Kapan masuk akal untuk membuat bahasa pemrograman saya sendiri?


49

Apakah ada jenis aplikasi pembunuh, kelas masalah algoritmik, dll., Di mana lebih baik, dalam jangka panjang, untuk membuat bahasa saya sendiri?

PS: Hanya untuk memastikan, maksud saya bahasa pemrograman baru dan kompiler, bukan kompiler baru untuk bahasa yang ada.

EDIT : Terima kasih atas jawabannya. Bisakah Anda memberikan beberapa contoh, di mana mutlak tidak perlu untuk membuat DSL atau kasus di mana DSL mungkin merupakan ide yang bagus?


8
Saya percaya bahwa orang harus membuat DSL untuk setiap masalah.
SK-logic

4
Bukankah ini yang bagus untuk LISP?
Darknight

1
@Darknight, tidak harus Lisp - bahasa apa pun dengan kemampuan pemrograman metaprogram yang layak tidak masalah.
SK-logic

2
Ketika Anda memiliki keinginan untuk belajar tentang internal compiler.
dan_waterworth

1
Ketika Anda berpikir itu akan menyenangkan atau mendidik. Merancang bahasa baru yang membutuhkan kompilernya sendiri tidak pernah melayani tujuan yang bermanfaat, mengingat jumlah usaha yang terlibat. (Tentu saja, ada orang-orang yang cukup cerdas, berpendidikan, dan pengalaman untuk mengetahui kapan harus mengabaikan saran saya.)
David Thornley

Jawaban:


40

Tentunya relevan bagi seseorang untuk menulis bahasa mereka sendiri untuk tujuan pendidikan. Untuk mempelajari tentang desain bahasa pemrograman dan tentang desain kompiler. Tetapi penggunaan dunia nyata sangat sedikit dan jarang.

Dalam menulis bahasa Anda sendiri, Anda adalah:

  • Menambahkan kompleksitas yang luar biasa ke masalah Anda
  • Menambahkan sejumlah besar pekerjaan secara tertulis dan memelihara bahasa dan kompiler baru

Jadi, jika Anda berencana untuk menulis bahasa Anda sendiri untuk proyek Anda maka fitur yang disediakannya bahasa lain tidak perlu mengimbangi biaya di atas.

Ambil contoh pengembangan game. Mereka sering membutuhkan bahasa mini di dalam game atau bahasa scripting mereka. Mereka menggunakan bahasa-bahasa ini untuk membuat skrip dalam jumlah besar dari peristiwa dalam game yang terjadi. Namun, bahkan dalam kasus ini, mereka hampir selalu memilih bahasa scripting yang ada dan menyesuaikannya dengan kebutuhan mereka.


13
Saya harus menyebutkan bahwa dalam "Programmer Pragmatis" bahwa menulis bahasa yang lebih kecil dan spesifik domain untuk membantu tugas sangat membantu dan mendorong. Saya tidak akan merekomendasikan menulis bahasa tujuan umum lengkap, tetapi bahasa logam yang menghasilkan kode kadang-kadang bisa membantu.
Jordan Parmer

5
Itu adalah kebohongan. Menulis bahasa tidak menambah kompleksitas - biasanya akan mengurangi kompleksitas secara signifikan. Menerapkan kompiler dan memeliharanya adalah bagian kecil dari pekerjaan.
SK-logic

3
@ SK-logic, "Menerapkan kompiler dan memeliharanya adalah bagian kecil dari pekerjaan". Sudahkah Anda mencoba? Untuk prosesor apa?

2
@ Thorbjørn Ravn Andersen, saya melakukannya untuk hidup. Saat ini Anda tidak perlu menargetkan CPU yang diberikan secara langsung - karena ada banyak VM hebat yang tersedia, seperti LLVM, .NET, bahkan JVM. Dan jika Anda tidak akan melakukan terlalu banyak optimasi mahal, bahkan menargetkan CPU "nyata" bukanlah masalah besar - lihat kompiler OCaml untuk contoh dari pendekatan primitif ini.
SK-logic

8
@ Thorbjørn Ravn Andersen, menurut definisi, kompiler menerjemahkan dari satu bahasa ke bahasa lain. Tingkat bahasa target itu tidak masalah apa-apa. Dan tidak ada orang waras yang akan mengimplementasikan kompilator back-end optimalisasi penuh untuk DSL - lebih baik menggunakan kembali yang sudah ada. Sebenarnya, sebagian besar DSL modern dikompilasi menjadi C. Adapun assembler dan linker - mereka selalu dianggap terpisah dari kompilasi, sejak hari-hari awal pemrograman sistem.
SK-logic

24

Biarkan saya mengutip Paul Vick, mantan kepala pengembang kompiler VB dan sekarang bekerja di Project Oslo dan bahasa M:

Sangat sulit, sangat sulit untuk membangun bahasa baru, bahkan bahasa yang sebagian besar didasarkan pada yang sudah ada. Namun banyak programmer berpikir, “hei, saya menggunakan bahasa, seberapa sulitkah ini?” Dan terus melakukannya. ... mungkin lebih dari 98% dari mereka gagal mendapatkan traksi sama sekali, tetapi Tuhan memberkati para optimis karena tanpa mereka kita tidak akan pernah mendapatkan 2% bahasa yang berhasil. Saya pribadi rela mengorbankan jutaan dolar dan berjam-jam yang terbuang untuk bahasa yang tidak pernah membuatnya hanya agar kita bisa mendapatkan bahasa seperti C # dan Java dan Ruby dan Python dan sebagainya.

Jadi fakta bahwa menggunakan bahasa baru adalah ide yang buruk seharusnya tidak menghalangi orang untuk mengembangkan DSL baru, itu seharusnya hanya memberi mereka jeda dan mudah-mudahan sedikit kerendahan hati. Kuncinya, saya pikir, adalah mulai dari yang kecil dan tetap yang kecil.

DSL: Pasti ide yang buruk!


8
VB! = VBA. Ngomong-ngomong, apakah legal untuk mengkritik VBA di situs ini? Lagi pula, Joel membantu mengembangkannya, bukan?
Konrad Rudolph

1
meskipun programmer pragmatis adalah buku yang bagus, rekomendasi DSL dalam buku itu benar-benar bodoh. Dengan cara yang sama mereka merekomendasikan belajar bahasa baru setiap tahun, IMHO itu cukup bodoh juga.
dr. evil

2
Saya baru saja mengedit jawaban Anda untuk merujuk ke artikel Paul Vick lagi daripada cache Google. Pada 2011 ia "mereset blog-nya" dan menghapus semua konten VB, tetapi pada 2012 ia mengembalikannya meski dengan URL berbeda. Sepertinya dia mengalami kesulitan ketika dia menghapus hal itu.
MarkJ

2
@ MarkJ Terima kasih banyak. Dan, wow, artikel itu tidak cocok untuk dibaca. Semoga dia lebih baik sekarang.
Konrad Rudolph

2
Terima kasih atas komentar yang baik, saya sebenarnya sekarang bekerja pada JavaScript dan, ya, semuanya sedikit lebih baik. :-) Tidak yakin mengapa tautan asli tidak berfungsi, saya mencoba agar semua gaya tautan lama berfungsi, saya akan melihatnya.
panopticoncentral

23

Kapan itu masuk akal?

Ketika Anda merasa seperti itu!

Jangan dengarkan orang-orang yang memiliki komentar sombong yang pada dasarnya mengatakan:

"Jangan lakukan itu karena bahasa X terlalu keras dan lebih baik daripada bahasa apa pun yang dapat Anda hasilkan".

Masalahnya, menciptakan DSL terjadi setiap saat. Kerangka kerja adalah DSL. Makro adalah DSL. Setiap kali Anda menulis fungsi untuk program Anda, itu adalah bagian dari DSL. Tentu, ini ada dalam batas tata bahasa, tetapi kosa kata adalah bagian dari bahasa. Inilah sebabnya mengapa industri sering membuat bahasa mereka sendiri: lebih efisien!

Jika "jangan lakukan itu" adalah jawaban yang tepat, kita semua akan menulis COBOL dan Fortran.


3
Benarkah? Saya akan mempertimbangkan kerangka kerja, makro dan fungsi semuanya menjadi hal-hal yang membantu bahasa mempertahankan independensi domain.
CurtainDog

3
@CurtainDog, itu hanya menjadi bagian dari bahasa jika itu bagian dari perpustakaan standar. Kalau tidak, itu adalah "dialek" bahasa.

9

Anda mungkin ingin membaca bagian buku DSL Martin Fowler yang akan datang , jika Anda berpikir untuk menulis bahasa Anda sendiri.

Saya benar-benar tidak bisa memikirkan kasus bisnis untuk membuat bahasa dari awal selain menjadi pengalaman belajar yang luar biasa.

Sunting: untuk DSL ada banyak kasus bisnis, tetapi kuncinya di sini adalah tidak terbawa suasana dan tetap sederhana.


7

Saya menyarankan bahwa pertanyaan kuncinya adalah, "Masalah apa yang saya coba selesaikan?" dan "Siapa yang mendapat ROI?"

Jika Anda mencoba untuk membangun keterampilan dan pengalaman Anda sendiri, maka kecepatan penuh di depan, tetapi tidak dalam sistem produksi yang seharusnya menyelesaikan masalah orang lain.


7

Sepertinya alasan utama Anda menginginkan bahasa baru adalah karena Anda mulai menemukan pola dalam kode Anda yang tidak ditangani dengan baik oleh bahasa yang ada. Tetapi ada banyak masalah dengan membuat bahasa Anda sendiri. Anda akan kehilangan semua perpustakaan dan kerangka kerja yang dibangun untuk bahasa yang ada. Anda akan menghabiskan banyak waktu merancang dan mengimplementasikan bahasa baru, yang merupakan waktu yang tidak harus Anda habiskan untuk tugas pemrograman yang sebenarnya. Anda akan menghabiskan banyak upaya meyakinkan pengembang lain bahwa mereka harus menggunakan bahasa Anda. Dan, Anda akan kesulitan merekrut dan melatih pengembang baru.

Mengapa tidak menulis dalam bahasa seperti Lisp yang memungkinkan Anda memperluas bahasa saat Anda menemukan pola baru? Kemudian, Anda mendapatkan semua kekuatan bahasa baru dengan semua manfaat dari bahasa yang mapan.


6

Salah satu alasannya adalah untuk membuatnya sebagai percobaan untuk belajar tentang desain bahasa dan pembangunan kompiler.

Alasan lain mungkin untuk membangun bahasa skrip ke dalam aplikasi ketika Anda tidak memiliki opsi untuk menambahkan API pihak ketiga.


6

Saya tidak berpikir Anda dapat memprogram tanpa membuat bahasa baru, jadi bagus untuk menyadari bahwa itulah yang Anda lakukan dan pahami masalahnya.

  • Apa itu bahasa?
    Kosakata, sintaksis, dan semantik.

Bahasa yang tidak tersedia seperti VB, Java, C #, dll. Hanyalah bahasa dasar . Segera setelah Anda menambahkan kelas, metode, dll. Untuk itu, Anda telah menambahkan kosakata dan semantik. Ada banyak cara untuk mengimplementasikan bahasa - parsing & menerjemahkan, parsing & menafsirkan, makro di atas bahasa yang ada, menambahkan kelas & metode ke bahasa yang ada.

  • Apa yang Anda ingin bahasa lakukan?
    Baik untuk mengungkapkan masalah secara singkat.

Bagaimana Anda tahu jika Anda telah melakukan ini? Ukuran yang saya gunakan adalah jumlah edit . Jika persyaratan satu kalimat A datang, saya melanjutkan untuk mengimplementasikan persyaratan dalam kode. Ketika saya selesai & mengeluarkan semua bug, saya memeriksa kode, dan repositori kode memberi saya daftar perubahan yang saya buat, B. Semakin kecil B, semakin baik bahasanya. Rata-rata di atas ruang persyaratan nyata & mungkin, ukuran itu memberi tahu saya bagaimana "domain spesifik" bahasa itu.

  • Mengapa keringkasan itu baik?
    Karena itu meminimalkan bug.

Jika diperlukan perubahan kode N untuk menerapkan persyaratan 1, dan Anda terkadang membuat kesalahan, maka jumlah bug yang Anda perkenalkan kira-kira sebanding dengan N. Pada batas di mana N = 1, hampir tidak mungkin untuk memperkenalkan bug tanpa berusaha.

Perhatikan bahwa ini adalah tantangan langsung ke "kode mengasapi" yang kita lihat saat ini.

TAMBAH: Menanggapi permintaan Anda untuk contoh, lihat eksekusi diferensial . Saya tidak akan mengatakan itu bisa dipahami dengan cepat, tetapi itu secara signifikan mengurangi kode UI.


Jika ada persyaratan satu kalimat, kita semua akan membuat kode dalam bahasa Inggris. Sama seperti bahasa manusia lainnya, kode membutuhkan banyak pelat untuk memiliki makna apa pun.
CurtainDog

@ Anjing: Dari sudut pandang AI, itu akan ideal. Lihatlah eksekusi diferensial. Itu adalah contoh nyata dari pemotongan kode sumber dengan urutan besarnya. Pelat boiler mungkin diperlukan, tetapi itu bukan hal yang baik.
Mike Dunlavey

5

Itu selalu "layak", untuk menggunakan kata dalam pertanyaan (asli) Anda, tetapi itu tidak sering berguna dan sangat jarang optimal mengingat banyaknya bahasa dan kerangka kerja yang didukung dan matang serta ada yang ada.

Namun, ini adalah tantangan intelektual yang menarik.


Ups, maaf. Non-penutur asli ... :)
Daniel Rikowski

oh, tidak tahu itu dan posting Anda dalam bahasa Inggris sangat baik, jadi sulit untuk mengatakannya. Tidak mencoba menjadi polisi tata bahasa juga - permintaan maaf.
Simon

5

Hanya jika bisnis inti tim Anda adalah bahasa pemrograman.

Saya telah bekerja pada bahasa pemrograman yang dibuat di perusahaan keuangan.

Jelas, bagi arsitek sendiri ini adalah tantangan besar dan meningkatkan keterampilannya sendiri.

Tidak dapat dihindari, bahasa tidak bisa tumbuh atau membaik pada tingkat mendekati tingkat yang bisa dilakukan oleh sesuatu seperti C # atau Java - mereka memiliki tim yang didedikasikan untuk melakukan itu.

Bahasa itu segera mandek karena tidak ada orang baru yang mau melakukan tugas meningkatkan proyek kesayangan orang lain.

Arsitek asli pergi. Bahasa layu dan mati setelah 10 tahun.

10 tahun itu adalah neraka bagi siapa saja yang mengalami ketidakberuntungan untuk bekerja dengan bahasa buntu.

Jadi silakan, buat bahasa Anda sendiri tapi tolong jangan meminta orang lain untuk benar-benar menggunakannya. Tolong jangan berharap orang lain mengucapkan terima kasih untuk itu.


1
Studi kasus yang menarik ... apakah stagnasi semacam itu dapat dihindari dengan menargetkan bahasa untuk platform Java atau .NET. Dengan begitu bahasa dapat 'tumbuh' karena lebih banyak ditambahkan ke pustaka dasar.
CurtainDog

2
Saya tidak yakin mengapa Anda membuat bahasa yang menargetkan bahasa lain seperti Java. Mengapa tidak menggunakan Java atau C # saja?

4

Merancang bahasa bisa menyenangkan. Tetapi Anda tidak harus membatasi diri ke bahasa pemrograman.

Jika saya membangun aplikasi yang cukup kompleks, saya ingin menambahkan semacam bahasa makro / scripting untuk membuatnya lebih mudah untuk menjalankan tugas berulang yang kompleks. Sebagian besar pengguna tidak akan menggunakan fungsi ini, tetapi beberapa yang menggunakannya sangat berterima kasih. Selain itu, saya memastikan itu sangat berharga bagi orang-orang dukungan untuk membantu mereka memperbaiki masalah pelanggan.


4

Sangat masuk akal jika dilakukan untuk memperluas keterampilan Anda dan untuk belajar.

Selain itu, jika Anda harus mengajukan pertanyaan, maka tidak. Jika Anda mencoba mencari tahu apakah Anda dapat menangani kelas algoritma tertentu atau domain masalah tertentu lebih baik daripada bahasa yang ada, pertama-tama Anda harus menjadi ahli di bidang yang Anda tangani. Anda akan tahu bahwa itu tepat ketika keterampilan dan pengalaman Anda mengatakannya.

Dan Anda bisa salah tentang itu juga, tetapi Anda membutuhkan ahli lain untuk meyakinkan Anda tentang hal itu (atau untuk menunjukkan bahwa Anda bukan ahli yang Anda kira). Diskusi yang hidup, bukan Q-dan-A sederhana seperti yang akan Anda temukan di sini.


4

Kecuali untuk tujuan pendidikan mandiri, saya ingin mengklaim bahwa saat ini tidak perlu apa pun untuk membuat bahasa Anda sendiri. Dalam keadaan apa pun. Pernah. Terlepas dari apa yang ingin Anda lakukan, ada banyak bahasa yang bisa Anda ambil / sesuaikan dengan kebutuhan Anda.


Klaim Anda sangat kontroversial, dan terdengar seperti kata kasar bagi saya.
SK-logic

Hari ini ada beberapa kerangka kerja untuk membuat DSL Anda sendiri yang disesuaikan, yang saya tidak benar-benar membahas apa yang saya coba katakan (ini 2 tahun yang lalu). Saya mungkin harus merumuskannya kembali sebagai "menerapkan bahasa tujuan umum baru dari awal dalam praktiknya bukan cara yang tepat untuk maju." :)
JesperE

ok, penambahan "tujuan umum" ini mengubah segalanya. Tapi, saya tidak percaya pada bahasa "tujuan umum" - tidak ada satupun yang benar-benar cukup umum, jadi masih ada banyak ruang untuk bahasa "agak umum" baru (yang semuanya, pada kenyataannya, DSL semacam).
SK-logic

3

Ini sangat tergantung pada situasi. Seperti yang dikatakan nosklo - Jika Anda memiliki ide bagus, konsep baru atau sesuatu seperti itu, saya sangat menyarankan Anda untuk melakukannya.

Secara umum saya akan menyarankan untuk mengandalkan teknologi yang sudah mapan.

Tetapi jika Anda tertarik untuk membuat "bahasa" Anda sendiri, Anda harus memeriksa: YACC & Lex


3

Anda bisa, tapi jangan terjebak dalam pola anti-rekreasi "Recreating the square".

Berarti Anda sedang membuat ulang apa yang sudah dilakukan, hanya lebih buruk dari yang asli.


Jika roda tidak diciptakan kembali, kita masih bisa menggunakan roda batu. Rock it baby
Wong Jia Hau


3

Kapan membuat bahasa Anda sendiri?

Bila Anda mau, sebagai proyek hobi besar.

Untuk bahasa khusus domain. Ini bisa sangat rumit; lihat apa yang terjadi di komunitas Fiksi Interaktif (atau petualangan teks) dengan memeriksa arsip .

Ketika tujuan Anda sangat ambisius, dan Anda pikir Anda dapat membuat kemajuan nyata, seperti proyek Arc Paul Graham .

Juga, dalam bahasa yang cukup mudah beradaptasi (mungkin C ++, pasti Common Lisp) dalam proses pengembangan konstruksi tingkat rendah.

Kapan harus menghindarinya seperti Anda, saya harap, hindari klise seperti menghindarinya seperti wabah?

Ketika itu menjadi dasar untuk melanjutkan pengembangan untuk proyek nyata. Itu akan selalu berakhir tertinggal di belakang apa yang tersedia secara komersial dengan harga murah, dan akan melumpuhkan pengembangan lebih lanjut. Saya bekerja untuk sebuah perusahaan dengan versi COBOL sendiri, dan tidak pernah ingin bekerja di perusahaan lain yang menggunakan bahasanya sendiri. Kami menyaksikan COBOL versi lain mendapatkan kemampuan yang lebih baik, dan alat yang lebih baik, sementara kami terjebak dengan masalah yang sama. (Saya tidak ingin bekerja dengan COBOL lagi, tapi itu cerita lain.)

Situasi di mana Anda dapat membuat bahasa Anda sendiri tidak termasuk dalam hal ini. Proyek hobi tidak digunakan untuk pengembangan nyata. Sesuatu seperti Arc akan berhasil (dan mendapatkan beberapa implementasi serta evolusi dan pengembangan lebih lanjut) atau gagal (dan tidak ada orang lain yang akan menggunakannya). Bahasa kecil khusus domain hanya bagian dari proyek, dan karena kecil, maka dapat ditingkatkan seiring waktu. Bahasa petualangan teks digunakan untuk menulis game individual, dan game-game itu, selain sebagai proyek hobi, hampir tidak pernah digunakan untuk melanjutkan pengembangan.


3

Perspektif saya adalah bahwa DSL pada umumnya adalah "ide yang lemah", dan dalam jangka panjang akan lebih produktif untuk menggunakan bahasa standar dan membangun kebutuhan spesifik domain Anda sebagai pustaka "non-DSL".

Namun, mungkin ternyata kebutuhan Anda cukup khusus sehingga lebih baik memiliki DSL (bukan hanya sedikit modifikasi gcc atau implementasi cisp) untuk perusahaan Anda. Banyak perusahaan menggunakan drop-in bahasa saat ini yang menargetkan apa yang mereka lakukan, tanpa menulis / memelihara bahasa mereka sendiri. Misalnya, saya pernah mendengar bahwa PHP memiliki fitur drop-in yang bagus; Lua dirancang untuk menjadi drop-in, ModelView menggunakan Python dan AutoCAD memiliki AutoLISP sebagai skripnya.


3

Tidak ada yang salah dengan menulis bahasa pemrograman Anda sendiri jika Anda dapat memanfaatkan alat yang ada. Di dunia todays ini berarti Anda mendefinisikannya dalam sintaks yang dapat digunakan untuk bahasa yang ada (seperti Java atau C #) atau menulis sistem transformasi kecil (makro expander) yang menghasilkan kode dalam bahasa yang ada.

Melanjutkan ke kode mesin adalah menciptakan kembali BANYAK roda ...

Alasan yang sangat bagus untuk DSL adalah untuk merepresentasikan data domain dengan cara yang ringkas. Ini memungkinkan pakar domain untuk bekerja dengan data secara langsung alih-alih harus melalui yang lain. Caranya adalah dengan memiliki program yang dihasilkan dalam bentuk proses yang mudah.


3

Secara umum jawabannya adalah TIDAK besar. Dari ratusan bahasa di luar sana biasanya ada satu yang sesuai dengan masalah Anda.

Namun ada keadaan di mana itu merupakan pilihan rasional untuk mengembangkan bahasa baru: -

  • Ketika salah satu pesaing Anda sekarang memiliki salah satu platform pengembangan utama Anda. Saya sedang memikirkan ketergantungan Google pada Java dan pengembangan "go" mereka, (ada baiknya jika Anda memiliki penulis bahasa paling sukses yang pernah ada di daftar gaji!).
  • Ketika Anda harus menulis satu ton kode untuk platform baru dan bahasa yang sudah ada adalah verbose dan rawan kesalahan - misalnya php untuk pengembangan web.
  • Ketika Anda menemukan masalah skala dan paralelisme yang tidak pernah ditemukan sebelumnya karena tidak ada yang pernah memiliki perangkat keras sebanyak ini untuk memproses data sebanyak ini sebelumnya - misalnya Scala dan (sampai batas tertentu GO).

2

Bahasa yang bagus adalah komposisionalitas atau menyatukan komponen yang sama dalam berbagai cara.

Jika masalah domain Anda hanya perlu mengatur sekelompok switch ortogonal, bahasa mungkin tidak menambah banyak bentuk, UI grafis atau konfigurasi teks langsung. mengajukan. (Saya berasumsi di sini bahwa file yang penuh dengan kunci, pasangan nilai bukan yang Anda maksud dengan "bahasa".)

OTOH, jika konfigurasi Anda seperti bahasa nyata mis. kata kerja dan kata benda dapat disatukan dalam banyak kombinasi yang berbeda (dan novel) untuk tingkat kompleksitas apa pun, maka suatu bahasa akan menjadi hampir tak terelakkan, karena ledakan kombinatorial mencoba menentukan apa yang Anda inginkan dengan metode lain mana pun membanjiri.


1

Selain mempelajari latihan, masuk akal untuk membuat bahasa pemrograman Anda sendiri hanya ketika Anda memahami bahasa lain, domain masalah spesifik Anda, dan cara bahasa yang ada mengatasi domain masalah itu dan pemahaman ini cukup menyeluruh sehingga Anda tahu bahasa baru adalah masuk akal solusi tanpa perlu bertanya.


1

Terakhir kali saya memulai untuk melakukan itu pada proyek hobi saya mulai menentukan seperti apa saya ingin bentuk sintaks dan menyadari setengah jalan melalui saya sedang menciptakan kembali prolog. Bahasa lain yang mungkin cocok ketika Anda berpikir Anda perlu menciptakan bahasa adalah lisp, lua, atau sesuatu seperti Haskell. Pada dasarnya, semua bahasa yang Anda abaikan di perguruan tinggi karena Anda pikir itu tidak akan berguna.


Saya secara rutin menggunakan lebih dari selusin bahasa yang sangat berbeda. Termasuk Prolog, berbagai Lisps dan Haskell. Tapi tetap saja saya cenderung menyelesaikan hampir semua masalah dengan mengimplementasikan DSL untuknya. Dan DSL itu cukup spesifik untuk berada jauh dari bahasa yang ada - mereka lebih mirip campuran bagian-bagian kecil dari bahasa yang berbeda.
SK-logic

1

Salah satu alasannya adalah untuk tujuan pendidikan, sebagaimana telah dinyatakan. Tetapi masih ada lagi. Sebagai contoh, ada banyak bahasa penelitian seperti Sing#pada sistem operasi Singularity dan BitCpada Coyotos yang telah dirancang karena bahasa yang ada tidak menawarkan fitur yang diperlukan (misalnya verifikasi pada tingkat bahasa).


1

Tom Van Cutsem baru-baru ini menulis jawaban esai untuk pertanyaan ini:

http://soft.vub.ac.be/~tvcutsem/whypls.html

Ringkasan peluru (dari halaman itu):

  • Bahasa sebagai mekanisme abstraksi sintaksis: untuk mengurangi kode "boilerplate" berulang yang tidak dapat diabstraksi dari penggunaan mekanisme abstraksi bawaan bahasa lain.
  • Bahasa sebagai pembentuk pikiran: untuk mendorong perubahan paradigma dalam bagaimana seseorang harus menyusun perangkat lunak (mengubah "jalan resistensi paling kecil").
  • Bahasa sebagai penyederhanaan: untuk meruntuhkan paradigma yang ada hanya untuk bagian-bagian penting, sering untuk meningkatkan pemahaman dan wawasan.
  • Bahasa sebagai penegak hukum: untuk menegakkan properti atau invarian penting, mungkin untuk membuatnya lebih mudah untuk menyimpulkan properti yang lebih berguna dari program.

0

Mungkin tidak pernah.

Lua adalah pilihan terbaik yang bisa Anda dapatkan jika Anda ingin menanamkan bahasa pada dasarnya bahasa lain.

Bahasa Small Domain Specifc saat ini sedang digunakan, dan masuk akal di beberapa aplikasi.

Selain itu, alasannya terutama akademis.

Membuat bahasa ketika itu tidak diperlukan, benar-benar hal yang buruk untuk dilakukan karena kompleksitas yang terlibat dalam mengembangkan dan mempertahankannya. Saya telah melihat banyak proyek yang memperkenalkan beberapa jenis bahasa scripting khusus hanya untuk program itu, dan itu adalah hal yang memperlambat pengembangan hal dasar dengan jumlah besar. Contoh yang bagus adalah misalnya bahasa otomasi seperti Phantom, AutoHotKey, AutoIt. Alat-alat itu akan menjadi IMO jauh lebih baik jika mereka menggunakan bahasa yang terkenal seperti Lua.


Lua slo-ooow. Namun, di sisi lain, ada MetaLua dengan beberapa kemampuan pemrograman yang layak.
SK-logic

0

'Suntingan' Anda tampaknya merupakan pertanyaan yang sangat berbeda ("kapan saya harus membangun DSL?" Daripada pertanyaan asli yang dipahami orang "kapan saya harus membangun bahasa pemrograman tujuan umum yang baru"). Tampaknya orang telah menjawab pertanyaan 'asli' secara menyeluruh, tetapi ada beberapa jawaban yang memberikan kriteria spesifik kapan harus menggunakan DSL. Jadi saya mengusulkan daftar periksa:

  1. Userbase Anda lebih besar dari beberapa orang, umumnya non-teknis dan / atau dengan akses sistem terbatas (oleh karena itu tidak masuk akal untuk mengharapkan mereka belajar / menggunakan bahasa tujuan umum yang ada). Jika berada di dalam tim pengembang atau organisasi perangkat lunak Anda, Anda bisa mengatakan "cukup tulis skrip".
  2. Pengguna Anda perlu menggunakannya cukup sering, dengan perilaku yang cukup bervariasi dan berubah (yaitu Anda tidak bisa hanya menyediakan pustaka fungsi yang dikelola oleh Anda)
  3. Perilaku yang dapat ditentukan pengguna terlalu rumit untuk ditentukan sebagai data (mis. Anda tidak dapat mencapainya menggunakan tabel database, atau matriks input pengguna, atau daftar tugas, atau kumpulan nilai kunci ... pikirkan dengan cermat karena Anda dapat mencapai banyak kerumitan dengan ini). Jika Anda dapat mencapai perilaku menggunakan input data atau konfigurasi daripada DSL maka Anda mungkin harus melakukannya karena itu akan jauh lebih sedikit bekerja. Beberapa jenis persyaratan, atau kompabilitas / rantai bersama, atau pemodelan beberapa abstraksi yang berbeda mungkin merupakan tanda bahwa perilaku yang Anda butuhkan terlalu kompleks untuk data / konfigurasi biasa
  4. Tetapi perilaku ini masih cukup terbatas sehingga Anda dapat menentukannya dalam DSL ringkas. Bahaya besar adalah 'platform mengasapi' misalnya jika pengguna mulai meminta "bisakah Anda menambahkan ...?". Jika mereka perlu terhubung ke internet, atau membaca dan menulis dari sistem file, atau membuka dan menutup proses - maka ini bukan lagi DSL. (Saya telah melihat ini terjadi dengan nyata ... pengguna diizinkan untuk menyematkan panggilan python kecil, secara bertahap berkembang menjadi skrip python, dan akhirnya menghancurkan segala batasan / modularitas / kinerja)

Jika semua ini benar maka DSL mungkin sesuai.


0

Apakah ada jenis aplikasi pembunuh, kelas masalah algoritmik, dll., Di mana lebih baik, dalam jangka panjang, untuk membuat bahasa saya sendiri?

Tergantung.

Ayo ambil otak kita. Tampaknya menjadi kekacauan yang begitu rumit sehingga kita menemui perbatasan dengan bahasa pemrograman APAPUN (setidaknya sekarang). Jadi mungkin untuk benar-benar memvirtualisasikan otak kita, kita memerlukan pendekatan lain dan untuk itu semantik dan sintaksis lainnya.

Secara umum, masih ada topik rumit yang mungkin mengarah pada strategi lain yang juga mencakup bahasa 'lebih baik' untuk skenario tertentu.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.