93 votes

Qu'est-ce que le compilateur angulaire "compile"?

On m'a demandé aujourd'hui et n'a pas été en mesure de donner une réponse adéquate.

Tapuscrit transpiles 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?

Il y a même une avance de compilateur, qui fait vraiment un notable de l'emploi. Que dois-je manquer?

Javascript lui-même est encore intepreted, droit?

96voto

Liam Points 5802

Vous êtes en supposant la compilation des moyens de prendre le code source et produit des machines de code de bas niveau, de codes, etc. Mais la compilation signifie tout simplement en prenant un code source et de le transformer en un autre. Il semble donc raisonnable de dire que la prise de la Machine et de la production de JavaScript est une forme de compilation. Ce n'est pas différente de ce que (par exemple) c# lorsque son compilé dans IL de la langue.

Cela dit, je dirais un meilleur mot pour cela est Transpiling. Je proposerais que le Tapuscrit compilateur est mieux décrit comme un Transpiler.

La différence est subtile et une transpiler peut être considéré comme un type de compilateur, mais un (pur)langage compilé est (généralement) en tournant un langage de haut niveau à un faible niveau(er) de niveau de langue (de plus près en code machine), comme l'exemple en C#. Un transpiler tourne un langage de haut niveau dans un même niveau (d'abstraction) langue (également de haut niveau).*

Le résultat de la compilation de code est généralement pas une langue que vous écrivez vous-même. Le résultat d'une transpiler est un autre langage de haut niveau. En théorie, vous pourriez écrire IL (par exemple) mais il est vraiment destiné à être produit par un compilateur et il n'y a pas d'outils ou de soutien pour ce faire, vous produisez IL par la compilation en C#/vb.net, seulement. Alors que Javascript est utilisable (et utilisé) langage de programmation dans son propre droit.

*Beaucoup de mises en garde que les définitions de ces mots et leur usage sont assez vague

72voto

Maximus Points 1342

Vous semblez être posé trois questions en une:

  • Quelle est la différence entre un compilateur et un transpiler?
  • Ne Angulaire et Tapuscrits de mettre en œuvre les compilateurs ou transpilers?
  • Est-il séparé Angulaire du compilateur? Que faut-il compiler?

Quelle est la différence entre un compilateur et transpiler?

@JörgWMittag fourni une très bonne réponse à cette question.

Ne Angulaire et Tapuscrits de mettre en œuvre les compilateurs ou transpilers?

Les deux TS et Angulaire de mettre en œuvre réelle des compilateurs. Ils suivent les mêmes étapes de l'analyse lexicale, analyse syntaxique, analyse sémantique, génération de code et que les compilateurs C/C++ qui produisent de l'assemblée de code (à l'exception sans doute de l'optimisation). Vous pouvez voir que la classe/dossier nommé "compilateur" dans les deux Angulaire et TS.

L'angle de compilateur n'est pas vraiment liée à Tapuscrit compilateur. Ceux-ci sont très différents compilateurs.

Est-il séparé Angulaire du compilateur? Que faut-il compiler?

Angulaire a deux compilateurs:

  • Vue Du Compilateur
  • Module Compilateur

Le travail de la vue du compilateur est de transformer le modèle que vous spécifiez pour le modèle de composant dans la représentation interne d'un composant qui est une vue de l'usine qui est ensuite utilisé pour instancier une instance de vue.

En plus de transformer le modèle, la vue du compilateur compile également les différentes informations de métadonnées sous la forme de décorateurs comme @HostBinding, @ViewChild etc.

Supposons que vous définissez un composant et son modèle comme ceci:

@Component({
  selector: 'a-comp',
  template: '<span>A Component</span>'
})
class AComponent {}

À l'aide de ces données, le compilateur génère légèrement simplifié de la composante de l'usine:

function View_AComponent {
  return jit_viewDef1(0,[
      elementDef2(0,null,null,1,'span',...),
      jit_textDef3(null,['My name is ',...])
    ]

Il décrit la structure d'un composant de la vue et est utilisé lors de l'instanciation du composant. Le premier nœud est la définition de l'élément et le second est le texte de la définition. Vous pouvez voir que chaque nœud reçoit les informations nécessaires lors de instanciée par la liste des paramètres. C'est un travail d'un compilateur pour résoudre toutes les dépendances nécessaires et de les fournir au moment de l'exécution.

Je recommande fortement la lecture de ces articles:

Voir également la réponse à Quelle est la différence Angulaire entre l'AOT et compilateur JIT.

Le travail du compilateur de module est de créer un module d'usine qui contient essentiellement fusionné les définitions de ces fournisseurs.

Pour plus d'informations, lire:

55voto

Jörg W Mittag Points 153275

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.

19voto

Nathan Cooper Points 772

Le code que vous avez écrit pour fonctionner sur un navigateur implique deux choses:

1) Transpiling le Tapuscrit en JavaScript. C'est un problème résolu. Je pense qu'ils viennent d'utiliser webpack.

2) la Compilation de l'angle d'abstractions en JavaScript. Je veux dire des choses comme l'un des composants, des tuyaux, des directives, des modèles, etc. C'est ce que l'ouverture angulaire du noyau de l'équipe de travail sur.

Dans le cas où vous êtes vraiment intéressé dans cette deuxième partie, l'angle de compilateur, regarder compilateur auteur Tobias Bosch expliquer l'angle de Compilateur à AngularConnect 2016.

Je pense qu'il y a un peu de confusion ici entre transpiling et de compilation. Ça n'a pas d'importance, c'est une question de goût personnel, ils sont à la fois se transforme tout simplement entre les représentations de code. Mais la définition que j'utilise personnellement est que transpilation est entre deux langues différentes au même niveau d'abstraction (par exemple la machine à javascript), tandis que la compilation nécessite une étape vers le bas dans le niveau d'abstraction. Je pense que à partir de modèles, des composants, des tuyaux, directives, etc pour javascript est une étape vers le bas de l'échelle d'abstraction, et c'est pourquoi il est appelé un compilateur.

-2voto

chandra rv Points 66

Pour plus de détails à suivre : https://en.wikipedia.org/wiki/Angular_(web_framework)

Straight answer to your question is: 

angulaire n'est pas un compilateur.Parce que ce n'est pas une langue.

Mais la machine a un compilateur, langue dans laquelle angulaire de la bibliothèque/Cadre est écrit.

Donc, comme il n'est pas d'avoir compilateur qu'il ne peut pas compiler quelque chose.

1.)'Angulaire'(2.x et versions supérieures) est une bibliothèque/FrameWork écrit en utilisant le langage appelé tapuscrit.

--Donc il utilise la Machine Compilateur.

2.)En revanche 'angularjs' (1.versions x) est une bibliothèque/FrameWork écrit en utilisant un langage appelé java script.

--Donc il utilise l'interpréteur javascript.

pourquoi le compilateur :

Car angulaire est écrite à l'aide de la machine, il est inconnu du navigateur(C'est l'actuelle plate-forme où fonctionnelle code pour les applications web).

Ainsi,En utilisant la machine compilateur, angulaire composants sont transformés en navigateur compréhensible java script composants.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X