Google Closure est-il un véritable compilateur?

19

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?

James Allardice
la source
2
Je parie que le JS qu'il produit est un sous-ensemble approprié de tous les JS légaux; en ce sens, sa langue de sortie est "une autre" langue.
AakashM

Réponses:

23

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

  • Appelez-le Google Closure Foogle et introduisez un tout nouveau mot sans signification dans le lexique.
  • Appelez-le Google Closure Minoptivalidator, qui est plus clair en intention mais plus difficile à retenir.
  • Appelez-le Google Closure Compiler, qui est assez proche de la vérité.

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"?

pdr
la source
Le but de la question était juste de vraiment voir ce que les gens considèrent comme un "compilateur". Comme indiqué par 0A0D, ce n'est que de la sémantique, mais je me suis simplement demandé pourquoi Google ressentait le besoin de clarifier qu'il s'agissait d'un "vrai compilateur". +1 pour "Minoptivalidator"!
James Allardice
@JamesAllardice: Encore une fois, parce que si vous pouvez convaincre les gens qu'il s'agit d'un compilateur, la définition du compilateur s'étire pour l'inclure. Et c'est vraiment juste que ce soit le cas, dans ce cas. Si vous définissez un nouveau mot qui le sépare du compilateur par une ligne sémantique, votre produit est classé comme "presque, mais pas tout à fait".
pdr
1
Je ne sais pas, j'aime plutôt "Google Foogle" :-)
GrandmasterB
9
Je vote pour Minoptival. Cela ressemble à un dinosaure. Tout le monde aime les dinosaures, non?
Izkata
2
@Izkata: S'il y a une chose que l'histoire de l'évolution nous a enseignée, c'est que Javascript ne sera pas contenu. Javascript se libère, il s'étend à de nouveaux territoires et traverse les barrières douloureusement, voire dangereusement.
pdr
9

Sur cette base, je dirais que Google Closure n'est pas un compilateur.

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 ):

2) (Informatique) - Un programme qui traduit un autre programme écrit dans un langage de haut niveau en langage machine afin qu'il puisse être exécuté.

2) (Electronics & Computer Science / Computer Science) un programme informatique par lequel un langage de programmation de haut niveau, tel que COBOL ou FORTRAN, est converti en langage machine qui peut être utilisé par un ordinateur.

Un programme informatique associé à certains langages de programmation qui convertit les instructions écrites dans ces langages en code machine qui peut ensuite être exécuté directement par un ordinateur.

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.

Stephen C
la source
2
+1 Ironiquement, JS est à la fois un «langage machine» pour le Web et un «langage de programmation de haut niveau».
K.Steff
3
+1, et un autre pour «suppose que Wikipédia fait autorité sur ce point». Trop de gens acceptent aveuglément tout ce qui s'y trouve écrit.
Marjan Venema
6

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.

Javier
la source
1
Merci, c'est une réponse intéressante. Je pense que votre explication peut offrir une meilleure définition de "compilateur" que Wikipedia et les différents dictionnaires que d'autres ont cités.
James Allardice
Eh bien, j'aime cette réponse et j'ai voté pour elle à un moment donné, mais je noterais qu'il est parfaitement possible de compiler (dans le sens traditionnel du langage à haut niveau) sans jamais construire d'AST. Voir Créons un compilateur par exemple. Maintenant, il est certainement vrai que le compilateur du tutoriel de Crenshaw est assez grossier, mais je ne pense pas que quiconque l'ait accusé de ne pas être un compilateur.
dmckee
Je n'ai pas lu cette référence, mais je conviens qu'un AST explicite n'est pas strictement nécessaire pour la compilation. Pourtant, dans la plupart des cas, il existe une structure équivalente, soit explicite dans les données, soit implicite dans l'exécution (peut-être que la pile d'appels (ou son évolution dans le temps) reflète l'analyse syntaxique). Mon point principal est que la compilation n'est pas une manipulation de texte, mais la génération de code à partir d'une analyse de code source.
Javier
4

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

Un compilateur est susceptible d'effectuer plusieurs ou toutes les opérations suivantes: analyse lexicale, prétraitement, analyse, analyse sémantique (traduction dirigée par syntaxe), génération de code et optimisation de code.

La fermeture effectue une partie ou la totalité de ces opérations.

Un peu plus loin dans l'article Wikipedia

Cependant, dans la pratique, il n'y a rarement rien dans un langage qui exige qu'il soit exclusivement compilé ou exclusivement interprété, bien qu'il soit possible de concevoir des langages qui reposent sur une réinterprétation au moment de l'exécution.

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 .

Brian
la source
C'est juste de la sémantique, vous avez raison. Le point de la question était vraiment juste de voir ce que les gens considèrent comme un "compilateur". Je ne pense toujours pas que le compilateur de fermeture est un "vrai compilateur", mais il effectue de nombreuses actions similaires.
James Allardice
3

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".

Alan
la source