Comment fonctionne un compilateur? [fermé]

17

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 visité 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.

Dynamique
la source
4
Trop large, au moins la partie «Comment ça marche». Il y a des livres entiers écrits sur ce sujet.
Odé
1
en.wikipedia.org/wiki/Compiler serait le lien Wikipedia qui est trivial à trouver, que vous demandez-vous précisément? La question est suffisamment large pour que je sois tenté de donner la réponse intelligente d'Alec, «Les compilateurs traduisent le code d'une langue dans une autre», car c'est l'idée générale qui contient beaucoup de nuances une fois que l'on commence à regarder qu'est-ce que cela implique vraiment.
JB King
1
Oui et je pense qu'il a assez bien répondu.
Jeremy
1
Toute explication du fonctionnement d'un compilateur sera soit trop large, soit trop compliquée. C'est un sujet compliqué et les cours de compilateurs étaient les cours informatiques les plus difficiles que j'ai jamais pris.
David Thornley
1
@David Bien sûr, les compilateurs sont compliqués, et vous ne pouvez pas expliquer tous les détails de leur fonctionnement ici. Cependant, je suis sûr que vous aviez une compréhension de base de haut niveau de ce qu'est un compilateur ou de son fonctionnement avant de suivre votre cours de compilateur.
Dima

Réponses:

24

Un compilateur est un programme qui traduit le code source d'un autre programme à partir 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 la CPU, ou il peut s'agir d'une représentation intermédiaire qui est interprétée par une machine virtuelle (par exemple du code d'octet Java).

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.

Dima
la source
2
En fait, il transforme une langue en une autre. Le premier compilateur C ++ a compilé en C. Il en va de même pour le compilateur Vala. Le compilateur Java se compile en bytecode qui n'est pas exécutable sans le compilateur JIT d'une JVM.
deadalnix
1
@deadalnix IMHO, le fait est que vous passez du code non exécutable au code exécutable. Je dirais que C-front n'était pas un compilateur mais un frontal pour le compilateur C. Ou une étape du processus de compilation, si vous voulez. Les machines virtuelles brouillent la frontière entre «exécutable» et «non exécutable», bien sûr. Ici, je considérerais simplement le code exécutable comme tout ce qui entre dans la machine virtuelle, comme le code d'octet, et j'abstiendrai tout ce qui se passe à l'intérieur de la machine virtuelle, comme JIT.
Dima
1
@Dima, il ne doit pas nécessairement s'agir d'un code non exécutable en code exécutable. Par exemple, vous ne pouvez pas exécuter le code d'octet JVM directement sur les machines Windows.
1
@ Thorbjørn Ravn Andersen: mais le code d'octet est exécutable par la JVM. N'est-ce pas tout l'intérêt d'une "machine virtuelle" de ressembler à une vraie machine pour le programmeur?
Dima
2
Je dirais que, traditionnellement, un compilateur convertissait un programme d'un format lisible par l'homme en un format lisible par machine, comme Dima l'a dit. Des variantes telles que Cfront convertissant C ++ en C ou javac convertissant Java en bytecode sont des sujets plus avancés qui devraient probablement être laissés jusqu'à ce qu'après avoir expliqué le concept de base traditionnel à quelqu'un qui ne le connaît pas.
Carson63000
5

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 du lieur.
Mario Stylianou
la source