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.

Une illustration montrant un compilateur lisant un fichier de code source C++, traduisant le code C++ en code machine et écrivant le code machine dans un fichier exécutable.
Traduction ou conversion d’un programme écrit dans un langage compilé en code machine. Le compilateur lit le code source C++ dans un fichier qui se termine par .cpp et produit un fichier de code machine qui est exécutable. Sur les ordinateurs Windows, les fichiers exécutables produits par le compilateur C++ se terminent par .exe ; d’autres systèmes d’exploitation suivent des conventions de dénomination différentes. Les systèmes d’exploitation sont capables d’exécuter les fichiers exécutables sans autre traitement.
Une illustration d'un compilateur lisant un fichier de code source Java et traduisant le code Java en code de machine virtuelle, qui est enregistré dans un nouveau fichier. La machine virtuelle, un autre programme, lit le code de la machine virtuelle dans le nouveau fichier et l'interprète pour exécuter les opérations spécifiées par le code de la machine virtuelle.
Compilation et exécution d’un programme écrit dans un langage qui produit du code de la machine virtuelle. Des langages comme Java et C# sont d’abord compilés en code de machine virtuelle, c’est-à-dire en un code machine pour un ordinateur virtuel – un ordinateur qui n’existe pas vraiment. Une fois le code source compilé, un programme appelé machine virtuelle (VM) exécute le code en simulant les actions d’un ordinateur réel. Le système d’exploitation exécute la VM.
L'image illustre un fichier de code source Javascript qui est lu et traité par un interpréteur.
Exécution d’un programme écrit dans un langage purement interprété. Des langages comme Javascript et Perl ne sont pas du tout compilés. Un programme appelé interprète lit le fichier de code source une déclaration à la fois et exécute ou interprète chaque déclaration au fur et à mesure de sa lecture sans la traduire dans un autre langage. L’interpréteur Javascript est intégré à la plupart des navigateurs web, que le système d’exploitation exécute. Pour les autres langages interprétés, le système d’exploitation exécute l’interprète en tant que programme d’application.

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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.