V. Génération de Code Intermédiaire. 9ème Cours.
La génération de code intermédiaire peut être considérée comme le point où on passe de la
partie analyse à la partie synthèse.
En principe, il reste peu ou pas de traces du langage source à ce point. Aussi, il y apparaît
peu ou pas de traces du langage (ou de la machine) cible.
Bien qu’optionnel, le passage par le code intermédiaire apporte certains avantages :
• Il est relativement aisé de changer le langage cible du compilateur ;
• La représentation intermédiaire permet d’appliquer des optimisations indépendantes
du langage cible.
Deux représentations intermédiaires sont souvent utilisées à savoir :
• Les arbres de syntaxe (avec ou sans partage des sous-expressions communes);
• La notation post fixé.
Exemple :
(b + c) * (b + c) * (- d) → *(+bc) *(+bc) (–d).
Une autre représentation est introduite c’est la représentation du code à trois adresses :
• Il s’agit de séquences d’énoncés simples dont les plus courants sont de la forme :
x := y op z (2 opérandes + 1 récepteur = 3 adresses);
• Le découpage des expressions complexes du langage source en des séquences
d’énoncés simples demande l’introduction de variables temporaires ti.
Voici les types d’énoncés que l’on retrouve dans le code à trois adresses :
• x := y op z où op est un opérateur binaire;
• x := op y où op est un opérateur unaire;
• x := y;
• Goto L, où L est l’étiquette d’un énoncé dans la séquence ;
• if x relop y goto L où relop est un opérateur de comparaison comme ≤, >, =, etc…;
• Param x et call p, n pour la préparation des appels de procédures où n indique le nombre de
valeurs passées en argument ;
• return [y] pour le retour des appels de procédures ;
• x := y[i] et x[i] := y pour les accès dans des tableaux;
• x := &y, x := *y et *x := y pour la manipulation des pointeurs;
• L : pseudo-énoncé qui déclare l’étiquette L, il marque la position de l’énoncé suivant.