Génération de code assembleur |
Le sujet est donné par l’archive td9.tar.gz.
Il vous reste deux traductions à implémenter dans le petit compilateur:
Les langages LIN et ASM sont décrits dans LIN.mli et ASM.mli.
Vous allez compléter les fichiers ltl2linI.ml et lin2asm.ml.
Il s’agit de compléter le fichier ltl2linI.ml, dont l’interface est donnée par ltl2linI.mli. Encore une fois, ce module prend la forme d’un foncteur, ce qui signifie que vous pouvez supposer données les fonctions suivantes:
Si vous le souhaitez, vous pouvez consulter ltl2lin.ml pour voir comment ces fonctions sont implémentées. Il n’y a là rien de très compliqué.
On vous demande d’écrire la fonction visit, qui parcourt le graphe de flot de contrôle en profondeur d’abord, et engendre pendant ce parcours une suite d’instructions LIN.
Vous pouvez tester à l’aide de la commande make lin, et visualiser le code produit avec:
# ./compilo -dlin <programme>
Il s’agit de compléter le fichier lin2asm.ml.
Les deux problèmes posés par cette traduction sont les suivants:
Pour effectuer cette traduction, il est nécessaire de comprendre l’organisation des trames de pile dans le petit compilateur. Celle-ci est décrite par un long commentaire en haut du fichier lin2asm.ml. La figure suivante récapitule cette organisation et son évolution lors d’un appel de fonction de f à g:
Lorsque vous aurez complété les cinq fonctions à trou, vous pourrez tester votre code via make test, et visualiser le code produit avec:
# ./compilo -dasm <programme>
Bravo, vous avez maintenant – du moins je l’espère – une vision d’ensemble du fonctionnement d’un compilateur d’un langage procédural vers un langage assembleur.
Ce document a été traduit de LATEX par HEVEA