Initialisation des systèmes...

Baptiste.Dev
Retour aux notes
FondamentauxDébutantSérie : Fondamentaux

La compilation

Traduire le code que tu écris en code que la machine exécute, avant de le lancer : ce qu'est un compilateur, la différence entre « à la compilation » et « à l'exécution », et pourquoi certaines erreurs sont attrapées avant même de démarrer.

Par Baptiste Vidal
3 min de lecture
Mis à jour il y a 2 semaines
fondamentauxcompilationcompilateurruntimebytecode

La compilation

On dit sans arrêt qu'un code « compile » ou qu'une erreur est « de compilation ». Mais compiler, ça veut dire quoi exactement ? C'est l'une des idées les plus fondamentales de la programmation, et la comprendre éclaire tout le reste (typage, transpilation, langages interprétés).


# Du code lisible au code exécutable

Un processeur ne comprend qu'une seule chose : du code machine, des instructions binaires (des 0 et des 1). Personne n'écrit directement là-dedans. On écrit dans des langages de haut niveau - C#, Java, C++ - pensés pour l'humain.

Entre les deux, il faut donc une traduction. C'est le rôle de la compilation.


# Qu'est-ce que compiler ?

Compiler, c'est traduire l'intégralité du code source en code exécutable, une bonne fois, avant de lancer le programme.

Un compilateur est le programme qui fait cette traduction. Il lit tout ton code, le vérifie, puis produit un artefact exécutable (un .exe, un binaire...). Une fois cet artefact produit, le programme tourne tout seul, sans avoir besoin du code source ni du compilateur.

Code source (C#)  ──[ compilateur ]──►  Exécutable  ──►  La machine exécute
   monfichier.cs                          monprog.exe

C'est une étape séparée et préalable : d'abord on compile (le build), ensuite on exécute.


# Les erreurs de compilation

Puisque la traduction se fait avant l'exécution, le compilateur peut refuser de traduire s'il détecte un problème. C'est une sécurité énorme : le programme ne démarre même pas tant que ces erreurs ne sont pas corrigées.

Forme f = new Forme();  // ❌ Erreur de compilation :
                        //    impossible d'instancier une classe abstraite

Le compilateur attrape ici deux grandes familles d'erreurs :

  • la syntaxe (une accolade oubliée, un mot-clé mal écrit) ;
  • les types, dans les langages typés statiquement (passer un texte là où un nombre est attendu).

Une erreur de compilation, c'est une erreur découverte gratuitement, avant que le programme n'ait fait quoi que ce soit.


# « À la compilation » vs « à l'exécution »

Ces deux expressions reviennent partout, et opposent deux moments dans la vie d'un programme :

À la compilation (compile-time)À l'exécution (runtime)
QuandPendant la traduction, avant de lancerPendant que le programme tourne
Ce qui s'y passeVérification de la syntaxe, des typesLes calculs réels, les entrées utilisateur, le réseau
Exemple d'erreur« type incompatible »« division par zéro », « valeur nulle »

Retiens cet axe : c'est la clé pour comprendre le typage. Un type vérifié « à la compilation » t'empêche d'écrire le bug ; un bug « à l'exécution » ne se révèle qu'en faisant tourner le code, souvent trop tard.


# Nuance : le bytecode, un intermédiaire

Tous les langages « compilés » ne produisent pas directement du code machine. C# et Java compilent d'abord vers un format intermédiaire (le bytecode, appelé IL en .NET) : un langage à mi-chemin, ni tout à fait humain ni tout à fait machine.

Ce bytecode est ensuite exécuté par une machine virtuelle (le runtime .NET, la JVM pour Java), qui le traduit en code machine au dernier moment. C'est ce qui rend ces langages portables : le même bytecode tourne sur Windows, Linux ou macOS, tant qu'il y a le bon runtime. On retrouve cette idée du côté des langages interprétés.


# À retenir

  • Compiler = traduire tout le code source en code exécutable, avant de lancer le programme.
  • Le compilateur peut refuser de compiler : ce sont les erreurs de compilation (syntaxe, types), attrapées avant l'exécution.
  • Compile-time vs runtime : l'axe central. Ce qui est vérifié à la compilation ne peut plus casser à l'exécution.
  • Beaucoup de langages compilent vers du bytecode exécuté par une machine virtuelle, gage de portabilité.

À lire ensuite : Les langages interprétés, l'autre grande façon d'exécuter du code.