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?
programming-languages
dsl
Daniel Rikowski
sumber
sumber
Jawaban:
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:
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.
sumber
Biarkan saya mengutip Paul Vick, mantan kepala pengembang kompiler VB dan sekarang bekerja di Project Oslo dan bahasa M:
DSL: Pasti ide yang buruk!
sumber
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.
sumber
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.
sumber
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.
sumber
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.
sumber
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.
sumber
Saya tidak berpikir Anda dapat memprogram tanpa membuat bahasa baru, jadi bagus untuk menyadari bahwa itulah yang Anda lakukan dan pahami masalahnya.
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.
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.
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.
sumber
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.
sumber
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.
sumber
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.
sumber
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.
sumber
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.
sumber
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
sumber
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.
sumber
Wouter dikenal karena menciptakan bahasa baru untuk setiap ide baru. Anda dapat mengambil inspirasi dari karyanya: halaman bahasa pemrograman Wouter .
sumber
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.
sumber
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.
sumber
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.
sumber
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: -
sumber
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.
sumber
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.
sumber
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.
sumber
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 danBitC
pada Coyotos yang telah dirancang karena bahasa yang ada tidak menawarkan fitur yang diperlukan (misalnya verifikasi pada tingkat bahasa).sumber
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):
sumber
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.
sumber
'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:
Jika semua ini benar maka DSL mungkin sesuai.
sumber
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.
sumber