Quelle est la différence entre un langage compilé et interprété?

118

Après avoir lu du matériel sur ce sujet, je ne sais toujours pas quelle est la différence entre un langage compilé et un langage interprété. On m'a dit que c'était l'une des différences entre Java et JavaScript. Quelqu'un pourrait-il m'aider à le comprendre?

SIr Codealot
la source

Réponses:

165

Quelle est la différence entre un langage compilé et interprété?

La différence n'est pas dans la langue; c'est dans la mise en œuvre .

Après avoir sorti cela de mon système, voici une réponse:

  • Dans une implémentation compilée, le programme original est traduit en instructions machine natives, qui sont exécutées directement par le matériel.

  • Dans une implémentation interprétée, le programme original est traduit en autre chose. Un autre programme, appelé «l'interpréteur», examine alors «autre chose» et exécute toutes les actions nécessaires. Selon le langage et sa mise en œuvre, il existe une variété de formes de «quelque chose d'autre». De plus populaire à moins populaire, «autre chose» pourrait être

    • Instructions binaires pour une machine virtuelle, souvent appelées bytecode , comme cela se fait dans Lua, Python, Ruby, Smalltalk et de nombreux autres systèmes (l'approche a été popularisée dans les années 1970 par le système UCSD P et UCSD Pascal)

    • Une représentation arborescente du programme original, comme un arbre de syntaxe abstraite, comme c'est le cas pour de nombreux prototypes ou interprètes pédagogiques

    • Une représentation tokenisée du programme source, similaire à Tcl

    • Les caractères du programme source, comme cela a été fait dans MINT et TRAC

Une chose qui complique le problème est qu'il est possible de traduire (compiler) le bytecode en instructions machine natives . Ainsi, une implémentation interprétée réussie peut éventuellement acquérir un compilateur. Si le compilateur s'exécute dynamiquement, dans les coulisses, il est souvent appelé un compilateur juste à temps ou un compilateur JIT. Les JIT ont été développés pour Java, JavaScript, Lua et j'ose dire de nombreux autres langages. À ce stade, vous pouvez avoir une implémentation hybride dans laquelle du code est interprété et du code est compilé.

Norman Ramsey
la source
7
Monsieur, j'ai les questions suivantes: 1. Dans quelle langue cet «autre chose» est-il écrit? 2. Et dans le contexte de JavaScript, est-ce que «autre chose» variait d'un navigateur à l'autre? 3. Dites, mon script s'exécute dans Google Chrome et Internet Explorer, est-il interprété de la même manière dans les deux navigateurs?
JavaHopper
@Norman c'était une explication géniale. Cependant, voici quelques confusions que j'ai encore. Dans une implémentation compilée, le programme d'origine est converti en instructions machine natives. Comment venir? Je pensais que C, par exemple, après la compilation, produirait du code d'assemblage, qui encore une fois de toute façon doit être assemblé par un assembleur natif dans le code machine de la machine sous-jacente. Alors en quoi est-ce différent d'une VM (python ou JVM, etc.) faisant la même chose dans le cas d'un langage interprété?
qre0ct
58

Java et JavaScript sont un assez mauvais exemple pour démontrer cette différence , car les deux sont des langages interprétés . Java (interprété) et C (ou C ++) (compilé) auraient pu être un meilleur exemple.

Pourquoi le texte barré? Comme cette réponse le souligne correctement, interprété / compilé concerne une implémentation concrète d'un langage, pas le langage en soi . Alors que des déclarations comme "C est un langage compilé" sont généralement vraies, rien n'empêche quelqu'un d'écrire un interpréteur en langage C. En fait, des interprètes pour C existent .

Fondamentalement, le code compilé peut être exécuté directement par le processeur de l'ordinateur. Autrement dit, le code exécutable est spécifié dans le langage "natif" du processeur ( langage d'assemblage ).

Le code des langues interprétées doit cependant être traduit au moment de l'exécution de n'importe quel format vers les instructions de la machine CPU. Cette traduction est effectuée par un interprète.

Une autre façon de le dire est que les langages interprétés sont que le code est traduit en instructions machine pas à pas pendant que le programme est en cours d'exécution, tandis que les langages compilés ont du code traduit avant l'exécution du programme.

stakx - ne contribue plus
la source
8
Java est interprété? De wikipedia: "Les applications Java sont généralement compilées en bytecode (fichier de classe) qui peut s'exécuter sur n'importe quelle machine virtuelle Java (JVM), quelle que soit l'architecture de l'ordinateur."
Personman
6
@Personman qui est encore techniquement "interprété" comme la machine virtuelle Java exécute le code, pas le système d'exploitation lui-même. C'est vraiment une différence sémantique plus, car on pourrait dire que la complexité des systèmes d'exploitation modernes fait la différence fondamentalement sans importance dans la plupart des situations. Vous parlez de la différence entre le système d'exploitation exécutant l'application et le système d'exploitation exécutant une application qui exécute le code.
GrayWizardx
5
Je suppose que vous voulez dire que les fichiers de classe eux-mêmes sont interprétés par la machine virtuelle Java. C'est assez raisonnable, mais la source java est vraiment compilée en bytecode Java VM. Vous pouvez créer une machine Java physique qui n'exigerait pas que la machine virtuelle l'interprète dans le code machine d'une autre architecture. Il semble donc plus exact de dire que Java est compilé. Pourtant, ceci est un bon exemple de la façon dont la distinction prête à confusion et est plutôt arbitraire. Après tout, le C compilé est interprété par le CPU, non?
Personman
13
Java est un très mauvais exemple de langage compilé ou interprété car il s'agit essentiellement des deux. Si je devais faire une comparaison, j'irais avec C et Lisp pour éviter toute confusion.
Bill the Lizard
7
@stakx - en fait, les bytecodes Java sont normalement compilés en code natif par un compilateur JIT également. La seule façon d'obtenir un comportement d'interpréteur pur est de désactiver explicitement le compilateur JIT lorsque la JVM est lancée.
Stephen C
15

Voici la différence fondamentale entre le langage compilateur et interprète.

Langue du compilateur

  • Prend le programme entier comme une seule entrée et le convertit en code objet qui est stocké dans le fichier.
  • Le code d'objet intermédiaire est généré
  • par exemple: C, C ++
  • Les programmes compilés s'exécutent plus rapidement car la compilation est effectuée avant l'exécution.
  • La mémoire requise est davantage due à la création de code objet.
  • Les erreurs sont affichées après la compilation de l'ensemble du programme
  • Code source --- Compilateur --- Code machine --- Sortie

Langue de l'interprète:

  • Prend une seule instruction comme entrée unique et exécute les instructions.
  • Le code d'objet intermédiaire n'est PAS généré
  • par exemple: Perl, Python, Matlab
  • Les programmes interprétés s'exécutent plus lentement car la compilation et l'exécution ont lieu simultanément.
  • La mémoire requise est moindre.
  • Les erreurs sont affichées pour chaque instruction.
  • Code source --- Interpréteur --- Sortie
PGOEL
la source
5

Un compilateur, en général, lit le code informatique d'un langage de niveau supérieur et le convertit en code p ou en code machine natif. Un interpréteur s'exécute directement à partir de p-code ou d'un code interprété tel que Basic ou Lisp. En règle générale, le code compilé s'exécute beaucoup plus rapidement, est plus compact et a déjà trouvé toutes les erreurs de syntaxe et de nombreuses erreurs de référence illégales. Le code interprété ne trouve ces erreurs qu'après que l'application tente d'interpréter le code affecté. Le code interprété est souvent bon pour des applications simples qui ne seront utilisées qu'une seule fois ou au plus plusieurs fois, ou peut-être même pour le prototypage. Le code compilé est meilleur pour les applications sérieuses. Un compilateur prend d'abord l'intégralité du programme, vérifie les erreurs, le compile puis l'exécute. Alors qu'un interprète fait cette ligne par ligne, donc il prend une ligne, la vérifie pour les erreurs,

Si vous avez besoin de plus d'informations, recherchez simplement sur Google "la différence entre le compilateur et l'interpréteur".

Salil
la source
3
Euh, je ne sais pas où vous en êtes au-delà des deux premières déclarations. Cela était techniquement vrai il y a plusieurs générations avec de nombreux langages interprétés, mais en fonction de la plate-forme et du souci du détail, il est possible d'avoir interprété du code qui fonctionne de manière proche ou aussi bien que du code compilé pour certaines activités.
GrayWizardx
En gardant à l'esprit que des langages comme Java, C # et JavaScript qui inondent presque tout le monde de la programmation aujourd'hui, il serait injuste de dire que «le code compilé est meilleur pour les applications sérieuses».
Sisir
2

C'est une distinction très trouble, et en fait généralement pas une propriété d'un langage lui-même, mais plutôt du programme que vous utilisez pour exécuter du code dans ce langage.

Cependant, la plupart des langages sont principalement utilisés sous une forme ou une autre, et oui, Java est essentiellement toujours compilé, tandis que javascript est essentiellement toujours interprété.

Compiler le code source consiste à exécuter un programme sur celui-ci qui génère un fichier exécutable binaire qui, lorsqu'il est exécuté, a le comportement défini par la source. Par exemple, javac compile les fichiers .java human-readbale en fichiers .class lisibles par machine.

Pour interpréter le code source, exécutez un programme dessus qui produit immédiatement le comportement défini, sans générer de fichier intermédiaire. Par exemple, lorsque votre navigateur Web charge stackoverflow.com, il interprète un tas de javascript (que vous pouvez consulter en affichant la source de la page) et produit de nombreux effets sympas que ces pages ont - par exemple, le vote à la hausse ou le petit notificateur barres en haut.

Homme de personne
la source
Alors que Java se traduit d'abord en bytecode et seulement lors de l'exécution de la JVM, il le convertit en code machine; est-il correct de dire qu'il est compilé et non interprété?
Sisir
1
Je suppose que vous pouvez dire que le bytecode Java est interprété, bien sûr, mais personne n'écrit le bytecode Java. Java lui-même est généralement compilé en bytecode.
Personman
2

Le langage interprété est exécuté au moment de l'exécution selon les instructions comme dans le script shell et le langage compilé est celui qui est compilé (changé en langage d'assemblage, que le CPU peut comprendre) puis exécuté comme en c ++.

Praveen Kishor
la source
0

Comme d'autres l'ont dit, compilé et interprété sont spécifiques à une implémentation d'un langage de programmation; ils ne sont pas inhérents à la langue. Par exemple, il existe des interpréteurs C.

Cependant, nous pouvons (et en pratique nous le faisons) classer les langages de programmation en fonction de leur implémentation la plus courante (parfois canonique). Par exemple, nous disons que C est compilé.

Tout d'abord, nous devons définir sans ambiguïté des interprètes et des compilateurs:

Un interprète pour la langue X est un programme (ou une machine, ou tout simplement une sorte de mécanisme en général) qui exécute un programme p écrit en langage X tel qu'il exécute les effets et évalue les résultats prescrits par le cahier des charges de X .

Un compilateur de X à Y est un programme (ou une machine, ou juste une sorte de mécanisme en général) qui traduit tout programme p d'un langage X en un programme sémantiquement équivalent p ' dans un langage Y de telle manière que l'interprétation de p ' avec un interprète pour Y donneront les mêmes résultats et ont les mêmes effets que l' interprétation de p avec un interprète pour X .

Notez que du point de vue du programmeur, les CPU sont des interprètes machine pour leur langage machine natif respectif.

Maintenant, nous pouvons faire une classification provisoire des langages de programmation en 3 catégories en fonction de son implémentation la plus courante:

  • Langages compilés en dur: lorsque les programmes sont entièrement compilés en langage machine. Le seul interpréteur utilisé est un CPU. Exemple: Habituellement, pour exécuter un programme en C, le code source est compilé en langage machine, qui est ensuite exécuté par une CPU.
  • Langages interprétés: Lorsqu'il n'y a pas de compilation d'une partie quelconque du programme original en langage machine. En d'autres termes, aucun nouveau code machine n'est généré; seul le code machine existant est exécuté. Un interpréteur autre que le processeur doit également être utilisé (généralement un programme). Exemple: Dans l'implémentation canonique de Python, le code source est d'abord compilé en bytecode Python , puis ce bytecode est exécuté par CPython, un programme d'interprétation pour le bytecode Python .
  • Langages compilés logiciels: Lorsqu'un interpréteur autre que le processeur est utilisé, mais également des parties du programme d'origine peuvent être compilées en langage machine. C'est le cas de Java, où le code source est d'abord compilé en bytecode, puis le bytecode peut être interprété par l'interpréteur Java et / ou compilé ultérieurement par le compilateur JIT.

Parfois, les langages compilés souples et durs sont simplement appelés compilés, donc on dit que C #, Java, C, C ++ sont compilés.

Dans cette catégorisation, JavaScript était autrefois un langage interprété, mais c'était il y a de nombreuses années. De nos jours, il est compilé en JIT en langage machine natif dans la plupart des principales implémentations JavaScript, donc je dirais qu'il tombe dans des langages compilés souples.

MrIo
la source