Remarque : Le premier exercice du sujet zéro évoque fortement le jeu robosomes.
Un ordinateur à jeu d’instruction unique (OISC en anglais) a ceci de fascinant qu’il ne comprend qu’une seule instruction, ce qui rend sa programmation quelque peu monotone. David Naccache a trouvé des applications cryptographiques à ce genre de machine. Un exemple important est celui où l’unique instruction consiste à
- lire en mémoire les nombres A, B et C pointés par le pointeur de programme (en P, P+1 et P+2)
- arrêter le calcul si un des entiers A, B et C est négatif
- sinon,
- soustraire (SUBtract) A à B
- si le résultat de la soustraction est négatif ou nul (Less or EQual) forcer le contenu de P à C, sinon incrémenter P
On montre que ce langage de programmation est Turing-complet. Par exemple on peut simuler les opérations des machines à registre avec une machine subleq pour prouver ce fait. C’est essentiellement l’objet de l’exercice « langages de programmation » du sujet zéro.
Dans cet article, on va faire un peu l’inverse, en simulant en JavaScript un OISC qui sera programmé dans des pages html. Un clic sur une copie d’écran d’une de ces pages html permet de manipuler en ligne l’OISC considéré.
L’exemple du sujet zéro est celui-ci :
Et voici le corrigé, en respectant les numéros des questions :
Question 21) Décrire les étapes de l’exécution du programme suivant et donner le contenu de la mémoire à l’issue de cette exécution :
Question 22) Écrire en Python une fonction OISC(memoire, P)
qui permet de simuler un tel ordinateur, en considérant que l’on n’utilise jamais que les 1000 premières cellules de la mémoire. Elle prend deux paramètres :
-
memoire
est une liste de 1000 éléments, qui représente l’état initial de la mémoire. -
P
est la valeur du pointeur d’instruction.
La fonction modifie la mémoire en appliquant les règles et renvoie une liste qui représente l’état de cette mémoire en fin d’exécution (quand cette exécution se termine).
Cette question est laissée en exercice, sauf le début qui devrait ressembler à ceci :
def OISC(memoire, P):
...
return memoire
Question 23) Écrire un programme sous la forme ci-dessus, tel que si la cellule 0 contient le nombre x et la cellule 1 le nombre y au début de l’exécution, alors la cellule 0 contient x - y à la fin de l’exécution.
Question 24) Écrire un programme, tel que si la cellule 0 contient le nombre x et la cellule 1 le nombre y au début de l’exécution, alors la cellule 0 contient x + y à la fin de l’exécution.
Question 25 Écrire un programme tel que si la cellule 0 contient le nombre x et la cellule 1 le nombre y au début de l’exécution, alors la cellule 0 contient le nombre y et la cellule 1 contient le nombre x à la fin de l’exécution.
Question 26) Écrire un programme, tel que si la cellule 0 contient le nombre x et la cellule 1 le nombre y au début de l’exécution, alors la cellule 0 contient max(x, y) à la fin de l’exécution.
Question 27) Écrire un programme tel que, si la cellule 0 contient le nombre x et la cellule 1 le nombre y au début de l’exécution, alors la cellule 0 contient x×y à la fin de l’exécution. On suppose que x et y sont tous deux strictement positifs.
Question 29) Cet ordinateur peut-il faire tous les calculs que peut faire un ordinateur classique ? Expliquer.
Cet ordinateur est capable de simuler
- une boucle while
- l’addition, la soustraction, la multiplication
- la comparaison
Il est donc Turing-complet, comme le sont les machines de Post qui sont d’ailleurs simulables en subleq
.
Commentaires