# Architettura di von Neumann

L'architettura di Von Neumann è una tipologia di architettura hardware per computer digitali programmabili a programma memorizzato la quale condivide i dati del programma e le istruzioni del programma nello stesso spazio di memoria, contrapponendosi all'architettura Harvard nella quale invece i dati del programma e le istruzioni del programma sono memorizzati in spazi di memoria distinti.

## Storia

L'architettura di Von Neumann prende nome dal matematico e informatico John Von Neumann, il quale inizialmente ha contribuito a svilupparla per l'EDVAC e successivamente l'ha riadattata per la IAS machine. L'EDVAC è un computer elettronico costruito dalla Moore School of Electrical Engineering (una ex scuola universitaria dell'Università della Pennsylvania) su commissione dell'Ordnance Department (un ex dipartimento dell'esercito degli Stati Uniti d'America). Anche la IAS machine è un computer elettronico, ma è stato costruito dall'Institute for Advanced Study.
John von Neumann non è stato il principale progettista dell'EDVAC, bensì colui che ha descritto l'architettura dell'EDVAC nella relazione First draft of a report on the EDVAC datata 30 giugno 1945. In seguito il matematico Herman Goldstine, supervisore alla Moore School of Electrical Engineering per l'Ordnance Department, ha fatto distribuire copie di tale relazione in molte università degli Stati Uniti d'America. L'architettura hardware dell'EDVAC è così diventata di dominio pubblico e First draft of a report on the EDVAC è diventata il testo di riferimento per una nuova generazione di computer basati sull'architettura hardware dell'EDVAC. Di conseguenza tale architettura è diventata nota come "architettura di von Neumann" suscitando malcontento tra gli altri progettisti dell'EDVAC.
Sebbene l'architettura di von Neumann sia stata sviluppata per l'EDVAC, non è stato l'EDVAC il primo computer operativo della storia basato sull'architettura di von Neumann. Prima dell'EDVAC sono diventati operativi i seguenti computer basati sull'architettura di von Neumann:
* Small-Scale Experimental Machine (costruito nel Regno Unito; operativo a partire dal giugno 1948);
* Ferranti Mark 1 (costruito nel Regno Unito; operativo a partire dall'aprile 1949);
* Electronic Delay Storage Automatic Calculator (costruito nel Regno Unito; operativo a partire dal maggio 1949);
* Binary Automatic Computer (costruito negli Stati Uniti d'America; operativo a partire dal settembre 1949);
* Council for Scientific and Industrial Research Automatic Computer (costruito in Australia; operativo a partire dal novembre 1949).
L'EDVAC è stato consegnato al Ballistics Research Laboratory nell'agosto 1949 ma è diventato operativo solo nel 1951 a causa di alcuni malfunzionamenti scoperti solo in seguito.
Attraverso i decenni degli anni 1960 e 1970 i computer in generale sono diventati più piccoli e veloci, cosa che ha portato ad alcune evoluzioni nella loro architettura. Ad esempio, l'I/O mappato in memoria consente ai dispositivi di ingresso e di uscita di essere trattati allo stesso modo della memoria. A volte è utilizzato un bus di sistema unico per fornire un sistema modulare con costi inferiori. Questo è talvolta chiamato una "razionalizzazione" dell'architettura. Nei decenni successivi, microcontrollori semplici hanno a volte omesso delle caratteristiche nei modelli per ridurre i costi e le dimensioni. Ai computer più grandi sono state aggiunte funzioni per prestazioni più elevate.

## Descrizione

Lo schema si basa su cinque componenti fondamentali:
* Unità centrale di elaborazione (CPU), che si divide a sua volta in unità aritmetica e logica (ALU o unità di calcolo) e unità di controllo;
* Unità di memoria, intesa come memoria di lavoro o memoria principale (RAM, Random Access Memory);
* Unità di input, tramite la quale i dati vengono inseriti nel calcolatore per essere elaborati;
* Unità di output, necessaria affinché i dati elaborati possano essere restituiti all'operatore;
* Bus, un canale che collega tutti i componenti fra loro.
Queste cinque unità fondamentali vengono raggruppate a loro volta in quattro categorie:
* Sottosistema di interfaccia, che fornisce il collegamento verso le periferiche del calcolatore permettendo lo scambio di informazioni tra computer e mondo esterno;
* Sottosistema di memorizzazione, che memorizza e fornisce l'accesso ai dati e programmi da eseguire, diventando un passaggio fondamentale per le informazioni in ingresso e uscita;
* Sottosistema di elaborazione, che esegue le istruzioni per l'elaborazione dei dati e svolge anche funzione di controllo;
* Bus che svolgono funzioni di trasferimento dati e informazioni tra le varie componenti del computer.
All'interno dell'ALU è presente un registro detto accumulatore, che fa da ponte tra input e output grazie a una speciale istruzione che carica una parola dalla memoria all'accumulatore e viceversa. È importante sottolineare che tale architettura, a differenza di altre, si distingue per la caratteristica di immagazzinare all'interno dell'unità di memoria, sia i dati dei programmi in esecuzione che il codice di questi ultimi.
Bisogna comunque precisare che questa è una schematizzazione molto sintetica, sebbene molto potente e espressiva: basti pensare che i moderni computer di uso comune sono progettati secondo l'architettura von Neumann. Difatti essa regola non solo gli insiemi, ma l'intera architettura logica interna degli stessi, ovvero la disposizione delle porte logiche, perlomeno per quanto riguarda la parte elementare, sulla quale si sono sviluppate le successive progressioni.
Inoltre, quando si parla di unità di memoria si intende la memoria primaria, mentre le memorie di massa sono considerate dispositivi di I/O. Il motivo di ciò è innanzitutto storico, in quanto negli anni quaranta, epoca a cui risale questa architettura, la tecnologia non lasciava neanche presupporre dispositivi come hard disk, CD-ROM, DVD-ROM o anche solo nastri magnetici, ma anche tecnico, se si considera che in effetti i dati da elaborare devono comunque essere caricati in RAM, siano essi provenienti da tastiera o da hard-disk.