3 votes

Compilateur et interpréteur

Alors, voyons si j'ai bien compris ou non.

  1. Quand on dit que la différence entre un compilateur et un interpréteur est qu'un interpréteur traduit les instructions de haut niveau en une forme intermédiaire qu'il exécute ensuite. [Je pense que le compilateur traduit également les instructions de haut niveau en une forme intermédiaire, mais à ce stade, il génère le code objet au lieu de l'exécuter, n'est-ce pas ?]

  2. Un interprète lit le code source une instruction ou une ligne à la fois, convertit cette ligne en code machine et l'exécute. [L'interpréteur lui-même ne convertit pas le code en code machine, il évalue l'instruction (après qu'elle ait été analysée) en utilisant ses propres fonctions précompilées. Par exemple, l'expression Add dans le langage de haut niveau sera évaluée en utilisant la fonction add de l'interpréteur qui a été préalablement compilée, n'est-ce pas ?]

3voto

David Schwartz Points 70129

La différence essentielle est la suivante : Un interprète traite le code source pendant qu'il l'exécute. Il ne convertit pas la source en code machine, il utilise simplement son propre code pour accomplir ce que la source indique. Un compilateur convertit le code source en code machine qui peut être exécuté directement.

Tous les compilateurs ne sont pas séparés du processus d'exécution. Par exemple, la plupart des moteurs d'exécution Java comprennent un "compilateur JIT" qui compile le code Java en cours d'exécution, si nécessaire.

Vous pouvez avoir des choses entre les deux. Essentiellement, un processus similaire à la compilation peut être utilisé en premier lieu pour convertir le code source en quelque chose de plus petit et plus facile à interpréter. Cette sortie compilée peut ensuite être interprétée. (Par exemple, une première passe pourrait convertir, disons 'if' en 53, 'else' en 54, 'for' en 55, et ainsi de suite -- cela évitera à l'interpréteur de devoir gérer des chaînes de longueur variable dans un code qui ne traite pas réellement de chaînes).

1voto

Attila Points 18290

Je suis d'accord avec la première, bien qu'il ne soit pas nécessairement vrai que l'interpréteur travaille sur une ligne à la fois (il pourrait faire des optimisations basées sur la connaissance de l'ensemble du code).

Le deuxième point me semble légèrement erroné : le compilateur crée le "code machine" (qui peut être un code d'octets pour une JVM). L'interpréteur exécute des parties de son propre programme sur la base de l'entrée (jusqu'ici identique au compilateur), ces parties exécutées effectuant le calcul décrit dans l'entrée (par opposition à l'exécution du calcul pour calculer le code machine nécessaire).

Il est possible de brouiller les pistes entre les deux, car un compilateur peut générer du code qui sera interprété au moment de l'exécution (pour fournir une optimisation au moment de l'exécution sur la base de facteurs qui ne sont pas disponibles au moment de la compilation).

0voto

larsmans Points 167484

Vous avez raison sur (1).

Ad (2), un interprète n'a pas besoin de lire le code source une instruction à la fois, parce que c'est tout simplement trop coûteux pour interpréter du code qui contient des boucles. Plus vraisemblablement, il lit des expressions, des instructions, des fonctions ou même des fichiers source entiers, les traduit dans un format intermédiaire et évalue le tout.

Notez que ni un compilateur ni un interprète n'ont besoin de générer du code machine à aucun moment ; de nombreux langages de programmation, dont Java, Python, mais aussi des langages plus anciens comme Prolog, sont couramment compilés en bytecodes de machine virtuelle. En Python et Prolog, l'"interpréteur" est généralement une combinaison de compilateur de bytecode/interprète de bytecode.

La meilleure introduction à la compilation et à l'interprétation que je connaisse sont les chapitres 4 et 5 de SICP qui commencent par discuter d'un interpréteur très simple et l'améliorent par itération jusqu'à en faire un compilateur à part entière.

0voto

martynas Points 3494

Qu'est-ce qu'un traducteur ?

Un site Traducteur S -> T accepte le code exprimé dans le langage source S, et le traduit en un code équivalent exprimé dans un autre langage (cible) T.

Exemples de traducteurs :

  • Les compilateurs traduisent le code de haut niveau en code de bas niveau. Java -> JVM
  • Assembleurs - traduisent le code du langage d'assemblage en code machine, c'est-à-dire x86as -> x86
  • Traducteurs de haut niveau - traduisent le code d'un PL à un autre, c'est-à-dire Java -> C
  • Décompilateurs - traduisent le code de bas niveau en code de haut niveau, c'est-à-dire JVM -> Java

Qu'est-ce qu'un interprète ?

Un site Interprète S accepte un code exprimé dans le langage S, et exécute immédiatement ce code. Il fonctionne en récupérant, analysant et exécutant une instruction à la fois.

Idéal lorsque l'utilisateur saisit des instructions de manière interactive (pensez à Python) et souhaite obtenir le résultat avant de saisir l'instruction suivante. Également utile lorsque le programme ne doit être exécuté qu'une seule fois ou qu'il doit être portable.

  • L'interprétation d'un programme est beaucoup plus lente que l'exécution du code machine natif.
    • L'interprétation d'un langage de haut niveau est ~100 fois plus lente.
    • L'interprétation d'un langage de niveau intermédiaire (tel que le code JVM) est environ 10 fois plus lente.
  • Si une instruction est appelée à plusieurs reprises, elle sera analysée à plusieurs reprises - ce qui prend du temps !
  • Pas besoin de compiler le code

Différences

Comportement

  • Un compilateur traduit le code source en code machine, mais n'exécute pas le code source ou objet.
  • Un interprète exécute le code source une instruction à la fois, mais ne traduit pas le code source.

Performance

  • Un compilateur prend beaucoup de temps pour traduire le programme source en code machine natif, mais l'exécution ultérieure est rapide.
  • Un interpréteur commence à exécuter le programme source immédiatement, mais l'exécution est lente.

Compilateurs interprétatifs

Un compilateur interprétatif est un bon compromis entre les compilateurs et les interprètes. Il traduit le programme source en code de machine virtuelle, qui est ensuite interprété.

Un compilateur interprétatif combine une traduction rapide avec une exécution modérément rapide, à condition que :

  • Le code VM est inférieur au langage source, mais supérieur au code machine natif.
  • Les instructions VM ont des formats simples (peuvent être rapidement analysées par un interprète).

Exemple : Le JDK fournit un compilateur interprétatif pour Java.


Source :

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