Viel hilft viel (iX, Februar 2002)

Abbildung 1: Der wackelige Waran

Komodo, die integrierte Entwicklungsumgebung von ActiveState, bietet Visual-Studio-ähnlichen Komfort für eine Palette von Skriptsprachen. Ein Praxistest des Produkts im rauhen Programmieralltag.

Statt eines simplen Editors und eines Compilers oder Interpreters, der von der Kommandozeile startet, bevorzugen viele Entwickler eine integrierte Entwicklungsumgebung (Integrated Development Environment, IDE). Diese kennt dann alle Dateien eines Projekts und kann schnell zwischen verwandten Programm- und Header-Dateien hin- und herspringen. Sie übersetzt, linkt oder interpretiert und lässt das Programm im Ausgabe- oder Debugger-Fenster ablaufen.

Typische IDE-Produkte heben Schlüsselworte des Programmtexts sprachspezifisch farblich hervor (Syntax-Highlighting) und zeigen manchmal sogar Syntaxfehler an, die sich beim Eintippen einschleichen, da der eingebaute Editor entweder die gerade programmierte Sprache versteht oder im Hintergrund schon ein Compile-Lauf abgeht.

Echte Programmierer fahren jedoch kaum mit diesen S-Klasse-Mercedessen der Softwareentwicklung: Wahre Hacker bevorzugen schnelle und gefährliche Editoren wie vi, können make-rules definieren und wissen auswendig, wie man in CVS automatisch zwei Zweige eines Projekts konsolidiert.

ActiveState beschreitet mit Komodo neues Terrain und bietet eine IDE für Skripthacker an. Es unterstützt gegenwärtig die Sprachen Perl, PHP, Python, JavaScript, Tcl und XSLT. Das kommerzielle Produkt basiert auf dem frei erhältlichen Mozilla-Code, definiert seine Oberfläche mittels XUL und steht unter [1] zum Download bereit.

Abbildung 2: Ein Software-Projekt in Komodo

Lizenzen

Die Linux-Version liegt als Beta-Release 1.1 vor und ist frei erhältlich. Für die Windows-Plattform bietet ActiveState drei Wahlmöglichkeiten: Die "kommerzielle" Lizenz zum Preis von $295, die kostenlose Evaluierungslizenz, um Komodo 21 Tage lang auszuprobieren und die ebenfalls kostenlose Privatnutzerlizenz, die den uneingeschränkten Gebrauch von Komodo für nicht-kommerzielle Zwecke (Heimnutzer und Schulen) anbietet. Beide kostenlosen Lizenzen stellt ActiveState blitzschnell aus, wenn man nur seinen Namen und seine Email-Adresse angibt.

Installation

Die Distribution für Linux kommt als tar-Datei daher und installiert sich problemlos, wenn man das mitgelieferte

    ./install.sh

startet und anschließend das Installationsverzeichnis zum PATH der Shell hinzufügt.

Für die Windowswelt liefert ActiveState eine *.msi-Datei, die der Microsoft-Installer aufgreift, den Benutzer durch die üblichen Dialoge schleust und Komodo 1.1 ebenfalls problemlos installiert. Beide Distributionen kommen vollständig an, setzen also keinen installierten Mozilla-Browser voraus.

Unter Linux stellt sich gleich das "Achtung, Beta!"-Gefühl ein, da ein von der Kommandozeile aufgerufenes komodo Debug-Meldungen auf der Konsole anzeigt. Beide Versionen bieten jedoch die gleiche Funktionalität, Unterschiede zeigen sich lediglich darin, dass unter Linux die von Komodo unterstützten Skriptinterpreter meist schon von Haus aus installiert sind (z.B. python), während sie der Anwender unter Windows noch separat nachrüsten muss.

Editieren mit Komfort

Gleich nach dem Hochfahren zeigt Komodo an einem Beispiel, dass ein Projekt eine Reihe von Dateien aller unterstützten Sprachen enthalten darf -- allerdings nur in einer Hierarchiestufe, ohne die Möglichkeit, sie auf Unterverzeichnisse zu verteilen. Komodo merkt sich die zuletzt editierten Dateien und Projekte und erlaubt es so, schnell wieder zum aktuellen Stand der Arbeit zurückzukehren. Die neue Version 1.2 (liegt als wackeliges Beta-Release zum Probieren vor) merkt sich sogar, wo genau man die Arbeit beendete.

Während des Tippens unterlegt Komodo, abhängig von der gerade verwendeten Sprache, Schlüsselwörter mit verschiedenen Farbcodes, was die Lesbarkeit des Codes erhöht -- ähnlich wie Emacs dies bewerkstelligt. Das Syntax-Highlighting unter Perl ist ja bekanntlich eine besondere Herausforderung. Perls komplexe Syntax versteht eigentlich nur der Perl-Interpreter perl komplett, da die Bedeutung vieler Konstrukte erst dann feststeht, sobald Information über den Kontext vorliegt. Komodo löst das Problem aber sehr schön.

Klickt man nahe einer sich öffnenden Codeblock-Klammer ({}) auf ein Minus-Symbol im Seitenbalken, lässt der Komodo-Editor den Block zusammenschrumpfen (Abbildungen 3 und 4) -- sehr nützlich, um sich einen Überblick über große Code-Dateien zu verschaffen.

Abbildung 3: Der Original-Code ...

Abbildung 4: ... mit kollabiertem if-Statement.

Aber Komodos Syntaxverständnis geht noch über das des traditionellen Highlightings hinaus. Für Perl, PHP und Python (und sogar für Tcl falls es eine TclPro-Installation findet) wirft es im Hintergrund, schon während der Programmierer den Code eintippt, ständig den entsprechenden extern installierten Skriptinterpreter an und lässt ihn das Skript analysieren. Meldet der Interpreter Fehler oder Warnungen, greift der Komodo-Editor diese auf und unterringelt die betroffenen Zeilen rot oder grün. Fährt der Programmierer mit der Maus über die Zeile, kommt der Text der Fehler- oder Warnungsmeldung hoch.

Editiert der Benutzer Perl-Code, schaltet Komodo den Warnungsmodus vernünftigerweise auch dann ein, wenn das Skript selbst nicht direkt mit -w oder use warnings danach verlangt (ist aber abstellbar). Abbildung 5 zeigt den berüchtigten Fehler, der Anfängern gerne mit Perls print()-Funktion unterläuft: print (2+1) * 5, "\n"; gibt keineswegs 15 und ein Newline-Zeichen aus, sondern den Wert 3 -- einer der wenigen Fälle, in denen man in Perl tatsächlich Klammern um die gesamte Argumentenliste der Funktion braucht.

Abbildung 5: Ein berüchtigter Anfängerfehler mit Perls print-Funktion.

Verlangt der Benutzer nach use strict, kommen noch mehr sinnvolle Warnungen hinzu. Abbildung 6 zeigt den Fall einer nur im Schleifenrumpf definierten Variablen $i, die versehentlich außerhalb verwendet wird. Da der Perl-Interpreter im use strict-Modus auf solche Leichtsinnsfehler anspringt, unterringelt Komodo die auslösende Zeile grün.

Abbildung 6: Ein Fehler unter use strict: Die nur in der Schleife gültige Variable $i wird extern verwendet.

Der Editor bietet einige andere Schmankerl wie das Auskommentieren von selektierten Code-Bereichen per Menu-Eintrag, das jeder betroffenen Zeile ein sprach-spezifisches Kommentarzeichen voranstellt.

Debuggen

Perl liefert ja bekanntlich schon einen Debugger für die Kommandozeile mit. Komodo setzt noch eine grafische Oberfläche darauf und vereinfacht so die Bedienung -- besonders für Neulinge. Im Variablenfenster ("Proximity") erscheinen die im aktuellen Scope gültigen Datenstrukturen des Programms. Von tief verschachtelten Strukturen (z.B. von einem Hash, dessen Einträge Arrayreferenzen enthalten, die wiederum auf Hashes verweisen) zeigt Komodo zunächst nur die oberste Ebene an. Klickt man mit der Maus aber auf den grünen Pfeil, der zur Tiefenbohrung einlädt, lässt sich die Datenstruktur bis in beliebige Tiefen anzeigen.

Besonders interessierende Variablen lassen sich auch per Drag-and-Drop in das rechts davon gelegene Watch-Fenster ziehen und getrennt beobachten -- mit jeder abgearbeitenen Programmzeile verändern sich dann die angezeigten Werte.

Zieht ein Perlskript Module hinzu, die ihrerseits wieder Module hinzuziehen, sind schnell mal 5 Dateien gleichzeitig aktiv. Die Reiter über dem Codefenster zeigen an, welche Dateien bisher geladen wurden und laden dazu ein, mittels eines einfachen Mausklicks den dort stehenden Perlcode aufzublättern.

Abbildung 7: Verschachtelte Datenstrukturen werden in der Debug-Session sichtbar.

Der Regex-Debugger

Perls reguläre Ausdrücke erschlagen Anfänger oft mit ihrer Komplexität. Abbildung 8 zeigt Komodos Debugger für reguläre Ausdrücke, Rx. Anhand eines Beispieltexts und eines regulären Ausdrücks sieht man dort genau, welche Teile des Beispieltexts vom regulären Ausdruck erfasst werden und welche Teile er mittels der greifenden Klammern (...) einfängt. Spielt man am regulären Ausdruck, ändert sich die farbliche Unterlegung im Beispieltext in Echtzeit. Die Implementierung dieser Funktion lässt allerdings stark zu wünschen übrig. Während Rx geklammerte Treffer zuverlässig hervorhebt, zeigt der mitgelieferte Debugger, der den Regex-Engine schrittweise durch den Beispieltext führen soll, teilweise stark verwirrende Daten an. Rx basiert auf einer guten Idee, die Realisierung in Komodo muss aber dringend überarbeitet werden.

Abbildung 8: Rx zeigt, dass man den regulären Ausdruck nachbessern muss

JavaScript

Komodo beherrscht sogar die JavaScript-Syntax: Es unterlegt die Schlüsselworte der Sprache in verschiedenen Farben, zeichnet Strings und Kommentare aus und unterringelt Zeilen mit Syntaxverstößen -- sehr praktisch beim Entwickeln. Von Fehlern, die erst zur Laufzeit auftauchen (z.B. ein Tippfehler in einem Klassen-, Objekt-, Funktions- oder Property-Namen), weiss Komodo freilich nichts, da JavaScript nicht im Debugger läuft. Definitiv ein Eintrag für die lange Wunschliste.

Abbildung 9: Komodo beherrscht sogar JavaScript: Einfaches Highlighting und Syntax-Checks -- allerdings kein Debugging.

Gedächtnishilfen

Für Anfänger, die Tcl oder Python programmieren (zukünftig auch für Perl) schlägt der Komodo-Editor in den aktuellen Kontext passende Befehle vor und gibt Nachhilfe, was deren Syntax betrifft. Fällt dem Programmier in Abbildung 10 gerade nicht ein, dass die puts-Funktion in Tcl zwei optionale Argumente und dann den auszugebenden Textstring entgegennimmt, hilft sicher die temporär aufleuchtende Gedächtnisstütze weiter.

In Abbildung 11 hat der Programmierer set value [str... getippt und Komodo weiß, dass dies der Anfang einer von Tcls string-Funktionen sein könnte. Auf einen Mausdoppelklick oder das Drücken der Tab-Taste hin übernimmt der Editor die vorgeschlagene Funktion in den Code.

Abbildung 10: Syntax-Hilfe für die Tcl-Funktion puts.

Abbildung 11: Kontextsensitive Vorschläge in Tcl.

XSLT

Da nicht jeder mächtige Programmiersprachen wie Perl beherrscht, um Transformationen an XML-Dokumenten vorzunehmen (um sie z.B. in HTML umzuwandeln), gibt es XSLT-Stylesheets. Mittels einer (natürlich) XML-basierten Sprache legt man dort fest, wie der XSLT-Prozessor die Elemente der ursprünglichen XML-Datei umwandeln muss, um beim Zielformat anzukommen. Abbildung 12 zeigt im mittleren Fenster die Original-XML-Datei hello.xml, deren Transformation nach HTML das XSLT-Stylesheet im oberen Fenster render.xsl festlegt. Die XSLT-Anweisungen transformieren <gruss>...</gruss> zu <H1>...</H1> und <text>...</text> zu <I>...</I>.

Komodo bietet nun einen Debugger für den XSLT-Prozessor, der sich schrittweise durch das XML-Dokument und das XSLT-Stylesheet arbeitet und im Ausgabefenster unten mit jedem durchschrittenen XML-Knoten und jeder abgearbeiteten XSLT-Regel häppchenweise das Zielformat ausgibt. Zusammen mit der XML-Tag-Komplettierung erleichtert Komodo das Erstellen von XML-Dokumenten und deren XSLT-Stylesheets erheblich. Wer gerade XSLT lernt, dem sei der Komodo-Debugger wärmstens empfohlen. Während statisch definierte Regeln manchmal schwer zu verdauen sind, hilft es sehr, dem Prozessor über die Schulter zu schauen, um zu verfolgen, was tatsächlich zur Laufzeit abgeht. Diese Funktion allein rechtfertigt es, einen genaueren Blick auf das Produkt zu werfen. Mehr zum Thema XLST steht in [2].

Abbildung 12: Der XSL-Prozessor arbeitet sich im Debugger durch ein XML-Dokument

... und mehr!

Für eine Reihe weiterer Sprachen bietet Komodo zumindest auf Schlüsselworten basiertes Syntax-Highlighting an. Abbildung 13 zeigt aber, dass hier wirklich nur stur Schlüsselworte unterlegt werden und keine wirkliche Intelligenz dahinter steckt. Unterstützt werden unter anderem LaTeX, C++ und Java, aber wer für diese Sprachen professionelle IDEs sucht, ist mit spezialisierteren Produkten besser bedient.

Abbildung 13: Leicht reinzulegen: Die Java-Umgebung

Schwächen

Die größte Schwäche des Produkts ist die geringe Stabilität. Die grafische Oberfläche der als Beta vorliegenden Linuxversion steigt bei schnellen Mausaktionen schnell aus und zwingt häufig zu Neustarts. Auch mit plötzlichen Core-Dumps muss man leben. Selbst die von ActiveState als stabil bezeichnete Vollversion für Windows zeigt schnell Mängel, falls der analysierte Code komplexer als die mitgelieferten Beispiel-Snippets wird. Steigt man bei folgendem Perl-Code mittels des Debuggers und "Step Into" in die Tiefen der eingebundenen Module, verlangsamt sich das Tempo drastisch:

    use Net::FTP;
    my $ftp = Net::FTP->new("some.host.com");

Während Perls Debugger solche Aufgaben mit Leichtigkeit meistert, zwingt Komodos Überbau selbst relativ gut ausgebaute Rechner bereits mit leicht fortgeschrittenen Skripts in die Knie.

Das Gleiche gilt für Python: Wer mit dem Debugger in die Tiefen von beispielsweise

    from Tkinter import *
    w = Button(text="hello", command='exit')
    w.pack()
    w.mainloop()

vordringt und ein bisschen in der Variablenliste blättert, kann nur noch mit viel Geduld und im Schneckentempo operieren. Wenn jeder Debug-Schritt die Oberfläche für zehn Sekunden einfriert, verzichtet man gern auf den Komfort eines grafischen Debuggers und operiert wieder wie gehabt von der Kommandozeile aus.

Abbildung 14: Volle Kanne Python -- drastische Geschwindigkeitseinbußen

Die aktuelle Version 1.1 wurde von ActiveState anscheinend nur rudimentär getestet. Es zeigen sich teilweise haarsträubender Fehler: Ruft man einmal den Debugger für eine Datei auf, kann man nicht mehr zurück zur Liste der Projektdateien. In der momentan noch sehr instabilen Beta 1.2 wurde dieses Problem schon behoben. Oder legt man beispielsweise mit dem GUI ein neues Projekt an und löscht anschließend die entsprechende *.kpf-Datei von Hand, liegt komodo wie eine Schildkröte auf dem Rücken, zeigt nach wie vor das Projekt in Recent Projects an, meldet aber einen unexpected error wenn man das Projekt öffnet. Aus der Recent Projects-Liste löschen kann man das Projekt aber nicht. Es bleibt zu hoffen, dass diese Kinderkrankheiten mit wachsendem Anwenderkreis verschwinden. Positiv fiel auf, dass Komodo seine Daten (wie zum Beispiel die Projektdatei) in XML ablegt -- so kann man notfalls von Hand eingreifen.

Online-Dokumentation

Da bei Komodo der Mozilla-Browser gleich dabei ist, bot es sich für ActiveState natürlich an, die Dokumentation gleich als HTML mitzuliefern und auf Knopfdruck im Mozilla-Engine anzuzeigen. Dort stehen sowohl die Beschreibungen aller verfügbaren Menüs sowie einige Tutorial-ähnliche Anweisungen zur Bedienung der verschiedenen Applikationen. Mehr wäre mehr gewesen.

Wunschliste

Hier noch eine Reihe von Funktionen, die in Komodo noch fehlen, die das Arbeiten damit aber vereinfachten -- vielleicht kommen sie ja in der nächsten Version:

Remote Debugging

Verfügt der Rechner, auf dem das zu analysierende Perl-, PHP- oder Pythonskript läuft, über keine Komodo-Installation oder gar kein Terminal, kann ein anderswo laufendes Komodo das Debugging übernehmen. Für Perl wird hierzu einfach ein der Komodo-Distribution beiliegendes Debugger-Perl-Skript auf die Remote-Maschine kopiert. Environmentvariablen legen dort den Hostnamen der Komodo-Maschine fest. Mit einem Menüklick weist man daraufhin das anderswo laufende Komodo an, auf einem festgelegten Port auf Signale des ferngesteuerten Perlskripts zu lauschen. Startet man letzeres anschließend auf der Remote-Maschine, sorgen das Debugger-Skript und die Environmentvariablen dafür, dass das Skript als erstes Kontakt zur Komodo-Maschine aufnimmt, um sich fernsteuern zu lassen. Dabei spielt es keine Rolle, ob Komodo- und Remote-Maschine unterschiedliche Betriebssysteme fahren -- Abbildung 15 zeigt ein unter Windows laufendes Komodo in einer Debugging-Session mit einem unter Linux laufenden Perlskript.

Abbildung 15: Komodo unter Windows schreitet durch ein Perlskript auf einem Linux-Rechner.

ActiveState hat sehr viel unterschiedliche Funktionalität in ein einzelnes Produkt verpackt, um es einem möglichst großen Anwenderkreis schmackhaft zu machen. Es dürfte eine große Herausforderung werden, diese Einzelteile stabil zu halten. Eine Aufgabe, die die Open-Source-Gemeinde auf Anfrage sicher dankbar aufgriffe.

Infos

[1]

Die Komodo-Homepage: http://www.activestate.com/Products/Komodo/

[2]

Doug Tidwell, "XSLT", O'Reilly 2001

Michael Schilli

arbeitet als Software-Engineer bei Yahoo! in Sunnyvale, Kalifornien. Er hat "Goto Perl 5" (deutsch) und "Perl Power" (englisch) für Addison-Wesley geschrieben und ist unter mschilli@perlmeister.com zu erreichen. Seine Homepage: http://perlmeister.com.

POD ERRORS

Hey! The above document had some coding errors, which are explained below:

Around line 20:

Non-ASCII character seen before =encoding in 'I<Visual-Studio>-ähnlichen'. Assuming ISO8859-1