Membangun DSL: Ditulis di atas bahasa tujuan umum atau berdiri sendiri?

10

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?

Jé Queue
sumber
siapa konsumen DSL ini? dan apa host potensial (Anda menyebutkan Java, apakah Anda mempertimbangkan kemungkinan lain)?
Mauricio Scheffer
Saya mempertimbangkan segala kemungkinan untuk tuan rumah. Konsumen adalah mereka yang menulis program tidak sinkron (pesan dengan tujuan).
Jé Queue

Jawaban:

9

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:

  • Biaya bangunan yang lebih rendah. Ada jauh lebih sedikit bagi Anda untuk diimplementasikan. Anda dapat fokus pada masalah yang ada alih-alih menghabiskan waktu untuk mengimplementasikan parser / compiler / interpreter.
  • Akses ke bahasa host: Bahasa Anda akan memiliki akses ke kekuatan penuh dari bahasa / platform yang ada.
kode kode
sumber
Saya agnostik bahasa yang cantik, tetapi mengapa menurut Anda inkarnasi Python lebih cocok?
Jé Queue
1
Lebih cocok daripada apa? Saya kira Ruby dan Python memiliki banyak manfaat yang sama, Ruby mungkin lebih cocok untuk internal DSL karena sintaksisnya yang lebih fleksibel. Adapun Java dan C #, saya telah melihat banyak antarmuka yang lancar dalam bahasa-bahasa tersebut (dan ada konstruk dalam versi yang lebih baru yang membuat pembuatan / penggunaan DSL internal lebih mudah, seperti sintaks penginisialisasi objek) - tetapi IMO bahasa "upacara rendah" adalah sedikit lebih cocok daripada bahasa "upacara tinggi".
codeape
1
Saya memilih C # untuk mengimplementasikan DSL internal dengan tepat untuk memanfaatkan pengecekan tipe statis waktu bebas "bebas". DSL bahasa dinamis tidak memberikan terlalu banyak keunggulan dibandingkan DSL eksternal.
Den
@Den itulah yang membuat saya kecewa ketika saya mencoba melakukan iDSL dengan Python. Di Jawa, iDSL Anda terasa seperti mendapat dukungan instan dari IDE. Belum menemukan IDE yang akan melakukan itu untuk Python.
candied_orange
2

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.

Henrik
sumber
2

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.

sintaks telur
sumber
1

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.

Logika SK
sumber
1

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 dll
External 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.

Olha Pavliuk
sumber