Kreuzfahrt mit dem snavigator

ArticleCategory: [Choose a category, translators: do not translate this, see list below for available categories]

SoftwareDevelopment

AuthorImage:[Here we need a little image from you]

Gerrit photo

TranslationInfo:[Author + translation history. mailto: or http://homepage]

original in en Gerrit Renker

en to de Viktor Horvath

AboutTheAuthor:[A small biography about the author]

Gerrit mochte Computer überhaupt nicht, bis er es mit C und Linux versuchte.

Abstract:[Here you write a little summary]

Dieser Artikel stellt den snavigator vor, ein mächtiges Werkzeug für Code-Analyse, Querverweise und Re-Engineering, das unverzichtbar ist, um der Komplexität der Pflege von größeren Softwareprodukten und -paketen effizient zu begegnen.

ArticleIllustration:[One image that will end up at the top of the article]

[Illustration]

ArticleBody:[The main part of the article]

Motivation

Ein altes Sprichwort sagt, daß ein Buch nicht nach seinem Umschlag beurteilt werden sollte. Etwas Ähnliches gilt für Open Source-Code. Open Source ist jedoch nicht dasselbe wie Open Documentation, und das Lesen wird immer schwieriger mit der wachsenden Anzahl und Länge der Quelldateien. Ich mußte kürzlich mit einer Software programmieren, die mit einer halben HTML-Seite Dokumentation aufwartete sowie mit über 348.000 Zeilen Open Source Java-Code, verteilt auf mehr als 2.060 Dateien (siehe Graphik). Angesichts solcher Dimensionen werden Werkzeuge für elektronische Orientierung, Reverse Engineering und Analyse unverzichtbar. Ein solches ist der Red Hat source code navigator, der in diesem Artikel vorgestellt wird.
Er automatisiert viele Aufgaben, die man normalerweise mit (c)tags, grep, search und replace erledigte, aber viel präziser und bequemer, in einer einfach zu benutzenden graphischen Oberfläche integriert, siehe die Screenshots unten.

Installation in Debian

Unter Debian kannst du das ganze Paket mit folgendem Einzeiler bekommen:
apt-get install sourcenav sourcenav-doc 
Das besorgt gleichzeitig auch die Dokumentation. Der source navigator befindet sich dann in /usr/lib/sourcenav/, du kannst das Hauptprogramm mittels /usr/lib/sourcenav/bin/snavigator starten (siehe den Tip bezüglich eines Symlinks unten). Die Dokumentation kann unter /usr/share/doc/sourcenav/html/ gefunden werden.

Installation aus den Quellen

Die Homepage von source navigator ist http://sourcenav.sourceforge.net/, die Downloads liegen hier (sourceforge.net/project/showfiles.php?group_id=51180). Hole den neuesten Tarball sourcenav-xx.xx.tar.gz. Während des Downloads kannst du dich mit etwas anderem beschäftigen - die Quellen sind 55 Megabytes groß. Das hat auch seine guten Seiten, das Paket braucht kaum etwas anderes. Obwohl es stark auf andere Bibliotheken wie Tcl/Tk, Tix und Berkeley DB zurückgreift, sind deren richtige Versionen alle mitgeliefert. Um Konflikte mit anderen Versionen von Tcl/Tk auf deinem System zu vermeiden, ist es eine gute Idee, die Installation in einem separaten Verzeichnis vorzunehmen, z.B. /opt/sourcenav. Die Anweisungen empfehlen des weiteren die Benutzung eines separaten Kompilier-Verzeichnis (build directory), was wie folgt funktioniert. Im Verzeichnis, wo die entpackten Dateien liegen, mache dies:
mkdir snbuild; cd snbuild 
../sourcenav-*/configure --prefix=/opt/sourcenav 
make                               ## takes a while ...
make install                       ## might have to become root first
Die Option --prefix spezifiziert das Installations-Verzeichnis. Während configure läuft, bekommt man bereits eine Vorstellung von den vielen Sprachen, mit denen snavigator umgehen kann. Es ist ebenfalls möglich, weitere Parser für Sprachen deiner Wahl oder auch selbstgeschriebene hinzuzufügen. Ist die Installation via make install einmal beendet, ist der snavigator bereit zur Arbeit und kann als /opt/sourcenav/bin/snavigator aufgerufen werden. Anstatt die Umgebungsvariable PATH zu erweitern, schlage ich einen symbolischen Link vor, z.B. in /usr/local/bin.
ln -s /opt/sourcenav/bin/snavigator    /usr/local/bin
Das Hauptprogramm ist ein Shellscript, das sein Verzeichnis kennen muß. Daher wird es über einen Symlink-Aufruf verwirrt. Das kann mit der Änderung folgender Zeilen in /opt/sourcenav/bin/snavigator behoben werden: Ersetze
snbindir=`dirname $0`
durch
prog=`readlink -f $0`
snbindir=`dirname $prog`
Die Option -f von readlink(1) erzeugt eine kanonische Darstellung des Pfades, d.h. es funktioniert sogar, wenn auf die Datei über einen sehr langen Pfad von verschachtelten Symlinks zugegriffen wird.

Benutzung des snavigator

Wird der snavigator zum ersten Mal aufgerufen, fragt er nach Verzeichnissen, die Quelldateien enthalten, wie der folgende Screenshot zeigt. Die unterstützen Sprachen umfassen unter anderem Java, C, C++, Tcl, Fortran, COBOL und Assemblerprogramme. Wenn der Quellcode angegeben wurde, baut er selber eine Projekt-Datenbank, die Verweis-Informationen, Klassenhierarchien, Datei-Abhängigkeiten und noch viel mehr umfaßt. Je nach Größe von deinem Projekt kann das ein bißchen dauern. Anschließend kannst du Anfragen an die Datenbank stellen und zusätzliche Informationen über den Code erfragen. Das Folgende präsentiert nur ein paar der Features, um dir eine Vorstellung zu geben. Eine illustrierte Einleitung und ein Referenzhandbuch befinden sich im Unterverzeichnis html deiner Installation.

Projekt-Management

Zum Paket gehört ein Editor mit Syntax-Highlighting, der auch zum ansprechenden Drucken genutzt werden kann. Der folgende Screenshot bildet das Hauptfenster des Editors ab. Er ist fast wie eine Entwicklungsumgebung, denn er wartet mit Sachen wie einer Debug-Möglichkeit, Projekt-Kompilierbefehlen, Versionskontrolle und ähnlichem auf.


Insbesondere die großen grünen Pfeile in der Toolbar funktionieren genau wie in einem Web-Browser. Der Projekt-Editor erlaubt einem, die Datenbankinformationen zu kontrollieren (z.B. falls eine Datei gerade verändert wurde), Dateien von der Liste hinzuzufügen oder zu löschen und andere Verwaltungsaufgaben. Alle Dateien werden als ein großes Projekt behandelt. Wenn also Veränderungen geschehen, kannst du die Datenbankinformationen mit Refresh Project oder Reparse Project aktualisieren.
Im Editorfenster markiere etwas, etwa den Namen einer Funktion, so daß die markierte Region in gelb erscheint. Dann klicke mit der rechten Maustaste - du kannst entscheiden, ob du (a) die Deklaration von dem, was du markiert hast, sehen willst (z.B. eine Header-Datei) oder (b) die Implementation des markierten Symbols (z.B. eine .cpp-Datei) - und es gibt noch ein paar weitere nützliche Optionen.

browse files

Der Symbolbrowser

Das ist das erste Fenster, das nach dem Füllen der Projektdatenbank erscheint. Normalerweise enthält es Dateinamen, aber es kann auch Klassenmethoden, Funktionssymbole und ähnliches darstellen. Wenn auf einen Dateinamen geklickt wird, öffnet sich der Editor mit dieser Datei.

Das grep-Fenster

Das tut, was der Name sagt: Es bietet eine komfortable GUI, um durch alle beteiligten Quelldateien zu greppen. Passende Einträge sind markiert und verlinkt, der Quellcode kann so wie ein Haufen Webseiten betrachtet werden. Wie der Screenshot zeigt, kann die entsprechende Datei ausgewählt werden, und durch simples Klicken wird der Editor an der richtigen Stelle geöffnet. (Die gezeigte Suche erzeugt Treffer in vielen Java-Dateien :)
grepper

Das Xref-Fenster

Hier haben wir eine Liste mit Querverweisen zu allen Symbolen, insbesondere kann man sehen, welche Methoden lesen (r), schreiben (w), usw. auf welchen Daten, und man kann die Beziehungen zwischen Symbolen sehen, hierarchisch dargestellt. Auf die Einträge kann man klicken. xref

Das Klassenfenster

Dieses Interface sammelt alle nützliche Informationen, die man über Klassen in einer objektorientierten Sprache wissen will. Vor allem werden die Super- und Subklassen gezeigt sowie Attribut- und Methodennamen mit ihren Parametern. Zur Abwechslung zeigt das Fenster unten eine C++-Klasse ClientSocket, die von Socket erbt und ziemlich viele Methoden aufweist. Wieder gilt, daß du per Klick auf einen Eintrag ein Editorfenster an der entsprechenden Position öffnen kannst.

Alternativen

cscope ist ein interaktiver C-Quellcode-Browser für die Kommandozeile (er kann auch mit C++ umgehen). Er hat einiges von der Funktionalität des snavigator, ein Screenshot ist hier. Tatsächlich ist er viel älter und ist in vielen sehr großen Projekten benutzt worden. Seine Homepage ist http://cscope.sourceforge.net. Aber du brauchst nicht einmal dorthin zu gehen - er ist in vim eingebaut und kann sehr ähnlich benutzt werden wie (g)vim in Kombination mit tags. Tippe einfach
:help cscope
in deiner vim-Sitzung, um die verfügbaren Optionen zu sehen. Es gibt noch ein paar von cscope abgeleitete Programme. Freescope ist ein cscope-Clone, dem etwas Funktionalität wie Symbol-Vervollständigung hinzugefügt wurde. Es gibt jetzt auch ein KDE-Frontend zu cscope namens kscope, das unter http://kscope.sourceforge.net liegt.

Zusammenfassung

Für jeden, der wenigstens zum Teil mit dem Re-Engineering oder der Integration von Quellcode beschäftigt ist, ist der snavigator ein sehr nützliches und mächtiges Werkzeug. Ich hatte einmal eine ältere Qt-Applikation, die leider nicht mit der aktuellen Version der Qt-Bibliothek lief. Indem ich die Fehlermeldungen las und ein bißchen mit dem snavigator arbeitete, fand ich bald heraus, daß nur die Parameterliste einer Funktion geändert werden mußte. Mit der klick-und-finde-Funktionalität (click-and-locate) war es möglich, das gesamte Softwarepaket in nur ein paar Minuten auf den aktuellen Stand zu bringen.