• Keine Ergebnisse gefunden

Sprachen im Rahmen der Softwareentwicklung

2.3.1 Aufbau einer Sprache

Jede nat¨urliche Sprache besteht aus S¨atzen. Jeder Satz ist nach bestimmten Regeln aufgebaut, die durch Worte, deren Bedeutung und die Grammatik dieser Sprache vor-gegeben sind.

Analog verh¨alt es sich mit den Sprachen der Softwareentwicklung. Um mit einer Spra-che modellgetrieben entwickeln zu k¨onnen, gibt man f¨unf Schichten zur Definition der Sprache an. Dabei spielt es nur bedingt eine Rolle, ob diese Sprache grafisch oder tex-tuell ist. Die Schichten werden im Folgenden vorgestellt und sind in Abbildung 2.3 dargestellt. Dabei werden zun¨achst nur die Sechsecke, welche die Sprachdefinition re-pr¨asentieren und die erl¨auternden, kursiven Texte betrachtet. Die weiteren Bestandteile der Abbildung dienen der Einordnung einer Sprache in die Modellierung und werden in Abschnitt 2.3.2 erkl¨art. Grunds¨atzlich ist jeder Sprache eine eigene Syntax und eine

Konkrete

Abbildung 2.3: Definition einer Sprache und deren Einordnung in die Modellierung

eigene Semantik zugeordnet. Beide lassen sich, wie folgt, weiter aufspalten.

Die lexikalische Syntax gibt die lexikalischen Elemente einer Sprache vor, beispiels-weise Schl¨usselw¨orter einer Sprache. Dabei werden die einzelnen lexikalischen Ele-mente auf ihre Validit¨at gepr¨uft. Die lexikalische Syntax wird oft durch regul¨are Ausdr¨ucke dargestellt.

Die konkrete Syntax beschreibt das tats¨achliche Aussehen einer Sprache. Durch sie entscheidet sich, ob die Sprache textuell oder grafisch gestaltet wird. Die konkrete Syntax wird im textuellen Fall meist durch kontextfreie Grammatiken festgelegt.

Im Falle einer grafischen Sprache werden oft Beispieldiagramme genutzt.

Die abstrakte Syntax abstrahiert die konkrete Syntax. Dabei werden konkrete Schl¨ us-selw¨orter eliminiert und damit nur noch die Konzepte erhalten. Demnach k¨onnen beliebig viele konkrete Syntaxen zu einer abstrakten Syntax definiert werden. Die abstrakte Syntax wird im textuellen Fall durch Baumgrammatiken oder Klassen-diagramme festgelegt. Grafisch sind mehrheitlich KlassenKlassen-diagramme zur Definition m¨oglich.

Die kontextsensitive Syntax, auch statische Semantik genannt, legt Bedingungen an

die Wohlgeformtheit der Sprache fest. Diese Bedingungen werden auch Constraints genannt. Sie werden gegen die abstrakte Syntax definiert und sind somit von ihr abh¨angig. Die kontextsensitive Syntax wird oft mittels Attributgrammatiken oder OCL-Ausdr¨ucken vorgegeben. Diese werden in der Object Constraint Langua-ge (OCL) formuliert.1 Man spricht in diesem Zusammenhang auch von kontext-sensitiver Korrektheit einer Sprache.

Die dynamische Semantik definiert das Verhalten des Programms zur Laufzeit. Sie ist optional. Sobald jedoch eine dynamische Semantik existiert, ist die Sprache ausf¨uhrbar. Die dynamische Semantik wird durch eine Funktionssemantik (deno-tationelle Semantik), durch eine operationale Spezifikation oder durch einen Text, geschrieben in einer nat¨urlichen Sprache, festgelegt.

Nach dieser Definition stellt sich die Frage, wann ein Ausdruck, also ein programmier-sprachlicher Satz, als

”zu einer Sprache geh¨orig“ eingestuft werden kann. Dazu muss dieser syntaktisch korrekt sein. Ist eine dynamische Semantik definiert, muss er auch dieser gen¨ugen.

2.3.2 Einordnung einer Sprache in die Modellierung

Im vorangegangenen Abschnitt wurde gezeigt, wie eine Sprache definiert wird. Davon ausgehend werden in diesem Abschnitt Parallelen zu Modellen gezogen. Abbildung 2.3 zeigt, wie im vorangegangenen Abschnitt besprochen, die einzelnen Ebenen der Sprach-definition. Zudem sind die zugeh¨origen Modellebenen farblich markiert. Diese werden hier gesondert besprochen. Dabei dient [72] als Literaturquelle.

Die abstrakte Syntax enth¨alt die Konzepte der Sprache. Im Sinne der Modellierung sind die Konzepte im Metamodell angesiedelt. Damit entspricht die abstrakte Syntax den Metamodellelementen und ihren Beziehungen untereinander. Um den Begriff des Metamodells vollst¨andig auf eine Sprache abzubilden, fehlt die Komponente der Bedin-gungen. Diese findet sich in der kontextsensitiven Syntax, da sie Bedingungen an die Wohlgeformtheit der Modelle festlegt. Die Bedingungen werden an die Elemente des Metamodells und deren Beziehungen definiert. Sie sind damit Bedingungen an das Mo-dell und dienen insbesondere der Vermeidung von MoMo-dellierungsfehlern. Ein typischer Vertreter unter den Modellierungssprachen sind OCL-Bedingungen, die mit Hilfe von Metamodellelementen deklariert werden. Zusammengefasst gilt demnach:

Die abstrakte und die kontextsensitive Syntax bilden das Metamodell der Sprache.

Die konkrete Syntax dient als

”konkrete Auspr¨agung der textuellen oder grafischen Konstrukte, mit denen modelliert wird“[72]. Sie bildet die Schnittstelle zum Modellierer, indem sie ihm die zur Verf¨ugung stehenden Konstrukte vorgibt. Diese Konstrukte sind in der Modellierung im Modell angesiedelt. Damit kann folgende Parallele gezogen werden:

Die konkrete Syntax entspricht der Repr¨asentation eines Modells.

1ahere Informationen zu OCL finden sich unterhttp://www.omg.org/spec/OCL/2.3.1/.

Betrachtet man nun die dynamische Semantik, kann eine Aussage ¨uber die Ausf¨ uhr-barkeit von Modellen gemacht werden:

Sobald die Sprache ausf¨uhrbar ist, ist es auch das Modell.

Ein solches Modell nennt man formales Modell. Dies bedeutet einerseits, dass ein Mo-dell, welches durch eine Sprache mit definierter dynamischer Semantik beschrieben wird, immer ausf¨uhrbar ist. Andererseits stellt ein formales Modell

”irgendeinen Aspekt der Software vollst¨andig”[72] dar, d.h. es ist klar festgelegt, wor¨uber mit Hilfe des Modells Aussagen getroffen werden k¨onnen.

2.3.3 Dom¨ anenspezifische und allgemeine Sprachen

Nachdem die Eigenschaften von Sprachen definiert sind und die Br¨ucke zu den Mo-dellen geschlagen wurde, werden in diesem Abschnitt die Sprachen als Ganzes n¨aher betrachtet. Programmiersprachen und Modellierungssprachen sind heute fester Bestand-teil der Softwareentwicklung. Sie agieren strikt nach der in Abschnitt 2.3.1 beschriebe-nen Definition. Beide k¨onnen entweder zur Gruppe der allgemeinen Sprachen oder der Dom¨anenspezifischen Sprachen, kurz DSLs genannt, zugeordnet werden. Ihre Darstel-lung ist textuell, grafisch oder hybrid. Hybrid bedeutet hier, dass die betreffende Sprache sowohl textuelle als auch grafische Elemente aufweist.

Eine allgemeine Sprache kann zu jedem Zweck verwendet werden. Typische Vertreter hierf¨ur sind Java und alle g¨angigen C-Dialekte.

Eine dom¨anenspezifische Sprache (DSL) wurde f¨ur eine bestimmte Dom¨ane entwi-ckelt und wird innerhalb dieser vom einem Dom¨anenspezialisten eingesetzt. DSLs sind dementsprechend spezialisierter als allgemeine Programmiersprachen. Sie besitzen in der Regel eine wohldefinierte Syntax und Semantik und sind oft ausf¨uhrbar, indem sie auf allgemeine Programmiersprachen abgebildet oder interpretiert werden. DSLs sind damit sehr gut zur modellgetriebenen Softwareentwicklung geeignet. Im Hinblick auf die Defini-tion der modellgetriebenen Softwareentwicklung, kann der Begriff des formalen Modells definiert werden:

”Ein formales Modell ist ein Modell, das in einer DSL geschrieben wurde.“[72]

Diese Definition wird im folgenden Abschnitt f¨ur die Definition der modellgetriebenen Softwareentwicklung ben¨otigt.2