/** * 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++; } } }