Cette question est inspirée du débat dans les commentaires sur cette question Stack Overflow . La documentation de Google Closure Compiler indique ce qui suit (non souligné dans l'original):
Le compilateur de fermeture est un outil permettant d'accélérer le téléchargement et l'exécution de JavaScript. C'est un vrai compilateur pour JavaScript. Au lieu de compiler à partir d'un langage source vers du code machine, il compile à partir de JavaScript vers un meilleur JavaScript.
Cependant, Wikipedia donne la définition suivante d'un "compilateur":
Un compilateur est un programme informatique (ou un ensemble de programmes) qui transforme le code source écrit dans un langage de programmation (le langage source) en un autre langage informatique ... Un réécriteur de langage est généralement un programme qui traduit la forme d'expressions sans changement de Langue.
Sur cette base, je dirais que Google Closure n'est pas un compilateur. Mais le fait que Google déclare explicitement qu'il s'agit en fait d'un "vrai compilateur" me fait me demander s'il y a plus. Google Closure est-il vraiment un compilateur JavaScript?
la source
Réponses:
Le Closure Compiler est un minifier , un optimiseur et un validateur tout-en-un. Cela le met dans sa propre catégorie, car vous avez raison de dire qu'un compilateur devrait au moins prendre quelque chose qui ne fonctionnera pas dans sa forme actuelle et le transformer en quelque chose qui va (prendre TypeScript pour un exemple basé sur ECMAScript).
Mais blâmez-vous Google d'étirer la terminologie? Comment allaient-ils l'appeler? Google Minifier? Non, c'est plus que cela, et il y en a des centaines. Optimiseur de Google? C'est bien plus que ça. Validateur Google? Non, c'est bien plus que ça aussi.
Donc, le choix est
Il fait tout ce que vous attendez d'un compilateur, avec seulement une différence sémantique. Et, à la fin, tous les mots sont définis par leur utilisation, dans une certaine mesure. Donc, si Google peut convaincre les gens d'appeler cela un compilateur, la définition du compilateur change légèrement. Certainement pas en aucune façon qui causera un problème.
Ou, pour revenir à l'exemple précédent, pouvez-vous trouver quelque chose d'important à propos de TypeScript qui lui permet d'être appelé un "vrai compilateur", alors que Google Closure Compiler devrait être limité à "presque un compilateur"?
la source
Minoptival
. Cela ressemble à un dinosaure. Tout le monde aime les dinosaures, non?Eh bien oui ... mais cela suppose que Wikipédia fasse autorité sur ce point.
Et pour contrer la définition de Wikipedia, considérez quelques définitions de dictionnaire (à partir de http://www.thefreedictionary.com/compiler ):
Certes, ces définitions sont toutes un peu démodées, mais elles illustrent qu'il n'y a pas de «sens unique» ... et en fait que les significations de termes comme «compilateur» changent avec le temps. (Et, l'OMI, c'est très bien, car nous n'avons pas vraiment besoin d' une définition précise pour ce cas.)
Débattre si le compilateur de fermeture est un "vrai compilateur" ou non (IMO) n'est pas une activité fructueuse. Il serait plus utile de comprendre ce que les gens de Google entendent par "vrai compilateur" ... dans ce contexte.
la source
Je pense que la raison pour laquelle il peut être appelé "un vrai compilateur" est parce qu'il construit un AST complet (arbre sémantique abstrait) à partir de vos programmes et l'utilise pour générer un nouveau texte.
Le fait que les textes originaux et résultants soient du JavaScript valide n'est qu'une simple coïncidence.
Ceci est important car il existe de nombreux outils qui ne font que des manipulations de texte du code (minificateurs, prettifiants, etc.) mais ne font aucune manipulation AST, encore moins une régénération de code. Même si ces outils sont de plus en plus puissants, ce ne sont pas les mêmes types de logiciels et les limitations sont différentes.
la source
C'est de la sémantique à mon avis. Au sens traditionnel, ce n'est pas un compilateur. Cependant, dans le même lien Wikipédia, il est dit
La fermeture effectue une partie ou la totalité de ces opérations.
Un peu plus loin dans l'article Wikipedia
Cela étant dit, je pense qu'il était plus facile de l'appeler le " Closure Compiler " plutôt que le "Closure Optimizer", car il s'agit simplement d'optimiser JavaScript pour les navigateurs, pas nécessaire de le traduire dans une autre langue ou un bytecode.
Closure Compiler en tant que substantif est un non-sequitur .
la source
Tout d'abord, permet de retirer cela de la façon dont le compilateur source à source existe. Vous ne pouvez pas dire que quelque chose n'est pas un compilateur car le résultat final n'est pas un code de niveau inférieur.
Bien qu'il soit correct que Closure Compiler génère AST et ait une phrase de génération de code, de nombreux minimiseurs Javascript le font déjà et je ne les appellerais probablement pas non plus.
Ce qui distingue vraiment Closure Compiler, c'est l'application de nombreuses techniques de compilation bien connues dans la détection et l'optimisation des erreurs. Voici quelques exemples:
Système de saisie:
Closure Compiler définit un système de type annoté. Il utilise des techniques d'inférence de type que de nombreux compilateurs utilisent pour rechercher des erreurs dans votre programme.
Optimisations interprocédurales
Closure Compiler construit des graphes d'appels pour renommer et supprimer le code mort dans tout un niveau de programme.
Optimisations intraprocédurales
Closure Compiler optimise Javascript en appliquant différentes analyses de flux de contrôle ainsi que l'analyse de flux de données. Les techniques classiques du compilateur telles que: Inlining, Allocation de registre, Live Variable Analysis .. et bien d'autres sont toutes utilisées pour extraire ce dernier octet du Javascript de sortie.
Système de modules
Une partie moins connue de Closure Compiler qui peut être utilisée pour diviser votre code en téléchargement séparé pour un temps de démarrage plus rapide. Il utilise également de nombreux algorithmes graphiques. Quelque chose est également très courant dans les compilateurs "traditionnels".
Toutes ces techniques de compilation et d'analyse statique sont ce qui distingue le compilateur de fermeture des autres minimiseurs Javascript. En tenant compte du fait que le langage d'entrée et de sortie ciblé est le même, je ne vois pas pourquoi il n'est pas classé comme un "vrai compilateur".
la source