Grundlegende Analysen & Zwischendarstellungen Aus: Programmverstehen und statische...

Preview:

Citation preview

Grundlegende Analysen & Zwischendarstellungen

Aus: Programmverstehen und statische Analysetechniken, Kapitel 5

Seminar 3D-Visualisierung von objektorientierten Codestrukturen, WS 06/07Prof. Dr. E.-E. Doberkat, Dr. A. Fronk

Priv.-Doz. Dr. G. Rinkenauer, Dr. D. Gude

Jasper Lauterbach

Einführung

• Worum geht es?– Techniken aus dem Compilerbau, die das

Programmverstehen unterstützen sollen.

• Welche Techniken sind das?– Grundlegendes wie lexikalische u.

syntaktische Analyse.– Zusätzliches wie Kontroll- und

Datenflussanalyse.

Lexikalische Analyse

• Fasst einzelne Zeichen zu Lexems zusammen.

• Unterstützt Programmverstehen durch– Hervorheben von Schlüsselwörtern,

Variablen, etc.

‚w‘, ‚h‘, ‚i‘, ‚l‘, ‚e‘ while-Schlüsselwort.

Syntaxanalyse

• Liefert Struktur des Programms (Syntaxbaum).

• Unterstützt Programmverstehen durch– Formatierung des Codes,– Hervorheben von Variablen, Klassen,

Sichtbarkeit, etc.

Symbolanalyse

• Erstellt Verknüpfungen im Syntaxbaum.– Z. B. Deklaration einer Variablen mit ihrer

Benutzung.

• Unterstützt Programmverstehen durch Darstellung dieser Verknüpfungen.

Kontrollflussanalyse

• Untersucht das Zusammenwirken funktionaler Einheiten wie– Basisblöcken (intraprozedural) und– Prozeduren (interprozedural). read(x)

a = 0

x > max

x < min

x = maxa = 1

x = mina = 1

print(x)print(a)

ft

f

t

Kontrollflussanalyse (Forts.)

• Unterstützt das Programmverstehen– durch grafische Darstellung (statt Text)– durch „Übersichtsinformation“ („Wo wird diese

Methode überall benutzt?“; „Wo wird diese Klasse verwendet?“)

Datenflussanalyse

• Baut auf den Knoten des Kontrollflussgraphen auf.

• Zeigt Abhängigkeiten in derVariablenbenutzung auf.

= Datenabhängigkeit

f

ft

t

print(x)print(a)

read(x)a = 0

x > max

x < min

x = maxa = 1

x = mina = 1

Datenflussanalyse (Forts.)

• Beantwortet Fragen wie– „An welchen Stellen wird der an Stelle X

gesetzte Wert verwendet?“– „Welche möglichen Werte kann eine Variable

einnehmen?“– „Welche Variablen sind für Abschnitt Y

relevant?“

• Dadurch Unterstützen des Programmverstehens.

Slicing

• Berechnet einen Teilbereich des Codes– Wähle eine zu betrachtende Zeile und– blende alle irrelevanten Zeilen aus.

Was wird durch diese Zuweisung beeinflusst?

Wie entsteht der Wert dieser Variablen?

Slicing (Forts.)

Forward Slice Backward Slice

Slicing (Forts.)

• Unterstützt Programmverstehen– durch Ausblendung von irrelevantem Code

bzgl. einer bestimmten Frage.

Bis hierher …

• Nutzung von grundlegenden Techniken des Compilers wie– Lexikalische, syntaktische und

Symbolanalyse sowie– Kontroll- und Datenflussanalyse.

• Visuelle Darstellung ihrer Ergebnisse, um Programmverstehen zu unterstützen.

Darstellende Verfahren

Aus: Programmverstehen und statische Analysetechniken, Kapitel 6

Einführung

• Wie sucht man nach– Architekturmustern (od. architektonischen

Stilen),– Entwurfsmustern (design patterns) und– Idioms?

• Daraus: Weitere Möglichkeiten zur Darstellung von Code.

Struktursuche

• Das Composite-Muster:– Modelliert zusammengesetzte Objekte.– Zusammengesetzte Teile sollen wie

Einzelteile behandelt werden können.– Beispiele

• Menüs mit Menü-Punktenund Untermenüs

• Zusammengesetzte undeinfache Elemente ineinem Grafikprogramm.

Component

Leaf Composite

Struktursuche (Forts.)

• Aufgabe: Suche das Composite-Muster.

• Mögliche Vorgehensweise:– Mittels lexikalischer Informationen,– anhand eines relationalen Modells des

Systems sowie– durch Metriken.

Lexikalische Suche

• Versucht, das Muster durch Suchen nach Schlüsselwörtern zu entdecken.

• Genauigkeit:– Hoch, falls passende Bezeichner vergeben,– sonst niedrig.

• Rolle im Programmverstehen:– Entdeckung von Mustern; keine wirkliche

Darstellung des Codes.

„Leaf“, „Composite“

Relationales Modell

• Erzeuge Modell des Systems mit– Entitäten und– Relationen dazwischen.

• Formuliere Anfragen daran, um das Composite-Muster zu finden.

Rel(Component, Composite, Leaf) := INHERITANCE(Composite, Component) ^ CONTAINMENT(Composite, Component) ^ INHERITANCE(Leaf, Component)

^ ! CONTAINMENT(Leaf, Component);

Relationales Modell (Forts.)

• Höhere Genauigkeit, aber rechenintensiv.

• Rolle im Programmverstehen:– Durch Finden von Strukturen oder– Visuelle Darstellung der Relationen.

Metriken

• Analyse des Codes durch– Zerlegung in Entitäten– Berechnung von Zahlenwerten

(z.B. Anzahl Member-Variable, Tiefe im Vererbungsbaum, etc.)

• Rolle im Programmverstehen:– Ebenfalls durch Finden von Strukturen /

Eigenschaften,– visuelle Darstellung der Metrik-Werte.

Zusammenfassung

• Compiler-Techniken zur Unterstützung des Programmverstehens.

• Alternative Darstellungen des Codes– durch Entitäten und Relationen– sowie durch Zahlenwerte an diesen,

berechnet durch Metriken.

• Ausblick: Welche dieser Möglichkeiten können wie genutzt werden?

Recommended