Le compilateur est un programme qui lit un programme écrit dans une langue (la langue source) et le traduit dans un autre programme équivalent dans une autre langue (la langue cible), principalement un langage machine.
Il existe différentes phases du compilateur à travers lesquelles votre code de langue source est analysé ligne par ligne. Il y a une table de symboles qui garde la trace de tous les mots-clés qui sont analysés dans le code de la langue source.
Phase 1: Lexical Analyzer - lit tous les caractères du programme source et forme la séparation logique des jetons (int, char, float, if-else, for, while etc.)
Phase 2: Syntax Analyzer - analysez la structure du flux de jetons. Analyse hiérarchique des expressions qui inclut le suffixe / préfixe, etc. (a = b + c * d)
Phase 3: Analyseur sémantique - Vérification de type des jetons (entier à réel, flottant, etc.) et de nombreuses choses comme la priorité des opérateurs, etc.
Phase 4: Générateur de code intermédiaire - a = b + c * de (temp1 = c * d, temp2 = temp1 + b, temp3 = temp2-e)
Phase 5: Optimisation du code - Diverses analyses (flux de contrôle, flux de données, transformations)
qui élémine: code de redondance, propagation des constantes, code mort partiel, sous-expression commune, code invariant de boucle
Phase 6: Génération de code - Génération de code cible (principalement un langage d'assemblage) mettant des valeurs dans les registres
Toutes ces phases ne sont rien d'autre que des programmes bien écrits et il pourrait y avoir N nombre de défauts.