/**
 * Ce programme est la traduction du programme Prog1.java.
 * Son comportement est une simulation de l'exécution d'un programme Java.
 * Les instructions autorisées sont très réduites. Mis à part la boucle
 * <code>while</code> et le <code>switch</code>, ne sont autorisés que
 * des instructions élémentaires : on s'autorise les affectations et expressions
 * arithmétiques, et des tests simples non-imbriqués (on verra plus tard).
 * <code>OuSuiJe</code> est une variable qui permet de représenter l'instruction
 * en cours d'exécution...
 * Après chaque instruction, on prend bien soin de calculer le numéro de
 * la suivante (ici c'est si simple qu'il suffit d'incrémenter le numéro).
 * On a rajouté une 6ième instruction permettant de terminer le programme.
 * La mémoire est elle rerpésentée comme un simple tableau d'entiers, ce qui
 * n'et pas très loin de la réalité (dans laquelle la mémoire est un simple
 * tableau d'octets), cette simplification n'est pas essentielle, elle permet
 * juste de réaliser une simulation pas trop désagréable en conservant les
 * principes de base de l'exécution d'un programme par une machine.
 * @author Jean-Baptiste Yunès
 * @date Février 2013
 */
public class Prog1Traduit {
  public static void main(String []args) {
    int ouSuisJe = 1;
    // nous avons joué le rôle d'un compilateur en choisissant un emplacement
    // mémoire pour chaque variable du programme d'origine. a est placée à
    // l'adresse 0, et b à l'adresse 1. C'est une pure convention, tout autre
    // choix serait correct (pourvu que les adresses ne se recouvrent pas!).
    int []memoire = new int[2];
    memoire[0] = 0;
    memoire[1] = 0;
    while (true) {
      System.out.println("<trace>On va exécuter l'instruction n°"+ouSuisJe);
      switch(ouSuisJe) {
      case 1:
        memoire[0] = 12; ouSuisJe++; break;
      case 2:
        memoire[1] = 25; ouSuisJe++; break;
      case 3:
        memoire[0] = memoire[0]+memoire[1]; ouSuisJe++; break;
      case 4:
        memoire[0] = 2*memoire[0]+memoire[1]; ouSuisJe++; break;
      case 5:
        System.out.println("a="+memoire[0]); ouSuisJe++; break;
      case 6:
        System.exit(0);
      }
    }
  }
}