¿Es Google Closure un verdadero compilador?

19

Esta pregunta está inspirada en el debate en los comentarios sobre esta pregunta de desbordamiento de pila . La documentación del compilador de cierre de Google establece lo siguiente (énfasis agregado):

El compilador de cierre es una herramienta para hacer que JavaScript se descargue y se ejecute más rápido. Es un verdadero compilador para JavaScript. En lugar de compilar desde un lenguaje fuente a código de máquina, compila desde JavaScript para mejorar JavaScript.

Sin embargo, Wikipedia ofrece la siguiente definición de "compilador":

Un compilador es un programa de computadora (o conjunto de programas) que transforma el código fuente escrito en un lenguaje de programación (el idioma de origen) en otro lenguaje de computadora ... Una reescritura de idiomas es generalmente un programa que traduce la forma de expresiones sin un cambio de idioma.

Basado en eso, diría que Google Closure no es un compilador. Pero el hecho de que Google declare explícitamente que de hecho es un "verdadero compilador" me hace preguntarme si hay más. ¿Es Google Closure realmente un compilador de JavaScript?

James Allardice
fuente
2
Apuesto a que el JS que genera es un subconjunto adecuado de todos los JS legales; en este sentido, su lenguaje de salida es "otro" lenguaje.
AakashM

Respuestas:

23

El compilador de cierre es un minificador , un optimizador y un validador todo en uno. Eso lo coloca en su propia categoría, porque tiene razón en que un compilador debe al menos tomar algo que no se ejecutará en su forma actual y convertirlo en algo que sí lo haga (tome TypeScript para un ejemplo basado en ECMAScript).

¿Pero culpas a Google por estirar la terminología? ¿Qué más iban a llamarlo? Google Minifier? No, es más que eso, y hay cientos de esos por ahí. Google Optimiser? Es mucho más que eso. Validador de Google? No, es mucho más que eso también.

Entonces la elección es

  • Llámelo Google Closure Foogle e introduzca una nueva palabra sin sentido en el léxico.
  • Llámalo Google Closure Minoptivalidator, que tiene una intención más clara pero más difícil de recordar.
  • Llámelo Google Closure Compiler, que está bastante cerca de la verdad.

Hace todo lo que esperaría que hiciera un compilador, con solo una diferencia semántica. Y, al final, todas las palabras se definen por su uso, hasta cierto punto. Entonces, si Google puede convencer a la gente de llamar a esto un compilador, la definición de compilador cambia ligeramente. Ciertamente no de ninguna manera que pueda causar un problema.

O, para volver al ejemplo anterior, ¿puede encontrar algo significativo acerca de TypeScript que le permita ser llamado "compilador verdadero", mientras que Google Closure Compiler debería restringirse a "casi un compilador"?

pdr
fuente
El punto de la pregunta era simplemente ver lo que la gente ve como un "compilador". Según lo indicado por 0A0D, es solo semántica, pero me pregunté por qué Google sintió la necesidad de aclarar que era un "verdadero compilador". +1 para "Minoptivalidator"!
James Allardice el
@JamesAllardice: De nuevo, porque si puedes convencer a la gente de que es un compilador, entonces la definición de compilador se extiende para incluirlo. Y es realmente justo que así sea, en este caso. Si define una nueva palabra que la separa del compilador por una línea semántica, su producto se clasifica como "casi, pero no del todo".
pdr
1
No sé, me gusta "Google Foogle" :-)
GrandmasterB
99
Yo voto por Minoptival. Suena como un dinosaurio. A todos les gustan los dinosaurios, ¿verdad?
Izkata
2
@Izkata: Si hay algo que la historia de la evolución nos ha enseñado, es que Javascript no estará contenido. Javascript se libera, se expande a nuevos territorios y atraviesa barreras dolorosamente, incluso peligrosamente.
pdr
9

Basado en eso, diría que Google Closure no es un compilador.

Bueno, sí ... pero eso supone que Wikipedia tiene autoridad en este punto.

Y como un contador a la definición de Wikipedia, considere algunas definiciones de diccionario (de http://www.thefreedictionary.com/compiler ):

2) (Ciencias de la computación) : un programa que traduce otro programa escrito en un lenguaje de alto nivel al lenguaje de máquina para que pueda ejecutarse.

2) (Electrónica y Ciencias de la Computación / Ciencias de la Computación) un programa de computadora mediante el cual un lenguaje de programación de alto nivel, como COBOL o FORTRAN, se convierte en lenguaje de máquina sobre el que puede actuar una computadora.

Un programa de computadora asociado con ciertos lenguajes de programación que convierte las instrucciones escritas en esos idiomas en código de máquina que luego puede ser ejecutado directamente por una computadora.

Es cierto que todas estas definiciones están un poco pasadas de moda, pero ilustran que no existe un "significado verdadero" ... y que los significados de términos como "compilador" cambian con el tiempo. (Y, en mi opinión, eso está bien, porque realmente no necesitamos una definición precisa para este caso).

Debatir si el compilador de Closure es un "compilador verdadero" o no (IMO) no es una actividad fructífera. Sería más útil entender lo que la gente de Google entiende por "compilador verdadero" ... en ese contexto.

Stephen C
fuente
2
+1, irónicamente, JS es 'lenguaje de máquina' para la web y 'lenguaje de programación de alto nivel'.
K.Steff
3
+1, y más otro para "supone que Wikipedia es autorizada en este punto". Demasiadas personas aceptan ciegamente lo que sea que esté escrito allí.
Marjan Venema el
6

Creo que la razón por la que se le puede llamar "un compilador real" es porque construye un AST (árbol semántico abstracto) completo de sus programas y lo utiliza para generar un nuevo texto.

El hecho de que tanto el texto original como el resultante sean JavaScript válido es mera coincidencia.

Esto es importante porque hay muchas herramientas que solo hacen manipulaciones de texto del código (minificadores, prettificadores, etc.) pero no hacen ningún manejo de AST, mucho menos la regeneración de código. Incluso si esas herramientas son cada vez más potentes, no son el mismo tipo de software y las limitaciones son diferentes.

Javier
fuente
1
Gracias, esta es una respuesta interesante. Creo que su explicación puede ofrecer una mejor definición de "compilador" que Wikipedia y los diversos diccionarios que otros han citado.
James Allardice
Bueno, me gusta esta respuesta y voté por ella en algún momento, pero quisiera señalar que es perfectamente posible compilar (en el sentido tradicional del lenguaje de alto nivel al lenguaje de máquina) sin crear un AST. Ver Let's Build a Compiler por ejemplo. Ahora es cierto que el compilador del tutorial de Crenshaw es bastante burdo, pero no creo que nadie lo haya acusado de no ser un compilador.
dmckee
No he leído esa referencia, pero estaría de acuerdo en que un AST explícito no es estrictamente necesario para la compilación. Aún así, en la mayoría de los casos hay una estructura equivalente, explícita en los datos o implícita en la ejecución (tal vez la pila de llamadas (o su evolución en el tiempo) refleja el análisis de sintaxis). Mi punto principal es que compilar no es manipulación de texto, sino generar código a partir de un análisis de algún código fuente.
Javier
4

Es semántica en mi opinión. En el sentido tradicional, no es un compilador. Sin embargo, en el mismo enlace de Wikipedia, dice

Es probable que un compilador realice muchas o todas las siguientes operaciones: análisis léxico, preprocesamiento, análisis, análisis semántico (traducción dirigida por sintaxis), generación de código y optimización de código.

El cierre realiza algunas o todas esas operaciones.

Un poco más abajo en el artículo de Wikipedia

Sin embargo, en la práctica rara vez hay algo sobre un lenguaje que requiera que se compile o interprete exclusivamente, aunque es posible diseñar lenguajes que se basen en la reinterpretación en tiempo de ejecución.

Dicho esto, supongo que fue más fácil llamarlo " Compilador de cierre " en lugar de "Optimizador de cierre" porque en realidad solo se trata de optimizar JavaScript para los navegadores, no es necesario traducirlo a otro idioma o código de bytes.

Closure Compiler como sustantivo es un no-sequitur .

Brian
fuente
Es solo semántica, tienes razón. El punto de la pregunta era realmente ver cómo las personas ven un "compilador". Todavía no creo que el Compilador de cierre sea un "compilador verdadero", pero realiza muchas acciones similares.
James Allardice el
3

Primero, saquemos esto de la forma en que existe el compilador de fuente a fuente. No se puede decir que algo no es un compilador porque el resultado final no es un código de nivel inferior.

Si bien es correcto que Closure Compiler genere AST y tenga una frase de generación de código, muchos minimizadores de Javascript ya lo hacen y probablemente tampoco los llamaría compiladores.

Lo que realmente distingue a Closure Compiler es su aplicación de muchas técnicas de compilación bien conocidas en detección y optimización de errores. Aquí hay unos ejemplos:

Sistema de tipo:

Compilador de cierre define un sistema de tipo anotado. Utiliza técnicas de inferencia de tipos que muchos compiladores usan para verificar si su programa tiene errores.

Optimizaciones interprocediales

Closure Compiler crea gráficos de llamadas para cambiar el nombre y eliminar el código muerto en un nivel de programa completo.

Optimizaciones intraprocedurales

Closure Compiler optimiza Javascript aplicando diferentes análisis de flujo de control y análisis de flujo de datos. Las técnicas clásicas de compilación como: Inlining, Asignación de registros, Análisis de variables en vivo ... y muchas más se utilizan para exprimir ese último byte del Javascript de salida.

Sistema de módulos

Una parte menos conocida de Closure Compiler que se puede usar para dividir su código en descargas separadas para un tiempo de inicio más rápido. Utiliza muchos algoritmos gráficos también. Algo también es muy común en los compiladores "tradicionales".

Todas estas técnicas de compilación y análisis estático es lo que diferencia a Closure Compiler de otros minimizadores de Javascript. Tomando en cuenta el hecho de que el lenguaje de entrada y salida dirigido es el mismo, no veo por qué no está clasificado como un "verdadero compilador".

Alan
fuente