Erstellen von DSLs in Java, Teil 1: Was ist eine domänenspezifische Sprache?

Wenn Sie jemals ein Makefile geschrieben oder eine Webseite mit CSS entworfen haben, sind Sie bereits auf eine DSL- oder domänenspezifische Sprache gestoßen. DSLs sind kleine, ausdrucksstarke Programmiersprachen, die speziell für bestimmte Aufgaben entwickelt wurden. In dieser vierteiligen Serie stellt Venkat Subramaniam das Konzept von DSLs vor und zeigt Ihnen schließlich, wie Sie sie mit Java erstellen. In diesem ersten Artikel erklärt Venkat, was ein DSL ist und definiert den Unterschied zwischen einem externen und einem internen DSL. Er weist dann auf einige DSLs hin, die Sie wahrscheinlich seit Jahren verwenden, vielleicht ohne es überhaupt zu merken.

Wenn Sie bereits geschrieben oder nur Anwendungen verwendet haben, sind Sie wahrscheinlich bereits auf domänenspezifische Sprachen oder DSLs gestoßen - auch wenn Sie dies zu diesem Zeitpunkt noch nicht bemerkt haben. Eine Schlüsselworteingabedatei für eine Anwendung, die Eingabedaten empfängt, ist DSL. Eine Konfigurationsdatei ist DSL. Ein Makefile ist ein DSL, mit dem Regeln und Abhängigkeiten zum Erstellen einer Anwendung angegeben werden. Wenn Sie eine dieser Sprachen geschrieben haben, haben Sie bereits Ihre ersten Schritte zum Erstellen domänenspezifischer Sprachen unternommen.

Das Wort Sprache in der Phrase können Sie führen eine DSL zu erwarten Syntax bestimmte Semantik auszudrücken verwenden würde. Im Gegensatz zu einer Allzwecksprache wie Java ist ein DSL in Umfang und Funktionen ziemlich begrenzt. Wie der Name schon sagt, konzentrieren sich DSLs stark auf eine bestimmte Art von Problem oder Domäne und darauf, eine enge Reihe von Lösungen im Kontext dieses begrenzten Umfangs auszudrücken. Und das ist gut so - DSLs sind einfach und prägnant.

Okay, das ist L; was ist mit D und S?

Das Wort Domäne in DSL bezieht sich auf "einen Bereich oder eine Sphäre des Wissens, Einflusses oder der Aktivität". (Weitere Informationen finden Sie unter Domain-Driven Design von Eric Evans.) Wenn Sie sich auf eine Domain konzentrieren, erhalten Sie einen Kontext - einen logischen Rahmen, in dem Sie Modelle für eine Anwendung entwickeln können.

Das in DSL spezifische Wort gibt Ihnen den begrenzten Kontext. Es hilft Ihnen, die Dinge relevant, konzentriert, knapp und ausdrucksstark zu halten.

Einfachheit ist entscheidend für den Erfolg eines DSL. Eine Person, die mit der Domäne der Sprache vertraut ist, muss sie leicht verstehen. Wenn Sie beispielsweise ein DSL erstellen, mit dem Versicherungsmathematiker Geschäftsregeln im Versicherungsbereich ausdrücken, möchten Sie nicht, dass sie viel Zeit damit verbringen, eine schwierige und komplizierte Sprache zu lernen. Sie möchten, dass sie sich darauf konzentrieren, die mit Versicherungsrisiken verbundenen Details so auszudrücken, dass sie leicht verstehen, diskutieren, weiterentwickeln und pflegen können. Das DSL, das Sie für sie erstellen, muss auf ihrem Wortschatz basieren, den Begriffen, die sie jeden Tag verwenden, um mit ihren Kollegen zu kommunizieren. Sie möchten, dass sie die von Ihnen bereitgestellte Syntax verwenden, aber es sollte ihnen so erscheinen, als würden sie lediglich einige diskrete Regeln angeben.Und sie sollten dazu in der Lage sein, ohne den Eindruck zu bekommen, dass sie wirklich programmieren oder sogar eine Art Sprache verwenden.

Das Erstellen eines guten DSL ist wie das Kochen einer nahrhaften Mahlzeit. So wie Sie möchten, dass Kinder Gemüse essen, ohne es zu bemerken und sich darum zu kümmern, möchten Sie, dass Kunden Ihr DSL verwenden, ohne sich um die Syntax zu kümmern.

Prägnanz ist ein weiterer Teil des Schreibens einer guten DSL, was bedeutet, dass Sie eine Syntax wählen, die sowohl knapp als auch ausdrucksstark ist. Die Knappheit innerhalb der Vernunft erleichtert das Lesen und Verwalten Ihres Codes. Ausdruckskraft fördert Kommunikation, Verständnis und Geschwindigkeit. Zum Beispiel ist jemand, der die Matrixmultiplikation versteht, matrixA.multiply(matrixB);weniger ausdrucksstark und prägnant als matrixA * matrixB. Ersteres beinhaltet das Aufrufen von Funktionen und die Verwendung von Klammern sowie ein einschüchterndes Semikolon. Letzteres ist bereits ein vertrauter Ausdruck.