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?
Jawaban:
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:
Ini dapat dianggap sebagai DSL dengan sintaks lisp. Fakta yang
html
bisa 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 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 :-)
sumber
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.
sumber
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).
sumber
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.
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.
sumber
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.
sumber