Im Kapitel 12 dieser Lehrveranstaltung beschäftigen wir uns mit einem sehr wirksamen und
sehr erfolgreichen Anwendungsgebiet von Modellen, nämlich zur Entwicklung domänspezifischer Sprachen.
Wir fangen an, es gibt wie üblich Fragen zur Wiederholung.
Es gibt zu diesem Kapitel im Lehrbuch, das wir für die Lehrveranstaltung verwenden,
leider keinen als Artikel dazu oder keinen Absatz dazu.
Stattdessen möchte sie verweisen auf einen Artikel von Herrn Frank,
der darüber spricht, wie man domänspezifische Sprachen entwickelt.
Markus Völter, ein sehr bekannter Experte für modellbasierte Entwicklung,
hat ein Buch über das Bauen von DSLs geschrieben und dann
gibt es noch von Martin Fauler ein Buch zu Domain-spezifischen Sprachen.
Außerdem, wie man mit Eclipse-Modelldomin-spezifische Sprachen bauen kann,
einige Kapitel in einem Buch mit Anwenderhilfen
Und dieses When and How ist auch ganz interessant zu sehen.
Und als letztes etwas, was wir auch in einem Übungsbeispiel verwenden können,
nämlich wie man mit X-Text und Extent solche Sprachen baut.
Das müssen Sie nicht alles gelesen haben, aber es sollte,
Sie sollten wissen, wohin kann es weitergehen,
nach diesen doch eher kurzen Abschnittenausführungen als Teil dieser Lehrveranstaltung.
Lassen Sie uns damit beginnen, was eigentlich eine DSL ist,
was eine DSL ausmacht. Also eine DSL,
ein Domain-spezifische Sprache, ist eben eine Modellierungs- oder Programmiersprache,
die sich auf eine Domäne bezieht
Auf eine Domäne bezieht sie sich vor allen Dingen dadurch,
dass sie eben Abstraktionen und Notationen für diese Konzepte der Domäne bringt.
Konzept heißt ja, steht ja auch für Begriff,
also die Begrifflichkeiten, die Abstraktionen der dieser Anwendungsdomäne,
dieses Anwendungsgebietes werden hier aufbereitet.
Und zwar so, dass sie von den speziellen Leuten,
die damit arbeiten sollen, gut verstanden und gut benutzt werden können.
Ja, also zwei spezifische Sachen unterscheiden sie sich jetzt schon
bei diesen ersten paar Sätzen von einer Programmiersprache.
Sie sind für einen Expertin aus einem Anwendungsgebiet gedacht und
sie konzentrieren sich auf Dinge dieses Anwendungsgebietes
Gegenüber normalen Programmiersprachen haben sie deswegen typischerweise ein höheres Abstraktionsniveau,
was die Fachlichkeit betrifft. Das heißt, einzelne Elemente dieser
Sprache sind leistungsfähiger, können mehr tun, als man,
wenn man das zusammensetzen würde, aus Elementen einer universellen Programmiersprache.
Und diese Begriffsmenge, diese Ausdrucksmenge, diese Abstraktionen,
kann man durchaus auch als Domänen vokabular bezeichnen, machen manche Leute,
also es sind eine Menge von sprachlichen Ausdrücken und die bedeuten,
beziehen sich zusammen, die bilden zusammen letztlich eine Möglichkeit,
etwas zu beschreiben, eine Grammatik.
Und wir hatten schon im Abschnitt Meta-Modell darüber gesprochen,
Grammatik und Meta-Modell ist so ungefähr das Gleiche.
Also diese, wir haben hier ein Meta-Modell der Doomänenkonzepte,
die wir halt für diese Aufgabestellung brauchen.
Die haben eine Syntax, die haben Beziehungen zwischeneinander, Konstrenz,
das ist der Kern. Und es gibt natürlich eine Semantik,
die muss formal definiert sein. Das ist ganz wichtig,
damit sie ausgeführt werden kann von irgendwelchen Werkzeugen.
Intuitiv sollte sie trotzdem sein, damit sie von Anwendern,
nämlich von diesen Stakeholdern gut verstanden wird
Ganz häufig kann man sie in irgendeiner Form auf eine Implementierung abbilden.
Es gibt natürlich auch domänspezifische Sprachen,
die nicht wirklich Implementierung, eine Implementierung dahinter haben.
Wir werden gleich noch ein paar Beispiele bringen. Aber zunächst erstmal,
wir werden ganz viele sehen, die eine Implementierung haben.
Lassen Sie mich erst kurz was zu dem Begriff Domäne sagen.
Eine von den Worten, mit denen Informatiker ganz viel zu tun haben.
Und ich habe immer ein bisschen den Verdacht,
dass einige von den Leuten, die den Begriff gerne benutzen,
nur eine unscharfe Vorstellung davon haben.
Also wo kommt der Begriff her? Er kommt aus dem zunächst zu uns,
also ins Deutschen aus dem französischen Domain,
Domin und die haben es, die Franzosen haben es von den Römern,
Dominum und das war der Herrschaftsbereich.
Ja, also es gibt auch im Feudalismus die Domäne,
das ist ein Herrschaftsbereich, eine bestimmte Landfläche oder das,
was zu einem Kloster oder so etwas gehört.
Wir benutzen den Begriff für ein abgeschlossenes Wissens- oder Interessengebiet und
dieses Interessen- oder Wissensgebiet ist häufig dadurch gekennzeichnet,
dass es sich von anderen dadurch unterscheidet.
Zum Beispiel, dass man eigene Gebräuche hat,
eigene Sachen, die man dort als üblich bezeichnet.
Dieses üblich können sprachliche Ausdrücke sein,
es können aber auch Lösungsschemata sein oder bestimmte Formalismen,
wie man etwas ausdrückt
Man kann so eine Domäne bezogen, beziehen auf etwas.
Also zum Beispiel auf dieses Wissens oder Interessengebiet kann auch eine
Fragestellung sein. Oder gibt es zum Beispiel technische Bezüge,
man könnte es beziehen auf eine Architektur, auf Persistenz,
auf ein bestimmtes Kommunikationsprotokoll, so etwas könnte man beziehen.
Aber man könnte auch Sachen aus dem Leben nehmen,
aus dem täglichen Leben oder hier aus geschäftlichen Dingen,
wie zum Beispiel Versicherungen, Banken, Logistik,
sind hier Beispiele, aber man könnte auch etwas denken,
wie funktioniert eine Energieverteilung in einem Land,
so etwas wäre denkbar
Der Begriff taucht ganz häufig für Softwareentwicklung im Zusammenhang als Anwendungsdomäne
auf und Anwendungstourmäne einer Software, beschreibt dann den Einsatzbereich einer Software.
Das ist auch nicht wirklich unterschiedlich von dem,
was wir hier oben hatten, Interessensgebiet.
So, soweit, was die Domäne in der sodomänisch-spezifischen Sprache
ist und nun mit zu einigen Eigenschaften von DSLs.
DSLs sollten dazu geeignet sein,
präzise und knappe
Ausdrücke zu formulieren
Deswegen auch dieser, wo wir hatten zwei Folien vorher,
von einem hohen Abstraktionsgrad gesprochen.
Und deswegen brauche ich nicht so viel. Deswegen ist das
auch knapp, was wir ausdrücken. Alle Sachen,
die man, die sich selbstverständlich sind und die sich daraus ableiten,
die drückt man da nicht aus, die werden dann generiert.
Die kommen dann einfach so mit. Wir hatten eben schon gesagt,
dass wir eine Syntax- und Semantik brauchen und wegen dieser formalen
Syntax- und Semantik ist das Ganze dann auswertbar mit Tools.
Oder wir haben die formale Syntax- und Semantik,
damit wir es auswerten können mit Tools. Und diese Tools,
da geht es also um welche für Analyse,
für Transformation, für Generation,
für Interpretation
Meistens handelt es sich nicht um Programmiersprachen im Sinne von Thuringen
vollständig, die ich also auch bearbeiten durchführen kann.
Und meistens sind sie auch nicht für Ausführungen, sondern ganz häufig sind es deklarative Sprachen.
Also die Sachverhalte beschreiben und nicht, wie ich da hinkomme.
Aus Sicht des Anwenders der Sprache,
also nicht des Anwenders der Software-Systems, dessenjenigen,
der mit der Sprache etwas macht, der Sprachverwende,
zwei Folien vorher hieß das Stakeholder,
sollte sich das Ganze eher wie eine Sprache anfühlen.
Ich sollte also in der Möglichkeit haben,
einen Ausdruck zu formulieren
Oder ein Zustand oder eine Tätigkeit oder so etwas, ein Ablauf.
Und weniger wie ein Programmierinterface, wo ich befehle,
absetze oder so etwas. Dann möchte ich noch sagen,
dass dir jetzt Els selten etwas komplett beschreiben,
also selten so etwas wie ein komplettes System,
sondern eher ein einzelner Aspekt, eine einzelne Sicht.
Wir hatten eben zum Beispiel Persistenz. Ja,
sie beschreibt eben nur die Persistenz,
nur wie Daten dauerhaft abgelegt werden und nicht die ganzen
anderen Aspekte und für die Datenorganisationen und für die Workflows
habe ich vielleicht eine separate DSL.
Deswegen sollten DSLs auch integrierbar sein. Das ist auch ein
wichtiger Punkt
Also all das sind schon Antworten auf die erste Frage,
charakterisieren Sie eine DSL. So,
dann habe ich eine ganze Menge schon dazu gesagt,
was in der DSL ist, was sie für Eigenschaften hat,
nun möchte ich Ihnen mit ein paar Beispielen das untermauern.
Diese Beispiele habe ich hier zusammengetragen aus verschiedenen Werken.
Ich fange mal damit an, mit etwas,
was sie hoffentlich schon irgendwann in ihrem Studium kennengelernt haben,
BNF, die Bacos Nower Form,
ich schreibe das nochmal mit dazu
Das ist eine Grammatikbeschreibung. Da kann ich beschreiben,
okay, das ist ein Term, das ist ein Terminalsymbol,
das kann wiederholt werden, das führt zur Einleitung eines Ausdrucks,
dass zum Ende eines Ausdrucks so sieht,
zum Beispiel wird man in der Programmiersprache eine Zuweisung formulieren.
Also das ist für alle Dinge geeignet, die irgendwie textlich sind.
Ja, und dafür ist, kann ich die Syntax hier angeben.
Ich habe ja in der Spalte Level aus den verschiedenen Arbeiten zusammengetragen,
wie viele Versionen, wie weit ist das schon entwickelt.
Bei der Parkus Nower Form ist das nicht wirklich bekannt. Ich denke,
das hat einer entwickelt und das ist die definierte Markus-Nauer-Form,
ob es da mehrere gab, weiß ich nicht.
Bei den anderen können wir ungefähr ablesen, wie weit die Entwicklung schon gekommen ist.
Wer mit Unix zu tun hat und Linux,
der hat auf jeden Fall von Yak schon gehört.
Yak, Yak, er heißt Andros gekürzt. Yeat another
compiler compiler. Das ist ein Spracherzeugungswerkzeug und damit kann ich
auch Sprachen beschreiben. Also so ähnlich wie mit der BNF,
ich eine Grammatik beschreiben kann,
also sie können die Sprache Java auf seinem bestimmten Level mit BNF beschreiben,
aber auch mit der Syntax von Jack und Jack
kann ihnen dann ein Compiler für diese Sprache daraus generieren.
Das ist der Sinn, dieses sehr mächtigen Werkzeugs-Jack, eigene Sprachen zu definieren.
Und damit, davon gibt es ungefähr 30 Weiterentwicklungsstufe.
Also sie können sagen, es ist schon sehr reif.
Etwas, was auch nicht Informatiker kennen, Excel.
Excel ist eine Form mit Spreadsheets. Spreadsheet heißt diese Technik
darunter, wo Datenformeln über Felder hinweg verbunden sind.
Und das Diese Excel ist eine Form, kann man durchaus
als DSL bezeichnen, wo ich die Spreadsheet-Ausdrucksweise verwenden kann.
HTML ist auf jeden Fall eine Sprache,
da wird es soweit wird, steht ja Älteren für Language.
Und was kann ich damit ausdrücken? Textseiten mit links.
Das hat den Namen Hypertext. Zusätzlich ist noch ganz viel
dazugekommen, um daraus eine Webseite zu machen.
Das hat auch schon eine lange Geschichte hinter sich.
Leitech kennen die meisten von ihnen als Textverarbeitungssystem,
was vorrangig in der Wissenschaft, in der Naturwissenschaften vor allen Dingen,
ist, mit besonderen Stärken Richtung Formeln und ein paar Schwächen,
wenn sie zum Beispiel meine Tabelle oder eine Grafik darstellen wollen.
Und ich kann damit das Aussehen einer Druckseite beschreiben.
Make kennen Sie auch alle vermutlich, hoffentlich, ja,
da das Bauen von Softwaresystemen mit kompilieren, linken,
Quellcode packetieren, ist da dabei.
Mattlab hatten wir hier schon in dieser Lehrveranstaltung, ist eine Sprache für technisches Rechnen.
Sequel Die Sprache für relationale Datenbanksysteme, da kann ich Abfragen damit machen.
Es gibt noch weitere Sprachen daran, zur Manipulation von Datenstrukturen,
die heißen dann nicht SQL, sondern ein bisschen anders.
VHTL, very high, definitiv, very high data.
Jedenfalls Hardware Description Language heißt das HDL. So,
Workflows, Spacification in Description, Language, Work, WSDL.
Also diese VHDL erlaubt ihnen Schaltkreise,
elektrische Schaltkreise zu beschreiben bis dahin, wie ein Verstärker aussieht,
sogar zu speziellen Effekten, wie der Verstärker rauscht,
wie er sich bei Temperatur entwickelt oder so etwas.
Sie können daraus ein Radio beschreiben und das entsprechend Simulationswerkzeugen,
können Sie das direkt zum UKW-Empfang benutzen.
Also es gibt da hinter verschiedenen dieser Sprachen etwas Ausführbares.
Hinter der BNF gibt es vielleicht wenigstens Werkzeuge, die eine Grammatik prüfen können.
Ja, kursiv geschrieben hier und runter um noch etwas im
Gegensatz zu haben. Java wäre eine Allzwecksprache,
keine Domänenspezifische Sprache
Nur zum Vergleich hier, wir sind mittlerweile sogar bei Version
11, glaube ich, bei da war.
Ich bin gar nicht sicher, wie weit das mittlerweile gegangen ist.
Aber wir haben auf jeden Fall hier auch schon eine Reife,
aber das wäre jetzt eine andere Sprach-Kategorie, würde nicht zu DSLs gehören.
Wir jemanden in dieser Lehrveranstaltung möchte ich Sie ein bisschen mit diesem,
mit der Entwicklung solcher Modelle und Modelle- und Modellierungssprachen vertraut machen, darauf bringen.
Und dazu möchte ich einen Rückzug, Rückbezug machen zu dem,
was wir ganz zu Anfang gesagt hatten.
Wie entwickle ich ein Modell? Und nun,
wie entwickle ich daraus eine Modellierungssprache, nämlich diese domänspezifische Sprache
Zunächst können wir sagen, es gibt drei Phasen,
finden wir viel in der Literatur, Domänenanalyse, Domänen, Design, Domänen, Implementierung.
Die Leute, die sich so ein bisschen anlehnen an Anforderungsanalyse, Systemdesign, Systemimplementierung. Dieses Domänenanalyse ist das,
was wir hier in dem ersten Punkt haben,
wir müssen zunächst die Ziele analysieren, analysieren,
was ist dieses Anwendungsgebiet, dieses Wissensgebiet, diese Domäne,
ja, und dann dieses Domänen-Vakupvokabular herausarbeiten,
was gehört für uns dazu, wenn wir für Präsistenzreber,
Persistente, Datenspeicherung, müssen wir ermitteln,
was ist dabei wichtig,
was muss man beschreiben
Diese Begriffe, die Struktur, und das könnten wir durchaus ausdrücken,
als Entitäten einer Sprache oder was sind Komponenten, ja,
was sind Handlungsschritte, die ich da mache, Aktivitäten.
Dann, was ist dort alles anzupassen? Ja,
was muss ich, was brauche ich in jedem System,
was muss ich unbedingt beschreiben oder in jeder dieser Kategorien?
Was wäre optional? Ich könnte das mit der Hilfe
eines Feature-Modells machen, diejenigen, die von Ihnen,
die schon mit Produktlinien zu tun haben, wissen,
dass dieses Feature-Modell ist.
Für die anderen ist es nur ein Querverweis,
sie müssen das nicht sich merken hier
Wir haben verschiedene Möglichkeiten, das auszudrücken. Welche davon sind in die Anwendungsdomäne?
Auch das wollen wir analysieren. Welche sind da akzeptabel?
Können wir es grafisch machen? Können wir textuell das machen,
was davon würde, akzeptiert von den Fachleuten?
Und was müssen wir in eine solche Sprache hineinnehmen?
Was sollten wir weglassen? Dieses Scoping,
also wir sollten ganz klar abgrenzen, das nehmen wir,
wird für unsere Sprache unterstützt, das nicht,
weil wenn es zu mächtig wird, kostet es zu viel Aufwand.
Und was sind die Qualitätsattribute, die ein System haben soll,
was von dieser Sprache unterstützt wird, die Implementierung ist,
worauf kommt es an, wann ist das wichtig?
Da muss ich portierbar sein, werkzeugunabhängig sein oder darf es
auch an einem kompletten Werkzeug erkennen? Oder was ist denn der,
was kann und macht der Power-User, also der Name für den Nutzer,
der wirklich alles braucht, aber eigentlich kein Informatiker ist?
Was kann der akzeptieren, was kann der für Ausdrucksformen, kann damit damit arbeiten?
Nachdem wir das alles analysiert haben und das ist viel,
da müssen wir die Domäne genau kennenlernen und wir sagen,
Versicherungsdomäne müssten wir halt die Begriffe der Versicherungs-,
die fachlichen Begriffe, die Strukturen, die Datenstrukturen,
die Abläufe,
alle sowas,
das müssten wir
alles erfassen
Würden wir versuchen, das zu formalisieren.
Und das wäre der Schritt zwei, das wäre hier Domändesign.
Wir würden zunächst erst mal versuchen, ein Meta-Modell zu entwickeln.
Meta-Modell, wissen Sie, ist eine Grammatik, wird am Ende
die Grammatik der Sprache sein. Wir brauchen eine abstrakte Syntax,
also welche Modellelemente gibt es überhaupt,
wie stehen die zueinander in Beziehungen und was bedeuten die,
was gibt es für Regeln, was ist gültig und nicht,
das wäre die statische Semantik und das können wir gut durch Constraints ausdrücken.
Wenn ich das habe, muss ich aber auch das haben
und davon kann es maximal drei geben oder irgend so etwas
Nachdem ich soweit den Sprachvorrat beschrieben und formalisiert habe,
muss ich mich jetzt entscheiden,
das ist auch immer noch Design hier, wie implementiere ich das?
Und da muss ich Design, Entscheidungen treffen. Darüber,
wenn wir jetzt in dieser Veranstaltung noch was sagen,
ich muss intern extern, grafisch textuell, welche Plattform,
welche Werkzeuge diese Implementierungsentscheidungen muss ich machen.
Und dann davon abhängig muss ich eine konkrete Syntax entwickeln.
Die hätten mir erstmal eine abstrakte Syntax,
welche Elemente gibt es und wie drücke ich diese Elemente aus,
mit was für grafischen Elementen oder mit was für Schlüssel
wird und wenn es eine Textuelle ist
Implementiere ich das Ganze. Das heißt,
es ist hier gerade in dem Punkt 5 zusammengefasst,
in Werkzeugen oder indem ich die generieren lasse, von Generatoren.
Soweit erstmal, wie wir insgesamt vorgehen, wie gesagt,
drei große Schritte. Der erste Schritt ist das,
was hier eins heißt, der Schritt Domain Design ist 2,
3 und 4 und der Schritt 5 wäre dann das,
was Implementierung ist. Lassen Sie uns anfangen damit,
was ist über die Art der Technologie zu sprechen.
Ich sage kaum etwas, hier von dazu.
Wir kommen gleich noch mal zu einem Beispiel,
aber ich möchte erst mal gegenüberstellen,
was wir hier mit diesen verschiedenen Technologien und Technologieentscheidungen und Permentierungsentscheidungen meinen.
Zunächst erst mal kurze Erläuterung, was intern, extern bedeutet.
Internet DSL bedeutet, dass wir eine andere Sprache nutzen,
um das auszudrücken, was unsere DSL machen soll.
Man kann auch durchaus sagen, das ist eine Wirtssprache,
die ist unser Wirt,
wo wir uns daran einnisten,
wo wir
das Ganze einbetten
Man kann das ganz gut machen, in dynamisch getypten Sprachen,
Ruby und Lizb sind hier Beispiele,
das hat man schon seit vielen Jahren dafür benutzt.
Ruby ist da eher neu. Und es ist vergleichbar mit
einer Bibliothek dieser Sprache. Also wir haben Hochsprachelemente,
die diesen höheren Abstraktionsgrad darstellen, die dann sagen,
das ist für eine Versicherung das und das.
Und das ist die und die Tätigkeit oder so etwas.
Und damit sozusagen eigentlich ein Sprachkonstrukt auf höherer Ebene darstellen.
Und das sieht dann am Ende gar nicht mehr so aus
wie diese basissprachige Hostsprache
Und ich kann damit, dass die Werkzeuge nutzen,
die die Sprache sowieso mitbringt. Weitere Toolunterstützung brauche ich nicht.
Und das würde ich aber eher machen für kleine Anwendungen.
Wenn ich nicht so viel Arbeit investieren möchte,
wenn sich das eher mal ändert, wenn ich schneller zum Erfolg kommen möchte,
insgesamt nicht so eine hohe Komplexität habe.
Ist natürlich dadurch gekennzeichnet, dass wir hier diese Hostsprache wird immer mal durchschauen.
Wenn wir uns vorstellen, Java als Hostsprache zu nehmen,
ja, da wird es schon mal eine geschweifte Klammer geben.
Und wenn wir natürlich jetzt nicht Techniker haben,
die bei einer geschweiften Klammer gleich Panik kriegen und wissen und ich weiß nicht,
was das hier ist und programmieren wollte ich nie machen,
dann ist das vielleicht keine gute Idee,
so eine Hostsprache zu nehmen,
die da irgendwann wieder durchschaut
Das Gegenteil zu dieser internen DSL, die also eingebaut in
eine andere Sprache ist, ist die externe DSL.
Das ist eine Sprache, die man von Grund auf selbst
baut und unabhängig deswegen von anderen Sprachen. Wir sind völlig frei,
wir müssen uns nicht an die Konvention einer Programmiersprache dran hängen,
aber wir brauchen eigene Werkzeuge, insbesondere brauchen wir einen eigenen Parser,
der dieses, der das übersetzt.
Wir sind dabei hier gleich bei der Beantworten gleich die Frage drei,
wodurch unterscheiden sich interne und externe DSLs
Wir haben jetzt die Frage 2, ein bisschen Übergang,
da komme ich da nochmal drauf,
das bezieht sich im Wesentlichen auf Turminenanalyse, Domänendesign.
So, soweit zu den externen und internen DSLs,
intern bedeutet ja, wir basieren auf etwas.
Das hat auch etwas mit Wiederverwendung zu tun. Ja,
ich benutze eine Sprache, ich benutze die ganzen Werkzeuge,
um daraus etwas mehr zu machen. Und ein bisschen einen
ähnlichen Ansatz wäre die Unterscheidung, ob ich etwas neu entwickle oder weiterentwickle.
Ich könnte zum Beispiel die Sprache aus einer Basissprache nutzen,
indem ich sage, okay,
ich baue das auf auf der Sprache, die ich schon habe,
das könnte in so eine interne Sprache sein,
so eine Hostsprache, und ich erweitere die.
Und habe damit zusätzliche Sprachelemente, das wäre hier das Erste,
oder zusätzliche syntaktische Elemente, die der Interpreter und Compiler nützt,
oder mit denen er gesteuert wird.
Oder ich könnte auch die Sprachmittel ausschalten,
die mich besonders stören, die dann etwas erlauben,
was ich eigentlich nicht mehr möchte,
damit es nicht mehr die Programmiersprache ist,
sondern die DSL
Das kann ich natürlich auch miteinander kombinieren, diese drei Sachen.
Wenn ich die Sprache neu baue, das wäre ja diese externe DSL,
dann muss ich natürlich auch einen Compiler unter Interpreter bauen.
Das wäre ein hoher Aufwand. Ich kann damit
wenig wiederverwenden, außer ich habe einen Parser-Generator.
Und da ich nicht auf etwas vorhandenem aufbaue,
muss ich auch schauen, was kann ich damit,
was muss ich mit der DSL Richtung Fehleranalyse Richtung Optimierung machen.
Es ist nicht nur möglich, es ist auch notwendig,
dass ich dann diese Sprache korrekt formuliere,
dass ich keine Widersprüche zulasse in meiner Sprachdefinition und dass ich nichts Undefiniertes habe.
Ich könnte natürlich auch Komponenten verwenden. Das wäre auch wieder
etwas von Wiederverwendung. Und ich könnte zum Beispiel eine Makrosprache verwenden,
die Dinge aufruft, zusammenbaut, die es schon irgendwo gibt.
Visual Basic in dem Microsoft Office-Paket Visual Basic for Applications
war immer so eine Makrosprache mit teilweise über die Jahre
etwas unterschiedlichen Konzepten