Saya sedang berdebat merancang bahasa khusus domain untuk menyederhanakan model pemrograman yang diberikan dan tidak jelas. Bagian dari perdebatan adalah apakah membangunnya (sebagai skrip) di atas bahasa / runtime yang ada (misalnya Java) atau membuatnya berdiri sendiri (kompiler sendiri, & c).
Bagi Anda yang memiliki pengalaman desain DSL, apakah Anda memiliki pro / kontra dan atau jawaban pasti untuk pendekatan yang sesuai?
language-design
scripting
dsl
runtime
Jé Queue
sumber
sumber
Jawaban:
Saya akan merekomendasikan membuat DSL Anda di atas bahasa yang ada (DSL internal). Saya telah melakukan ini beberapa kali dengan Python, menciptakan sistem di mana konsumen DSL menulis file python yang digunakan sebagai file konfigurasi untuk sistem. File konfigurasi menggunakan konstruk (kelas, fungsi) yang telah saya tentukan. Konstruksi ini membentuk DSL.
IMO, bahasa seperti Python (IronPython atau Jython jika sistem host .NET atau Java) atau Ruby (IronRuby, JRuby) lebih baik untuk mendasarkan DSL Anda daripada Java atau C #.
Dalam kasus saya sistem host juga (C) Python, jadi memilih Python untuk DSL telah menjadi hal yang wajar.
Beberapa pro:
sumber
Lihatlah Xtext (http://www.eclipse.org/Xtext/) dan Xbase (http://blog.efftinge.de/2010/09/xbase-new-programming-language.html). Jika pengguna bukan pemrogram, saya tidak berpikir Anda harus mendasarkan DSL Anda pada bahasa pemrograman yang ada. Itu akan terlalu rumit untuk mereka. DSL "bersih" bisa sangat efisien jika dibuat dengan benar.
sumber
Daripada merekomendasikan pendekatan tertentu, izinkan saya untuk merekomendasikan Bahasa Martin -spesifik Domain Martin Fowler sebagai sumber yang bagus untuk membuat keputusan. Ini memiliki pemeriksaan yang luas dan menggugah pikiran tentang manfaat relatif DSL internal dan eksternal.
sumber
Ada opsi ketiga - membangun DSL sebagai kompiler di atas bahasa tujuan umum. Bahasa apa pun dengan tingkat kemampuan metaprogramming yang masuk akal akan melakukan pekerjaan itu, termasuk bahkan hal tingkat rendah seperti C ++. Saya lebih suka Lisp dan bahasa sejenis untuk hal-hal semacam ini, tetapi Template Haskell atau Nemerle dapat memberikan tingkat fleksibilitas yang sama juga.
sumber
Dalam bukunya "Domain-Specific Languages", Martin Folwer menjelaskan DSL internal dan eksternal .
Internal DSL
= adalah himpunan bagian dari bahasa pemrograman yang ada misalnya Ruby / Java dllExternal DSL
= Anda mendefinisikan sintaks dan kosakata.DSL eksternal dapat jauh lebih ekspresif, tetapi dapat memerlukan parsing eksternal dan pembuatan kode.
Meskipun DSL internal tidak memerlukan pemrosesan tambahan, tetapi terkadang sulit dipahami oleh para pakar domain yang tidak pemrograman (misalnya analis bisnis, penguji).
Saat memilih jenis DSL Anda, penting untuk menganalisis siapa penggunanya. Jika mereka sebagian besar orang non-teknis, maka DSL eksternal bisa menjadi pilihan yang lebih baik. Untuk tim kecil programmer berpengalaman, DSL internal dapat dipilih, jika bahasa pemrograman yang mereka gunakan cukup ekspresif.
sumber