Pourquoi un interprète est-il plus lent qu'un compilateur en pratique?
N'ont-ils pas tous les deux ont pour convertir en code machine à un certain point, d'exécuter ou ai-je raté quelque chose de plus basique?
EDIT:
Veuillez considérer le plus sophistiqué de l'interprétation des schémas par exemple des cas où le code est traduit en code Octet et le byte code est généré lorsque des modifications du code source par exemple Disponible de la mise en œuvre de Python?
Je ne suis pas vraiment intéressé par les anciens interprètes qui ré-exécuter ligne par ligne....
Merci!
source d'informationauteur algorithmicCoder
Vous devez vous connecter pour publier un commentaire.
Un compilé langage comme C est généralement compilé directement dans code machine. Lorsque vous exécutez le code, il est exécuté directement par le PROCESSEUR.
Entièrement interprété de la langue de BASE ou PHP est généralement interprété à chaque fois qu'il s'exécute. Lorsque vous exécutez le code, le PROCESSEUR exécute l'interprète, et l'interprète lit et exécute votre code source. (PHP peuvent être classés comme entièrement interprété, puisque même s'il n'utilisez opcodes, ils sont généralement jetés après l'exécution.)
Un bytecode interprété langage comme Python, est compilé à partir de code source pour bytecode qui est exécuté par une machine virtuelle. Le PROCESSEUR exécute la machine virtuelle et la machine virtuelle exécute chaque instruction bytecode. En Python, le pseudo-code est compilé la première fois, le code est exécuté.
En Java bytecode compilé à l'avance de l'exécution. La machine virtuelle Java a aussi une fonction spéciale appelée Juste-à-temps de compilation. Cela signifie que lors de l'exécution, il peut compiler certains bytecode à code machineil peut envoyer au PROCESSEUR d'exécuter directement.
En conclusion, avec les langages compilés, le PROCESSEUR exécute le code directement. Dans des langages interprétés, le PROCESSEUR exécute généralement l'interprète ou de la machine virtuelle. Cela rend les langages interprétés généralement plus lents que les langages compilés, en raison de la surcharge de l'exécution de la machine virtuelle ou d'un interprète.
REMARQUE: lorsque nous parlons de l'interprété et compilé languesce que nous sommes vraiment en discuter, c'est l'habituel exécution d'un style de langue. PHP peut être compilé à l'aide de hip-hop), et C peut être interprété (à l'aide de Parrot VM).
OK, beaucoup de mauvais messages ici, le temps pour une longue réponse.
Un compilateur est fondamentalement clair, il se traduit par un programme de la langue source à la langue cible. Les deux langues peut être celui - langage de haut niveau, la machine virtuelle de pseudo-code binaire, le code machine.
D'un interprète, d'autre part ne pas effectuer une traductionmais directement effectue les actions prescrites par la langue source, construire, une.k.un. interprète.
Considérons un hypothétique
add
instruction dans une machine à pile, qui ajoute les deux meilleurs éléments de la pile, et pousse à nouveau le résultat. Les services d'un interprète effectuer directement que "ajouter les deux éléments haut et poussez le résultat en arrière", d'une manière similaire à:Comme vous pouvez le voir, pour un seul
add
insn, il y a beaucoup d'opérations effectuées: la lecture et l'écriture de la mémoire, incrémenter et décrémenter le pointeur de pile, le complément de l'opération elle-même, les frais généraux de l'interrupteur (si l'interprète est mis en œuvre), les frais généraux de la boucle qui lit chaque insn et décide de la façon de les traiter, etc.Si l'interprète a travaillé sur un AST, il peut ressembler à:
De nouveau, beaucoup, beaucoup de insns pour effectuer tout ce qui est requis par la
add
sémantique.Un compilateur traduit un programme en code machine avant d'exécuter le programme. Il résout toutes les variables, les types au moment de la compilation.
Un interprète généralement traduit chaque instruction en code machine chaque fois que l'instruction est exécutée.
Une ligne de démarcation entre la compilation et l'interprétation est floue. En général, certains formes d'interprétation de travail plus lent qu'un directement le code compilé. Il n'est pas nécessairement vrai dans des cas spécifiques.
Par exemple, certains interprètes sont directement de l'exécution de la machine virtuelle instructions (parfois traduit dans une directe ou indirecte fileté code), qui est plus lent qu'un code natif pour des raisons évidentes.
Puisqu'il y a une différence d'impédance entre la sémantique de la machine virtuelle (par exemple, la plupart d'entre eux sont de la pile) et de la sémantique du code natif, tout ad hoc de la traduction de l'un à l'autre sous-optimale. Afin d'effectuer des poids lourds optimisations, vous aurez besoin d'une machine virtuelle (ou de toute autre forme d'une représentation intermédiaire) avec une certaine quantité d'une plate-forme cible spécifique de la sémantique. LLVM est un bon exemple d'une telle représentation.
Certains autres interprètes sont à même d'évaluer le code sur un arbre de syntaxe abstraite. Certains sont performants remplacement de chaîne de caractères (un exemple bien connu est Tcl).
Tous que les techniques sont faciles à mettre en œuvre, ils fournissent d'intéressantes propriétés dynamiques de la langue de la sémantique, mais tout cela à un coût d'un ralentissement de l'exécution.
Une autre chose importante à mentionner est un supercompilation. Cette technique pratiquement transforme n'importe quel interprète dans un compilateur, en se spécialisant l'interprète de la mise en œuvre à l'encontre d'une instance spécifique d'un code destiné à être exécuté. L'Existence de telles approches rend une différence entre la compilation et l'interprétation encore plus vague.
Comme par WikiPedia:
Le compilateur fait une fois (ce qui prend du temps), puis le code s'exécute rapidement.
Comme il peut prendre un certain temps, il peut passer du temps à optimiser le code aussi.
L'interprète est-il lorsque vous souhaitez exécuter le code, il compile chaque fois que vous l'exécutez.
Interprète exécute, ligne par ligne, et convertit chaque ligne d'instruction machine à moment de l'exécution. Alors que le compilateur converti ensemble du programme de la langue source à la langue cible ( la plupart sans doute la machine instruction du processeur cible ) dans le moment de la compilation.