121 votes

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

Après avoir lu quelques documents sur le sujet, je ne suis toujours pas sûr de 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 à la comprendre ?

170voto

Norman Ramsey Points 115730

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

La différence est pas dans la langue ; elle est dans le mise en œuvre .

Après m'être débarrassé de cela, 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 quelque chose d'autre. Un autre programme, appelé "l'interpréteur", examine alors "l'autre chose" et effectue les actions demandées. Selon le langage et son implémentation, il existe une variété de formes de "quelque chose d'autre". Du plus populaire au moins populaire, "quelque chose d'autre" peut être

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

    • Une représentation arborescente du programme d'origine, telle qu'un arbre de syntaxe abstraite, comme c'est le cas pour de nombreux prototypes ou interpréteurs éducatifs.

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

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

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

7 votes

Monsieur, j'ai les questions suivantes 1. En quelle langue est écrit ce "quelque chose d'autre" ? 2. Et dans le contexte de JavaScript, ce "quelque chose d'autre" varie-t-il d'un navigateur à l'autre ? 3. Si mon script est exécuté dans Google Chrome et Internet Explorer, est-il interprété de la même manière dans les deux navigateurs ?

0 votes

@Norman, c'était une explication impressionnante. Cependant, voici quelques confusions que j'ai encore. Dans une implémentation compilée, le programme original est converti en instructions machine natives. Comment cela se fait-il ? Je pensais que C, par exemple, après compilation, produisait du code assembleur, qui de toute façon doit être assemblé par un assembleur natif dans le code machine sous-jacent. En quoi est-ce différent d'une VM (python ou JVM, etc.) qui fait la même chose dans le cas d'un langage interprété ?

58voto

stakx Points 29832

Java et JavaScript sont un assez mauvais exemple pour démontrer cette différence <strike>car tous deux sont des langages interprétés </strike> . Java <strike>(interprété) </strike> et C (ou C++) <strike>(compilé) </strike> aurait pu être un meilleur exemple.

<strong>Pourquoi le texte barré ? </strong>Comme <a href="https://stackoverflow.com/a/2657453/240733">cette réponse </a>souligne à juste titre que l'option "interprété/compilé" concerne l'implémentation concrète d'un langage, et non le langage. <em>en soi </em>. Alors que des déclarations comme "C est un langage compilé" sont <em>généralement </em>En effet, rien n'empêche quelqu'un d'écrire un interprète du langage C. En fait, <a href="https://stackoverflow.com/q/584714/240733">Il existe des interprètes pour le C </a>.

En principe, le code compilé peut être exécuté directement par l'unité centrale de l'ordinateur. En d'autres termes, le code exécutable est spécifié dans le langage "natif" de l'UC ( langage assembleur ).

Le code des langages interprétés doit cependant être traduit au moment de l'exécution, de n'importe quel format aux instructions machine du CPU. Cette traduction est effectuée par un interpréteur.

Une autre façon de le dire est qu'interprété <strike>les langues sont </strike> le code est traduit en instructions machine étape par étape tandis que le programme est en cours d'exécution, tandis que la compilation <strike>les langues ont </strike> le code a été traduit avant l'exécution du programme.

9 votes

Java est interprété ? D'après 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."

6 votes

@Personman c'est toujours techniquement "interprété" car la JVM exécute le code, pas le système d'exploitation lui-même. C'est vraiment une différence sémantique, car on pourrait dire que la complexité des systèmes d'exploitation modernes rend la différence non pertinente dans la plupart des situations. Vous parlez de la différence entre le système d'exploitation qui exécute l'application, et le système d'exploitation qui exécute une application qui exécute le code.

6 votes

Je suppose que vous voulez dire que les fichiers de classe eux-mêmes sont interprétés par la VM Java. C'est assez raisonnable, mais les sources Java sont réellement compilées en bytecode Java VM. Vous pourriez construire une machine Java physique qui ne nécessiterait pas que la VM l'interprète dans le code machine d'une autre architecture. Il semble donc plus exact de dire que Java est compilé. Néanmoins, il s'agit là d'un bon exemple de la manière dont cette distinction peut prêter à confusion et est quelque peu arbitraire. Après tout, le C compilé est interprété par le CPU, n'est-ce pas ?

5voto

Salil Points 20300

Un compilateur, en général, lit le code informatique d'un langage de niveau supérieur et le convertit soit en p-code, soit en code machine natif. Un interpréteur s'exécute directement à partir du p-code ou d'un code interprété tel que Basic ou Lisp. En général, 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 ait tenté d'interpréter le code concerné. Le code interprété est souvent bon pour les applications simples qui ne seront utilisées qu'une fois ou au maximum deux fois, ou même pour le prototypage. Le code compilé est préférable pour les applications sérieuses. Un compilateur prend d'abord le programme entier, vérifie les erreurs, le compile et l'exécute ensuite. Un interprète, quant à lui, procède ligne par ligne, c'est-à-dire qu'il prend une ligne, vérifie s'il y a des erreurs et l'exécute.

Si vous avez besoin de plus d'informations, il suffit de chercher sur Google "différence entre compilateur et interprète".

3 votes

Umm, je ne suis pas sûr de savoir où vous avez trouvé certaines de ces informations au-delà des deux premières déclarations. C'é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 de l'attention portée aux détails, il est possible d'avoir un code interprété dont les performances sont proches ou aussi bonnes que celles du code compilé pour certaines activités.

0 votes

Si l'on garde à l'esprit que des langages comme Java, C# et JavaScript 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".

2voto

Personman Points 449

Il s'agit d'une distinction très floue, et en fait, ce n'est généralement pas une propriété d'un langage en soi, mais plutôt du programme que vous utilisez pour exécuter du code dans ce langage.

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

Compiler un code source, c'est exécuter un programme qui génère un fichier binaire exécutable qui, lorsqu'il est exécuté, a le comportement défini par le code source. Par exemple, javac compile les fichiers .java lisibles par l'homme en fichiers .class lisibles par la machine.

Interpréter un code source, c'est exécuter un programme sur celui-ci 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 voir en consultant la source de la page) et produit un grand nombre d'effets agréables sur ces pages - par exemple, le vote à la hausse, ou les petites barres de notification en haut.

0 votes

Alors que Java est d'abord traduit en bytecode et que ce n'est qu'au cours de son exécution que la JVM le convertit en code machine, est-il correct de dire qu'il est compilé et non interprété ?

1 votes

Je suppose que l'on peut 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.

0 votes

Non seulement vous pouvez le dire, mais il peut être interprété. Et il peut aussi être compilé en code machine.

2voto

Praveen Kishor Points 16

Le langage interprété est exécuté au moment de l'exécution selon les instructions, comme dans le cas du scripting shell, et le langage compilé est un langage qui est compilé (transformé en langage d'assemblage, que le CPU peut comprendre) et ensuite exécuté, comme dans le cas de c++.

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