Tapuscrit s'avère JS. Puis il y a l'arbre de secouer, de "moins" (en option) et quoi d'autre dans le processus de fabrication d'un déploiement. Mais rien de tel que (à ma connaissance) n'a rien à voir avec la "compilation". Tout est fourni et largement optimisé, mais ce n'est pas vraiment compilé, droit?
Compilation signifie la transformation d'un programme écrit dans un langage Un dans un sémantiquement équivalents programme écrit dans un langage B tels que l'évaluation du programme compilé selon les règles de la langue B (par exemple l'interpréter avec un interprète pour B) donne le même résultat et a les mêmes effets secondaires que d'évaluer le programme d'origine selon les règles de la langue d'Un (par exemple l'interpréter avec un interprète pour Une).
Compilation signifie simplement la traduction d'un programme à partir de la langue A vers la langue B. C'est tout ce qu'il signifie. (À noter également qu'il est parfaitement possible pour Un et B à la même langue.)
Dans certains cas, nous avons de plus en plus spécialisée noms pour certains types de compilateurs, selon ce qui A et B sont, et ce que le compilateur n':
- si l' Un est perçu à l'assemblée de la langue et de B est perçu comme un langage machine, puis nous l'appelons un assembleur,
- si Une perception, langage machine et B est perçue à l'assemblée de la langue, nous l'appelons un désassembleur,
- si l' Un est perçu comme étant de niveau inférieur de B, alors nous l'appelons un decompiler,
- si A et B sont dans la même langue, et le programme qui en résulte est d'une certaine façon plus rapide ou le plus léger, puis nous l'appelons un optimiseur,
- si A et B sont les mêmes langues, et le programme qui en résulte est plus petit, alors nous l'appelons un minifier,
- si A et B sont les mêmes langues, et le programme qui en résulte est moins lisible, alors nous l'appelons un obfuscateur,
- si A et B sont perçus pour être à peu près au même niveau d'abstraction, alors nous l'appelons un transpiler, et
- si A et B sont perçus pour être à peu près au même niveau d'abstraction et le programme qui en préserve la mise en forme, les commentaires, et le programmeur intention, qu'il est possible de maintenir l'résultant du programme de la même manière que le programme d'origine, puis nous l'appelons la ré-ingénierie de l'outil.
Il est également à noter que les sources plus anciennes peuvent utiliser les termes de "traduction" et "traducteur" au lieu de "compilation" et "compilateur". Par exemple, C parle des "unités de traduction".
Vous pouvez également tomber sur le terme "langue processeur". Cela peut signifier soit un compilateur, un interprète, ou les deux compilateurs et interprètes selon la définition.
Javascript lui-même est toujours interprété, non?
JavaScript est un langage. Les langues sont un ensemble de règles logiques et les restrictions. Les langues ne sont pas interprété ou compilé. Les langues sont.
La Compilation et l'interprétation sont des traits d'un compilateur ou l'interpréteur (duh!). Chaque langue peut être mis en œuvre avec un compilateur et pour chaque langue peut être mis en œuvre avec les services d'un interprète. Beaucoup de langues ont les deux compilateurs et interprètes. Beaucoup de moderne et de haute performance des moteurs d'exécution ont à la fois au moins un compilateur et au moins un interprète.
Ces deux termes appartiennent à différentes couches d'abstraction. Si les anglais ont tapé langue", interprété en langue" serait une erreur de type.
Notez également que certaines langues n'ont ni l'interprète, ni d'un compilateur. Il y a des langues qui n'ont pas de mise en œuvre à tous. Pourtant, ils sont les langues, et vous pouvez écrire des programmes en eux. Vous ne pouvez pas les exécuter.
Notez également que tout est interprété à un certain point: si vous voulez exécuter quelque chose, on doit l'interpréter. Compilation juste traduit le code d'une langue à l'autre. Il n'a pas l'exécuter. L'interprétation de l'exécution. (Parfois, lorsqu'un interprète est mis en œuvre dans le matériel, nous l'appelons un "CPU", mais c'est toujours un interprète.)
Affaire au point: chaque existant actuellement dominant JavaScript mise en œuvre a un compilateur.
V8 commencé comme un pur compilateur: il compilé en JavaScript directement à moyennement optimisé code machine natif. Plus tard, un deuxième compilateur a été ajouté. Maintenant, il y a deux compilateurs: un léger compilateur qui produit modérément code optimisé, mais le compilateur lui-même est très rapide et utilise très peu de mémoire vive. Ce compilateur permet aussi d'injecter de profilage de code dans le code compilé. La deuxième compilateur est plus lourd, plus lent, plus cher compilateur, qui, cependant, produit beaucoup plus, beaucoup plus rapidement le code. Il utilise également les résultats du profilage de code injecté par le premier compilateur pour le rendre dynamique d'optimisation des décisions. Aussi, la décision qui code pour re-compiler avec le compilateur deuxième est basée sur les informations de profilage. Notez qu'à aucun moment il y a un interprète en cause. V8 jamais interprète, il est toujours compile. Il ne contient même pas les services d'un interprète. (En fait, je crois que de nos jours il n', je suis décrivant les deux premières itérations.)
SpiderMonkey compile en JavaScript SpiderMonkey bytecode, qui l'interprète. L'interprète aussi des profils, le code, et le code qui est exécuté le plus souvent est compilé par un compilateur de code machine natif. Donc, SpiderMonkey contient deux compilateurs: l'un à partir de JavaScript SpiderMonkey bytecode, et l'autre de SpiderMonkey code binaire en code machine natif.
Presque tous d'exécution de JavaScript, moteurs (à l'exception de la V8) de suivre ce modèle d'un AOT compilateur compile le JavaScript pour le bytecode, et un mode mixte moteur qui bascule entre l'interprétation et la compilation que le bytecode.
Vous avez écrit dans un commentaire:
Vraiment, je pensais que le code machine est quelque part en cause.
Que signifie "code machine" même dire?
Qu'est-ce que d'un seul homme machine de la langue est un autre homme intermédiaire de la langue et vice-versa? Par exemple, il y a des CPUs qui peut nativement d'exécuter du bytecode JVM, sur un tel PROCESSEUR, le bytecode JVM est du code machine natif. Et il y a des interprètes pour les architectures x86 code machine, lorsque vous exécutez de ces machine x86 code est interprété bytecode.
Il y a un x86 interprète appelé JPC écrit en Java. Si je lance x86 code machine sur JPC en cours d'exécution sur un natif de la JVM de l'UC ... qui est le bytecode et qui est le code natif? Si je compile machine x86 code JavaScript (oui, il y a des outils qui peut le faire) et l'exécuter dans un navigateur internet sur mon téléphone (qui a un CPU ARM), qui est le bytecode et qui est le code machine natif? Que faire si le programme que je suis de la compilation est un SPARC émulateur, et je l'utilise pour exécuter le code SPARC?
Notez que chaque langue induit une machine abstraite, et est langage machine pour la machine. Donc, de toutes les langues (y compris de très haut niveau en langues) est du code machine natif. Aussi, vous pouvez écrire un interprète pour chaque langue. Donc, de toutes les langues (y compris x86 code machine) n'est pas natif.