D’abord, je vous recommande de travailler sous Linux. N’importe quelle version devrait faire l’affaire. Toutes les versions de Caml ou OCaml ≥ 2.04 devraient aussi faire l’affaire. Si vous voulez travailler sur un autre système d’exploitation (Windows par exemple), c’est votre choix. Sachez cependant que, même avec Cygwin sous Windows, vous vous exposez à des complications. Allez-y si vous avez une âme de hacker.
Ensuite, vous devez récupérer
l’archive
du projet. Décompressez-là avec gunzip
et désarchivez le
tout avec tar
. Vous pouvez faire le tout en une seule étape en
tapant tar -xvzf projet.tgz
.
Vous devriez obtenir un répertoire MiniC
et
les fichiers suivants:
drwxr-xr-x goubault/lsv 0 2006-10-16 19:20:49 ProjetMiniC2/ -rw-r--r-- goubault/lsv 63297 2006-10-16 19:20:49 ProjetMiniC2/ctab.ml -rw-r--r-- goubault/lsv 13163 2006-10-16 19:20:49 ProjetMiniC2/clex.mll -rw-r--r-- goubault/lsv 2752 2006-10-16 19:20:49 ProjetMiniC2/error.ml -rw-r--r-- goubault/lsv 2078 2006-10-16 19:20:49 ProjetMiniC2/Makefile drwxr-xr-x goubault/lsv 0 2006-10-16 19:20:49 ProjetMiniC2/Exemples/ -rwxr-xr-x goubault/lsv 7593 2006-10-16 19:20:49 ProjetMiniC2/Exemples/exc1 -rw-r--r-- goubault/lsv 839 2006-10-16 19:20:49 ProjetMiniC2/Exemples/exc2.c -rw-r--r-- goubault/lsv 173 2006-10-16 19:20:49 ProjetMiniC2/Exemples/ordre.c -rw-r--r-- goubault/lsv 1454 2006-10-16 19:20:49 ProjetMiniC2/Exemples/cat.s -rw-r--r-- goubault/lsv 9391 2006-10-16 19:20:49 ProjetMiniC2/Exemples/exc1.s -rw-r--r-- goubault/lsv 459 2006-10-16 19:20:49 ProjetMiniC2/Exemples/cat.c -rw-r--r-- goubault/lsv 2554 2006-10-16 19:20:49 ProjetMiniC2/Exemples/fact.s -rwxr-xr-x goubault/lsv 8077 2006-10-16 19:20:49 ProjetMiniC2/Exemples/exc3 -rw-r--r-- goubault/lsv 10504 2006-10-16 19:20:49 ProjetMiniC2/Exemples/exc2.s -rw-r--r-- goubault/lsv 2064 2006-10-16 19:20:49 ProjetMiniC2/Exemples/sieve.c -rwxr-xr-x goubault/lsv 7935 2006-10-16 19:20:49 ProjetMiniC2/Exemples/exc2 -rw-r--r-- goubault/lsv 7388 2006-10-16 19:20:49 ProjetMiniC2/Exemples/sieve.s -rw-r--r-- goubault/lsv 917 2006-10-16 19:20:49 ProjetMiniC2/Exemples/exc3.c -rw-r--r-- goubault/lsv 739 2006-10-16 19:20:49 ProjetMiniC2/Exemples/fact.c -rw-r--r-- goubault/lsv 727 2006-10-16 19:20:49 ProjetMiniC2/Exemples/ordre.s -rw-r--r-- goubault/lsv 725 2006-10-16 19:20:49 ProjetMiniC2/Exemples/exc1.c -rw-r--r-- goubault/lsv 11072 2006-10-16 19:20:49 ProjetMiniC2/Exemples/exc3.s -rw-r--r-- goubault/lsv 246214 2006-10-16 19:20:49 ProjetMiniC2/clex.ml -rw-r--r-- goubault/lsv 1041 2006-10-16 19:20:49 ProjetMiniC2/genlab.ml -rw-r--r-- goubault/lsv 1254 2006-10-16 19:20:49 ProjetMiniC2/ctab.mli -rw-r--r-- goubault/lsv 14023 2006-10-16 19:20:49 ProjetMiniC2/ctab.mly -rw-r--r-- goubault/lsv 1859 2006-10-16 19:20:49 ProjetMiniC2/top.ml -rw-r--r-- goubault/lsv 2198 2006-10-16 19:20:49 ProjetMiniC2/main.ml -rw-r--r-- goubault/lsv 936 2006-10-16 19:20:49 ProjetMiniC2/verbose.ml -rw-r--r-- goubault/lsv 9464 2006-10-16 19:20:49 ProjetMiniC2/cparse.ml -rw-r--r-- goubault/lsv 643 2006-10-16 19:20:49 ProjetMiniC2/depend -rw-r--r-- goubault/lsv 981 2006-10-16 19:20:49 ProjetMiniC2/compile.mli |
Votre travail consiste à écrire le fichier manquant
compile.ml
. Vous pouvez y écrire ce que
vous voulez, l’important est de définir la fonction dont le type est
spécifié dans le fichier d’interface
compile.mli
:
val compile : out_channel -> Cparse.var_declaration list -> unit;;
Cette fonction prend un canal de sortie en premier argument,
appelons-le out
, et un programme C--,
appelons-le π, et imprime sur out
un texte
en assembleur x86 qui code le programme π. Ce texte en assembleur
ressemblera donc au texte de l’introduction (voir le fichier
cat.s).
Lorsque vous aurez écrit le fichier
compile.mli
, compilez le tout en invoquant
make
. Comme Emmanuel et moi vous l’avons
expliqué, ceci va appliquer un certain nombre de commandes dans un
ordre défini par les dépendances exprimées dans le fichier
Makefile
.
Le résultat sera un programme, qui s’appellera
mcc
et sera dans le répertoire
ProjetMiniC2
. Vous pourrez tester ce
programme en tapant ./mcc
suivi du nom d’un fichier C-- à compiler.
Par exemple, si vous tapez (en partant du répertoire
ProjetMiniC2
):
cd Exemples ../mcc cat.c |
Ceci devrait produire un fichier assembleur
cat.s
, que vous pourrez consulter, et un
fichier exécutable cat
, que vous pourrez
tester en tapant (sous le répertoire
ProjetMiniC2/Exemples
):
./cat cat.s |
Il est évidemment plus que probable que le code assembleur que vous
produisiez, au moins au début, ne soit pas de la meilleure qualité.
Notamment, mcc
appelle le compilateur
gcc
pour compiler le code assembleur que
vous aurez produit vers un vrai exécutable. Si votre code assembleur
n’est pas syntaxiquement correct, ceci échouera. Il se peut aussi que
vous obteniez un exécutable, mais qu’il plante (message
Segmentation fault
, typiquement).
Dans tous les cas, vous pouvez:
mcc
à ne produire que le code
assembleur, sans le compiler. Appelez-le avec l’option
-S
:
../mcc -S cat.c |
compile
produit. Vous pouvez envoyer ce
code dans un fichier, disons cat.s
encore
une fois, par:
../mcc -S cat.c >cat.s |
ddd
. Si vous ne
l’avez pas, rabattez-vous sur xxgdb
, ou
dans le pire des cas sur gdb
. Utilisez
les commandes
ddd
pour voir le contenu des registres
de la machine. Sous gdb
, tapez
info registers
pour le même effet (en moins beau).
%esp
vaut 0xbffff8e0
,
tapez 0xbffff8d0
dans le champ “from” pour voir un peu de
part et d’autre de 0xbffff8e0
. Sous
gdb
, vous obtiendrez le même effet (en
moins beau) avec l’incantation: