Startseite | Einleitung | Funktionsweise | Verwendung | Kompiliergrade | Arbeiten mit advanced_optimizations | Fazit |
---|
Bei einem abstrakten Syntaxbaum(kurz: AST) handelt es sich um eine logische Baumstruktur, welche die syntaktischen Zusammenhänge eines Programmes abbildet.
Diese werden im Kontext von Compilern verwendet um das Programm in der Quellsprache systematisch traversieren und in die Zielsprache übersetzen zu können.
Der abstrakte Syntaxbaum ist meist das Ergebnis eines Parsers.
Googles Closure Compiler nutzt für die Analyse des JavaScript-Quellcodes den Parser aus Mozillas JavaScript-Implementierung "Rhino".
Jedoch verwendet man hier eine stark vereinfachte und stellenweise modifizierte Version, da das Original des JavaSript-Parsers von Rhino einen - zumindest für den Closure Compiler - zu großen Funktionsumfang hat.
Unterstützt wird ausschließlich JavaScript nach dem "Ecmascript 262 Revision 3"-Standard. Funktionalitäten die diesen Standard verletzen führen zu Fehlern bei der lexikalischen Analyse.
Das Ergebnis der lexikalischen und syntaktischen Analyse wird in Form eines attributierten abstrakten Syntaxbaumes zurückgegeben.
Durch Transformationen auf dem abstrakten Syntaxbaum kann die Länge des Quellcodes stark verringert werden.
Hierbei dürfen jedoch ausschließlich Transformationen vorgenommen werden welche die Semantik (die Funktionsweise) des ursprünglichen Quellcodes nicht verändern, da das resultierende Programm natürlich dieselbe Funktionalität haben muss.
So kann man zum Beispiel ein If [Kondition] then [Then-Anweisung] else [Else-Anweisung]
-Konstrukt in die verkürzte Form [Kondition]?[Then-Anweisung]:[Else-Anweisung]
gebracht werden.
Anhand des abstrakten Syntaxbaumes kann der Compiler auch erkennen, ob eine Variable so genutzt wird als wäre sie eine Konstante. In diesem Fall könnte man jede Verwendung der Variablen einfach durch den Wert ersetzten (vorrausgesetzt es verkürzt den Code).
Auch können einige Elemente des Syntaxbaumes als unerreichbar erkannt werden und komplett entfernt werden.
Ein Großteil der Codeminimierung wird jedoch durch das Entfernen von Kommentaren und nicht notwendigen Whitespaces erreicht. Auch durch das Umbenennen von Bezeichnern in möglichst kurze Namen verliert der Code enorm an Länge.
if (condition == true)
{foo=1};
In diesem Beispiel kann man durch Transformation des IF-THEN-Ausdrucks in eine logische Und-Verknüpfung der Kondition und des Ausdrucks einige Zeichen einsparen.
Der Vergleich auf true kann weggelassen werden, da beim IF die gesamte Bedingung soweiso auf true verglichen wird.
So erhält man als Resultat (ohne Umbenennungen):condition&&(foo=1);
Nach einer Umbenennung erhält man dann a&&(b=1);
Startseite | Einleitung | Funktionsweise | Verwendung | Kompiliergrade | Arbeiten mit advanced_optimizations | Fazit |
---|