Fiche CCMP2 1
A cet étape de la construction du compilateur, nous avons un ast.
J’ai un ast, comment je fais pour prodire du code depuis l’AST ?
Structure du compilateur
Front-End et Back-End
Front end est un nom (le front end)
front-end est un adjectif (front-end interface)
Front end: Lié à l’analyse.
Middle end: Concerne tout ce qui est des optimisations généric etc.
Back end: Concerne le passage à notre assembleur préféré.
Front end:
Lexical analysis (scanning)
...
Back end:
Instruction select
register allocation
Register allocation
assembly specific optimizations
assembly code emission
...
Middle-End
L’interet d’un middle end c’est que si un compilo à un bug, alors il faut changer le code de tous les compilos qui se ressemblent (C, et C++ par exemple). Alors que si on crée un middle end, on a moins de noeuds à vérifier. (cf. slide 9 du pdf du prof).
Il est difficile de réaliser le passage d’un angage à un middle end commun à tous les langages.
On va donc réaliser plusieurs couche de middle end qui vont chacune faire converger notre langage vers un middle end commun. Chaque couche retirera une couche d’abstraction. Par exemple une couche va retirer l’objet, une autre va retirer les lambda etc…
Il existe plusieurs type de middle-end. Celui qui va nous intéresser est le RegisterBased: tc’s Tree.
RegisterBased: tc’s Tree
Question:
Dans la slide 27/107 vous faites référence à 3 structures:
Je ne comprends pas à quoi cela correspond et fait référence. Pouvez-vous m’éclairez ?
Le langage Tree
Tree structure (nokidding…)
Un bounded number of registers (temporaries)
Two way conditional jump

Exemples de représentations tree à la slide 41.
Memory
On a plusieurs modèle de mémoire dynamique:
- Global: java
- Automatic: La durée de vie d’une variable dépend de la fonction où elle est. (Ex: auto variables en C++)
- Heap: La durée de vie ne dépend pas de la fonction:
- User controlled: Malloc/Free ©, new/delete (C++) etc.
- Garbage Collected: With or without new (lisp, Tiger, perl etc.)
Question:
Je n’ai pas compris ce qu’est le modèle Global. Puis-je avoir un exemple svp ?
Activation Blocks
Activation Block: Tout ce qui constitue une procédure/fonction en ASM.
Data à mettre sur la stack:
- Arguments qui arrive
- Variable local
- Adresse de return
- Registres sauvegardé: (l’environnement à restaurer après le return)
- temp: variable automatiques
- static link (si besoin): lien vers le parent dans les fonction recursive
Example de block à la slide 54/107
frame pointer: Début du block d’activation
Stack pointer: Fin du block d’activation
Question
Je n’ai pas compris ce qu’était Arrays et Alloca.
Translation
- Ex: Expression qui a une valeur
- Nx: Expression sans valeur
- Cv: Condition
Linearization
Lineariser: Quand on a le language tree, on essaie de tout aplatir en remplacant les blocks imbriqué en jeu d’instruction.
Principe:
- Eseq et seq doivent être éliminé (sauf le seq tout en haut)
QuestionS
- Dans la slide 94/107 vous avez marqué “Similar to cut-elimination : p ermute inner eseq and seq to lift them higher, until they vanish”.
Je ne comprends ce que vous voulez dire par là.
- seq (ss1, seq (ss2), ss3) -> seq (ss1, ss2, ss3)
Je ne suis pas sûr de comprendre ce que sont les ss1, ss2, ss3 etc…
Enfin, je vois de nombreuses transformations dans la slide 95. Comment avez-vous opéré pour les réaliser ? Juste par logique et visuellement ou y a-t-il un algorithme ?
Fiche CCMP2 1
Intermediate Representation
A cet étape de la construction du compilateur, nous avons un ast.
Structure du compilateur
Front-End et Back-End
Front end est un nom (le front end)
front-end est un adjectif (front-end interface)
Front end: Lié à l’analyse.
Middle end: Concerne tout ce qui est des optimisations généric etc.
Back end: Concerne le passage à notre assembleur préféré.
Front end:
Back end:
Middle-End
L’interet d’un middle end c’est que si un compilo à un bug, alors il faut changer le code de tous les compilos qui se ressemblent (C, et C++ par exemple). Alors que si on crée un middle end, on a moins de noeuds à vérifier. (cf. slide 9 du pdf du prof).
Il est difficile de réaliser le passage d’un angage à un middle end commun à tous les langages.
On va donc réaliser plusieurs couche de middle end qui vont chacune faire converger notre langage vers un middle end commun. Chaque couche retirera une couche d’abstraction. Par exemple une couche va retirer l’objet, une autre va retirer les lambda etc…
Il existe plusieurs type de middle-end. Celui qui va nous intéresser est le RegisterBased: tc’s Tree.
RegisterBased: tc’s Tree
Dans la slide 27/107 vous faites référence à 3 structures:
Je ne comprends pas à quoi cela correspond et fait référence. Pouvez-vous m’éclairez ?
Le langage Tree
Tree structure (nokidding…)
Un bounded number of registers (temporaries)
Two way conditional jump
Exemples de représentations tree à la slide 41.
Memory
On a plusieurs modèle de mémoire dynamique:
Je n’ai pas compris ce qu’est le modèle Global. Puis-je avoir un exemple svp ?
Activation Blocks
Activation Block: Tout ce qui constitue une procédure/fonction en ASM.
Data à mettre sur la stack:
Example de block à la slide 54/107
frame pointer: Début du block d’activation
Stack pointer: Fin du block d’activation
Je n’ai pas compris ce qu’était Arrays et Alloca.
Translation
Linearization
Lineariser: Quand on a le language tree, on essaie de tout aplatir en remplacant les blocks imbriqué en jeu d’instruction.
Principe:
Je ne comprends ce que vous voulez dire par là.
Je ne suis pas sûr de comprendre ce que sont les ss1, ss2, ss3 etc…
Enfin, je vois de nombreuses transformations dans la slide 95. Comment avez-vous opéré pour les réaliser ? Juste par logique et visuellement ou y a-t-il un algorithme ?