Scopri come l'idea del programma memorizzato—spesso collegata a John von Neumann—rese possibile il software riutilizzabile, i computer a uso generale e la programmazione moderna.

Al centro del calcolo moderno c'è una domanda semplice: cosa ha reso possibile che una macchina svolgesse molti compiti diversi senza essere ricostruita ogni volta? I primi computer elettronici potevano calcolare velocemente, ma “cambiare il lavoro” spesso significava modificare fisicamente la configurazione della macchina. L'idea del programma memorizzato è il punto di svolta che ha reso i computer davvero programmabili.
Un computer a programma memorizzato conserva le istruzioni per un compito (il programma) nello stesso tipo di memoria interna dei dati su cui il programma opera. Invece di ricollegare l'hardware o riconfigurare manualmente pannelli, puoi caricare un nuovo insieme di istruzioni in memoria ed eseguire un lavoro diverso.
Ora può sembrare ovvio, ma fu un cambiamento profondo:
Non è solo una curiosità storica. Il concetto del programma memorizzato spiega perché il “software” esiste come cosa separata dall’“hardware” e perché aggiornare un dispositivo oggi può sbloccare nuove funzionalità senza cambiare i chip all'interno.
Nelle sezioni successive vedremo il problema che affrontavano i primi computer, cosa ha cambiato l'approccio del programma memorizzato, le persone e i documenti che hanno chiarito l'idea (incluso il famoso rapporto EDVAC) e come il termine “architettura von Neumann” è diventato un'etichetta per un modello ampiamente usato.
Anche se il nome di John von Neumann è fortemente associato al programma memorizzato, il merito è condiviso tra un team e un'epoca più ampia. Molti ricercatori stavano convergendo su idee simili mentre costruivano i primi computer elettronici pratici. Questo articolo mantiene quel contesto, perché capire lo sforzo collettivo aiuta a spiegare come l'idea si sia diffusa così rapidamente e sia diventata il modello predefinito per la maggior parte dei computer successivi.
Prima dell'idea del programma memorizzato, molti primi computer non “eseguivano software” nel senso in cui lo intendiamo oggi. Potevano calcolare a velocità impressionante, ma dire loro cosa fare spesso voleva dire modificare fisicamente la macchina.
Un approccio comune era usare pannelli a prese, cavi di collegamento e pannelli di interruttori. Gli operatori collegavano fili tra prese, impostavano file di interruttori e talvolta regolavano unità di temporizzazione perché i segnali arrivassero nell'ordine corretto. Il “programma” non era un file da caricare: era uno schema di collegamento temporaneo.
Questa configurazione funzionava, ma aveva un costo nascosto: ogni nuovo compito era un mini progetto di ingegneria. Se volevi cambiare la sequenza delle operazioni (somma, moltiplicazione, confronto, ciclo), poteva essere necessario spostare dozzine o centinaia di collegamenti. Un singolo cavo inserito male poteva creare errori sottili difficili da diagnosticare, perché la logica era distribuita attraverso connessioni hardware anziché scritta come passi leggibili.
Riconfigurare poteva richiedere ore o giorni, soprattutto se la macchina doveva essere spenta con cura, ricollegata e testata. Questo significava flessibilità limitata: quelle macchine spesso venivano programmate per un solo tipo di calcolo per lunghi periodi perché cambiare lavoro era così disruptive.
Immagina una macchina configurata per calcolare tabelle balistiche—calcoli lunghi e ripetitivi con una formula fissa. Se i ricercatori volevano poi usare la stessa macchina per risolvere un problema diverso, come tabulare risultati statistici per un censimento, non era un rapido “modifica il programma e riesegui”. L'ordine delle operazioni, i passaggi di memorizzazione intermedi e i controlli condizionali potevano differire, richiedendo una progettazione completa del pannello a prese e una nuova serie di verifiche.
Questo è il mondo che il computer a programma memorizzato è stato progettato per superare.
Un computer a programma memorizzato è una macchina in cui le istruzioni (il programma) risiedono nella stessa memoria di lavoro dei dati che il programma usa. In altre parole, il computer non tratta “cosa fare” come qualcosa di separato da “su cosa lavorare”: entrambi sono memorizzati come pattern di bit nella memoria.
Quando i pionieri del computer parlavano di memoria, intendevano l'archiviazione interna veloce e direttamente utilizzabile del computer—quello che oggi associamo più da vicino alla RAM. È il luogo da cui il processore può leggere e scrivere rapidamente mentre esegue.
Questo è diverso dall'archiviazione a lungo termine come un disco rigido o un SSD. Un disco è ottimo per conservare file a macchina spenta, ma non è il blocco note immediato che il processore usa costantemente per prelevare l'istruzione successiva e aggiornare i risultati intermedi.
Una volta che le istruzioni sono memorizzate in memoria, passare da un compito all'altro diventa molto più semplice: puoi caricare un nuovo programma in memoria ed eseguirlo, senza ricostruire, ricollegare o riconfigurare fisicamente l'hardware. La stessa macchina a uso generale può fare l'elaborazione paghe al mattino e i calcoli balistici al pomeriggio—perché il “come” del compito è solo un altro insieme di bit che puoi sostituire.
Immagina una cucina in cui la ricetta e gli ingredienti sono conservati insieme nella stessa dispensa. Il cuoco (il processore) va ripetutamente alla dispensa (memoria) per leggere il prossimo passo della ricetta (istruzione) e prendere o aggiornare gli ingredienti (dati).
Vuoi fare un piatto diverso? Non rimodelli la cucina. Cambi ricetta—usando gli stessi piani di lavoro, forno e utensili.
John von Neumann non ha “inventato il computer” e non ha creato da solo l'idea del programma memorizzato. Ciò che fece—brillantemente—fu contribuire a trasformare un concetto promettente in un progetto chiaramente enunciato e ampiamente condiviso che altri ingegneri e laboratori potevano implementare.
Von Neumann fu profondamente coinvolto in progetti di calcolo durante e dopo la guerra, consigliando team e affinando la struttura logica dei primi progetti. Aveva il dono di spiegare scelte tecniche complesse in termini chiari e organizzati, e questo contava perché l'informatica elettronica stava avanzando rapidamente, con gruppi diversi che risolvevano problemi simili contemporaneamente.
Ancora più importante, scrisse e diffuse descrizioni influenti di come un computer potesse memorizzare istruzioni di programma nella stessa memoria usata per i dati. Quel quadro chiaro rese più facile per altri discutere, insegnare e replicare l'approccio.
I nomi spesso restano non tanto alla prima persona con un'idea, quanto a chi produce una descrizione di riferimento. I testi di von Neumann furono molto letti, copiati e citati—quindi i lettori successivi associarono naturalmente l'organizzazione “a programma memorizzato” a lui.
Questa etichetta semplificò anche la storia: è più facile dire “architettura von Neumann” che elencare tutti i contributori e i rapporti. Ma questa abbreviazione può offuscare quello che è realmente accaduto.
I primi computer elettronici furono un impegno collaborativo e trans-istituzionale che coinvolse matematici, ingegneri e programmatori. Il concetto del programma memorizzato maturò attraverso discussioni, bozze, prototipi e revisioni tra i vari team. Il ruolo duraturo di von Neumann fu aiutare a cristallizzare e diffondere l'idea—accelerandone l'adozione—piuttosto che inventarla da solo.
EDVAC (Electronic Discrete Variable Automatic Computer) fu uno dei primi progetti postbellici che miravano ad andare oltre le macchine “monouso”. Altresì importante rispetto allo sforzo hardware fu la decisione di mettere per iscritto le idee di progetto in una forma chiara e condivisibile. All'epoca la costruzione di computer era ancora vicina all'ingegneria sperimentale—la conoscenza viveva in quaderni di laboratorio, incontri e nelle teste di pochi specialisti. Un rapporto poteva trasformare quelle intuizioni disperse in qualcosa che altri gruppi potevano discutere, criticare e riusare.
Il First Draft of a Report on the EDVAC (spesso abbreviato in “rapporto EDVAC”) espose, in termini concettuali accessibili, l'idea del programma memorizzato: un computer dovrebbe conservare le istruzioni del programma nello stesso tipo di memoria interna usata per i dati. Quella memoria non è solo un luogo per tenere numeri mentre un calcolo è in corso—contiene anche i passi che dicono alla macchina cosa fare dopo.
Questo modo di vedere fa percepire il computer meno come un dispositivo a scopo fisso e più come una macchina generale che può essere “riprogrammata” cambiando ciò che è in memoria. Non si ricollega il sistema per passare da un lavoro a un altro; si carica una diversa sequenza di istruzioni.
Oltre al concetto in sé, il rapporto aiutò a standardizzare il modo in cui le persone parlavano dei computer: memoria, controllo, aritmetica e input/output come parti funzionali distinte che lavorano insieme. Avere un vocabolario condiviso e una descrizione ampiamente letta non solo spiegò EDVAC, ma diede all'intero campo un modello mentale comune per costruire, confrontare e migliorare i computer a programma memorizzato.
È allettante chiedersi “chi ha inventato il computer a programma memorizzato?” e aspettarsi un unico nome. Ma scienza e ingegneria raramente funzionano così. Le idee spesso si sviluppano in parallelo, si affinano tramite discussioni e diventano convincenti solo quando vengono dimostrate in hardware funzionante.
John von Neumann è fortemente associato al concetto, ma i lavori iniziali coinvolsero molte persone e gruppi:
Un computer a programma memorizzato non è una singola intuizione. Combina (1) il salto concettuale che le istruzioni possano vivere in memoria come i dati, (2) l'ingegneria necessaria per costruire memorie e unità di controllo affidabili, e (3) le pratiche di programmazione che rendono il progetto utilizzabile. Persone diverse contribuirono a pezzi diversi.
Un altro motivo per cui il merito è condiviso: proporre un'idea non è la stessa cosa che costruire una macchina che funziona giorno dopo giorno. I primi rapporti e le discussioni chiarirono il concetto; i primi prototipi e i sistemi di produzione provarono che era fattibile. Una storia attenta riconosce entrambi i tipi di contributo senza forzare un'improbabile sentenza di “primo inventore”.
Quando si parla di “architettura von Neumann”, di solito ci si riferisce a un modello semplice e ampiamente insegnato di come è organizzato un computer a programma memorizzato. Non è un marchio né una singola macchina storica—è un'etichetta comoda per un piano di base che appare, in una forma o nell'altra, in molti computer.
A livello concettuale, l'immagine è la seguente:
L'idea chiave è che la CPU non ha un luogo fisico separato per “il programma” rispetto ai “numeri”. Preleva tutto ciò che le serve dalla memoria.
La CPU esegue un programma ripetendo un ciclo spesso descritto come fetch–decode–execute:
Questa descrizione è semplificata, ma cattura il nucleo: il programma è una sequenza di istruzioni memorizzate in memoria e la CPU le esegue passo dopo passo.
Mettere istruzioni e dati nella stessa memoria rende un computer a uso generale in modo molto pratico:
Quindi “architettura von Neumann” è meglio intesa come un'abbreviazione per il modello a programma memorizzato con una CPU, una memoria condivisa che contiene istruzioni e dati, e I/O—un'idea fortemente associata alle chiare spiegazioni di von Neumann, anche se la storia iniziale coinvolse molti contributori.
Si parla spesso di “von Neumann” e “Harvard” come se fossero filosofie in competizione. In realtà sono due modi pratici di disporre istruzioni del programma e dati in modo che il computer possa prelevare ciò che gli serve.
In un design in stile von Neumann, istruzioni e dati vivono nella stessa memoria e tipicamente viaggiano sullo stesso percorso principale verso la CPU.
È concettualmente semplice: un programma sono semplicemente byte in memoria, accanto ai numeri, al testo e alle immagini su cui lavora. Rende anche il calcolo a uso generale più diretto—il software può essere caricato, cambiato e memorizzato con gli stessi meccanismi usati per i dati.
Il compromesso: quando istruzioni e dati condividono la stessa “strada”, possono competere per la larghezza di banda. (A volte lo sente descrivere come un “collo di bottiglia”.)
Un approccio Harvard mantiene l'archiviazione delle istruzioni separata dall'archiviazione dei dati, spesso con percorsi distinti per il loro prelievo.
Questa separazione può rendere più facile prelevare la prossima istruzione mentre si leggono o scrivono dati—utile in sistemi piccoli e prevedibili. Un esempio semplice sono molti microcontrollori, dove il codice del programma può risiedere in memoria flash mentre le variabili vivono in RAM.
Le CPU moderne spesso appaiono “von Neumann” dal punto di vista del software (uno spazio di indirizzi, un modello unico), mentre internamente prendono idee dallo stile Harvard. Un esempio comune sono cache separate per istruzioni e dati (I-cache e D-cache). Al software sembra ancora un'unica memoria, ma l'hardware può prelevare codice e dati in modo più efficiente.
Da ricordare: non esiste un vincitore universale. Von Neumann enfatizza semplicità e flessibilità; Harvard enfatizza separazione e throughput. Molte macchine mescolano entrambi per bilanciare programmabilità, costo, consumo e velocità.
Un computer a programma memorizzato non si limita a eseguire calcoli—può caricare un insieme di istruzioni dalla memoria, eseguirle e poi caricarne uno diverso in seguito. Questo cambiamento rese il software riutilizzabile e condivisibile: un programma poteva essere scritto una volta, salvato, copiato, migliorato e distribuito senza toccare l'hardware.
Quando il programma vive in memoria, la stessa macchina fisica può svolgere molti lavori diversi semplicemente sostituendo le istruzioni che legge. Questo è il vero significato di “a uso generale”: una macchina, molti programmi. Il computer non è più definito da un singolo flusso di lavoro; diventa una piattaforma.
Un esempio moderno è il tuo portatile che esegue posta, giochi e fogli di calcolo. Sotto, è sempre la stessa idea: l'hardware resta fermo mentre programmi diversi vengono caricati ed eseguiti mentre passi da un'app all'altra.
Una volta che le istruzioni sono trattate come dati in memoria, diventa pratico costruire strati di software che aiutino a scrivere software:
Questi strumenti dipendono dall'assunto che i programmi possano essere memorizzati, spostati e manipolati come altre informazioni. Questo rese il software un ecosistema piuttosto che un artefatto unico legato a una specifica configurazione hardware.
Un modo utile per vedere l'arco storico: i programmi memorizzati permisero compilatori e sistemi operativi, che permisero strumenti di sviluppo moderni—e oggi vediamo un altro livello di astrazione dove puoi descrivere un'app in linguaggio naturale e avere strumenti che generano codice funzionante. Per esempio, Koder.ai è una piattaforma vibe-coding dove costruisci web, backend o app mobili tramite un'interfaccia chat, sfruttando LLM e un flusso di lavoro agent-based per accelerare il passaggio dall'intento (“cosa dovrebbe fare?”) alle istruzioni eseguibili (codice sorgente che puoi esportare, distribuire e ripristinare tramite snapshot).
Il risultato è lo stesso ciclo virtuoso: i programmi memorizzati hanno reso possibili strumenti migliori, e strumenti migliori hanno reso possibili programmi più ambiziosi—trasformando i computer in macchine flessibili e a uso generale.
L'idea del programma memorizzato rese i computer flessibili, ma mise anche in luce un vincolo pratico di cui gli ingegneri parlano ancora oggi: il “collo di bottiglia di von Neumann”. In termini quotidiani, è come un ingorgo sulla strada tra la CPU (il lavoratore) e la memoria (il magazzino).
In un tipico design a programma memorizzato, sia le istruzioni sia i dati vivono in memoria. La CPU preleva un'istruzione, poi i dati necessari, poi scrive i risultati—spesso passando tutti per la stessa connessione. Se quella connessione non può muovere informazioni abbastanza velocemente, la CPU rimane in attesa anche se potrebbe calcolare molto più rapidamente.
Due fattori correlati modellano questo collo di bottiglia:
Una CPU può essere in grado di eseguire miliardi di operazioni al secondo, ma se la memoria non riesce a fornire un flusso costante di istruzioni e dati, le prestazioni sono limitate dal passo più lento: ottenere i byte dentro e fuori.
Questa è una considerazione ingegneristica molto discussa, e i computer moderni usano diverse tecniche per ridurne l'impatto:
Questi approcci non eliminano la “strada” sottostante, ma aiutano a mantenerla meno congestionata—così la CPU passa più tempo a lavorare e meno a aspettare.
Il concetto del programma memorizzato non è un pezzo da museo—è il modo in cui il calcolo quotidiano resta flessibile. I tuoi dispositivi non devono essere “ricablati” per fare qualcosa di nuovo; caricano semplicemente istruzioni diverse in memoria ed eseguirle.
Su un telefono, toccare l'icona di un'app fa sì che il sistema operativo carichi il codice di quell'app (istruzioni) dall'archivio in memoria, poi la CPU lo esegue. Su un laptop succede lo stesso quando apri un browser, modifichi un documento o avvii un gioco. Nei server la cosa è ancora più evidente: la macchina può eseguire migliaia di carichi di lavoro variabili—richieste web, query di database, job in background—senza cambiare l'hardware.
Anche funzioni che percepiamo come “hardware-like” sono spesso definite da software. Instradamento di rete, decodifica video, miglioramento delle foto e politiche di gestione energetica sono frequentemente aggiornati tramite firmware e software di sistema—nuove istruzioni, stesso dispositivo.
Linguaggi come Python e JavaScript tipicamente girano tramite un interprete o una macchina virtuale. Invece che la CPU esegua direttamente il tuo codice sorgente, il programma viene tradotto in una forma strutturata (bytecode o istruzioni interne) che viene memorizzata in memoria e eseguita passo dopo passo. JVM di Java, runtime .NET, WebAssembly e i motori JavaScript dei browser si basano tutti su questo: le istruzioni diventano strutture dati che la macchina può caricare, muovere ed eseguire.
Poiché le istruzioni sono “solo” informazioni, gli attacchi spesso cercano di introdurre codice malevolo nei dati—il classico code injection. Difese come protezione della memoria, firma del codice e regioni di memoria non eseguibili servono a impedire che dati non affidabili vengano trattati come istruzioni eseguibili.
Tutto questo ricade sulla promessa centrale dei programmi memorizzati: flessibilità tramite software—nuovi comportamenti sullo stesso hardware.
Quando guardi un computer (o leggi una specifica), queste domande ti aiutano a individuare il modello base:
Se vuoi altri post a orientamento divulgativo come questo, sfoglia /blog.
Nota: Se sperimenti modi moderni di trasformare “istruzioni” in sistemi eseguibili—sia scrivendo codice direttamente sia usando piattaforme di build guidate dalla chat come Koder.ai—considera di documentare ciò che impari. Koder.ai offre anche un programma per guadagnare crediti pubblicando contenuti e referral, che può essere un modo pratico per finanziare altri esperimenti e tutorial.
Un computer a programma memorizzato conserva le istruzioni del programma nella stessa memoria interna usata per contenere i dati su cui quelle istruzioni operano. Per cambiare compito, si carica un diverso insieme di istruzioni in memoria invece di ricollegare o riconfigurare l'hardware della macchina.
Prima dei programmi memorizzati, molte macchine venivano effettivamente “programmate” con schede di collegamento, cavi di patch e impostazioni di interruttori. Cambiare la sequenza delle operazioni poteva significare ore o giorni di riconfigurazione e retest, e un singolo collegamento errato poteva introdurre errori difficili da individuare.
In questo contesto, “memoria” indica l'archiviazione di lavoro veloce del computer (più simile alla RAM moderna) che la CPU può leggere e scrivere continuamente durante l'esecuzione. È diversa dall'archiviazione a lungo termine (come dischi/SSD), che serve a conservare programmi e file quando l'alimentazione è spenta.
Il rapporto EDVAC descrive chiaramente l'organizzazione in cui istruzioni e dati condividono la memoria interna, insieme a un vocabolario utile per parlare delle parti del computer (memoria, controllo, aritmetica, input/output). Quella chiarezza ha aiutato altri gruppi a discutere, confrontare e costruire sistemi simili più rapidamente.
Il nome di von Neumann rimane molto associato al concetto perché le sue descrizioni sono state ampiamente diffuse e facili da citare, non perché fosse l'unico contributore. L'approccio del programma memorizzato è emerso da una comunità più ampia (ingegneri, matematici e primi programmatori) che lavorava su problemi correlati nello stesso periodo.
“Architettura von Neumann” solitamente indica un modello con:
È un'etichetta didattica conveniente per l'organizzazione a programma memorizzato, non una rivendicazione di una singola macchina storica o di un inventore unico.
In un design stile von Neumann, istruzioni e dati condividono un'unica memoria (spesso con un unico percorso verso la CPU). In un design stile Harvard, la memoria delle istruzioni è separata da quella dei dati (spesso con percorsi distinti).
Molti sistemi moderni mescolano i due approcci—ad esempio un modello di memoria unico a livello di software, ma con cache separate per istruzioni e dati internamente.
Il “collo di bottiglia di von Neumann” è il limite di prestazioni che può verificarsi quando CPU e memoria condividono un percorso limitato per muovere sia istruzioni sia dati. Mitigazioni comuni includono cache, prefetching e parallelismo (come core multipli), che riducono i tempi di attesa ma non eliminano il vincolo sottostante.
Poiché i programmi sono semplicemente informazioni che possono essere caricate in memoria, puoi aggiornare il comportamento cambiando il software invece dei componenti hardware. Per questo lo stesso telefono o laptop può eseguire molte app e aggiornamenti firmware/OS possono aggiungere funzionalità senza ridisegnare l'hardware.
Dato che le istruzioni sono rappresentate come dati in memoria, gli attaccanti a volte cercano di far sì che sistemi inaffidabili vengano trattati come codice eseguibile (ad es. injection di codice). Le difese moderne includono protezione della memoria (regioni non eseguibili), firma del codice e altri controlli che separano i “dati che puoi leggere” dal “codice che puoi eseguire”.