Child pages
  • Imperative Programme
Skip to end of metadata
Go to start of metadata


Die imperative Programmiersprache wird in Form eines Kontrollflussgraphen visualisiert. Der Kontrollflussgraph zeigt dabei den sequentiellen Ablauf eines Programms in Form eines Graphen. Die Visualisierung der imperativen Sprache liegt dabei einem Metamodell zugrunde, siehe folgende Abbildung.

Das Metamodell besteht dabei aus dem Programm, welches wiederum als Hauptbestandteile Statements und Variablen enthält. Dabei werden Statements als Knoten realisiert. Die Beschriftungen der Knoten wird dabei aus den Expressions generiert.

Die Visualisierung

Bei der Visualisierung der imperativen Sprachen wurde die Entscheidung getroffen den Graph in Form eines Kontrollflussgraphen zu erstellen. Der Nachteil eines Kontrollflussgraphen ist, das nicht alle Informationen die in der Sprachen enthalten sind repräsentiert werden. Der Kontrollflussgraph hat sich jedoch dadurch das nicht alle Informationen dargestellt werden, als übersichtlicher herausgestellt. Es fehlen keine wichtigen Information im Graphen, z.B. werden Blöcke nicht dargestellt, da sie keine Informationen zum Graphen beitragen.

Zu Beginn der Visualisierung werden die Variablen dargestellt. Die folgende Abbildung zeigt ein Beispiel. Die Variablen werden dabei in einen Knoten abgebildet der die Überschrift Variables trägt. Für jede Variable wird ein neuer Subknoten innerhalb des Oberknotens angelegt, der dann entsprechend des Variablennamen und Typs beschriftet wird. Die Variablen liegen dabei in Form einer Liste vor und werden nach und nach visualisiert.

Visualisierung von Statements und Expressions

Um Knoten für Statements (Assignment, If-Statement, While-Statement, Return und Block) zu erzeugen, wurden dispatch Methoden angelegt. Diese Methoden werden dann in Abhängigkeit ihres Typs aufgerufen. Der weitere Aufruf geschieht hierbei rekursiv, das bedeutet das wenn für ein Statement ein Knoten angelegt worden ist, wird rekursiv ein Knoten für das nächste Statement erzeugt.

Eine Besonderheit haben Blöcke. Blöcke tragen in einen Kontrollflussgraphen zu keiner weiteren Information bei. Somit werden für Blöcke keine Knoten erzeugt.

Die Beschriftung der Knoten ergibt sich aus den Expressions. So ist zum Beispiel die Condition eines If-Statements eine Expression. Der If-Knoten erhält somit z.B. die Beschriftung if i == 0. Das if ergibt sich aus dem If-Statement und i == 0 aus der Condition Expression.

Alle Expressions werden durch entsprechende Methoden in ihre textuelle Repräsentation überführt, um als Knotenbeschriftung verwendet werden zu können.

Visualisierung der Kanten

Die Visualisierung der Kanten hat sich als komplex herausgestellt. Dadurch das Blöcke nicht als Knoten dargestellt werden, müssen Blöcke beim erstellen der Kanten „übersprungen“ werden. Eine Kante muss somit über Blöcke hinweg zum nächsten relevanten Statement gezeichnet werden. Ebenso können Blöcke leer sein, sie enthalten dann keine weiteren Statements. Die Kanten eines Statements vor einem leeren Block, müssen auf ein Statement nach dem Block verweisen. Hierzu ein kleines Beispiel.

ProgrammVisualisierung

{

   i = k

   if ( i > 10 ) then

     { }

   else

     { i = 1}

   k = 42

}

Ein If-Statement besteht aus einer Condition, einem False- und einem True-Statement. Die Condition ist wie oben bereits erwähnt die Beschriftung des If-Knotens. Das True- bzw. False-Statement eines If-Statements können genau ein Statement enthalten. Dabei kann es sich um ein Block oder ein anderes Statement handeln. Im Beispiel enthält das False-Statement ein Assignment. Der Kontrollfluss teilt sich am If-Statement auf und zeigt zum Assignment im False-Statement. Das True-Statement hingegen enthält einen leeren Block. Da Blöcke nicht als Knoten dargestellt werden, muss der Kontrollfluss auf das innere Statement (welches kein Block ist) des Blocks verweisen. Jedoch ist der Block leer. Der Kontrollfluss muss somit von If-Statement-Knoten auf das erste Statement (welches kein Block ist) nach dem If-Statement verweisen.

Diese Besonderheit zieht sich durch die gesamte Visualisierung wo sich Blöcke befinden.

Die Lösung des Problems wird hier anhand des Beispiels erklärt. Die Lösung lässt sich auf alle weiteren Fälle übertragen.

Das Problem wurde gelöst, indem bei der Kantenzeichnung den einzelnen Knoten ihre Vorgänger mitgeteilt werden. Bezogen auf des obige Beispiel bedeutet das nun folgendes. Das Assignment i = k selbst hat (hier) keine Vorgänger. Es wird deshalb auch keine weitere Kante gezeichnet. Als nächstes wird die Kante für den If-Knoten gezeichnet werden. Der Vorgänger des If-Knoten ist das Assignment (i=k). Es wird die Kante 1 gezeichnet. Der rekursive Abstieg führt nun die Kantenzeichnung im False-Statement fort. Der Vorgänger vom Assignment i=1 ist das If-Statement. Es wird Kante 2 gezeichnet. Im True-Fall haben wir das Problem das der Block (hier) leer ist. Das bedeutet es gibt keinen Knoten innerhalb des True-Statements, von dem aus ein Pfeil zum If-Statement gezeichnet werden kann. Deshalb darf die Kante jedoch nicht vergessen werden.

 

Denn die Vorgänger das Assignments k=24 setzen sich wie folgt zusammen: Enthalten True- und False-Statement eines If-Statements Statements (welches keinen leeren Blöcke sind), so sind jeweils die letzten Statements innerhalb der beiden Fälle, die Vorgänger von k=42. Da hier jedoch das True-Statement einen leeren Block enthält, ist der Vorgänger (wie in der Abbildung zu sehen) das If-Statement selber. Das Assignment k=42 hat somit zwei Vorgänger (i=1 und if i>10). Das Assignment muss somit zwei Kanten (3 und 4) zeichnen.

Die Lösung des Problems ist somit eine Vorgängerliste die jedem Statement übergeben wird. In Abhängigkeit dieser Liste zeichnet das jeweilige Statement seine Kanten dann „rückwärts“ zu seinen Vorgängern.

 

Der logische Fluss eines Programms erstreckt sich in Form eines Graphen von oben nach unten. Damit der Graph so gezeichnet wird, sind gewichtete Kanten eingefügt worden. Kanten die im Kontrollflussgraphen von unten nach oben verlaufen bekommen ein Gewicht. Somit zeichnet der Layoutalgorithmus den Graphen „von oben nach unten“.

  • No labels