La définition et le but d'un compilateur

Un compilateur est un programme qui traduit le code source lisible par l'homme en code machine exécutable par ordinateur. Pour ce faire, le code lisible par l'homme doit respecter les règles de syntaxe du langage de programmation dans lequel il est écrit. Le compilateur n'est qu'un programme et ne peut pas corriger votre code pour vous. Si vous faites une erreur, vous devez corriger la syntaxe sinon elle ne compilera pas.

Que se passe-t-il lorsque vous compilez du code?

La complexité d'un compilateur dépend de la syntaxe du langage et de la quantité d'abstraction fournie par le langage de programmation. Un compilateur C est beaucoup plus simple qu'un compilateur pour C ++ ou C #.

Analyse lexicale

Lors de la compilation, le compilateur lit d'abord un flux de caractères à partir d'un fichier de code source et génère un flux de jetons lexicaux. Par exemple, le code C ++:

int C = (A * B) +10;

pourraient être analysés comme ces jetons:

  • tapez "int"
  • variable "C"
  • équivaut à
  • support gauche
  • variable "A"
  • fois
  • variable "B"
  • parenthèse
  • plus
  • littéral "10"

Analyse syntaxique

La sortie lexicale va à la partie analyseur syntaxique du compilateur, qui utilise les règles de grammaire pour décider si l'entrée est valide ou non. Sauf si les variables A et B ont été précédemment déclarées et étaient de portée, le compilateur pourrait dire:

  • 'A': identifiant non déclaré.

S'ils ont été déclarés mais non initialisés. le compilateur émet un avertissement:

  • variable locale 'A' utilisée sans être initialisée.

Vous ne devez jamais ignorer les avertissements du compilateur. Ils peuvent casser votre code de manière étrange et inattendue. Toujours corriger les avertissements du compilateur.

Un ou deux passages?

Certains langages de programmation sont écrits de sorte qu'un compilateur ne peut lire le code source qu'une seule fois et générer le code machine. Pascal est l'un de ces langages. De nombreux compilateurs nécessitent au moins deux passes. Parfois, c'est à cause de déclarations avancées de fonctions ou de classes.

En C ++, une classe peut être déclarée mais ne peut être définie que plus tard. Le compilateur est incapable de déterminer la quantité de mémoire dont la classe a besoin jusqu'à ce qu'il compile le corps de la classe. Il doit relire le code source avant de générer le code machine correct.

Génération de code machine

En supposant que le compilateur termine avec succès les analyses lexicales et syntaxiques, la dernière étape génère le code machine. C'est un processus compliqué, en particulier avec les processeurs modernes.