Kapan API dianggap DSL yang disematkan?

10

Apa perbedaan antara API dan Domain Specific Language (DSL) tertanam?

Apakah itu hanya sintaks?

Pertimbangkan API seperti OpenGL. Apa bedanya dengan grafis DSL?

Dengan kata lain, jika API cukup kompleks, dapatkah itu dianggap sebagai DSL yang disematkan?

Phyllostachys
sumber
1
Maksud dari DSL adalah untuk membuat segalanya lebih sederhana. Bukankah Anda seharusnya bertanya apakah API yang cukup sederhana dapat dianggap sebagai DSL?
Doval
Saya kira apa yang ingin saya ketahui / pahami adalah bagaimana API dan DSL dibedakan. Saya menempatkan kompleks di sana karena saya pikir ketika seseorang terus-menerus membuat panggilan ke API maka itu agak spesifik domain, atau setidaknya itulah yang awalnya saya pikirkan.
Phyllostachys
1
Pertanyaannya adalah apa perbedaan antara API dan DSL Tertanam ?
proskor

Jawaban:

8

Perbedaannya sulit dibuat, dan bergantung pada bahasa yang digunakan. Itu juga subyektif.

Di clojure, Anda dapat menentukan API yang terlihat seperti DSL. Sebagai contoh, cegukan memungkinkan Anda untuk menghasilkan html:

(html [:span {:class "foo"} "bar"])

Ini dapat dianggap sebagai DSL dengan sintaks lisp. Fakta yang htmlbisa menjadi makro memberikannya kekuatan yang sama seperti jika Anda menulis html templating lib dengan s-expressions (lihat sxml )

Dengan python, API yang sama mungkin terlihat seperti:

html(["span", {"class" : "foo"}, "bar"])

html adalah fungsi. Argumennya akan dievaluasi terlebih dahulu, dan kemudian pemanggilan fungsi akan terjadi. Fakta bahwa sintaksis python lebih spesifik, dan semantik python lebih ketat berarti bahwa ungkapan ini lebih sulit untuk ditafsirkan sebagai DSL yang independen dari bahasa.

Representasi bahasa klasik adalah struktur data seperti pohon dan fungsi eval yang disebut secara rekursif pada simpulnya. Bahasa LISP membuat struktur pohon ini sangat jelas, sehingga panggilan fungsi apa pun tidak dapat dibedakan dari fitur bahasa bawaan. Itulah mengapa komunitas LISP berbicara tentang DSL untuk hampir semua hal.

Saya percaya pemrograman adalah tentang memberikan abstraksi yang bermanfaat. Saya menemukan bahwa melihat semua yang Anda bangun (lib atau bahkan UI aplikasi Anda) sebagai elemen bahasa yang membantu orang untuk memecahkan masalah yang kompleks adalah cara yang efektif untuk merancang banyak hal. Dengan perspektif ini, saya menyatakan bahwa setiap perpustakaan adalah DSL, tetapi beberapa di antaranya dirancang dengan buruk :-)

Simon Bergot
sumber
4

API dan DSL adalah konsep yang sangat berbeda dan hanya ada beberapa area di mana mereka mungkin dikatakan tumpang tindih.

Semua DSL adalah bahasa komputer . Mereka mungkin ditafsirkan, dikompilasi, mark-up, bahasa query (misalnya SQL) atau (seperti JSON atau beberapa penggunaan XML) bahasa data yang mungkin digunakan dalam pesan yang melewati API, tetapi mereka harus bahasa . Istilah ini menggambarkan sifat , bukan tujuan.

API adalah antarmuka yang memungkinkan satu komponen perangkat lunak digunakan oleh komponen lain. Istilah ini menjelaskan tujuan , bukan sifat. API dapat berupa sekumpulan metode objek, misalnya - yang bukan DSL. API web mungkin menggunakan DSL (atau, jika nyala, Anda mungkin berpendapat bahwa itu adalah DSL) tetapi bahasa domain khusus yang dibagikan bukan bagian dari definisi. Driver perangkat lunak untuk perangkat dapat ditulis dalam C, API didistribusikan sebagai perpustakaan yang dikompilasi, protokol yang sepenuhnya biner dan bahasa apa pun yang dapat menggunakan perpustakaan dapat digunakan untuk membuat klien. Tidak ada dalam API yang bisa disebut DSL (daftar nama simbolis untuk fungsi API tidak memotongnya).

Saya agak bingung mengapa Anda hanya bisa melihat kesamaan, mengingat definisi.

itu otaknya
sumber
Sebagai komentator menunjukkan, saya pasti hanya mempertimbangkan DSL tertanam. Pertimbangkan sesuatu seperti Forth di mana seseorang membuat kamus kata-kata. Saya telah membaca bahwa membangun DSL sama seperti seseorang memiliki aplikasi lengkap fitur tetapi sepertinya sangat mirip dengan API.
Phyllostachys
2
Yang tidak benar-benar mempengaruhi jawaban saya. Jika itu adalah bahasa, dengan sintaksnya sendiri dll, itu adalah DSL. Antarmuka kompleks yang tidak memiliki fitur-fitur bahasa itu bukan DSL. Anda mungkin harus memperbarui pertanyaan Anda dan saya akan mempertimbangkan memperbarui jawaban saya.
bruce
2
Subbahasa masih merupakan bahasa. Tidak perlu memiliki sintaks "sendiri", ia dapat "meminjam" dari bahasa host.
proskor
Jadi bukankah semua proyek DSL mereka sendiri ketika mereka hampir selesai (yaitu bahasa pemrograman umum akhirnya DSL)? Suatu rangkaian dari umum ke spesifik domain.
Phyllostachys
4

Secara umum, tidak. DSL sengaja dibuat non-umum untuk tujuan membuat beberapa operasi lebih nyaman. Hal-hal seperti HTML atau Logo awalnya bahasa khusus domain.

Secara umum, Anda tidak dapat menanamkan DSL ke bahasa lain bahkan dengan API paling kuat; apa pun yang Anda programkan terhadap API itu akan tetap terlihat seperti serangkaian ekspresi dalam bahasa host dan tidak senyaman menggunakan bahasa tujuan khusus.

Pengecualian adalah bahasa yang memberikan peluang luar biasa untuk membengkokkan sintaks melalui pustaka (operator overloading seperti C ++, menciptakan operator baru seperti Scala, atau bahkan memprakarsai sintaks baca yang sama sekali berbeda seperti Perl dengan filter sumber). Ketika Anda menggunakan bahasa seperti itu dan mengambil keuntungan penuh dari fleksibilitas yang mereka tawarkan, maka hasilnya dapat terlihat seperti bahasa baru yang bertujuan khusus (tetapi semantiknya akan sedikit berbeda dari apa yang Anda harapkan jika bahasa itu benar - benar diciptakan dari bawah ke atas untuk melayani tujuan Anda).

Kilian Foth
sumber
Jadi mungkin seseorang dapat membuat sesuatu yang mem-parsing string (DSL) yang bertindak sebagai pembungkus sederhana untuk API besar. Saya kira pemisahan DSL dari hal yang mem-parsing DSL adalah diferensiasi.
Phyllostachys
3
Ya, itu disebut pola desain "Juru Bahasa", dan ini dianggap praktik yang baik: Anda menulis kode juru bahasa sekali, dan sejak saat itu Anda dapat mengekspresikan konten spesifik domain Anda dengan lebih mudah.
Kilian Foth
"Menemukan operator baru seperti Groovy" Mungkin maksudmu Scala; di Groovy set operator diperbaiki tetapi dapat kelebihan beban seperti di C ++.
Vorg van Geir
@VorgvanGeir Maaf, sudah diperbaiki.
Kilian Foth
2

Di sini, dari DslBoundary oleh Martin Fowler

Dari artikel tersebut, pengertian saya pada dasarnya adalah DSL dan API yang tertanam tidak begitu berbeda. Namun, ada sedikit perbedaan di sini.

  1. API menekankan pada penyediaan fasilitas baru.
  2. DSL tidak hanya memberi Anda fasilitas baru tetapi juga memberi Anda sintaks baru dan cara baru untuk pengkodean.

Tetapi jika berbicara tentang DSL eksternal itu akan menjadi cerita lain. DSL eksternal seperti bahasa pemrograman kecil tapi yang pasti, itu bukan bahasa tujuan umum yang berarti tidak bisa menyelesaikan semua masalah tetapi masalah khusus.

fronthem
sumber
1

Saya pikir setiap API adalah DSL yang disematkan tetapi sebaliknya tidak benar: tidak setiap DSL yang disematkan adalah API. Hanya ketika bahasa digunakan sebagai sarana untuk mengintegrasikan komponen-komponen itu dapat disebut API.

Mengapa API dapat dianggap sebagai DSL yang disematkan? Pertama-tama, ia membentuk bahasa: ia memiliki elemen primitif (tipe dan operasi) yang dapat digabungkan (dengan menggunakan bahasa host) untuk membentuk abstraksi dan memecahkan masalah yang kompleks. Misalnya, OpenGL API dapat digunakan untuk membuat adegan 3D secara real-time. API Koleksi dapat digunakan untuk membuat algoritme yang beroperasi pada set objek, dll. Kedua, ini jelas merupakan domain spesifik; misalnya, domain API Koleksi menangani set objek, dan domain API OpenGL adalah rendering 3D. Karenanya API adalah bahasa khusus domain.

Tetapi tidak setiap DSL adalah API. Misalnya, beberapa DSL tidak diimplementasikan oleh komponen yang ditunjuk. Semua sistem mendefinisikan beberapa abstraksi, dan abstraksi yang berhubungan dengan beberapa domain tertentu dapat dianggap sebagai DSL, tetapi itu tidak menyiratkan bahwa implementasi abstraksi ini harus "swappable", dengan kata lain, mereka tidak harus membentuk API. . Mereka bisa, tetapi itu tidak selalu perlu. Namun, dalam kasus-kasus ketika implementasinya "terprogram" (maaf karena tidak ada istilah yang lebih baik), DSL memang menjadi API.

proskor
sumber
Apakah ini hanya pendapat Anda atau Anda dapat mendukungnya?
nyamuk
@gnat, saya memperpanjang jawaban saya untuk menjelaskan poin saya lebih jauh.
proskor