1 0 1 1 0 1 0 ...
Connexion...

  • Mini Scala (misc) compiler 2004-04-12

    Statut: terminé

    Le but de ce projet, réalisé dans le cadre du cours de compilation, était de concevoir un compilateur misc. Misc (abréviation de mini Scala) est, comme son nom l'indique, une version allégée du langage Scala. Scala est un language fonctionnel, orienté objet, développé au laboratoire des méthodes de programmation (LAMP) de l'EPFL. La version allégée de Scala n'existe que dans un but éducatif, nous permettant de faire abstraction dans ce projet de certaines spécificités du language et ainsi de nous concentrer sur les aspects de compilation.

    Le code source de ce compilateur n'est pas disponible ici, étant donné que c'est un travail noté, réalisé chaque année par les étudiants de 3e année d'informatique de l'EPFL. De plus, le compilateur comporte quelques erreurs tout de même, notemment lors de l'appel de fonctions récursives avec passage de fonctions en paramètre... Ainsi, la version binaire n'est pas non plus disponible (Cependant, je vous encourage à télécharger et utiliser la version officielle du compilateur Scala).

    Voilà un example de code machine généré par la version "finale" du compilateur:

    /* 0000 */ syscall 30 0 13
    /* 0004 */ divi 1 30 4
    /* 0008 */ divi 2 1 2
    /* 0012 */ addi 3 0 30
    /* 0016 */ lshi 3 3 27
    /* 0020 */ add 2 2 3
    /* 0024 */ syscall 1 2 11
    /* 0028 */ bsr 40
    /* 0032 */ psh 31 30 4
    /* 0036 */ syscall 1 0 2
    /* 0040 */ pop 31 30 4
    /* 0044 */ ret 31
    /* 0048 */ psh 31 30 4
    /* 0052 */ syscall 1 0 1
    /* 0056 */ pop 31 30 4
    /* 0060 */ ret 31
    /* 0064 */ psh 31 30 4
    /* 0068 */ ldw 1 30 4
    /* 0072 */ syscall 1 0 7
    /* 0076 */ pop 31 30 8
    /* 0080 */ ret 31
    /* 0084 */ psh 31 30 4
    /* 0088 */ ldw 1 30 4
    /* 0092 */ syscall 1 0 6
    /* 0096 */ pop 31 30 8
    /* 0100 */ ret 31
    /* 0104 */ psh 31 30 4
    /* 0108 */ ldw 1 30 4
    /* 0112 */ oriu 2 0 0
    /* 0116 */ cmp 2 1 2
    /* 0120 */ bne 2 3
    /* 0124 */ oriu 1 0 1
    /* 0128 */ beq 0 13
    /* 0132 */ addi 2 0 104
    /* 0136 */ oriu 4 0 1
    /* 0140 */ ldw 5 30 4
    /* 0144 */ sub 3 5 4
    /* 0148 */ psh 3 30 4
    /* 0152 */ addi 31 0 160
    /* 0156 */ ret 2
    /* 0160 */ psh 1 30 4
    /* 0164 */ ldw 1 30 0
    /* 0168 */ ldw 2 30 8
    /* 0172 */ mul 1 2 1
    /* 0176 */ addi 30 30 4
    /* 0180 */ pop 31 30 8
    /* 0184 */ ret 31
    /* 0188 */ psh 1 30 4
    /* 0192 */ addi 1 0 64
    /* 0196 */ psh 1 30 4
    /* 0200 */ psh 2 30 4
    /* 0204 */ addi 1 0 104
    /* 0208 */ oriu 2 0 3
    /* 0212 */ psh 2 30 4
    /* 0216 */ addi 31 0 224
    /* 0220 */ ret 1
    /* 0224 */ add 3 0 1
    /* 0228 */ pop 2 30 4
    /* 0232 */ pop 1 30 4
    /* 0236 */ psh 3 30 4
    /* 0240 */ addi 31 0 248
    /* 0244 */ ret 1
    /* 0248 */ add 2 0 1
    /* 0252 */ pop 1 30 4
    /* 0256 */ add 1 0 0
    /* 0260 */ ret 0

    avec le code original:

    def fact(x: Int):Int =
    if ( x == 0)
    1
    else {
    var y: Int = fact(x -1);
    x*y
    };
    printInt(fact(3));

    Vous remarquerez que nous compilons pour un processeur de type RISC, en fait pour un processeur DLX. En quelque sorte, une variante de ce processeur est conçu lors du cours d'architecture des ordinateurs, en 2e année.

 
Contact me | Terms of use | Site map
Copyright © 2004 Jérôme Caffaro