Diese Frage ist von der Debatte in den Kommentaren zu dieser Stapelüberlauf-Frage inspiriert . In der Dokumentation zum Google Closure Compiler wird Folgendes angegeben (Hervorhebung hinzugefügt):
Der Closure Compiler ist ein Tool, mit dem Sie JavaScript schneller herunterladen und ausführen können. Es ist ein wahrer Compiler für JavaScript. Anstatt von einer Quellsprache in Maschinencode zu kompilieren, kompiliert es von JavaScript zu besserem JavaScript.
Allerdings Wikipedia gibt die folgende Definition eines „Compiler“:
Ein Compiler ist ein Computerprogramm (oder eine Reihe von Programmen), das in einer Programmiersprache (der Quellsprache) geschriebenen Quellcode in eine andere Computersprache umwandelt Sprache.
Basierend darauf würde ich sagen, dass Google Closure kein Compiler ist. Aber die Tatsache, dass Google ausdrücklich angibt, dass es sich tatsächlich um einen "wahren Compiler" handelt, lässt mich fragen, ob mehr dahinter steckt. Ist Google Closure wirklich ein JavaScript-Compiler?
quelle
Antworten:
Der Closure Compiler ist ein All-in-One- Minifier , Optimizer und Validator . Auf diese Weise wird es in eine eigene Kategorie eingeordnet, da Sie Recht haben, dass ein Compiler zumindest etwas verwenden sollte, das nicht in der aktuellen Form ausgeführt wird, und es in etwas umwandeln sollte , das dies ermöglicht ( für ein ECMAScript-basiertes Beispiel nehmen Sie TypeScript ).
Aber beschuldigen Sie Google, die Terminologie erweitert zu haben? Wie würden sie es sonst nennen? Google Minifier? Nein, es ist mehr als das, und es gibt Hunderte von denen da draußen. Google Optimizer? Es ist viel mehr als das. Google Validator? Nein, es ist viel mehr als das.
Die Wahl ist also
Es macht alles, was Sie von einem Compiler erwarten, mit nur einem semantischen Unterschied. Und am Ende werden alle Wörter bis zu einem gewissen Grad durch ihre Verwendung definiert. Wenn Google die Leute davon überzeugen kann, dies als Compiler zu bezeichnen, ändert sich die Definition des Compilers geringfügig. Auf keinen Fall wird dies ein Problem verursachen.
Oder können Sie, um auf das vorherige Beispiel zurückzukommen, irgendetwas Wichtiges an TypeScript finden, das es ermöglicht, es als "echten Compiler" zu bezeichnen, während der Google Closure Compiler auf "fast einen Compiler" beschränkt sein sollte?
quelle
Minoptival
. Es klingt wie ein Dinosaurier. Jeder mag Dinosaurier, richtig?Na ja ... aber das setzt voraus, dass Wikipedia in diesem Punkt maßgeblich ist.
Als Gegenentwurf zur Wikipedia-Definition sollten Sie einige Wörterbuchdefinitionen berücksichtigen (von http://www.thefreedictionary.com/compiler ):
Zugegeben, diese Definitionen sind alle ein bisschen altmodisch, aber es zeigt, dass es keine "wahre Bedeutung" gibt ... und dass sich die Bedeutungen von Begriffen wie "Compiler" im Laufe der Zeit ändern. (Und, IMO, das ist in Ordnung, weil wir für diesen Fall keine genaue Definition brauchen .)
Die Debatte, ob der Closure-Compiler ein "echter Compiler" ist oder nicht, ist (IMO) keine fruchtbare Aktivität. Es wäre sinnvoller zu verstehen, was die Google-Leute in diesem Zusammenhang unter "echtem Compiler" verstehen.
quelle
Ich denke, der Grund, warum es "ein echter Compiler" genannt werden kann, ist, dass es aus Ihren Programmen einen vollständigen AST (abstrakten semantischen Baum) erstellt und ihn verwendet, um einen neuen Text zu generieren.
Die Tatsache, dass sowohl der Originaltext als auch der resultierende Text gültiges JavaScript sind, ist Zufall.
Dies ist wichtig, da es viele Tools gibt, die nur Textmanipulationen des Codes ausführen (Minifier, Prettifier usw.), aber keine AST-Verarbeitung ausführen, geschweige denn eine Code-Neuerstellung. Auch wenn diese Tools immer leistungsfähiger werden, sind sie nicht die gleiche Art von Software, und die Einschränkungen sind unterschiedlich.
quelle
Meiner Meinung nach ist es Semantik. Im herkömmlichen Sinne ist es kein Compiler. In demselben Wikipedia-Link heißt es jedoch
Beim Schließen werden einige oder alle dieser Vorgänge ausgeführt.
Ein bisschen weiter unten im Wikipedia-Artikel
Abgesehen davon denke ich, dass es einfacher war, es als " Closure Compiler " zu bezeichnen, als als "Closure Optimizer", da es eigentlich nur JavaScript für Browser optimiert und nicht in eine andere Sprache oder einen anderen Bytecode übersetzt werden muss.
Closure Compiler als Substantiv ist eine Nicht-Sequenzierung .
quelle
Lassen Sie uns dies zunächst aus dem Weg räumen, den der Source-to-Source-Compiler bietet. Sie können nicht sagen, dass etwas kein Compiler ist, da das Endergebnis kein Code niedrigerer Ebene ist.
Es ist zwar richtig, dass der Closure Compiler AST generiert und eine Code-Generierungsphrase hat, aber viele Javascript-Minimierer tun dies bereits und ich würde sie wahrscheinlich auch nicht als Compiler bezeichnen.
Was Closure Compiler wirklich auszeichnet, ist die Anwendung vieler bekannter Compilertechniken bei der Fehlererkennung und -optimierung. Hier sind einige Beispiele:
Typ System:
Closure Compiler definiert ein System mit Anmerkungen. Es verwendet Typinferenztechniken, die viele Compiler verwenden, um Ihr Programm auf Fehler zu überprüfen.
Interprozedurale Optimierungen
Closure Compiler erstellt Aufrufdiagramme, um toten Code in einer gesamten Programmebene umzubenennen und zu entfernen.
Intraprozedurale Optimierungen
Closure Compiler optimiert Javascript durch Anwendung verschiedener Kontrollflussanalysen sowie Datenflussanalysen. Klassische Compilertechniken wie Inlining, Registerzuordnung, Live-Variablenanalyse usw. werden verwendet, um das letzte Byte aus dem Ausgabe-Javascript herauszuholen.
Modul System
Ein weniger bekannter Teil von Closure Compiler, mit dem Sie Ihren Code in separate Downloads aufteilen können, um die Startzeit zu verkürzen. Es werden auch viele Grafikalgorithmen verwendet. Auch bei "traditionellen" Compilern ist etwas sehr verbreitet.
All diese Compiler- und statischen Analysetechniken unterscheiden Closure Compiler von anderen Javascript-Minimierern. Wenn man bedenkt, dass die gezielte Eingabe- und Ausgabesprache identisch ist, kann ich nicht nachvollziehen, warum sie nicht als "echter Compiler" eingestuft wird.
quelle