In questo periodo sto (ri)approfondendo la Programma 101. A differenza di quando lo feci le prime volte, da sbarbato studente dell’ITI, ora sono un ben più barbuto (ogni tanto) studente di informatica che ha passato un esame di architettura degli elaboratori e che ha quindi maggiori capacità di capire il mondo informatico attorno a sé.

Vi prometto, più avanti, un articolo più completo sulla Perottina, nel mentre però voglio risolvere una questione: che architettura usa la P101?

La memoria della Programma 101

La memoria della P101, magnetostrittiva e di circa 240 byte, è divisa in registri: M, A, B, C, D, E, F, 1 e 2. M, A ed R sono di servizio: M, detto “Mediano”, che accoglie gli input da tastiera, A, detto “Accumulatore”, ospita i risultati delle operazioni mentre R (“Resto” e “Risultati”) ospita i risultati completi o i resti.

B, C, D, E ed F sono registri di deposito, che possono essere anche divisi (in tal caso si parla di parte destra e sinistra, indicate con la lettera maiuscola e quella minuscola, sulla tastiera indicato con la lettera seguita da “/"). Ogni registro ospita fino a 22 cifre, con virgola e segno.

1 e 2 sono registri di programma, con 24 istruzioni ciascuno. Qualora un programma sia più grande di 48 passi, può strabordare nei registri F, E e D, sino ad arrivare a 120 passi di programma.

Una netta separazione tra dati e istruzioni

Nella maggioranza dei computer odierni nulla vi vieta di avere un’istruzione mischiata a dei dati, purché si agisca opportunamente a livello di istruzioni per fare in modo che il contatore di programma non esegua mai il dato come istruzione, cosa che può portare a risultati imprevisti.

Ad esempio, usando LC-3, nulla vieta di avere una situazione del genere:

.orig x3000
BRNZP x3002 [x3000]
.fill x1234 [x3001]
NOP         [x3002]

Così la locazione di memoria x3001 avrebbe dentro un dato, in mezzo a due istruzioni: un salto incondizionato e una istruzione nulla NOP (che potrebbe essere qualsiasi cosa). Proprio grazie al salto incondizionato non sarà possibile eseguire il dato.

Con la P101 non è ordinariamente possibile, per due ragioni:

  1. Immaginando la memoria della P101 come un unicum da 0 a 239, i dati vengono salvati da 0 e verso destra, mentre le istruzioni da 239 e verso sinistra
  2. In generale, mischiare in un unico registro istruzioni e dati non è ammesso, anche se esistono modi per farlo (come vedremo nel prossimo paragrafo)

Interazioni tra dati e istruzioni

Non sono del tutto escluse, comunque, interazioni tra dati e istruzioni.

È possibile, ad esempio, salvare costanti come istruzioni, usando l’istruzione (uso la mia notazione) “a^”, istruzione non standard che essenzialmente vorrebbe dire “sposta M nella parte sinistra di A”, quando A non si può splittare e per scambiare tra A ed M si deve usare la funzione di trasferimento con A “><”.

Facendo così viene salvata sulla scheda una rappresentazione della costante in formato Binary-Coded Decimal, formato utilizzato spesso per i calcolatori numerici poiché offre una corrispondenza tra un nibble e una cifra decimale, dalla cifra meno significativa a quella più significativa. Tuttavia questo sistema non permette di usare “direttamente” una costante numerica ma semplicemente di caricarla nel registro M, tra l’altro, per lo spazio che porta via in memoria, viene consigliato l’uso solo per piccole costanti da usare una volta ogni tanto, mentre per le grandi costanti viene consigliato di salvarle in un registro che viene salvato nella cartolina magnetica.

Un altro modo in cui dati e istruzioni possono coabitare nella memoria della P101 è il cosiddetto “uso promiscuo”, possibile sui registri F, E e D. Tale uso promiusco permette, in un unico registro, di usare delle porzioni non occupate da cifre per salvare istruzioni, permettendo quindi di avere programmi più lunghi anche se si deve occupare un registro numerico.

Questo modello ricorda quello che ho mostrato con LC-3: si crea uno “spazio invisibile” alle istruzioni creando un salto incondizionato che non permetta l’accesso al contatore di programma di tali dati, si riempie la zona di istruzioni di Stop, codificate in BCD come zero, più altre due S come istruzioni di inizio e fine dato.

Un esempio, mostrato nel manuale di programmazione, gentilmente trascritto dall’Ing. Larini, vede l’uso dei registri d, E e F promiscuo, per salvare dati di dimensioni variabili, sino a 15 cifre per E e F mentre solo 3 per d.

La Programma 101 non può modificare il proprio programma

Una cosa essenziale da valutare nella classificazione architetturale della P101 è che la macchina non è in grado di mutare il proprio programma in corso d’opera.

Pensate all’esempio LC-3 fatto sopra: essendo la memoria un unicum, condiviso tra dati e istruzioni, nulla vieta che a un certo punto del programma ci sia un’istruzione che fa un’operazione binaria sulla locazione x3000 e che il salto incondizionato diventi condizionato. Su LC-3, tra l’altro, è anche semplice, dato che la struttura dell’operazione branch è [4 bit di opcode] + [Negativo] + [Zero] + [Positivo] + [9 bit di offset].

Se si volesse, putacaso, renderlo un salto condizionato che agisce solo se l’ultima istruzione ha dato un risultato positivo o nullo basta azzerare in qualche modo il quinto bit, ad esempio con una funzione che implementi OR grazie a De Morgan, dato che LC-3 supporta nativamente solo AND e NOT.

Non è certamente una best practice quella di modificare in corso d’opera, dato che è davvero facile dimenticarsi di una modifica e perdere ore di debug per un qualcosa che si potrebbe tranquillamente fare con un codice classico, tant'è che ad oggi solo due programmi ne fanno uso ampio: i malware e le intelligenze artificiali, ma è possibile.

Con la Programma 101 ciò non è possibile: trattare un’istruzione come dato o viceversa porterà all’accensione della lucetta rossa e alla necessità di resettare il calcolatore. Anche la tecnica d’uso promiscuo che abbiamo visto funziona solo se il contatore di programma non ha nemmeno la possibilità di vedere le locazioni dove ci sono dati, mentre nel caso di LC-3 può vederli eccome ed eseguirà ciò che ha davanti, con risultati variabili.

Non si può, insomma, scambiare F contentente istruzioni con A, effettuare un’operazione su A e rieffettuare lo scambio senza che il calcolatore non si pianti. Un’istruzione è lì per sempre… almeno fino al caricamento di un nuovo programma.

Ma non solo…

“Computer Structures: Readings and Examples” è un libro del 1971 molto interessante: per quanto non dia un giudizio sull’architettura della P101, limitandosi a riconoscerla come computer a programma memorizzato, pone nove caratteristiche necessarie perché si possa parlare di calcolatore di tipo Von Neumann. La P101 ne ha otto: può ricevere dalla memoria, salvare in essa, negare, sommare, sequenziare, effettuare un salto condizionato, prendere in input e dare in output.

Ma non può “eseguire come istruzione il risultato di un’operazione aritmetica”, cosa che essenzialmente la esclude dal novero dei calcolatori Von Neumann.

E quindi?

Qualcuno dice che la possibilità di cambiare le proprie istruzioni e di eseguirne come descritto sopra è ciò che distingue un computer da un non computer, ma così non è: la possibilità di avere codice automodificante è praticamente condizione necessaria dell’architettura nota come Von Neumann, ma esistono anche calcolatori che non seguono questa architettura.

I più noti sono i cosiddetti calcolatori Harvard: nella concezione originale, sviluppata nel 1944 dall’omonima università per il Mark I, si prevede che il calcolatore abbia due memorie completamente separate, una destinata a contenere i dati e una le istruzioni, collegate con bus differenti all’unità centrale.

Col tempo, però, ci si rese conto che ciò creava una complessità tecnica non indifferente, oltre ad una certa rigidità del sistema (ad esempio rendendo impossibile usare spazio per istruzioni vuoto per salvare dati) e vennero introdotte le cosiddette Architetture Harvard modificate.

Tali architetture mantengono l’idea di separazione tra memoria per istruzioni e memoria per dati, ma la rilassano in vari modi, a seconda delle necessità del sistema: alcune usano lo stesso bus per entrambe le memorie, alcune ammettono una certa commistione tra dati e istruzioni, altre sono praticamente Von Neumann che separa solo le cache, per avere un miglioramento di prestazioni. Insomma, trattasi di una larga famiglia accomunata da una certa origine ma con vari scopi, alcuni adatti a computer general-purpose, altri adatti a sistemi embedded o ad uso specifico.

La Programma 101 è molto probabilmente un calcolatore con architettura Harvard modificata/semplificata

I pochi che hanno già analizzato la questione architettura della P101 tendono a classificarla come Von Neumann, probabilmente basandosi su questa schematizzazione: Struttura P101

Da un punto di vista fisico è chiaro che la P101 sia collegata come da grafica: la memoria è unica, non divisa. Ma è altrettanto ben chiaro che il resto del calcolatore faccia una netta differenziazione tra ciò che passa da quella memoria come dato e ciò che passa come istruzione, effettuando normalmente una segregazione, dinamica, tra ciò che contiene dati e ciò che contiene istruzioni. Al contempo, tale segregazione è parzialmente superabile, con alcuni stratagemmi e in casi limitati.

Non so se coscientemente o meno, Perotto ed il suo team hanno scelto una versione peculiare di quella che oggi chiamiamo architettura Harvard, utilizzando una sola memoria fisica che viene logicamente divisa in parti, permettendo quindi una certa flessibilità sulla quantità di memoria da destinare alle istruzioni e ai dati. Poiché, inoltre, fisicamente la macchina non ha un impedimento a salvare dati in zona istruzioni è possibile, a certe condizioni mostrate sopra, farlo.

Siccome la dizione stessa di “Harvard modificata” è un po’ oscura e controversa, alcuni non la considererebbero tale, poiché sarebbe un esempio, un po’ sui generis, di “Instruction-memory-as-data architecture”, ossia che permette, a certe condizioni, di usare la memoria istruzioni come dati, ma non viceversa. Secondo alcune fonti, infatti, tale modello sarebbe da considerarsi come architettura Harvard con alcune limature, ma non modificato.

Ad ogni buon conto, a differenza dell’architettura di Von Neumann che sembrava già ben definita come concetto negli anni ‘60, sembra che si sia iniziato a parlare di architettura Harvard solo da fine anni ‘70, spesso tra dubbi e incertezze. Questo fatto, a mio parere, rende meno imperative le condizioni per includere un calcolatore nel novero di Harvard rispetto al novero Von Neumann.

Fatte queste considerazioni, credo si possa affermare con ragionevole probabilità che si possa considerare la Programma 101 come calcolatore avente una qualche forma di architettura Harvard e non come un calcolatore Von Neumann.

Architettura di altri prodotti comparabili

La P101 è sicuramente stata una pietra miliare nella storia dei calcolatori da tavolo e la prima ad avere successo commerciale, ma non fu di certo un prodotto isolato ma, anzi, parte (e, da un punto di vista commerciale origine) di un periodo che ha reso desiderabile per imprese, uffici, laboratori e università l’avere calcolatori a costo moderato (per l’epoca), seppur con funzioni ridotte, così da ridurre la dipendenza dai grandi elaboratori.

Ha quindi senso vedere quali soluzioni abbiano adottato prodotti analoghi e coevi alla P101.

Il Mathatron, un calcolatore prodotto nel 1963 e con scarso successo commerciale, usava un’architettura Harvard, con registri per istruzioni e per dati rigidamente separati e nessuna possibilità di interazione, non è purtroppo noto se la divisione fosse già a livello di memoria o fosse, come nella P101, più logica. Proprio a causa dello scarso successo ci sono poche informazioni su questo calcolatore e sulle capacità delle varie riedizioni, inclusa la struttura interna, tant'è che nemmeno è accertato se le prime versioni fossero capaci di effettuare salti condizionati…

Il Wang LOCI-2, prodotto rilasciato lo stesso anno della Perottina e molto simile, per quanto un po’ meno semplice da utilizzare (richiedeva all’operatore di lavorare col binario e di attuare una certa “manutenzione”) e meno funzionale (ad esempio sulla capienza dei registri), ad essa aveva invece una stretta architettura Harvard, con divisione anche fisica delle due memorie. Il Wang LOCI-2 non ebbe il grande successo commerciale della macchina di Perotto ma ebbe un discreto successo negli States, finendo anch’egli alla NASA, per i calcoli necessari a produrre le tute spaziali. A proposito, si tratta di una macchina molto interessante e poco conosciuta, che vi consiglio di approfondire se vi interessa la storia informatica e, in generale, la Wang ha prodotto molta innovazione nel proprio periodo di attività nel settore dei calcolatori da tavolo.

L’HP 9100, ossia la versione “sotto steroidi” di un calcolatore da tavolo fatta dall’azienda americana in risposta alla P101, invece, usava un’architettura di Von Neumann: non c’era distinzione alcuna tra le due memorie, era possibile quindi mutare in corso d’opera un’istruzione, per quanto sconsigliato, e mischiare istruzioni e dati. Ironia della sorte ha voluto che tutti e tre i calcolatori “harvardiani” si definissero in inglese “computer” mentre l’HP 9100A, più vicina ai grandi elaboratori dell’epoca che già avevano adottato in maggioranza l’architettura di Von Neumann, venisse ampiamente commercializzata come “programmable calculator” per ragioni di marketing, per evitare di associarla ai grandi calcolatori, che erano in mano a poche aziende e visti con diffidenza per la difficoltà d’uso.

Prevedibilmente l’utenza anglofona si è resa conto di avere davanti un computer, anche abbastanza sveglio, e si è messa a chiamarlo come tale quasi subito, mentre in italiano fu l’Olivetti “tecnica” a creare la strada con “calcolatore da tavolo”, mentre pochi usavano “computer da tavolo”, termine più apprezzato dal marketing. Sull’uso delle parole, comunque, e sul perché “programmable calculator” del 1970 non è traducibile come “calcolatrice programmabile” in italiano, discuteremo in un futuro post.

Commenti o considerazioni?

Sono ovviamente interessato a commenti e considerazioni su questo testo, che potete inviarmi via email.

Letture consigliate