semaine 5
This commit is contained in:
13
MVaP/3n+2.mvap
Normal file
13
MVaP/3n+2.mvap
Normal file
@@ -0,0 +1,13 @@
|
||||
# calcule : 2 + 3 * n
|
||||
PUSHI 2
|
||||
LABEL 1
|
||||
PUSHI 3
|
||||
ADD
|
||||
WRITE
|
||||
DUP
|
||||
PUSHI 100
|
||||
INF
|
||||
JUMPF 2
|
||||
JUMP 1
|
||||
LABEL 2
|
||||
HALT
|
BIN
MVaP/3n+2.mvap.cbap
Normal file
BIN
MVaP/3n+2.mvap.cbap
Normal file
Binary file not shown.
36
MVaP/ALIRE
Normal file
36
MVaP/ALIRE
Normal file
@@ -0,0 +1,36 @@
|
||||
# La machine virtuelle à pile.
|
||||
|
||||
Une machine pédagogique pour donner une idée de ce qu'est l'assembleur.
|
||||
|
||||
Dans le cadre d'un cours de compilation, par exemple en L3 informatique, on peut demander aux étudiants de coder un compilateur qui va transcrire un langage de haut niveau similaire à du python (sans objets et avec quelques types simples entiers, flottants, tableaux) vers du code MVàP.
|
||||
|
||||
## Contenu du répertoire.
|
||||
* add.mvap Un exemple simple de programme
|
||||
* 3n+2.mvap Un exemple moins simple de programme
|
||||
* test.mvap Un exemple avec appel de fonction
|
||||
|
||||
* MVaP.jar Une archive java qui propose 2 exécutables
|
||||
MVaPAssembler (assemble en un binaire)
|
||||
CBaP (interprète le binaire).
|
||||
|
||||
* antlr-4.5.2-complete.jar Une archive java contenant de nombreux binaires permettant d'écrire des compilateurs sur lequel le code de la MVàP s'appuit.
|
||||
|
||||
## Pour utiliser la MVàP
|
||||
|
||||
Il faut avoir java d'installé sur sa machine (c'est le cas si vous passez par proxmox des machines de l'IUT).
|
||||
|
||||
** Pour exécuter du code mvap, il faut :
|
||||
|
||||
1- Assembler :
|
||||
$ java -cp antlr-4.5.2-complete.jar:MVaP.jar MVaPAssembler add.mvap
|
||||
ou avec des traces (option -d) :
|
||||
$ java -cp antlr-4.5.2-complete.jar:MVaP.jar MVaPAssembler -d add.mvap
|
||||
ce qui produit le fichier add.mvap.cbap
|
||||
|
||||
Le fichier .cbap (code binaire à pile) est du binaire que la machine peut exécuter.
|
||||
|
||||
2- Exécuter :
|
||||
$ java -jar MVaP.jar add.mvap.cbap
|
||||
ou pour mieux comprendre avec des traces :
|
||||
$ java -jar MVaP.jar -d add.mvap.cbap
|
||||
|
61
MVaP/ALIRE~
Normal file
61
MVaP/ALIRE~
Normal file
@@ -0,0 +1,61 @@
|
||||
add.mvap Un exemple simple de programme
|
||||
3n+2.mvap Un exemple moins simple de programme
|
||||
test.mvap Un exemple avec appel de fonction
|
||||
MVaP.g4 Le parser du langage qui produit un analyseur ANTLR4
|
||||
MVaPAssemblerListener.java Méthode appelée par le parcours de l'arbre d'analyse
|
||||
qui produit du code binaire (CB)
|
||||
MVaPAssembler.java L'assembleur qui produit du code binaire
|
||||
Pile.java Un gestionnaire de pile d'entiers
|
||||
CBaP.java La machine virtuelle pour le code binaire à pile
|
||||
|
||||
|
||||
** Pour compiler l'assembleur et le machine virtuelle, il faut :
|
||||
|
||||
1- Avoir antlr dans son CLASSPATH :
|
||||
$ export CLASSPATH=.:/usr/local/java/antlr-4.4-complete.jar
|
||||
ou ajouter aux commandes : -cp .:/usr/local/java/antlr-4.4-complete.jar
|
||||
|
||||
2- Lancer antlr sur MVaP.g4
|
||||
$ java -jar /usr/local/java/antlr-4.4-complete.jar MVaP.g4
|
||||
|
||||
3- Compiler l'assembleur et la machine virtuelle (il suffit de demander la
|
||||
compilation des fichiers contenant les main, javac compilera les autres
|
||||
classes automatiquement...)
|
||||
$ javac MVaPAssembler.java CBaP.java
|
||||
|
||||
|
||||
** Pour exécuter du code mvap, il faut :
|
||||
|
||||
1- Assembler :
|
||||
$ java MVaPAssembler add.mvap
|
||||
ou avec des traces :
|
||||
$ java MVaPAssembler -d add.mvap
|
||||
ce qui produit le fichier add.mvap.cbap
|
||||
|
||||
2- Exécuter :
|
||||
$ java CBaP add.mvap.cbap
|
||||
ou pour mieux comprendre avec des traces :
|
||||
$ java CBaP -d add.mvap.cbap
|
||||
|
||||
|
||||
** Pour construire le jar, il faut :
|
||||
1- avoir un META-INF/MANIFEST pour inclure le jar antlr dans le CLASSPATH :
|
||||
Manifest-Version: 1.0
|
||||
Version: 2.1
|
||||
Main-Class: CBaP
|
||||
Class-Path: /usr/local/java/antlr-4.4-complete.jar
|
||||
|
||||
2- Contruire le jar avec :
|
||||
$ jar cfm MVaP.jar META-INF/MANIFEST *.class
|
||||
|
||||
|
||||
On peut aussi faire tout simplement :
|
||||
$ make
|
||||
|
||||
** Utilisation du jar :
|
||||
|
||||
1- Assembler :
|
||||
$ java -cp .:/usr/local/java/antlr-4.4-complete.jar:MVaP.jar MVaPAssembler add.mvap
|
||||
|
||||
2- Exécuter :
|
||||
$ java -jar MVaP.jar -d add.mvap.cbap
|
BIN
MVaP/MVaP.jar
Normal file
BIN
MVaP/MVaP.jar
Normal file
Binary file not shown.
7
MVaP/add.mvap
Normal file
7
MVaP/add.mvap
Normal file
@@ -0,0 +1,7 @@
|
||||
# calcule : 2 + 40
|
||||
PUSHI 2
|
||||
PUSHI 40
|
||||
ADD
|
||||
WRITE
|
||||
POP
|
||||
HALT
|
BIN
MVaP/add.mvap.cbap
Normal file
BIN
MVaP/add.mvap.cbap
Normal file
Binary file not shown.
BIN
MVaP/antlr-4.5.2-complete.jar
Normal file
BIN
MVaP/antlr-4.5.2-complete.jar
Normal file
Binary file not shown.
27
MVaP/test.mvap
Normal file
27
MVaP/test.mvap
Normal file
@@ -0,0 +1,27 @@
|
||||
# On prend au départ 2
|
||||
# on ajoute 3 et on élève le tout au carré
|
||||
# on recommence et on s'arrête dès que l'on dépasse 100
|
||||
PUSHI 2
|
||||
LABEL 1
|
||||
PUSHI 3
|
||||
ADD
|
||||
WRITE
|
||||
CALL 2
|
||||
WRITE
|
||||
# a-t-on un sommet de pile < 100 ?
|
||||
DUP
|
||||
PUSHI 100
|
||||
SUP
|
||||
JUMPF 1
|
||||
# le nombre affiché est plus grand que 100, on s'arrête
|
||||
HALT
|
||||
# procédure qui élève un nombre au carré
|
||||
LABEL 2
|
||||
# récupère le premier paramètre (-3 = -1 - 2)
|
||||
PUSHL -3
|
||||
DUP
|
||||
MUL
|
||||
# on a donc son carré en sommet de pile
|
||||
STOREL -3
|
||||
# on remplace la valeur
|
||||
RETURN
|
BIN
MVaP/test.mvap.cbap
Normal file
BIN
MVaP/test.mvap.cbap
Normal file
Binary file not shown.
Reference in New Issue
Block a user