Apa itu bahasa khusus domain? Ada yang menggunakannya? Dan dengan cara apa?

107

Saya rasa saya mencari semacam intro dan melihat apakah ada yang menggunakannya. Apakah ada keuntungan khusus dari menggunakannya?

Wikipedia:

domain-specific language (DSL) adalah bahasa pemrograman atau bahasa spesifikasi yang didedikasikan untuk domain masalah tertentu, teknik representasi masalah tertentu, dan / atau teknik solusi tertentu.

Adakah yang bisa memberikan contoh spesifik bagaimana Anda telah menerapkannya atau bagaimana hal itu bisa berguna dalam skenario tertentu?

Srikar Doddi
sumber
Sebenarnya bahasa khusus domain adalah istilah dengan arti yang didefinisikan dengan baik dalam pemrograman - periksa artikel wikipedia
1800 INFORMATION
SEPERTI yang disebutkan di bawah, DSL bukanlah satu bahasa, tetapi nama dari seluruh kelas bahasa tujuan khusus.
dmckee --- kucing mantan moderator
Jadi dapatkah saya mengatakan R adalah DSL?
Srikar Doddi
2
Di tepi itu, tapi aku tidak mau. R memiliki semua struktur tujuan umum dan digunakan untuk berbagai macam komputasi; komputasi numerik dan statistik bukanlah domain yang sangat sempit. Ini adalah tes yang bagus untuk definisi tersebut.
Charlie Martin

Jawaban:

114

Bahasa khusus domain adalah bahasa yang ditulis untuk menangani domain atau kumpulan masalah tertentu. Ada banyak di antaranya, seperti make, ant, dan rake untuk mendeskripsikan build perangkat lunak, atau lexx dan yacc untuk konstruksi bahasa. Dalam beberapa tahun terakhir, mereka menjadi populer karena beberapa hal telah digabungkan untuk membuatnya lebih mudah dibangun. Besar di antara hal-hal itu adalah meningkatnya popularitas Ruby, yang memiliki beberapa fitur yang memudahkan pembuatan DSL baru.

Martin Fowler adalah pendukung besar ide tersebut, seperti di sini .

Charlie Martin
sumber
3
Fitur apa yang dimiliki Ruby yang membuat pembuatan DSL baru lebih mudah?
Lernkurve
2
@Lernkurve - Ruby memiliki metaprogramming, yang membantu. rubylearning.com/blog/2010/11/23/…
James Black
@CharlieMartin bisakah Anda memberi tahu saya tentang "groovy"? jenis bahasa apa sebenarnya itu? Saya ingin tahu tolong bantu di sini ..
G dangi
2
Groovy adalah bahasa skrip yang berjalan di JVM. Ini pada dasarnya dimaksudkan sebagai jawaban Java untuk Ruby. Ini adalah bahasa tujuan umum tetapi dapat digunakan untuk menulis DSL. docs.groovy-lang.org/docs/latest/html/documentation/…
Charlie Martin
1
Saya ingin menambahkan groovy Gradle. Jika tidak salah mereka memiliki bahasa mereka sendiri yang menggambarkan sebuah bangunan.
Neon Warge
67

Anda dapat menganggap DSL sebagai argumen yang terlalu kompleks untuk fungsi yang ditulis dalam bahasa pemrograman yang lebih umum. Bahasa pemrograman yang sebenarnya mengurai kode DSL dan melakukan sesuatu dengannya, biasanya, kode DSL hanya berfokus pada apa yang ingin Anda lakukan, dan sistem yang lebih besar akan mengetahui caranya .

Contoh DSL mencakup semua bahasa kueri (SQL, XPath, ...), semua bahasa templat (Django, Smarty, ...), skrip shell, terutama termasuk hal-hal seperti twill, browser web yang digerakkan oleh perintah (kebanyakan digunakan untuk pengujian otomatis ), penyimpanan data dan bahasa pertukaran (XML, YAML, ...), dan bahasa dokumen seperti LaTex, HTML atau CSS.

Beberapa bahasa dengan sintaks yang sangat fleksibel seperti TCL dan Lisp membangun DSL mereka langsung ke dalam bahasa ... bila memungkinkan. Mayoritas bahasa menggunakan string, biasanya dimuat dari file eksternal.

Apakah ada keuntungan khusus menggunakannya? Menggunakannya untuk tujuan yang dimaksudkan sangat menguntungkan ke titik Anda akan beralih ke mereka tanpa mengetahuinya, sama seperti Anda telah menggunakan (saya kira) SQL atau HTML tanpa menganggapnya sebagai DSL.

Saya berani mengatakan bahwa ada cukup banyak DSL di luar sana untuk segala jenis aplikasi yang mungkin Anda perlukan; Anda hampir pasti tidak perlu belajar menulis sendiri.

rgz
sumber
1
Cukup lucu, satu contoh yang tidak Anda cantumkan adalah yang pertama saya pikirkan: regex
CoffeeTableEspresso
12

(membahas inti dari pertanyaan)

Saya pikir pertama kali saya melihat DSL di suatu tempat dan definisinya sebagai "bahasa khusus domain" Saya juga berpikir itu adalah bahasa konkret tertentu yang belum pernah saya dengar - tetapi, tidak, itu adalah istilah umum untuk bahasa yang disesuaikan dengan area aplikasi tertentu.

Ironisnya, jika Anda baru saja mendengar tentang TCL sebagai "bahasa perintah alat", Anda mungkin berpikir, seperti DSL, akan ada banyak TCL untuk berbagai alat - tetapi, tidak, ini adalah nama spesifik dari bahasa skrip tertentu.

rndmcnlly
sumber
10

Saya pikir itu adalah bahasa yang cocok untuk memecahkan masalah untuk domain tertentu. Ini bisa berupa bahasa pemrosesan aturan atau bahasa deskripsi layanan.

Kebalikan dari bahasa khusus domain (DSL) adalah bahasa tujuan umum .

Michael Damatov
sumber
10

Semuanya adalah DSL ...

Assembler: MOV R1 to R2
Compilers: Assignment Statements - A = A + 1, Conditionals - IF (TRUE) ..., Branch - RETURN
HTML: ... deskripsikan struktur bertingkat
TCP / IP: jelaskan ke / dari alamat
PDF: menjelaskan penempatan teks / gambar di atas kertas
Font: mendeskripsikan karakter

Bahasa apa pun yang kami gunakan untuk menjelaskan proses tertentu adalah DSL. Sayangnya, ada kekurangan bahasa khusus domain untuk mendeskripsikan bahkan proses kami yang paling dasar, jadi kami menggunakan beberapa bahasa yang kami miliki untuk menjelaskan semua yang kami lakukan. "Zip semua file html di situs saya" membutuhkan 300 baris dari 3 atau 4 Bahasa yang berbeda untuk menyelesaikannya.

Untuk membangun DSL, tentukan jumlah minimum karakter yang diperlukan untuk menggambarkan proses yang dapat Anda ingat dan tidak memerlukan dokumentasi. Ingatlah bahwa kecepatan dan kemudahan penggunaan adalah kriteria desain utama. Parsing sangat cepat sehingga sintaks apa pun yang Anda gunakan baik-baik saja, saya lebih suka bahasa natural sebagai sintaks saya dalam banyak kasus, "Bayar Karyawan di awal bulan", tetapi khusus domain hanya itu, khusus domain, Anda menentukan sintaks yang terbaik cocok dengan masalahnya.

Saya akan menghindari menggunakan solusi lain yang mungkin nyaman tetapi tidak sesuai dengan masalah seperti HTML yang digunakan untuk mendefinisikan Data (XML). CSV sangat berguna, cocok untuk sebagian besar masalah. JSON tidak sesuai dengan porsi kemudahan penggunaan, itu berlebihan sehingga menambah komplikasi yang tidak perlu jika CSV berfungsi untuk sebagian besar masalah. Kami banyak menggunakan EXCEL untuk DSL, ini berfungsi dengan baik untuk menjelaskan masalah kecil, di bawah 65K hingga 1M baris, seperti struktur pohon atau menu, kolom A adalah level, kolom lain adalah ikon, warna, label dan semacamnya (EXCEL adalah CSV yang dapat diedit).

Saya menemukan bahwa HTML tidak benar-benar menyelesaikan masalah tata letak halaman, jadi saya menyingkirkannya dan menentukan DSL yang sesuai. Saya mendefinisikan 6 wilayah di halaman, KEPALA, TUBUH, KAKI, MARGIN KIRI / KANAN, dan MARGIN LENGKAP KIRI / KANAN. Saya kemudian bisa memberitahu generator halaman untuk menambahkan TITLE BAR, STATUS BAR, MENUS, TABLE, FORMS, ..., ke sel tertentu. Masing-masing Sel ini kemudian dapat dipecah menjadi Baris dan Kolom hingga kedalaman berapa pun. Tata letak halaman membutuhkan beberapa detik untuk gaya apa pun.

BODY berisi Tabel
KEPALA Karyawan saya berisi judul Bar Judul 'Hello World' dengan login ke Collins Software

A Menu DSL tidak sesuai dengan tata letak halaman DSL, jadi saya membuat DSL unik untuk menu.

Sumber Daya Menu Utama Saya
* tentukan: menu, m, Tingkat, Label, Ikon, Tindakan;
m, 0, berkas;
m, 1, buka, open.gif, Dialog Open File;

Setiap masalah adalah unik, komputer dapat menggunakan format apapun, DSL dirancang untuk manusia, sehingga membuatnya dapat dimengerti oleh manusia, sesuatu yang dapat mereka ketik, dan membuat bahasa dari kata-kata nyata; karena itu adalah orang, tempat, dan hal-hal yang nyata yang kami gambarkan.

Clif
sumber
8

DSL adalah cara yang baik untuk mengembangkan bahasa yang akan digunakan oleh non-programmer. Misalnya, jika Anda memiliki DSL untuk orang keuangan di sebuah perusahaan, daripada memprogram sesuai spesifikasi mereka, Anda dapat membiarkan mereka menulis program yang ingin mereka selesaikan. Kemudian, jika terlalu lambat maka Anda dapat mengambil apa yang mereka tulis sesuai keinginan mereka, menuliskannya dalam bahasa yang dikompilasi untuk mempercepatnya.

James Black
sumber
5

Baik! ada banyak hal yang dijelaskan di atas. Saya akan mencoba menjelaskan hal ini dengan cara yang lebih sederhana karena orang seperti saya akan mengerti.

Karena bahasa tujuan umum digunakan untuk tujuan luas, DSL hanya dibuat untuk domain tertentu. Seperti HTML atau CSS.

Anda dapat mengatakan jika Anda menulis instruksi pada sebuah makalah yang hanya bisa dimengerti oleh beberapa orang atau satu-satunya sahabat Anda dan tidak ada orang lain yang bisa. Maka itu mungkin DSL. Tetapi jika Anda menulis instruksi sedemikian rupa sehingga banyak orang bisa mengerti dan bisa mengikutinya maka ini bukan DSL.

I onces membuat papan Switch untuk pengguna yang dapat dioperasikan melalui port Serial komputer dan Pengguna menginginkan program untuk papan itu yang dapat dijalankan pada papan itu dan sakelar Relay akan dihidupkan dan dimatikan sesuai. Jadi saya menulis beberapa instruksi dan memberi tahu pengguna untuk memprogram papan itu sesuai dengan instruksi ini. Ini adalah contoh DSL. Saya tidak menemukan Bahasa baru, tetapi saya hanya membuat banyak String yang dapat dibaca oleh pengontrol mikro dari EEPROM dan dapat mengurai sesuai dan dapat melakukan tugas tertentu.

Abdul Rehman
sumber
4

Saya telah menulis posting blog singkat yang membahas mengapa saya suka menggunakan DSL:

Saya Berharap Kita Menggunakan Bahasa Tertentu Domain (DSL) Lainnya

Di dalamnya, saya mendefinisikan DSL sebagai:

Bahasa pemrograman kecil yang dirancang khusus untuk mengkomunikasikan solusi untuk domain masalah tertentu.

Dalam hal penggunaan, jika Anda pernah menggunakan Ant, Structured Query Language (SQL), atau Cascading Style Sheets (CSS), Anda telah menggunakan DSL.

Saya suka menggunakan DSL karena mereka berfokus pada memfasilitasi komunikasi solusi ke ruang masalah tertentu, dan mereka melakukannya dengan cara yang mempromosikan masuknya pakar domain.

AdamJonR
sumber
3

Salah satu contoh sederhana Domain Specific Language (DSL) adalah HTML yang digunakan untuk domain tertentu yang disebut aplikasi berbasis web.

Anil Kumar
sumber
3

Saya baru saja mendengar DSL tetapi menemukan contoh yang sangat membantu: LUNA (bekas lunascript).

Ini adalah bahasa pemrograman / kerangka kerja yang dibuat oleh tim Asana untuk platform mereka sendiri.

Seperti yang saya temukan lebih lanjut, banyak perusahaan membuat kerangka kerja dan bahasa mereka sendiri untuk menciptakan keunggulan kompetitif yang tepat, beberapa contohnya adalah:

  • SAP dengan AbAp
  • PeopleSoft dengan PeopleCode
  • Apple dengan Objective-C
  • Facebook memiliki hal-hal seperti FBML dan FQL

Itu adalah domain khusus karena Anda akan menggunakannya hampir secara eksklusif untuk bekerja pada platform ini.

Saya harap jawaban ini membantu Anda memperjelas konsep tersebut.

Abraham Romero
sumber
3
Objective-C bukan bahasa khusus domain
boraseoksoon
Itu juga tidak dibuat oleh (dan untuk) Apple.
Alexander Rossa
2

Contoh DSL yang digunakan dalam Pembelajaran Mesin adalah patsy di python: https://patsy.readthedocs.io/en/latest/formulas.html#

yang didasarkan pada rumus DSL dari R: https://stat.ethz.ch/R-manual/R-devel/library/stats/html/formula.html

https://cran.r-project.org/web/packages/Formula/vignettes/Formula.pdf

dan Hadley memiliki bagian bagus dari buku R lanjutannya yang menjelaskan bagaimana membangun DSL w / R: http://adv-r.had.co.nz/dsl.html

Setelah bidang pembelajaran mendalam agak stabil (atau bahkan sekarang), saya ingin melihat sesuatu yang serupa muncul di dalam proyek Apache MXnet. Namun, saya belum melihat proposal untuk itu di halaman proposal .

Lucas Roberts
sumber
1

Bahasa khusus domain mengekspresikan proses dan pengetahuan domain Anda dalam bahasa yang secara langsung menggunakan konsep dan logika dari bidang khusus Anda.

Komunitas ini pasti tumbuh tetapi masih belum di tingkat teknologi "arus utama" lainnya.

Sebagian besar waktu, DSL dibuat untuk meningkatkan produktivitas di dalam perusahaan, jadi mereka merahasiakannya dan tidak membagikan hasil / wawasan mereka.

Berikut adalah konferensi dimana pembicara memberikan beberapa contoh DSL menggunakan JetBrains MPS , dengan teknologi pengeditan Proyeksi: https://vimeo.com/197381453

Oscar Rodriguez
sumber
1

DSL - bahasa khusus domain. Mari kita mulai apa itu domain - domain adalah area tertentu, cakupan. Domain ini dapat berupa tampilan situs web, dan Anda memiliki CSS untuk itu dan domain kedua dapat menjadi struktur situs web, dan di sini Anda memiliki HTML.

Tapi, domain juga bisa menjadi Aplikasi Perusahaan X. Dan dalam lingkup domain ini beberapa bahasa dapat dibuat. Bahasa tidak berarti - hal yang dibumbui sepenuhnya dengan gramma, sintaks, kompilator atau runtime sendiri. DSL bisa jadi hanya daftar alat yang memecahkan masalah domain.

Mari kita pertimbangkan OOP dan modelnya untuk merepresentasikan objek domain dengan kelas dan metode sebagai perilaku objek tersebut. Jika kita membuat struktur seperti itu, dan memberikan perilaku pada objek-objek ini, maka kita dapat menulis kode menggunakan konsep tersebut. Pertimbangkan contoh kode pseudo ini:

cookie = async getCookie(cookieId)
user = async getUser(userId)
result async user.buy(cookie)
if (result.isError()) {
  error.showAlert("User has not enough money")
} else {
  confirmation.showSuccess("Cookie was bought")
}

Berapa banyak dari GPL di atas (bahasa tujuan umum) dan berapa terminologi dan alat domain tertentu. Ini adalah campuran dari dua, tetapi semua perintah di sini khusus domain. Yang mengatakan kita dapat mengatakan bahwa di atas ditulis dalam DSL di mana domainnya adalah beberapa aplikasi x.

Ke depan dengan contoh ini saya dapat membuat alat yang lebih abstrak, dan sebagian besar melakukan aliran kontrol oleh alat tersebut, pertimbangkan (ini lebih banyak FP, tapi harap Anda mendapatkan apa yang saya maksud):

waitForMany(getCookie(cookieId), getUser(userId)
  .andThen([cookie, user] -> user.buy(cookie))
  .andThen(showSuccess("Cookie was bought"))
  .whenError(showError("User has not enough money"))

Seperti yang Anda lihat, saya dapat mengabstraksi cukup banyak dan menggunakan abstraksi ini untuk menjalankan aliran kontrol. Dan semuanya didasarkan pada GPL dan bekerja dalam lingkup GPL.

Untuk mengungkapkan kebenaran, kita semua menulis DSL, setiap abstraksi spesifik domain yang dapat Anda gunakan adalah jenis itu. Tetapi kebanyakan dari abstraksi tersebut bukanlah solusi yang lengkap, oleh karena itu kami tidak ingin terlalu sering menggunakan kata ini. Tetapi jika Anda memiliki seperangkat alat, fungsi yang mengabstraksi domain Anda, mereka membentuk DSL.

Apa itu DSL juga, banyak hal, misalnya kerangka kerja apa pun yang menyediakan seperangkat aturan adalah DSL. Jika Anda melihat seseorang mengklaim dia adalah pengembang React, maka Anda tahu dia adalah Pengembang Khusus Domain, karena React adalah DSL yang merupakan alternatif untuk menggunakan platform web asli. Jika Anda dapat membuat fungsionalitas dari alat khusus domain yang ada maka Anda menulis menggunakan DSL. Masuk lebih dalam di React, maaf semua orang bukan dari DSL: D ini, Anda dapat membuat sekumpulan komponen, dan menyusunnya sebagai blok penyusun, dan hurra!, Sekarang Anda membuat DSL di atas DSL.

Yap terlalu sering mengulang DSL di sini, maaf.

Maciej Sikora
sumber