web-dev-qa-db-fra.com

Comment fonctionne un compilateur?

Remarque: je suis surpris que cela n'ait pas été demandé auparavant, et si c'est le cas, je ne l'ai pas trouvé dans une recherche.

J'ai consulté des tonnes de sites Web, j'ai lu des tonnes d'articles et j'ai entendu des tonnes d'explications. La plupart d'entre eux étaient bons, mais ils étaient tous trop larges ou trop compliqués ou tout simplement mauvais. Donc ma question est, comment fonctionne un compilateur?

S'il s'agit d'une question vaste et difficile, veuillez me le dire. Sinon, veuillez répondre à la question.

17
Dynamic

Un compilateur est un programme qui traduit le code source d'un autre programme d'un langage de programmation en code exécutable.

Le code source est généralement dans un langage de programmation de haut niveau (par exemple Pascal, C, C++, Java, Perl, C #, etc.). Le code exécutable peut être une séquence d'instructions machine qui peut être exécutée directement par le CPU, ou il peut s'agir d'une représentation intermédiaire interprétée par une machine virtuelle (par exemple Java octet code).

En bref, un compilateur convertit un programme d'un format lisible par l'homme en un format lisible par une machine.

Quant au fonctionnement d'un compilateur, c'est en effet compliqué. Il existe des livres et des cours universitaires sur le sujet. Je vais essayer de décrire brièvement les principales étapes du processus, mais ce sera un aperçu très rapide.

  1. Lexing - décomposer le texte du programme en "jetons". Les jetons sont les "mots" du langage de programmation, tels que des identifiants (mots-clés, noms de variables, noms de fonctions, etc.) ou des opérateurs (=, *, &, etc.).
  2. Analyse - convertissez la séquence de jetons en une arborescence d'analyse, qui est une structure de données représentant diverses constructions de langage: déclarations de type, déclarations de variables, définitions de fonction, boucles, conditions, expressions, etc.
  3. Optimisation - évaluez les expressions constantes, optimisez les variables inutilisées ou le code inaccessible, déroulez les boucles si possible, etc.
  4. Traduisez l'arborescence d'analyse en instructions machine (ou code d'octet JVM).

Encore une fois, je souligne qu'il s'agit d'une description très brève. Les compilateurs modernes sont très intelligents et, par conséquent, très compliqués.

24
Dima

Un compilateur est un programme informatique (ou un ensemble d'instructions) qui transforme le code source écrit dans un langage de programmation (le langage source) en un autre langage informatique (le langage cible, ayant souvent une forme binaire connue sous le nom de code objet). La raison la plus courante de vouloir transformer le code source est de créer un programme exécutable.

Les compilateurs relient les programmes source dans les langages de haut niveau avec le matériel sous-jacent. Un compilateur nécessite:

  1. Déterminer l'exactitude de la syntaxe des programmes
  2. Générer un code objet correct et efficace
  3. Organisation d'exécution
  4. Formatage de la sortie selon les conventions de l'assembleur et/ou de l'éditeur de liens.
5
Mario Stylianou