NSI (terminale) · Chapitre 15 · Exercice de TD
Problème — Un ordinateur à programme enregistré, en Python
Histoire de l'informatique · niveau 3 (difficile)
Énoncé
Problème — Un ordinateur à programme enregistré, en Python.
On reconstitue une machine minimale conforme au rapport de 1945. Sa mémoire est une liste de entiers ; les instructions y sont rangées comme les données. Une instruction est un entier de la forme , avec le jeu d'instructions suivant, où acc désigne l'accumulateur et co le compteur ordinal :
| Code | Nom | Effet |
|---|---|---|
| 0 | STOP | arrêter la machine |
| 1 | CHARGE a | acc memoire[a] |
| 2 | RANGE a | memoire[a] acc |
| 3 | AJOUTE a | acc acc + memoire[a] |
| 4 | SOUSTRAIT a | acc acc - memoire[a] |
| 5 | SAUTE a | co a |
| 6 | SAUTE_SI_POSITIF a | si acc > 0, alors co a |
- Écrire la fonction
executer(memoire)qui applique le cycle « lire, décoder, exécuter » jusqu'à l'instruction STOP. - Dérouler les trois premières instructions du programme donné ci-dessous, qui calcule .
- Que contient la case à la fin ?
- Écrire trois instructions qui modifient une instruction du programme. Que montre cette possibilité, et pourquoi l'évite-t-on aujourd'hui ?
Corrigé de la question 1
1. La machine. Le cycle tient en une dizaine de lignes : c'est exactement le schéma de l'architecture à programme enregistré.
def executer(memoire):
acc = 0 # accumulateur
co = 0 # compteur ordinal
while True:
instruction = memoire[co]
code = instruction // 100
adresse = instruction % 100
co = co + 1 # on avance AVANT d'executer
if code == 0:
return memoire
elif code == 1:
acc = memoire[adresse]
elif code == 2:
memoire[adresse] = acc
elif code == 3:
acc = acc + memoire[adresse]
elif code == 4:
acc = acc - memoire[adresse]
elif code == 5:
co = adresse
elif code == 6:
if acc > 0:
co = adresse
Le programme s'écrit directement en nombres, puisque c'est ainsi qu'il est rangé :
memoire = [0] * 100
memoire[0] = 121 # CHARGE 21 acc <- somme
memoire[1] = 320 # AJOUTE 20 acc <- somme + n
memoire[2] = 221 # RANGE 21 somme <- acc
memoire[3] = 120 # CHARGE 20 acc <- n
memoire[4] = 422 # SOUSTRAIT 22 acc <- n - 1
memoire[5] = 220 # RANGE 20 n <- acc
memoire[6] = 600 # SAUTE_SI_POSITIF 0 si n > 0, on recommence
memoire[7] = 0 # STOP
memoire[20] = 5 # n
memoire[21] = 0 # somme
memoire[22] = 1 # la constante 1
executer(memoire)
print(memoire[21]) # affiche 15Question 2 : comment l'IA t'aide
2. Dérouler les trois premières instructions du programme donné ci-dessous, qui calcule .
Élève
Pour dérouler, je dois prendre les instructions une par une dans la mémoire. Mais je ne sais pas trop comment retrouver le code et l'adresse à partir du nombre 121.
IA
C'est bien de commencer par là. L'énoncé te donne la forme d'une instruction : . Quelles opérations te permettent d'extraire le code et l'adresse d'un entier comme ?
Élève
Je peux faire la division entière par 100 pour le code, et le reste pour l'adresse. Pour 121, ça donne code 1 et adresse 21. Ensuite je regarde dans le tableau ce que fait le code 1.
IA
Exact. Et le tableau te dit que le code correspond à CHARGE : l'accumulateur reçoit la valeur de la case . Avant de passer à l'instruction suivante, quelle est la valeur de la case au départ, et que devient l'accumulateur après cette première instruction ?
L'IA ne donne pas la réponse : elle pose la question qui fait avancer. À toi de continuer.
Continue cet exercice avec l'IA
Reprends la question 2 là où le dialogue s'arrête, puis la suite de l'exercice.
Continuer avec l'IA — gratuit, sans inscriptionGratuit, sans inscription. L'IA te guide pas à pas, sans te donner la réponse.