Membuat DSL di Java, Bagian 1: Apa itu bahasa khusus domain?

Jika Anda pernah menulis makefile atau mendesain halaman Web dengan CSS, Anda telah menemukan DSL, atau bahasa khusus domain. DSL adalah bahasa pemrograman kecil dan ekspresif yang dirancang khusus untuk tugas tertentu. Dalam seri empat bagian ini, Venkat Subramaniam memperkenalkan konsep DSL dan akhirnya menunjukkan kepada Anda cara membuatnya menggunakan Java. Dalam artikel pertama ini, Venkat menjelaskan apa itu DSL dan mendefinisikan perbedaan antara DSL eksternal dan internal. Dia kemudian menunjukkan beberapa DSL yang kemungkinan telah Anda gunakan selama bertahun-tahun, bahkan mungkin tanpa menyadarinya.

Jika Anda pernah terlibat dalam penulisan atau bahkan hanya menggunakan aplikasi, kemungkinan besar Anda telah menemukan bahasa khusus domain, atau DSL - bahkan jika Anda tidak menyadarinya pada saat itu. File masukan kata kunci ke aplikasi yang menerima data masukan adalah DSL. File konfigurasi adalah DSL. Makefile adalah DSL yang digunakan untuk menentukan aturan dan dependensi untuk membangun aplikasi. Jika Anda telah menulis salah satunya, Anda telah mengambil langkah pertama untuk membuat bahasa khusus domain.

Kata bahasa dalam frasa dapat membuat Anda mengharapkan DSL akan menggunakan sintaks untuk mengekspresikan semantik tertentu. Tidak seperti bahasa tujuan umum seperti Java, DSL cukup terbatas dalam cakupan dan kemampuannya; Seperti namanya, DSL sangat fokus pada jenis masalah atau domain tertentu, dan mengekspresikan serangkaian solusi yang sempit dalam konteks cakupan terbatas itu. Dan itu hal yang bagus - DSL sederhana dan ringkas.

Oke, itu L; bagaimana dengan D dan S?

Kata domain di DSL mengacu pada "suatu wilayah atau lingkup pengetahuan, pengaruh, atau aktivitas." (Untuk informasi selengkapnya, lihat Desain Berdasarkan Domain oleh Eric Evans.) Berfokus pada domain memberi Anda konteks - kerangka kerja logis di mana Anda dapat mengembangkan model untuk aplikasi.

Kata spesifik di DSL memberi Anda konteks yang dibatasi. Ini membantu Anda menjaga hal-hal tetap relevan, fokus, singkat, dan ekspresif.

Kesederhanaan sangat penting untuk keberhasilan DSL. Seseorang yang akrab dengan domain bahasa tersebut harus dengan mudah memahaminya. Misalnya, jika Anda membuat DSL yang akan digunakan oleh aktuaris untuk menyatakan aturan bisnis dalam domain asuransi, Anda tidak ingin mereka menghabiskan banyak waktu untuk mempelajari bahasa yang sulit dan rumit. Anda ingin mereka fokus dalam mengungkapkan detail yang terkait dengan risiko asuransi dengan cara yang dapat mereka pahami, diskusikan, ubah, dan pertahankan dengan mudah. DSL yang Anda buat untuk mereka harus dibuat berdasarkan kosakata mereka, istilah yang mereka gunakan setiap hari untuk berkomunikasi dengan rekan-rekan mereka. Anda ingin mereka menggunakan sintaks yang Anda berikan, tetapi bagi mereka tampaknya mereka hanya menetapkan beberapa aturan terpisah.Dan mereka harus dapat melakukannya tanpa mendapat kesan bahwa mereka benar-benar pemrograman atau bahkan menggunakan suatu jenis bahasa.

Menciptakan DSL yang baik seperti memasak makanan bergizi; sama seperti Anda ingin anak-anak makan sayuran tanpa menyadarinya dan meributkannya, Anda ingin klien menggunakan DSL Anda tanpa mengkhawatirkan sintaksnya.

Ringkas adalah bagian lain dari penulisan DSL yang baik, yang berarti memilih sintaksis yang singkat dan ekspresif. Keterseness in reason membuat kode Anda lebih mudah dibaca dan dipelihara. Ekspresi membantu meningkatkan komunikasi, pemahaman, dan kecepatan. Misalnya, seseorang yang memahami perkalian matriks, matrixA.multiply(matrixB);kurang ekspresif dan ringkas daripada matrixA * matrixB. Yang pertama melibatkan fungsi panggilan dan menggunakan tanda kurung, dan termasuk titik koma yang mengintimidasi. Yang terakhir sudah merupakan ungkapan yang cukup familiar.