Google Closure è un vero compilatore?


19

Questa domanda è ispirata al dibattito nei commenti su questa domanda Stack Overflow . La documentazione del compilatore di chiusura di Google indica quanto segue (enfasi aggiunta):

Il compilatore di chiusura è uno strumento per eseguire download e l'esecuzione di JavaScript più velocemente. È un vero compilatore per JavaScript. Invece di compilare da una lingua di origine al codice macchina, compila da JavaScript a JavaScript migliore.

Tuttavia, Wikipedia fornisce la seguente definizione di "compilatore":

Un compilatore è un programma per computer (o un insieme di programmi) che trasforma il codice sorgente scritto in un linguaggio di programmazione (la lingua di origine) in un altro linguaggio del computer ... Un riscrittore di linguaggio è di solito un programma che traduce la forma di espressioni senza un cambiamento di linguaggio.

Sulla base di ciò, direi che Google Closure non è un compilatore. Ma il fatto che Google affermi esplicitamente che si tratta in realtà di un "vero compilatore" mi fa chiedere se c'è di più. Google Closure è davvero un compilatore JavaScript?


2
Scommetto che il JS che emette è un sottoinsieme proprio di tutti i JS legali; in questo senso, la sua lingua di output è "un'altra" lingua.
AakashM,

Risposte:


23

Il compilatore di chiusura è un minificatore , un ottimizzatore e un validatore all-in-one. Quel tipo lo inserisce nella sua stessa categoria, perché hai ragione sul fatto che un compilatore dovrebbe almeno prendere qualcosa che non verrà eseguito nella sua forma attuale e trasformarlo in qualcosa che lo farà (prendi TypeScript per un esempio basato su ECMAScript).

Ma dai la colpa a Google per aver allungato la terminologia? Cos'altro avrebbero chiamato? Google Minifier? No, è più di questo, e ce ne sono centinaia là fuori. Google Optimizer? È molto più di questo. Google Validator? No, è molto più di questo.

Quindi la scelta è

  • Chiamalo Google Closure Foogle e introduce una parola completamente nuova altrimenti insignificante nel lessico.
  • Chiamalo Google Closure Minoptivalidator, che è più chiaro nelle intenzioni ma più difficile da ricordare.
  • Chiamalo Google Closure Compiler, che è abbastanza vicino alla verità.

Fa tutto ciò che ti aspetteresti da un compilatore, con solo una differenza semantica. E, alla fine, tutte le parole sono definite dal loro uso, in una certa misura. Quindi, se Google riesce a convincere le persone a chiamarlo compilatore, la definizione di compilatore cambia leggermente. Certamente non in alcun modo ciò causerà un problema.

Oppure, per tornare all'esempio precedente, puoi trovare qualcosa di significativo su TypeScript che gli consenta di essere chiamato un "vero compilatore", mentre il compilatore di chiusura di Google dovrebbe essere limitato a "quasi un compilatore"?


Il punto della domanda era solo quello di vedere veramente ciò che la gente vede come un "compilatore". Come affermato da 0A0D è solo una semantica, ma mi sono appena trovato a chiedermi perché Google abbia sentito il bisogno di chiarire che si trattava di un "vero compilatore". +1 per "Minoptivalidator"!
James Allardice,

@JamesAllardice: Ancora una volta, perché se riesci a convincere le persone che si tratta di un compilatore, la definizione di compilatore si estende per includerlo. Ed è davvero giusto che dovrebbe, in questo caso. Se definisci una nuova parola che la separa dal compilatore da una riga sematica, il tuo prodotto viene classificato come "quasi, ma non del tutto".
pdr,

1
Non lo so, mi piace un po '"Google Foogle" :-)
GrandmasterB

9
Io voto per Minoptival. Sembra un dinosauro. A tutti piacciono i dinosauri, giusto?
Izkata,

2
@Izkata: Se c'è una cosa che la storia dell'evoluzione ci ha insegnato, è che Javascript non sarà contenuto. Javascript si libera, si espande in nuovi territori e attraversa barriere dolorosamente, forse anche pericolosamente.
pdr,

9

Sulla base di ciò, direi che Google Closure non è un compilatore.

Bene sì ... ma questo presuppone che Wikipedia sia autorevole su questo punto.

E in contrasto con la definizione di Wikipedia, considera alcune definizioni del dizionario (da http://www.thefreedictionary.com/compiler ):

2) (Informatica) - Un programma che traduce un altro programma scritto in un linguaggio di alto livello in linguaggio macchina in modo che possa essere eseguito.

2) (Elettronica & Informatica / Informatica) un programma per computer attraverso il quale un linguaggio di programmazione di alto livello, come COBOL o FORTRAN, viene convertito in linguaggio macchina su cui può agire un computer.

Un programma per computer associato ad alcuni linguaggi di programmazione che converte le istruzioni scritte in quei linguaggi in codice macchina che può successivamente essere eseguito direttamente da un computer.

Concesso che queste definizioni siano tutte un po 'vecchio stile, ma ciò dimostra che non esiste un "vero significato" ... e in effetti che significati di termini come "compilatore" cambiano nel tempo. (E, IMO va bene, perché non abbiamo davvero bisogno di una definizione precisa per questo caso.)

Discutere se il compilatore Closure sia o meno un "vero compilatore" (IMO) non è un'attività fruttuosa. Sarebbe più utile capire cosa intende la gente di Google per "vero compilatore" ... in quel contesto.


2
+1, ironicamente, JS è sia un "linguaggio macchina" per il web sia un "linguaggio di programmazione di alto livello".
K.Steff,

3
+1 e un altro per "presume che Wikipedia sia autorevole su questo punto". Troppe persone accettano ciecamente qualunque cosa accada lì scritto.
Marjan Venema,

6

Penso che il motivo per cui possa essere chiamato "un vero compilatore" è perché crea un AST completo (albero semantico astratto) dai tuoi programmi e lo usa per generare un nuovo testo.

Il fatto che sia il testo originale che quello risultante siano JavaScript validi è una semplice coincidenza.

Questo è importante perché ci sono molti strumenti che eseguono solo manipolazioni di testo del codice (minificatori, prettificatori, ecc.) Ma non eseguono alcuna gestione AST, tanto meno la rigenerazione del codice. Anche se quegli strumenti sono sempre più potenti, non sono lo stesso tipo di software e i limiti sono diversi.


1
Grazie, questa è una risposta interessante. Penso che la tua spiegazione possa offrire una migliore definizione di "compilatore" rispetto a Wikipedia e ai vari dizionari citati da altri.
James Allardice,

Bene, mi piace questa risposta e ho votato per questo ad un certo punto, ma vorrei notare che è perfettamente possibile compilare (nel tradizionale senso linguistico di alto livello da macchina a macchina) senza mai costruire un AST. Vedi Let's Build a Compiler per esempio. Ora è certamente vero che il compilatore del tutorial di Crenshaw è piuttosto rozzo, ma non credo che nessuno lo abbia accusato di non essere un compilatore.
Dmckee,

Non ho letto quel riferimento, ma sarei d'accordo che un AST esplicito non è strettamente necessario per la compilazione. Tuttavia, nella maggior parte dei casi esiste una struttura equivalente, esplicita nei dati, o implicita nell'esecuzione (forse lo stack di chiamate (o la sua evoluzione nel tempo) riflette l'analisi della sintassi). Il mio punto principale è che la compilazione non è manipolazione del testo, ma generazione di codice da un'analisi di un codice sorgente.
Javier,

4

Secondo me è semantica. In senso tradizionale, non è un compilatore. Tuttavia, nello stesso link di Wikipedia, si dice

È probabile che un compilatore esegua molte o tutte le seguenti operazioni: analisi lessicale, preelaborazione, analisi, analisi semantica (traduzione diretta dalla sintassi), generazione di codice e ottimizzazione del codice.

La chiusura esegue alcune o tutte queste operazioni.

Un po 'più in basso nell'articolo di Wikipedia

Tuttavia, in pratica raramente c'è qualcosa in un linguaggio che richiede che sia compilato o interpretato esclusivamente, anche se è possibile progettare linguaggi che si basano sulla reinterpretazione in fase di esecuzione.

Detto questo, suppongo che sia stato più facile chiamarlo " Closure Compiler " piuttosto che "Closure Optimizer" perché in realtà si tratta solo di ottimizzare JavaScript per i browser, non è necessario tradurlo in un'altra lingua o bytecode.

Il compilatore di chiusura come sostantivo è un non sequitur .


È solo una semantica, hai ragione. Il punto della domanda era davvero solo quello di vedere come la gente vede un "compilatore". Continuo a non pensare che il compilatore di chiusura sia un "vero compilatore", ma esegue molte azioni simili.
James Allardice,

3

Innanzitutto, evitiamo che esista il compilatore da sorgente a sorgente. Non puoi dire che qualcosa non sia un compilatore perché il risultato finale non è un codice di livello inferiore.

Mentre è corretto che il compilatore di chiusura generi AST e abbia una frase di generazione di codice, molti minimizer Javascript già lo fanno e probabilmente non li chiamerei nemmeno compilatori.

Ciò che distingue veramente Closure Compiler è la sua applicazione di molte note tecniche di compilazione nel rilevamento e nell'ottimizzazione degli errori. Ecco alcuni esempi:

Tipo di sistema:

Il compilatore di chiusura definisce un sistema di tipi con annotazioni. Utilizza tecniche di inferenza del tipo utilizzate da molti compilatori per verificare la presenza di errori nel programma.

Ottimizzazioni interprocedurali

Il compilatore di chiusura crea grafici di chiamata per rinominare e rimuovere il codice morto a livello di intero programma.

Ottimizzazioni intra-processuali

Il compilatore di chiusura ottimizza Javascript applicando diverse analisi del flusso di controllo e analisi del flusso di dati. Tecniche di compilazione classiche come: Inline, Allocazione dei registri, Analisi delle variabili in tempo reale ... e molte altre sono tutte utilizzate per spremere l'ultimo byte dall'output Javascript.

Sistema di moduli

Una parte meno nota del compilatore di chiusura che può essere utilizzata per dividere il codice in download separato per tempi di avvio più rapidi. Utilizza anche molti algoritmi grafici. Qualcosa è anche molto comune nei compilatori "tradizionali".

Tutte queste tecniche di analisi statica e del compilatore sono ciò che distingue Closing Compiler dagli altri minimizer Javascript. Togliendo dal fatto che il linguaggio di input e output target è lo stesso, non vedo perché non sia classificato come un "vero compilatore".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.