Sebbene non famoso come Jobs, per chi non lo conoscesse Steve Wozniak è “l’altro Steve” (come veniva chiamato scherzosamente anche dai dipendenti) che ha cofondato la Apple nella seconda metà degli anni ’70.
Abile e visionario ingegnere, purtroppo nell’81 fu vittima di un incidente aereo che lo ha segnato e compromesso in parte le sue capacità, ma non senza che prima consegnasse alla storia quelle pietre miliari che furono l’Apple (I) prima e il ben più famoso Apple II dopo.
Oltre che della progettazione dell’hardware si è interessato anche dello sviluppo del software, e fu proprio mentre lavorava alla sua implementazione di un interprete BASIC per l’Apple II che gli venne in mente di realizzare quello che chiamò “un meta-processore a 16 bit in software“, a cui diede successivamente il nome (che è tutto un programma) di SWEET 16…
In effetti cos’è una virtual machine, se non l’implementazione di un processore “ideale” (nel senso di non reale; non fisicamente tangibile) dotato di una sua personalissima ISA (Instruction Set Architecture) e le cui istruzioni vengono generalmente chiamate bytecode?
Con l’enorme diffusione che hanno avuto negli ultimi anni (Java e runtime .NET in particolare), oggi SWEET16 la si inquadrerebbe esattamente in quest’ottica: una virtual machine che esegue il suo bytecode.
D’altra parte, sebbene dotata di pochissime istruzioni (circa una trentina), il principio era esattamente quello: un byte che identificava l’opcode da eseguire, eventualmente seguito da uno o due byte all’occorrenza.
Le istruzioni, oltre che poche, erano anche semplici: per lo più di caricamento/salvataggio dell’accumulatore (il registro R0) facendo uso degli altri registri (ne erano disponibili ben 16), e di salto condizionato. Le uniche operazioni aritmetiche erano la somma e la sottrazione (due sole istruzioni in tutto), e incremento e decremento (altre due istruzioni per queste operazioni molto comuni).
Se non fosse stato per la lunghezza variabile delle istruzioni, lo si sarebbe classificato come uno dei più semplici e “ridotti all’osso” processori RISC della storia. Peccato che girasse dentro la “pancia” di un 6502 che di “ridotto” aveva soltanto il numero di istruzioni e di registri, ma abbondava parecchio quanto a modalità (complesse) d’indirizzamento della memoria (CISC docet).
In fin dei conti SWEET16 era una routine (residente nella ROM dell’Apple II) che occupava in tutto circa 300 byte, e che veniva richiamata all’occorrenza da una normale applicazione scritta in linguaggio macchina o assembly 6502.
Ma il 6502 non era abbastanza potente / flessibile per fare a meno di questo “processore virtuale”? Certamente, ma il problema all’epoca stava nello scarso spazio a disposizione, a causa delle limitate architetture e soprattutto degli elevati costi delle memorie. Dunque si cercava di risparmiare spazio come si poteva.
Le compatte istruzioni a 16 bit di questa macchina virtuale servivano proprio allo scopo: ottenere piccoli pezzi di codice quando c’era da manipolare quantità a 16 bit. Cosa alquanto comune per un interprete BASIC, le cui variabili altro non sono che puntatori a 16 bit a locazioni di memoria che… spesso contengono valori interi a 16 bit.
Infatti l’interprete BASIC a cui stava lavorando “Woz” era orientato strettamente agli interi (per questo fu chiamato “Integer BASIC“). Puntatori a 16 bit + interi a 16 bit = SWEET16 architettura ideale per poterli manipolare, occupando poco spazio per il codice, anche se a prezzo di una riduzione della velocità di esecuzione in questi casi (ma il compromesso era ragionevole).
La cosa interessante è che il codice di SWEET16 fu reso disponibile pubblicamente (sebbene rimanesse il copyright), prassi questa abbastanza diffusa all’epoca, e ciò ha permesso che arrivasse fino a noi. Addirittura ne è stato effettuato il porting per altre macchine dotate del 6502.
A una prima lettura il codice sembra complesso in alcune parti, ma si riesce a comprendere presto la “filosofia” con la quale era stato scritto, e il funzionamento. Ma non ci sarebbe da meravigliarsi altrimenti: non è anche prassi che i genii rimangano incompresi?