Membuat DSL di Java, Bahagian 1: Apakah bahasa khusus domain?

Sekiranya anda pernah menulis makefile atau merancang laman web dengan CSS, anda sudah menemui DSL, atau bahasa khusus domain. DSL adalah bahasa pengaturcaraan ekspresif kecil yang direka khas untuk tugas-tugas tertentu. Dalam siri empat bahagian ini, Venkat Subramaniam memperkenalkan konsep DSL dan akhirnya menunjukkan kepada anda bagaimana membinanya menggunakan Java. Dalam artikel pertama ini, Venkat menerangkan apa itu DSL dan mendefinisikan perbezaan antara DSL luaran dan dalaman. Dia kemudian menunjukkan beberapa DSL yang mungkin anda gunakan selama bertahun-tahun, mungkin tanpa menyedarinya.

Sekiranya anda terlibat dalam penulisan atau bahkan hanya menggunakan aplikasi, kemungkinan anda telah menemui bahasa khusus domain, atau DSL - walaupun anda tidak menyedarinya pada masa itu. Fail input kata kunci ke aplikasi yang menerima data input adalah DSL. Fail konfigurasi adalah DSL. Makefile adalah DSL yang digunakan untuk menentukan peraturan dan pergantungan untuk membina aplikasi. Sekiranya anda menulisnya, anda sudah mengambil langkah pertama untuk membuat bahasa khusus domain.

Bahasa perkataan dalam frasa boleh menyebabkan anda mengharapkan DSL menggunakan sintaks untuk menyatakan semantik tertentu. Tidak seperti bahasa untuk umum seperti Java, ruang lingkup dan kemampuan DSL agak terhad; seperti namanya, DSL sangat terfokus pada jenis masalah atau domain tertentu, dan untuk menyatakan sekumpulan penyelesaian yang sempit dalam konteks ruang lingkup terhad itu. Dan itu adalah perkara yang baik - DSL ringkas dan ringkas.

Baiklah, itu L; bagaimana dengan D dan S?

Kata domain dalam DSL merujuk kepada "kawasan atau bidang pengetahuan, pengaruh, atau aktiviti." (Untuk maklumat lebih lanjut, rujuk pada Domain-Driven Design oleh Eric Evans.) Memfokus pada domain memberi anda konteks - kerangka logik di mana anda dapat mengembangkan model untuk aplikasi.

Kata khusus dalam DSL memberi anda konteks yang dibatasi. Ini menolong anda menjaga hal-hal yang relevan, fokus, singkat, dan ekspresif.

Kesederhanaan sangat penting untuk kejayaan DSL. Seseorang yang biasa dengan domain bahasa mesti memahaminya dengan mudah. Contohnya, jika anda membuat DSL yang akan digunakan oleh aktuaris untuk menyatakan peraturan perniagaan dalam bidang insurans, anda tidak mahu mereka menghabiskan banyak masa untuk mempelajari bahasa yang sukar dan rumit. Anda mahu mereka fokus untuk menyatakan perincian yang berkaitan dengan risiko insurans dengan cara yang mereka dapat dengan mudah memahami, membincangkan, berkembang dan mengekalkan. DSL yang anda buat untuk mereka mesti dibina berdasarkan perbendaharaan kata mereka, istilah yang mereka gunakan setiap hari untuk berkomunikasi dengan rakan sebaya mereka. Anda mahu mereka menggunakan sintaks yang anda berikan, tetapi nampaknya mereka hanya menetapkan beberapa peraturan yang berbeza.Dan mereka seharusnya dapat melakukannya tanpa mendapat kesan bahawa mereka benar-benar memprogram atau bahkan menggunakan semacam bahasa.

Membuat DSL yang baik adalah seperti memasak makanan berkhasiat; sama seperti anda mahu anak-anak makan sayur-sayuran tanpa menyedari dan menyusahkannya, anda juga mahu pelanggan menggunakan DSL anda tanpa perlu risau tentang sintaksnya.

Ringkas adalah bahagian lain dalam menulis DSL yang baik, yang bermaksud memilih sintaks yang ringkas dan ekspresif. Kesunyian dengan akal menjadikan kod anda lebih mudah dibaca dan dijaga. Ekspresif membantu meningkatkan komunikasi, pemahaman, dan kepantasan. Sebagai contoh, bagi seseorang yang memahami pendaraban matriks, matrixA.multiply(matrixB);kurang ekspresif dan ringkas daripada matrixA * matrixB. Yang pertama melibatkan fungsi memanggil dan menggunakan tanda kurung, dan termasuk titik koma yang menakutkan. Yang terakhir ini adalah ungkapan yang akan cukup dikenali.