Is ORCA/C a PCC compiler developed by Johnson [1979] ? PCC stands for Portable C Compiler. 3/4 of the PCC code are independant of the target machine. Are there only two passes for the ORCA/C compiler or is there a third one optional ? C est un langage de programmation d'usage général conçu par D. M. Ritchie; il constitue le principal langage de programmation du système d'exploitation UNIX (Ritchie et Thompson [1974]). UNIX lui-même est écrit en C, et il a été porté sur un grand nombre de machines, depuis les micro-processeurs jusqu'aux gros ordinateurs centraux, en portant d'abord un compilateur C. Cette section décrit brièvement la structure globale du compilateur écrit par Ritchie [1979] pour le PDP-11 et de la famille de compilateurs C portables, nommée PCC, développée par Johnson [1979]. Les trois quarts du code de PCC sont indépendants de la machine cible. Tous ces compilateurs travaillent essentiellement en deux passes; comme l'indique la figure 12.3, le compilateur PDP-11 a une troisième passe optionnelle qui effectue une optimisation du code en langage d'assemblage. Cet optimiseur à lucarne élimine les instructions redondantes ou inaccessibles. Fig.12.3 STRUCTURES EN PASSES DES COMPILATEURS C 1. programme source 2. analyses lexicale et syntaxique production de code intermédiaire 3. forme postfixée ou préfixée pour les expressions langage d'assemblage pour les autres constructions 4. production de code 5. langage d'assemblage 6. post-optimisation 7. langage d'assemblage La première passe de tous ces compilateurs effectue l'analyse lexicale, l'analyse syntaxique et la production du code intermédiaire. Le compilateur PDP-11 emploie la descente récursive pour analyser tout le source sauf les expressions, pour lesquelles il emploie la précédence d'opérateurs. Le code intermédiaire consiste en une notation postfixée pour les expressions et en code en langage d'assemblage pour les instructions de contrôle de flot. PCC emploie un analyseur LALR(1) produit par Yacc. Son code intermédiaire consiste en une notation préfixée pour les expressions et en langage d'assemblage pour les autres constructions. Dans les deux cas, l'assignation de mémoire aux variables locales est effectuée au cours de la première passe; ces variables peuvent donc être référencées ensuite en utilisant des déplacements dans un enregistrement d'activation. Dans la partie finale, les expressions sont représentées par des arbres abstraits. Dans le compilateur PDP-11, la production de code est réalisée par un parcours d'arbre employant une stratégie similaire à l'algorithme d'étiquetage de la section 9.10. Celui-ci a été modifié pour assurer que des couples de registres soient disponibles pour les opérations qui les requièrent, et pour profiter du fait que certains opérandes sont des constantes. Johnson [1978] analyse l'influence de la théorie sur PCC. Dans PCC et PCC2, une version ultérieure du compilateur, le code pour les expressions est produit par réécriture d'arbre. Le générateur de code de PCC examine une instruction du programme source à la fois et détermine de façon répétitive des sous-arbres maximaux qui peuvent être évalués en utilisant les registres disponibles sans ranger aucun résultat intermédiaire en mémoire. Des étiquettes calculées comme dans la section 9.10 identifient les sous-expressions qui doivent être calculées et stockées dans des temporaires. Au fur et à mesure que les sous-arbres sont sélectionnés, le compilateur produit le code évaluant et stockant les valeurs représentées par ces sous-arbres. La réécriture est plus évidente encore dans PCC2, dont le générateur de code est fondé sur l'algorithme par programmation dynamique de la section 9.11. Johnson et Ritchie [1981] décrivent l'influence de la machine cible sur la conception des enregistrements d'activation et du protocole d'appel de procédure. La fonction de bibliothèque standard printf peut avoir un nombre variable d'arguments, ce qui fait que la conception du protocole d'appel est dominé sur certaines machines par la nécessité d'autoriser des listes d'arguments de longueur variable.