www.aec.at  
Ars Electronica 2003
Festival-Website 2003
Back to:
Festival 1979-2007
 

 

Visually Deconstructing Code


'Benjamin Fry Benjamin Fry

Visually Deconstructing Code untersucht in einer Reihe von Experimenten die Form von Code. Es gilt alternative Blickwinkel für Text, Maschinensprache und binäre Programmcodes zu finden, aus denen die darin versteckten abstrakten Strukturen und Prozesse sichtbar werden.

Evolution von Softwareprojekten
Während außer Zweifel steht, dass sich der Code einer Software mit der Zeit ändert, ist weit weniger bekannt, wie die einzelnen Änderungen in einem größeren Kontext ablaufen. Ein Projekt besteht für gewöhnlich aus einer strukturierten Sammlung von Dateien, die im Entwicklungsprozess hinzugefügt, entfernt und reorganisiert werden. Der Inhalt der einzelnen Dateien wird für jeden Bugfix oder jede Funktion zeilen- oder abschnittweise umgeschrieben.

Bei größeren Projekten oder solchen, an denen mehrere Autoren arbeiten, wird meist ein System zur Versionskontrolle eingesetzt. Eines der gängigsten ist das kostenlos erhältliche CVS (oder „Concurrent Version System“). Um den Entwicklungsprozess eines Projekts zu verstehen, muss man die vom Kontrollsystem gespeicherten Daten interpretieren können, das jede Änderung an der Datei oder deren Organisation inkrementiell erfasst.

Im ersten Experiment der Reihe vermittelt eine interaktive Applikation die strukturelle und inhaltliche Evolution des Projekts Processing (http://proce55ing.net) von den ersten Anfängen über fünfzig Releases hindurch. Großformatige Ausdrucke zeigen größere Änderungen im Zeitraffer, während der User mit einer interaktiven Applikation durch die einzelnen Änderungsschritte navigieren kann, die zu den verschiedenen Versionen geführt haben. Das Ergebnis ist ein Abbild eines organischen Ablaufs, in dem auch das kleinste Stück Programmcode heranreift, indem es von den Entwicklern weitergegeben, für den letzten Schliff wieder aufgenommen, zusammengeführt, entfernt und vereinfacht wird.
Von maschinengleicher Sprache zur Sprache der Maschine
Für die meisten Programmiersprachen gilt, dass der vom Programmierer verfasste Code in eine abstraktere Form übersetzt wird, die die ausführende Maschine direkt versteht. In dieser maschinensprachlichen Form erscheint der ursprüngliche Code, der unverständlich oder wunderbar expressiv sein kann, ohne Zweifel noch geheimnisvoller. Allerdings bleibt die Schönheit der Übersetzung durch die Komplexität dieses Verschleierungsvorgangs oft verborgen; manche Teile werden prägnanter, andere weitschweifiger und alles erhält insgesamt eine festere Struktur. Programmiert man in Java, so speichern die Anweisungen im resultierenden Maschinencode (der für eine „virtuelle“, nichtexistente Maschine erstellt wird) auch, welche Zeile im menschen-lesbaren Ausgangscode welche maschinen-lesbare Anweisung erzeugt hat. Die beiden Codeformen werden in diesem Experiment wieder vereint, indem der Übersetzungsprozess des Kompilierens in einem Bild offen gelegt wird.
Verpacken von Daten im Code
Jeder ausführbare Code ist auch mit Daten gespickt, die von einfachen Texten für Fehlermeldungen bis zu kompletten Grafikabfolgen für die Anwendung reichen. So waren bei älteren Spielkonsolen mit Cartridges die Bilder (die „Sprites“) oft als Rohdaten nach den eigentlichen Programmanweisungen eingebettet.

Im dritten Teil untersuchen wir das Entpacken einer Nintendo-Spiel-Cartridge, indem das Programm als Vierfarbbild dekodiert wird und damit einen wundervollen Blick auf die tausenden Einzelelemente freigibt, die den Spielspaß ausmachen.
Die Zeitkomponente beim Ausführen von Code
Gerne wird auch ein „Profiler“ beim Durchlaufen des Codes eingesetzt, um herauszufinden, wie lange die Maschine für welche Operationen braucht. Für jede Funktion wird die Zeit in den jeweiligen Bereichen in Prozent angegeben. Bessere Tools zeigen auch die Hierarchie der nacheinander ausgeführten Funktionen an, eine Hierarchie, die den „Aufruf-Stack“ der nachfolgenden Methoden anzeigt.

Hier analysiert ein aktives Diagramm die Ausgabe eines solchen Profilers: Die funktionalen Beziehungen sind räumlich angeordnet und die Zeit wird durch unterschiedliche Strichstärken dargestellt. So werden aufgeblähte Bereiche des Codes sichtbar, die entweder schlecht programmiert sind oder einfach den Hauptteil der Arbeit ausführen.
Sichtbare Mathematik in Code-Algorithmen
Eine Klasse von Softwarealgorithmen, die u. a. Kryptografie, Prüfsummenverfahren und Seriennummernüberprüfung einschließt, funktioniert wie das mathematische Äquivalent zu den Zacken eines Sicherheitsschlüssels. Dabei wird mit einer Gruppe von Ziffern, die den Schlüssel bilden, Zahlenakrobatik betrieben.

Visually Deconstructing Code untersucht einen solchen Algorithmus, der die Generierung und Überprüfung der Seriennummern von Produkten aus dem Haus Adobe simuliert. Er beginnt mit einer einfachen Initialzahl und führt mehrere mathematische Operationen aus – meist einfache Additionen oder Multiplikationen – um einen mehrstelligen Schlüssel für ein Produkt zu erzeugen. In Applikationen wie PhotoShop oder Illustrator wird dieser Algorithmus eingesetzt, um die Richtigkeit der vom User eingegebenen Seriennummer zu prüfen; er kann aber auch verwendet werden, um eine Vielzahl von gefälschten, aber funktionierenden Schlüsseln für jeden Interessenten zu produzieren. Dieses Experiment soll die Eleganz und Einfachheit eines Prozesses darstellen, der für den Enduser so undurchsichtig wie möglich gehalten wird.
Jedes dieser Experimente wird mit der Frage eingeleitet: „Wie lässt sich dieser Aspekt des Codes bildlich umsetzen?“ Jedes für sich ist eine Vereinfachung, aber als Sammlung visualisieren sie die Funktion und das Verhalten von Code und vermitteln ein organischeres Gedankenmodell als die üblichen Beschreibungen in Form von Text, Tabellen und Diagrammen.

Aus dem Amerikanischen von Michael Kaufmann