JAN Ein Visualisierungssystem zur objektorientierten Animation von Java Programmen

André Vratislavsky

http://vratislavsky.de

Institut für Informatik

Freie Universität Berlin

12.01.2003

JAN wurde im Rahmen einer Diplom-Arbeit bei Prof. Dr.-Ing. Klaus-Peter Löhr (lohr@inf.fu-berlin.de) entworfen und implementiert. Die Software wurde seit der Fertigstellung der Diplomarbeit im August 2002 weiterentwickelt.

JAN kann den Ablauf eines beliebigen Java Programms in animierter Form, d.h. zeitabhängig visualisieren. Insbesondere werden dabei Datenstrukturen in Objektdiagrammen und die Kommunikation zwischen den Objekten auf Ebene der Methodenaufrufe in einem Ablaufdiagramm dargestellt. Das Ablaufdiagramm berücksichtigt mehrere Threads. Spezielle Kommentare im Quelltext ermöglichen, Einfluss auf die Detailtiefe der Darstellung zu nehmen.

Voraussetzung für eine Visualisierung ist das Vorhandensein des Quelltextes des zu inspizierenden Programms. Dieser wird analysiert und, vor dem Anwender versteckt, um speziellen Code für die Visualisierung erweitert. Es werden Aufrufe gewisser Methoden des Visualisierungssystems eingefügt, die die zu beobachtenden Daten aus dem inspizierten Programm an das Visualisierungssystem melden.

Damit nicht alle programmtechnischen Details dargestellt werden, gibt es die Möglichkeit, Methodenaufrufe und Objekte mit sogenannten Tags zu kennzeichnen und somit gezielt in die Visualisierung aufzunehmen oder von dieser auszuschließen. Bei den Tags handelt es sich um Annotationen in Kommentarform.

Eine besondere Bedeutung hat die Datenstruktur der Objekte. In Java ist im Programmtext nicht zu erkennen, ob eine Variable auf ein Unterobjekt zeigt, welches semantisch als Komponente zu betrachten ist, eine beliebige Referenz darstellt oder nur die Funktion einer Hilfsvariable hat. Das Visualisierungssystem ermöglicht, Variablen im Java Programm mit speziellen Kommentaren um eine semantische Eigenschaft zu ergänzen, die sie als Komponenten kennzeichnen. Eine Komponente ist in diesem Zusammenhang ein Unterobjekt, welches als Teil eines größeren Objekts betrachtet wird und im Gegensatz zu einfachen Referenzen semantisch eng zu diesem Objekt gehört. In der objektorientierten Welt wird diese Beziehung auch als Aggregation bezeichnet.

Die Schnittstelle zum Anwender wird durch eine graphische Benutzeroberfläche (GUI) realisiert, mit der das zu inspizierende Programm gesteuert werden kann und die die gewünschten Informationen graphisch darstellt. Dabei werden neben textuellen Darstellungen Ablauf- und Objektdiagramme verwendet. Der Inhalt der Diagramme wird nicht nur durch die Vorauswahl bestimmt, die durch die Tags im Programmtext getroffen werden kann, sondern kann auch interaktiv beeinflusst werden.

Es gibt die Möglichkeit, das zu inspizierende Programm kontinuierlich oder schrittweise ablaufen zu lassen. Neben der Verfolgung des laufenden Programms können auch vergangene Zustände dargestellt werden. Bei einer schrittweisen Darstellung des jeweils vorhergehenden Zustands ergibt sich so der Eindruck eines rückwärts laufenden Programms.


Abbildung 1 Eine Ansicht des Visualisierungssystems. Oben befinden sich Buttons zur Steuerung des Programmablaufs. Darunter sind links Threads und Objekte aufgelistet. Für jeden Thread kann der Methodenaufrufstack und eine Historie eingesehen werden (Mitte). Aktuelle Aufrufe werden im Quelltext dargestellt (Mitte rechts). Unten rechts befinden sich Objekt- und Ablaufdiagramm.

Die Methodenaufrufe im inspizierten Programm werden nach den Threads unterschieden, zu denen sie gehören. Für alle Threads gibt es einen Methodenaufrufstack und eine Historie der Aufrufe. Die Aufrufe aller Threads werden gemeinsam in einem Ablaufdiagramm dargestellt und farblich getrennt gekennzeichnet, so dass der Ablauf nebenläufiger Programme dargestellt werden kann. Ein Objekt im Diagramm hat dabei nicht nur einen Zeitbalken, sondern parallel für jeden Thread, der auf das Objekt einwirkt, einen eigenen Zeitbalken. Jeder Thread zieht sich in der Darstellung sozusagen als farblich individuell gekennzeichneter Faden durch das Programm.


Abbildung 2 Ein Ablaufdiagramm, wie es von dem Visualisierungssystem zur Laufzeit des inspizierten Programms erzeugt wird. In diesem Beispiel werden drei Threads in drei verschiedenen Farben dargestellt. Oben sind die beteiligten Objekte (mit Typ und Angabe ihrer Identität) aufgeführt, darunter die Zeitbalken der auf die Objekte einwirkenden Threads und ihre Methodenaufrufe.

Die Objektstruktur wird in einem Objektdiagramm dargestellt. Gewöhnliche Referenzen zwischen Objekten werden als Pfeile eingezeichnet. Unterobjekte, die als Komponenten gekennzeichnet sind, werden innerhalb ihrer umschließenden Objekte dargestellt. Dadurch ergibt sich eine geschachtelte Struktur. Der Anwender des Visualisierungssystems kann durch Mausklicks Unterobjekte auf- bzw. zuklappen, um die Darstellung seinen Wünschen anzupassen. Auf diese Weise können Objekte aus der Graphik ausgeblendet werden. Neben Komponenten, die im Programm durch eine Variable benannt sind, werden auch die Elemente der mengenwertigen Java Strukturen Set, List und Map dargestellt.


Abbildung 3 Ein Objektdiagramm, wie es von dem Visualisierungssystem zur Laufzeit des inspizierten Programms erzeugt wird. In diesem Beispiel werden drei Komponenten (Bibliothek, Benutzerverzeichnis, Katalog) mit ihren Unterkomponenten dargestellt. Das Benutzerverzeichnis und der Katalog enthalten jeweils eine Hashtabelle mit den Benutzern bzw. den Büchern der Bibliothek. Das Benutzerverzeichnis wird über Benutzernummern, der Katalog über Signaturen indiziert. Ein Benutzer hat einen Namen als Attribut und eine Menge der ausgeliehenen Bücher als Komponente. Von dieser Menge gehen Referenzen (Pfeile im Diagramm) zu den ausgeliehenen Büchern. Umgekehrt hat ein Buch eine Referenz zu seinem Entleiher.

Die Hauptidee des Vorhabens ist die Animation einer Software. Nah verwandt mit diesem Thema ist das Gebiet der Animation von Algorithmen, bei der die Aufmerksamkeit mehr auf der abstrakten Darstellung eines Algorithmus als auf der Funktionsweise eines Programms liegt. Eine Algorithmenanimation kann mit dem Visualisierungssystem vorgenommen werden, indem ein Programm geschrieben wird, das den Algorithmus realisiert. Der Schwerpunkt liegt dabei auf der Präsentation von Objektbeziehungen, Variablen primitiven Datentyps und Methodenaufrufen.

Das System ist in einer Schichten Struktur realisiert, wobei die einzelnen Schichten über Schnittstellen miteinander kommunizieren. Das inspizierte Programm und der Kern des Visualisierungssystems laufen getrennt voneinander in unterschiedlichen virtuellen Java Maschinen, die über Java RMI (Remote Method Invocation) miteinander kommunizieren. Damit wird eine Entkopplung des inspizierten Programms und des beobachtenden Visualisierungssystems erreicht, um Rückwirkungen auf das untersuchte Programm zu vermeiden.