04 Comment un programme pour les vaches est-il structuré ?

La vache est constituée d’une séquence continue d’instructions moo, qui sont stockées dans une mémoire de programme et sont traitées en continu en commençant par la première instruction.

Les données sont stockées dans une mémoire de données et traitées avec un registre.

Commandes

NrInstructionDescription
0mooCette commande est liée à la commande MOO. Lorsqu’elle est rencontrée au cours d’une exécution normale, elle recherche le code du programme en sens inverse à la recherche d’une commande MOO correspondante et recommence l’exécution à partir de la commande MOO trouvée. Lors de la recherche, elle saute l’instruction qui la précède immédiatement (voir MOO).
1mOoDéplace la position actuelle de la mémoire d’un bloc en arrière.
2moODéplace la position actuelle de la mémoire d’un bloc vers l’avant.
3mOOExécute la valeur du bloc mémoire actuel comme s’il s’agissait d’une instruction. La commande exécutée est basée sur la valeur du code d’instruction (par exemple, si le bloc mémoire actuel contient un 2, la commande moO est exécutée). Une commande non valide quitte le programme en cours d’exécution. La valeur 3 n’est pas valide car elle provoquerait une boucle infinie.
4MooSi le bloc de mémoire actuel contient un 0, lire un seul caractère ASCII à partir de STDIN et le stocker dans le bloc de mémoire actuel. Si le bloc mémoire actuel n’est pas 0, alors imprimez le caractère ASCII qui correspond à la valeur du bloc mémoire actuel sur STDOUT.
5MOoDécrémente la valeur du bloc mémoire actuel de 1.
6MoOIncrémente de 1 la valeur du bloc mémoire actuel.
7MOOSi la valeur du bloc mémoire actuel est égale à 0, ignore la commande suivante et reprend l’exécution après la prochaine commande moo correspondante. Si la valeur du bloc mémoire actuel est différente de 0, continuez avec la commande suivante. Notez que le fait d’ignorer la commande qui la suit immédiatement a des ramifications intéressantes pour savoir où se trouve réellement la commande moo correspondante. Par exemple, la commande suivante correspondra à la deuxième commande moo et non à la première : OOO MOO moo moo
8OOOMettre la valeur du bloc mémoire actuel à 0.
9MMMS’il n’y a pas de valeur actuelle dans le registre, copier la valeur du bloc mémoire actuel. S’il y a une valeur dans le registre, coller cette valeur dans le bloc de mémoire actuel et effacer le registre.
10OOMImprime la valeur du bloc mémoire actuel sur STDOUT comme un entier.
11oomLire un nombre entier à partir de STDIN et le placer dans le bloc de mémoire actuel.