di  -  mercoledì 22 aprile 2009

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?

9 Commenti »

I commenti inseriti dai lettori di AppuntiDigitali non sono oggetto di moderazione preventiva, ma solo di eventuale filtro antispam. Qualora si ravvisi un contenuto non consono (offensivo o diffamatorio) si prega di contattare l'amministrazione di Appunti Digitali all'indirizzo info@appuntidigitali.it, specificando quale sia il commento in oggetto.

  • # 2
    massimo m.
     scrive: 

    solo 300 byte? mi pare un po’ poco.

  • # 3
    Cesare Di Mauro
     scrive: 

    Eppure sta in quello spazio. Il codice in ROM è contenuto fra le locazioni $F689 to $F7FC: 372 byte per la precisione (ma ci sono da considerare anche le tabelle per i salti all’inizio di ogni routine che gestiva una precisa istruzione). ;)

  • # 4
    blackshard
     scrive: 

    Se non ricordo male in tempi recenti transmeta ha provato a fare qualcosa del genere con bytecode java. Un approccio rivoluzionario che però purtroppo non è andato a buon fine :/

  • # 5
    Cesare Di Mauro
     scrive: 

    Francamente su Transmeta sono rimasto fermo ai tempi in cui il suo Efficeon “emulava” una CPU x86.

    Non sono al corrente di esperimenti col bytecode di Java.

  • # 6
    blackshard
     scrive: 

    Mah io ricordo di una notizia di molto tempo fa, però non ho mai approfondito la questione. D’altro canto ormai transmeta non esiste più. E’ più probabile che in futuro venga riproposta una cosa del genere che, per applicazioni in un server web destinato a servlet potrebbe essere interessante.

  • # 7
    Cesare Di Mauro
     scrive: 

    Solo se ha prestazioni superiori alle attuali virtual machine dotate di compilatore JIT. Ma mi sembra molto difficile che ci riescano.

    Al più potrebbe essere interessante dal punto di vista del risparmio energetico.

  • # 8
    Arkham00
     scrive: 

    Lo Sweet16 di Wozniak era la base dell’Integer Basic che veniva inizialmente fornito con Apple ][. Era volutamente leggero e veloce per poter creare e gestire videogiochi. Questa era la “visione strategica” di Wozniak ed il suo “posizionamento” del prodotto. Invece Jobs voleva proporlo come “business machine” e quindi volle inserire nella macchine il Microsoft Basic (più lento ma con gestione di numeri in floating point) che poi divenne l’ambiente di sviluppo principale.

  • # 9
    Cesare Di Mauro
     scrive: 

    Mi pare difficile che potesse gestire videogiochi. Lo SWEET16 era comunque molto più lento (di circa un’ordine di grandezza) rispetto al codice “nativo” 6502.

Scrivi un commento!

Aggiungi il commento, oppure trackback dal tuo sito.

I commenti inseriti dai lettori di AppuntiDigitali non sono oggetto di moderazione preventiva, ma solo di eventuale filtro antispam. Qualora si ravvisi un contenuto non consono (offensivo o diffamatorio) si prega di contattare l'amministrazione di Appunti Digitali all'indirizzo info@appuntidigitali.it, specificando quale sia il commento in oggetto.