Conception du compilateur - Phases du compilateur
Le processus de compilation est une séquence de différentes phases. Chaque phase prend l'entrée de son étape précédente, a sa propre représentation du programme source et transmet sa sortie à la phase suivante du compilateur. Laissez-nous comprendre les phases d'un compilateur.
Analyse lexicale
La première phase du scanner fonctionne comme un scanner de texte. Cette phase analyse le code source sous forme de flux de caractères et le convertit en lexèmes significatifs. L'analyseur lexical représente ces lexèmes sous forme de jetons comme:
<token-name, attribute-value>
Analyse de la syntaxe
La phase suivante est appelée l'analyse syntaxique ou parsing. Il prend le jeton produit par l'analyse lexicale comme entrée et génère un arbre d'analyse (ou arbre de syntaxe). Dans cette phase, les dispositions des jetons sont vérifiées par rapport à la grammaire du code source, c'est-à-dire que l'analyseur vérifie si l'expression faite par les jetons est syntaxiquement correcte.
Analyse sémantique
L'analyse sémantique vérifie si l'arbre d'analyse construit suit les règles du langage. Par exemple, l'attribution de valeurs se fait entre des types de données compatibles et l'ajout d'une chaîne à un entier. En outre, l'analyseur sémantique garde une trace des identifiants, de leurs types et expressions; si les identificateurs sont déclarés avant utilisation ou non, etc. L'analyseur sémantique produit un arbre de syntaxe annoté en sortie.
Génération de code intermédiaire
Après analyse sémantique, le compilateur génère un code intermédiaire du code source pour la machine cible. Il représente un programme pour une machine abstraite. Il se situe entre le langage de haut niveau et le langage machine. Ce code intermédiaire doit être généré de manière à faciliter sa traduction dans le code machine cible.
Optimisation du code
La phase suivante consiste à optimiser le code du code intermédiaire. L'optimisation peut être considérée comme quelque chose qui supprime les lignes de code inutiles et organise la séquence d'instructions afin d'accélérer l'exécution du programme sans gaspiller de ressources (CPU, mémoire).
Génération de code
Dans cette phase, le générateur de code prend la représentation optimisée du code intermédiaire et la mappe au langage machine cible. Le générateur de code traduit le code intermédiaire en une séquence de code machine (généralement) re-localisable. La séquence d'instructions du code machine exécute la tâche comme le ferait le code intermédiaire.
Table des symboles
C'est une structure de données maintenue pendant toutes les phases d'un compilateur. Tous les noms d'identifiant ainsi que leurs types sont stockés ici. La table des symboles permet au compilateur de rechercher rapidement l'enregistrement d'identificateur et de le récupérer. La table des symboles est également utilisée pour la gestion du périmètre.