grundlegende analysen & zwischendarstellungen aus: programmverstehen und statische...
TRANSCRIPT
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?