Ist Google Closure ein echter Compiler?

19

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?

James Allardice
quelle
2
Ich wette, das JS, das es ausgibt, ist eine richtige Teilmenge aller legalen JS; in diesem Sinne seine Ausgangssprache ist „ eine andere“ Sprache.
AakashM 20.11.12

Antworten:

23

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

  • Nennen Sie es Google Closure Foogle und fügen Sie ein völlig neues, ansonsten bedeutungsloses Wort in das Lexikon ein.
  • Nennen Sie es Google Closure Minoptivalidator, was in der Absicht klarer, aber schwerer zu merken ist.
  • Nennen Sie es Google Closure Compiler, was der Wahrheit ziemlich nahe kommt.

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?

pdr
quelle
Der Punkt der Frage war nur zu sehen, was die Leute als "Compiler" ansehen. Wie von 0A0D angegeben, handelt es sich nur um Semantik, aber ich habe mich gerade gefragt, warum Google das Bedürfnis verspürt, zu verdeutlichen, dass es sich um einen "wahren Compiler" handelt. +1 für "Minoptivalidator"!
James Allardice
@JamesAllardice: Auch hier gilt: Wenn Sie die Leute davon überzeugen können, dass es sich um einen Compiler handelt, wird die Definition des Compilers so erweitert, dass sie ihn einschließt. Und es ist nur wirklich fair, dass es in diesem Fall sollte. Wenn Sie ein neues Wort definieren, das es durch eine sematische Linie vom Compiler trennt, wird Ihr Produkt als "fast, aber nicht ganz" eingestuft.
pdr
1
Ich weiß nicht, ich mag "Google Foogle" :-)
GrandmasterB
9
Ich stimme dafür Minoptival. Es klingt wie ein Dinosaurier. Jeder mag Dinosaurier, richtig?
Izkata
2
@Izkata: Wenn es eine Sache gibt, die uns die Geschichte der Evolution gelehrt hat, dann ist es, dass Javascript nicht enthalten sein wird. Javascript löst sich, es dehnt sich in neue Gebiete aus und stürzt schmerzhaft, vielleicht sogar gefährlich, durch Barrieren.
pdr
9

Basierend darauf würde ich sagen, dass Google Closure kein Compiler ist.

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 ):

2) (Informatik) - Ein Programm, das ein anderes in einer höheren Sprache geschriebenes Programm in eine Maschinensprache übersetzt, damit es ausgeführt werden kann.

2) (Electronics & Computer Science / Computer Science) ein Computerprogramm, mit dem eine Programmiersprache auf hoher Ebene wie COBOL oder FORTRAN in eine Maschinensprache konvertiert wird, auf die ein Computer einwirken kann.

Ein Computerprogramm, das bestimmten Programmiersprachen zugeordnet ist und die in diesen Sprachen geschriebenen Anweisungen in Maschinencode umwandelt, der später direkt von einem Computer ausgeführt werden kann.

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.

Stephen C
quelle
2
+1, Ironischerweise ist JS sowohl "Maschinensprache" für das Web als auch eine "Programmiersprache auf hohem Niveau".
K.Steff
3
+1 und ein weiteres für "setzt voraus, dass Wikipedia in diesem Punkt maßgeblich ist". Zu viele Leute akzeptieren blind, was dort geschrieben steht.
Marjan Venema
6

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.

Javier
quelle
1
Danke, das ist eine interessante Antwort. Ich denke, Ihre Erklärung könnte eine bessere Definition von "Compiler" bieten als Wikipedia und die verschiedenen Wörterbücher, die andere zitiert haben.
James Allardice
Nun, ich mag diese Antwort und habe irgendwann dafür gestimmt, aber ich würde bemerken, dass es durchaus möglich ist, zu kompilieren (im traditionellen Sinn von Hochsprache zu Maschinensprache), ohne jemals einen AST zu erstellen. Weitere Informationen finden Sie beispielsweise unter Erstellen eines Compilers . Nun ist es sicher richtig, dass der Compiler aus Crenshaws Tutorial ziemlich grob ist, aber ich glaube nicht, dass jemand ihm vorgeworfen hat, kein Compiler zu sein.
DMCKEE
Ich habe diesen Verweis nicht gelesen, aber ich stimme zu, dass ein expliziter AST für die Kompilierung nicht unbedingt erforderlich ist. In den meisten Fällen gibt es jedoch eine äquivalente Struktur, entweder explizit in den Daten oder implizit in der Ausführung (möglicherweise spiegelt der Aufrufstapel (oder seine zeitliche Entwicklung) die Syntaxanalyse wider). Mein Hauptpunkt ist, dass das Kompilieren keine Textmanipulation ist, sondern das Generieren von Code aus einer Analyse von Quellcode.
Javier
4

Meiner Meinung nach ist es Semantik. Im herkömmlichen Sinne ist es kein Compiler. In demselben Wikipedia-Link heißt es jedoch

Es ist wahrscheinlich, dass ein Compiler viele oder alle der folgenden Vorgänge ausführt: lexikalische Analyse, Vorverarbeitung, Parsen, semantische Analyse (syntaxgesteuerte Übersetzung), Codegenerierung und Codeoptimierung.

Beim Schließen werden einige oder alle dieser Vorgänge ausgeführt.

Ein bisschen weiter unten im Wikipedia-Artikel

In der Praxis gibt es jedoch selten etwas an einer Sprache, das eine ausschließliche Kompilierung oder Interpretation erfordert, obwohl es möglich ist, Sprachen zu entwerfen, bei denen zur Laufzeit eine Neuinterpretation erforderlich ist.

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 .

Brian
quelle
Es ist nur Semantik, du hast recht. Der Punkt der Frage war wirklich nur zu sehen, als was die Leute einen "Compiler" ansehen. Ich denke immer noch nicht, dass der Closure Compiler ein "echter Compiler" ist, aber er führt viele ähnliche Aktionen aus.
James Allardice
3

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.

Alan
quelle