/**
* Programme traduit en langage machine illustrant la traduction d'une alternative.
* L'alternative consiste à linéariser une graphe planaire. L'alternative est
* un embranchement (conditionné) suivi par une jointure (les voies se rejoignent).
* L'embranchement et la jointure sont réalisées via des sauts en des points précis
* dans le code machine.
*
* Exercice : certains saut sont calculés inutilement. Lesquels ? Les supprimer.
* Exercice : cette traduction utilise un décalage systématique pour les saut car
* il a été choisi d'utiliser une mécanique systématique d'incrémentation du
* pointeur d'instruction. Un autre choix est possible qui rend inutile ce décalage.
* Lequel ? Réécrire le programme de façon à faire disparaître le décalage.
* Exercice : traduire un if sans else
* Exercice : traduire une boucle for
* Exercice : traduire une boucle while
*/
public class s2traduit {
public static void main(String []a) {
// i:0, j:1
int []memoire = new int[2];
int instructionCourante = 1;
boolean fin = false;
while (!fin) {
switch(instructionCourante) {
case 1: // traduction de i=0;
memoire[0] = 0;
break;
case 2: // traduction de if (i==0) aller à la séquence "test vrai"; sinon aller à la séquence "test faux" (embranchement)
if (memoire[0]==0) {
instructionCourante = 3-1; // la première instruction de la séquence "test vrai" est de numéro 3, mais attention la machine est concue pour systématique ajouter un au pointeur d'instruction lorsqu'une instruction est terminée; on tiens compte de ce décalage en enleveant 1 à la valeur souhaitée...
} else {
instructionCourante = 5-1; // la première instruction de la séquence "test faux" est de numéro 5; attention au décalage...
}
break;
case 3: // traduction de la séquence j=1; i=i+j;
memoire[1] = 1;
break;
case 4:
memoire[0] = memoire[0]+memoire[1];
instructionCourante = 7-1; // attention fin de la séquence, donc saut vers la suite (jointure)
break;
case 5: // traduction de la séquence j=1; i=j*i
memoire[1] = 2;
break;
case 6:
memoire[0] = memoire[1]*memoire[0];
instructionCourante = 7-1; // attention fin de la séquence, donc saut vers la jointure
break;
case 7: // traduction de System.out.println(i+" "+j);
System.out.println(memoire[0]+" "+memoire[1]);
break;
case 8: // fin
fin = true;
break;
}
instructionCourante++;
}
}
}