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é.
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.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
langagesinterprétéssont que lecode est traduit en instructions machine pas à pas pendant que le programme est en cours d'exécution, tandis que leslangagescompilésont ducode traduit avant l'exécution du programme.la source
Voici la différence fondamentale entre le langage compilateur et interprète.
Langue du compilateur
Langue de l'interprète:
la source
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".
la source
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.
la source
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 ++.
la source
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:
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.
la source