Die Unterscheidung ist schwer zu treffen und hängt von der verwendeten Sprache ab. Es ist auch subjektiv.
In clojure können Sie APIs definieren, die wie DSL aussehen. Mit hiccup können Sie beispielsweise HTML generieren:
(html [:span {:class "foo"} "bar"])
Dies kann als DSL mit einer Lisp-Syntax betrachtet werden. Die Tatsache, dass es html
sich um ein Makro handeln könnte, gibt ihm die gleiche Leistung, als ob Sie eine HTML-Vorlagenbibliothek mit S-Ausdrücken schreiben würden (siehe sxml ).
In Python sieht dieselbe API möglicherweise folgendermaßen aus:
html(["span", {"class" : "foo"}, "bar"])
HTML ist eine Funktion. Das Argument wird zuerst ausgewertet, und dann wird der Funktionsaufruf ausgeführt. Die Tatsache, dass die Python-Syntax spezifischer ist und die Python-Semantik strenger ist, bedeutet, dass dieser Ausdruck als DSL unabhängig von der Sprache schwerer zu interpretieren ist.
Eine klassische Sprachdarstellung ist eine baumartige Datenstruktur und eine Bewertungsfunktion, die auf ihren Knoten rekursiv aufgerufen wird. LISP-Sprachen machen diese Baumstruktur sehr deutlich, sodass jeder verschachtelte Funktionsaufruf nicht von einer integrierten Sprachfunktion zu unterscheiden ist. Deshalb spricht die LISP-Community für fast alles über DSLs.
Ich glaube, beim Programmieren geht es darum, nützliche Abstraktionen bereitzustellen. Ich finde, dass es eine effektive Möglichkeit ist, die meisten Dinge zu entwerfen, wenn Sie alles, was Sie erstellen (eine Bibliothek oder sogar die Benutzeroberfläche Ihrer Anwendung), als Sprachelemente betrachten, die Menschen bei der Lösung eines komplexen Problems helfen. Mit dieser Perspektive behaupte ich, dass alle Bibliotheken DSLs sind, aber einige von ihnen sind schlecht gestaltet :-)