Google Closure Compiler


Startseite Einleitung Funktionsweise Verwendung Kompiliergrade Arbeiten mit advanced_optimizations Fazit

Funktionsweise

Übersicht:





Was ist ein abstrakter Syntaxbaum?

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.



Die Funktionsweise des Closure Compilers

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.



Ein kleines Beispiel für eine AST-Transformation

AST für
if (condition == true)
{foo=1};

AST für obigen Code

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.

AST für transformierten Code

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