/**
 * Programme de comportement opérationnel équivalent (modulo quelques mécaniques
 * de simulation) à <a href="Prog2.java.html">Prog2.java</a>.
 * La simulation comporte de nombreux détails à analyser/observer/étudier :
 * <ul>
 * <li>la mémoire et en particulier la réalisation de l'opération
 * <code>new</code>. Cette opération ici n'est pas simulée, nous avons
 * simplement convenu que l'opération correspondante attribuera l'adresse
 * 4 au tableau. Il faut remarquer que cette adresse correspond à l'adresse
 * du premier élément du tableau, lequel est précédé (donc à l'adresse 3)
 * d'un entier représentant sa longueur (tableau de longueur 5).
 * <li>les variables <code>tableau</code>, <code>i</code> et <code>somme</code>
 * sont respectivement stockées aux adresses 0, 1 et 2.
 * <li>la variable <code>tableau</code> contient une valeur qui est une
 * adresse, on en fait donc pas n'importe quoi...
 * <li>une boucle <code>for</code> se déplie en différentes opérations plus
 * élémentaires, il faut donc observer soigneusement la transformation opérée...
 * </ul>
 * @author Jean-Baptiste Yunès
 * @date Février 2013
 */
public class Prog2Traduit {
  public static void main(String []args) {
    int instructionCourante = 1;
    // 0: tableau, 1: i, 2: somme 3..8 : length+contenu (1+5 entiers)
    int []memoire = new int[9];
    while(true) {
      System.out.println(">>>>>>>"+instructionCourante); // Trace d'observation
      switch(instructionCourante) {
      case 1:
        memoire[3] = 5; // stockage de la longueur du tableau
        memoire[0] = 4; // tableau = ...
        instructionCourante++;
        break;
      case 2:
        memoire[1] = 0; instructionCourante++; break;
      case 3:
        memoire[2] = 0; instructionCourante++; break;
      case 4: // début premier for
        memoire[1] = 0; instructionCourante++; break; // i=0 dans le for
      case 5:
        if (memoire[1]<5) instructionCourante++; // test de fin du for i<5
        else instructionCourante = 8; // si fin, saut vers début de l'autre for
        break;
      case 6 :
        memoire[memoire[0]+memoire[1]] = memoire[1]+1; // corps du for
        instructionCourante++; break;
      case 7:
        memoire[1] = memoire[1]+1; // i++
        instructionCourante = 5; // retour vers le test de continuation du for
        break;
      case 8: // début second for
        memoire[1] = 0; instructionCourante++; break; // i=0 dans le for
      case 9:
        if (memoire[1]<5) instructionCourante++; // test de fin du for (i<5)
        else instructionCourante = 12; // si fin, saut vers suite du for
        break;
      case 10:
        memoire[2] = memoire[2]+memoire[memoire[0]+memoire[1]]; // corps du for
        instructionCourante++; break;
      case 11:
        memoire[1] = memoire[1]+1; // i++
        instructionCourante = 9; // retour vers le test de continuation du for
        break;
      case 12:
        System.out.println("Somme="+memoire[2]); instructionCourante++; break;
      case 13:
        System.exit(0);
      }
    }
  }
}