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 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(["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 :-)