Les ordinateurs numériques ne comprennent pas les langages que les humains parlent. Au lieu de cela, ils utilisent un langage binaire appelé code machine ou langage machine.Le code machine consiste en une séquence d’instructions informatiques simples, chaque instruction étant exprimée par une chaîne de chiffres ou de bits binaires (c’est-à-dire des 1 et des 0). Différents ordinateurs « parlent » ou « comprennent » typiquement différents langages machine. Par exemple, un ordinateur peut représenter l’opération ADD par 10011111
alors qu’un autre peut représenter les mêmes opérations par 000110
. Non seulement les modèles de bits sont typiquement différents d’un type d’ordinateur à l’autre, mais même le nombre de bits utilisés pour représenter une opération peut être différent.
De plus, lorsqu’un programme s’exécute, le système d’exploitation (par exemple Windows, Linux, OS X, etc.) agit comme un environnement hôte qui fournit des services au programme.Ces services comprennent un support essentiel tel que l’accès au clavier, à l’écran et aux disques durs. Malheureusement, la façon dont le programme accède à ces services est également différente d’un système d’exploitation à l’autre. En raison des différences entre les langages machine et les exigences des systèmes d’exploitation, les programmes écrits en langage machine sont davantage axés sur le système qui exécute le programme que sur la manière dont le programme résout un problème. En outre, cela signifie également qu’il n’est pas possible de déplacer le code machine entre différents ordinateurs sans fournir une sorte de service de traduction – généralement sous la forme d’une machine virtuelle.
Écrire des programmes en langage machine est lent, fastidieux et sujet aux erreurs. La solution a été de développer des langages de programmation de plus haut niveau qui se concentrent davantage sur le problème et moins sur le système (le matériel et le système d’exploitation) qui exécute le programme (voir la figure 2). Mais les ordinateurs n’exécutent généralement pas les programmes écrits dans des langages de haut niveau. Il faut donc trouver un moyen de traduire un programme écrit dans un langage de haut niveau en langage machine. Deux types de programmes informatiques effectuent la traduction nécessaire : les compilateurs et les interprètes.
Un compilateur est un programme qui traduit d’autres programmes écrits dans un langage de programmation de haut niveau comme C ou C++ en code machine ou en langage machine.D’autres langages comme Java et C# empruntent une voie différente : Les programmes écrits dans ces langages sont compilés dans une représentation intermédiaire (une représentation qui se situe quelque part entre le langage de haut niveau et le langage machine) qui est souvent appelée code de machine virtuelle. Le code de la machine virtuelle devient alors l’entrée d’un autre programme appelé interprète ou machine virtuelle (VM, un programme qui simule une unité centrale matérielle). Certains langages, comme Javascript et Perl, sont complètement interprétés, c’est-à-dire qu’ils ne sont pas compilés mais interprétés directement.
Chaque approche pour exécuter un programme écrit dans un langage de programmation de haut niveau présente des avantages et des inconvénients. Les programmes écrits dans des langages entièrement compilés (par exemple, C et C++) s’exécutent plus rapidement que les programmes écrits dans des langages partiellement compilés (par exemple, Java et C#) et s’exécutent beaucoup plus rapidement que les programmes écrits dans des langages entièrement interprétés (par exemple, Javascript et Perl). Pour donner une idée de la différence de performances, disons qu’un programme C++, une fois compilé, s’exécute en un temps de 1,0. Un programme équivalent écrit dans un langage qui est compilé puis interprété s’exécutera généralement en un temps de 3 à 10. Le même programme exécuté dans un langage purement interprété s’exécutera en un temps d’environ 100. Les implémentations contemporaines des VM Java et C# utilisent un interpréteur juste à temps (JIT) qui compile une partie du code virtuel en code machine tout en le traitant. Les processeurs JIT réduisent le temps d’exécution à environ 1,5 fois celui des systèmes de langage purement compilé. Le langage de programmation Python est un peu différent : la partie principale d’un programme Python est interprétée, mais elle est relativement petite et a donc un impact minimal sur le temps d’exécution global. La plupart des bibliothèques Python, où le programme passe la majeure partie de son temps, sont écrites en C, de sorte que les programmes Python s’exécutent presque aussi rapidement qu’un programme C équivalent.
D’autre part, les programmes exécutables produits par un compilateur pur ne peuvent pas être transférés entre des plates-formes dissemblables (par exemple, vous ne pouvez pas exécuter un programme Windows sur un ordinateur Apple), tandis que les programmes écrits en langage interprété sont plus facilement déplacés entre différents ordinateurs. Cette portabilité est obtenue en fournissant une VM ou un interprète pour chaque plate-forme (combinaison de matériel et de système d’exploitation). Les interprètes et les VM sont des programmes écrits en langage purement compilé, ils ne sont donc pas portables, mais les programmes qu’ils traitent le sont.