Google Closure è un vero compilatore?

19

Questa domanda è ispirata al dibattito nei commenti su questo Overflow dello stack domanda . La compilatore di Google Closure riporta quanto segue (in corsivo aggiunto):

The Closure Compiler is a tool for making JavaScript download and run faster. It is a true compiler for JavaScript. Instead of compiling from a source language to machine code, it compiles from JavaScript to better JavaScript.

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

A compiler is a computer program (or set of programs) that transforms source code written in a programming language (the source language) into another computer language... A language rewriter is usually a program that translates the form of expressions without a change of language.

In base a ciò, direi che Google Closure non è un compilatore. Ma il fatto che Google affermi esplicitamente che è in effetti un "vero compilatore" mi fa chiedere se c'è dell'altro. Google Closure è davvero un compilatore JavaScript?

    
posta James Allardice 20.11.2012 - 14:53
fonte

5 risposte

23

Il Closure Compiler è un minifier , un optimiser e un validator all-in-one. Quel tipo lo mette nella sua categoria, perché sei corretto 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 esteso la terminologia? Cos'altro avrebbero potuto chiamarlo? Google Minifier? No, è più di questo, e ci sono centinaia di quelli là fuori. Google Optimiser? È molto più di questo. Google Validator? No, è molto più di questo.

Quindi la scelta è

  • Chiamalo Google Closure Foogle e inserisci una nuova parola altrimenti priva di significato nel lessico.
  • Chiamalo Google Closure Minoptivalidator, che è più chiaro negli intenti ma difficile da ricordare.
  • Chiamalo compilatore di chiusura di Google, che è molto vicino alla realtà.

Fa tutto ciò che ci si aspetterebbe 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 può convincere la gente a chiamare questo un compilatore, la definizione del compilatore cambia leggermente. Certamente non in alcun modo che possa causare un problema.

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

    
risposta data 20.11.2012 - 15:12
fonte
9

Based on that, I would say that Google Closure is not a compiler.

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

E come contropartita della definizione di Wikipedia, considera alcune definizioni di dizionario (dal link ):

2) (Computer Science) - A program that translates another program written in a high-level language into machine language so that it can be executed.

2) (Electronics & Computer Science / Computer Science) a computer program by which a high-level programming language, such as COBOL or FORTRAN, is converted into machine language that can be acted upon by a computer.

A computer program associated with certain programming languages that converts the instructions written in those languages into machine code that can later be executed directly by a computer.

È scontato che queste definizioni siano un po 'antiquate, ma dimostra che non esiste un "unico vero significato" ... e infatti i significati di termini come "compilatore" cambiano nel tempo. (E IMO va bene, perché in realtà non abbiamo bisogno di una definizione precisa.)

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

    
risposta data 20.11.2012 - 15:09
fonte
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 fanno solo manipolazioni di testo del codice (minifiers, prettifier, ecc.) ma non fanno alcuna manipolazione AST, tanto meno la rigenerazione del codice. Anche se questi strumenti sono sempre più potenti, non sono lo stesso tipo di software e le limitazioni sono diverse.

    
risposta data 20.11.2012 - 20:46
fonte
4

È semantica a mio avviso. Nel senso tradizionale, non è un compilatore. Tuttavia, nello stesso link di Wikipedia, si dice

A compiler is likely to perform many or all of the following operations: lexical analysis, preprocessing, parsing, semantic analysis (Syntax-directed translation), code generation, and code optimization.

La chiusura esegue alcune o tutte quelle operazioni.

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

However, in practice there is rarely anything about a language that requires it to be exclusively compiled or exclusively interpreted, although it is possible to design languages that rely on re-interpretation at run time.

Detto questo, suppongo che fosse più facile chiamarlo " Compilatore di chiusura " anziché " Closure Optimizer "perché in realtà si sta solo ottimizzando JavaScript per i browser, non è necessario tradurlo in un'altra lingua o in un bytecode.

Il compilatore di chiusura come sostantivo è un non sequitur .

    
risposta data 20.11.2012 - 15:05
fonte
3

In primo luogo, consente di estrarre questo compilatore sorgente-da-sorgente. Non puoi dire che qualcosa non è un compilatore perché il risultato finale non è un codice di livello inferiore.

Anche se è vero che il compilatore di chiusura genera AST e ha una frase di generazione del codice, molti minimizzatori Javascript là fuori lo fanno già e probabilmente non li chiamerei nemmeno compilatori.

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

Digita sistema:

Closure Compiler definisce un sistema di tipo annotato. Utilizza tecniche di inferenza di tipo che molti compilatori usano per controllare errori del tuo programma.

Ottimizzazioni interprocedurali

Closure Compiler costruisce i grafici delle chiamate per rinominare e rimuovere il codice morto in un intero livello di programma.

Ottimizzazioni intraprocedurali

Closure Compiler ottimizza Javascript applicando diverse analisi del flusso di controllo e analisi del flusso di dati. Tecniche di compilazione classiche come: Inlining, Register Allocation, Live Variable Analysis ... e molte altre sono tutte utilizzate per spremere l'ultimo byte dall'output di Javascript.

Sistema del modulo

Una parte meno conosciuta di Closure Compiler che può essere utilizzata per dividere il codice in download separato per un tempo di avvio più rapido. Utilizza anche molti algoritmi di grafi. Qualcosa è anche molto comune nei compilatori "tradizionali".

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

    
risposta data 25.11.2012 - 12:57
fonte

Leggi altre domande sui tag