# Ordinateur à programme enregistré

Un ordinateur à programme enregistré (ou calculateur à programme enregistré; en anglais stored-program computer) est un ordinateur qui enregistre les instructions des programmes qu'il exécute dans sa mémoire vive.
La définition précédente est souvent étendue pour exiger que le traitement des instructions et des données en mémoire doive être interchangeable et uniforme$^,$$^,$.
Un ordinateur avec une architecture de von Neumann enregistre ses données et ses instructions dans la même mémoire; un ordinateur avec une architecture Harvard enregistre ses données et ses instructions dans des mémoires séparées$^,$

## Histoire

L'expression ordinateur à programme enregistré est parfois utilisée comme synonyme d'architecture de von Neumann$^,$. Cependant, le professeur Jack Copeland considère qu'il est « historiquement inapproprié d'appeler les ordinateurs à programme enregistré des machines de Von Neumann ». Hennessy et Patterson ont écrit que les premières machines de Harvard étaient considérées comme « réactionnaires par les défenseurs des ordinateurs à programme enregistré ».
Le concept d'ordinateur à programme enregistré remonte à un article de 1936 sur une machine de Turing universelle. Von Neumann connaissait cet article et l'a fait connaître à ses collaborateurs.
Plusieurs des premiers ordinateurs n'étaient pas programmables. Ils n'exécutaient qu'un seul programme câblé dans l'ordinateur. Comme ces ordinateurs ne contenaient pas d'instructions, ils n'avaient pas besoin de mémoire. D'autres ordinateurs, bien que programmables, conservaient leurs programmes sur des cartes perforées qui étaient physiquement fournies à l'ordinateur au besoin.
En 1936, Konrad Zuse a anticipé, comme démontré par ses deux applications de brevet, que les instructions de l'ordinateur pouvaient être conservées dans la même mémoire que les données.
En avril 1948, la reconversion de l'ENIAC en ordinateur à programme enregistré s'achève. Il exécute ses premières instructions le 12 avril 1948$^,$. La simulation de Monté Carlo exécutée le 10 mai 1948 par l'ENIAC est la plus ancienne trace de programme enregistré connue à ce jour.
Le Small-Scale Experimental Machine (SSEM) de l'Université de Manchester est également considéré comme le premier ordinateur électronique à avoir exécuté un programme enregistré en mémoire ; cet événement s'est produit le 21 juin 1948$^,$. Néanmoins, le SSEM n'était pas considéré comme un ordinateur achevé, mais plutôt comme une démonstration de faisabilité en vue de la construction de l'ordinateur Manchester Mark 1.
Le 6 mai 1949, le EDSAC à Cambridge exécute un programme enregistré en mémoire et, de ce fait, est aussi considéré comme le « premier ordinateur électronique numérique à programme enregistré complet et opérationnel ».
Certains enfin affirment que l'IBM SSEC, opérationnel en janvier 1948, aurait été le premier ordinateur à programme enregistré. Cette affirmation est controversée, à cause de la nature hiérarchique de la mémoire de l'IBM SSES, et à cause de certains aspects de ses opérations, comme l'accès aux relais ou aux rubans magnétiques qui fonctionnaient par branchements manuels.

## Paradigmes de programmation

Le concept de programme enregistré, initialement apparu sur un mémo d'IBM en 1949, possède des contours assez flous, cause d'erreurs de classification et de critiques. Afin de lever toute ambiguïté, il lui est parfois préféré une hiérarchisation des paradigmes de programmation, permettant tant de clarifier que de catégoriser les différentes approches.

### Paradigme 1

Dans ce premier paradigme, la programmation consiste en un recâblage physique de la machine à travers des fiches et des interrupteurs. Cette approche possède certains avantages intrinsèques, telle que la très grande vitesse d’exécution des programmes.
La série des calculateurs Collossus, ou encore l’ENIAC dans sa configuration initiale de 1945, se sont ainsi distingués des autres machines de leur époque par leur vitesse de traitement.
Le principal inconvénient de ce paradigme est la difficulté inhérente au câblage des programmes, rendant leur mise en œuvre et leur débogage lent et difficile.

### Paradigme 2

Ce paradigme utilise une programmation par instructions, ce qui réduit le temps de mise en œuvre des programmes.
Les instructions sont généralement codées sous forme numérique (typiquement binaire ou décimale) et enregistrées sur un support externe, tels que des bandes ou cartes perforées. Le programme n’est pas enregistré dans la machine mais exécuté instruction par instruction depuis un support externe en lecture seule.
Cette approche comprend plusieurs inconvénients :
* La vitesse d’exécution du programme est égale à la vitesse de lecture du support
* Le programme ne peut réaliser que des branchements très proches (s’il possède même la possibilité d’effectuer des branchements), ou nécessite sinon une action manuelle pour remplacer les cartes perforées en exécution, ou encore rembobiner le ruban perforé vers le branchement souhaité. Pour cette raison, les machines utilisant le paradigme P2 sont rarement Turing-complètes, ou ne le sont que de façon théorique.
Des exemples de machines utilisant ce paradigme de programmation sont la machine analytique de Charles Babbage, ou encore les Zuse Z1, Z2, Z3 et Z4.

### Paradigme 3

Ce paradigme est le premier membre de la famille des architectures à programme enregistré.
Les instructions deviennent enregistrées dans la mémoire de la machine, permettant de réaliser des branchements conditionnels, des boucles, des fonctions, et d’exécuter le programme à vitesse électronique. Dans ce paradigme, la mémoire est rapide d’accès mais la mémoire contenant les instructions est en lecture seule, les processus ne peuvent donc la modifier.
Un exemple d’une machine employant ce paradigme est l’ENIAC dans sa configuration de 1948. Ce type de machine se rencontre également de nos jours dans le domaine de l'embarqué, avec certaines consoles de jeux-vidéos à cartouches, ou encore pour des champs d'application sécurisés.

### Paradigme 4

Le paradigme P4 reprend le fonctionnement du P3, mais emploie une mémoire modifiable, permettant aux processus tant de lire que d’écrire les instructions enregistrées en mémoire.
Le premier exemple théorique de ce paradigme fût publié par Alain Turing en 1936 avec le concept de Machine de Turing Universelle. L’EDSAC, le Manchester Mark 1, ou l’ENIAC à la fin de sa carrière sont des exemples de machines célèbres employant ce paradigme de façon concrète.

#### Paradigmes P5 et P6

Le paradigme P4 contient le potentiel pour un programme d’éditer l’espace mémoire dédié aux instructions. Dans le paradigme P5, ce potentiel est réalisé mais se limite à l’insertion, la manipulation et la suppression d’instructions.
La Machine de Turing Universelle est là aussi une bonne illustration de ce paradigme.
Le paradigme P6, quant à lui, est très proche du paradigme P5, mais permet de concevoir des programmes pouvant produire de nouvelles instructions à la demande au cours de son exécution, et donc entièrement auto-modifiables. De plus, il permet à un programme de modifier à chaud le code d’un autre programme, un concept révolutionnaire dans les années 1940 bien qu'éloigné aujourd'hui des bonnes pratiques de sécurité informatique.
Ce paradigme fût conceptualisé avec le « First Draft of a Report on the EDVAC » en 1945, selon une inspiration du fonctionnement du cerveau humain. Turing et Zuse ont eux aussi mentionné l’idée d’un programme pouvant s’automodifier, ou en modifier un autre en temps réel, et inspira la création du ACE et Pilot ACE de Turing.