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?
fuente
Respuestas:
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
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"?
fuente
Minoptival
. Suena como un dinosaurio. A todos les gustan los dinosaurios, ¿verdad?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 ):
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.
fuente
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.
fuente
Es semántica en mi opinión. En el sentido tradicional, no es un compilador. Sin embargo, en el mismo enlace de Wikipedia, dice
El cierre realiza algunas o todas esas operaciones.
Un poco más abajo en el artículo de Wikipedia
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 .
fuente
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".
fuente