Qu'est-ce qu'un compilateur de code et que fait-il?

UNE compilateur est un programme qui traduit lisible par l'homme code source en code machine exécutable par ordinateur. Pour ce faire, le code lisible par l'homme doit être conforme à la syntaxe les règles 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 se 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 ce langage de programmation fournit. 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"
instagram viewer

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és et étaient dans la 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. Corrigez toujours 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 une de ces langues. Beaucoup compilateurs nécessitent au moins deux passes. Parfois, c’est à cause de déclarations les fonctions ou des cours.

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.

La vitesse de la compilation exécutable le code doit être aussi rapide que possible et peut varier énormément selon la qualité du code généré et le degré d'optimisation demandé.

La plupart des compilateurs vous permettent de spécifier le niveau d'optimisation, généralement connu pour les compilations de débogage rapide et l'optimisation complète du code publié.

La génération de code est difficile

Le rédacteur du compilateur fait face à des défis lors de l'écriture d'un générateur de code. De nombreux processeurs accélèrent le traitement en utilisant

  • Pipelining d'instructions
  • Interne caches.

Si toutes les instructions dans un code boucle peut se tenir dans le CPU le cache, cette boucle s'exécute beaucoup plus rapidement que lorsque le processeur doit récupérer des instructions dans la RAM principale. Le cache CPU est un bloc de mémoire intégré à la puce CPU auquel on accède beaucoup plus rapidement que les données de la RAM principale.

Caches et files d'attente

La plupart des processeurs ont une file d'attente de prélecture où le processeur lit les instructions dans le cache avant de les exécuter. Si une branche conditionnelle se produit, le CPU doit recharger la file d'attente. Le code doit être généré pour minimiser cela.

De nombreux processeurs ont des pièces distinctes pour:

  • Arithmétique entière (nombres entiers)
  • Arithmétique à virgule flottante (nombres fractionnaires)

Ces opérations peuvent souvent s'exécuter en parallèle pour augmenter la vitesse.

Les compilateurs génèrent généralement du code machine dans des fichiers objets qui sont ensuite lié ensemble par un programme de liaison.

instagram story viewer