Programmazione in Binario Assoluto
I primi programmatori scrivevano in binario assoluto: ogni istruzione & ogni indirizzo in cifre binarie grezze. Una singola istruzione potrebbe assomigliare a 01100101 00001010 — codice di istruzione & indirizzo di memoria in binario.
Il Problema del Codice Spaghetti
Quando un errore richiedeva l'inserimento di una nuova istruzione, i programmatori affrontavano un dilemma. Inserire sul posto significava che ogni indirizzo di istruzione successiva si spostava di uno — richiedendo al programmatore di aggiornare ogni riferimento all'indirizzo nell'intero programma. Catastrofico.
La soluzione: sostituire l'istruzione appena prima del punto di inserimento con un salto alla memoria vuota. In quella posizione vuota: scrivere l'istruzione sovrascritta, aggiungere le nuove istruzioni, quindi saltare indietro. Quando gli errori apparivano nelle correzioni, applicare lo stesso trucco di nuovo usando altra memoria vuota.
Risultato: il percorso di esecuzione attraverso il programma saltava a posizioni apparentemente casuali. Hamming ha chiamato questo 'un barattolo di spaghetti.' Il percorso del flusso di controllo, disegnato su carta, assomigliava esattamente a spaghetti intricati.
Le Vie di Fuga
Due miglioramenti immediati: notazione ottale (raggruppare cifre binarie in insiemi di 3) ed esadecimale (gruppi di 4, usando A–F per valori oltre 9). Questi hanno ridotto gli errori di scrittura ma non hanno risolto il problema fondamentale dell'indirizzo.
L'assembly simbolico (es. SAP di IBM — Symbolic Assembly Program — e SOAP — Symbolic Optimizing Assembly Program sull'IBM 650) ha permesso ai programmatori di scrivere nomi di istruzione (ADD, MOVE) e etichette di indirizzo simbolico invece che binario. L'assembler ha tradotto in binario al momento dell'input, gestendo automaticamente le assegnazioni di indirizzo.
SOAP ha eseguito un'ottimizzazione aggiuntiva: ha disposto le istruzioni sul tamburo rotante in modo che l'istruzione successiva arrivasse alla testina di lettura proprio quando la precedente era completata — codifica a latenza minima. SOAP si è persino compilato da solo: il programma A elaborato come dati per produrre B, B eseguito su A per misurare quanto l'auto-compilazione lo aveva migliorato.
Librerie & Codice Rilocabile
Hamming ha notato che l'idea del software riutilizzabile (librerie matematiche) è arrivata molto presto — Babbage l'aveva concepita. Il problema: una libreria con indirizzo assoluto richiedeva che ogni routine occupasse le stesse posizioni di memoria ogni volta che veniva utilizzata. Quando la libreria totale diventava troppo grande, i programmi competevano per gli stessi indirizzi.
La soluzione: codice rilocabile. L'assembler genera istruzioni che fanno riferimento alla memoria relativamente — offset da un indirizzo di base — piuttosto che indirizzi assoluti. Un linker risolve gli indirizzi finali al momento del caricamento.
I rapporti inediti di Von Neumann (ampiamente circolati) descrivevano i trucchi di programmazione necessari. Il primo libro di programmazione pubblicato (Wilkes, Wheeler & Gill, EDSAC, 1951) ha codificato queste tecniche.
La Biforcazione della Progettazione del Linguaggio
FORTRAN (1957, IBM) e ALGOL (1958, comitato internazionale) rappresentano due filosofie di progettazione che hanno prodotto risultati radicalmente diversi.
FORTRAN
John Backus ha guidato il progetto FORTRAN (FORmula TRANslation) presso IBM. L'obiettivo di progettazione: rendere il linguaggio facile da usare per scienziati & ingegneri. FORTRAN ha accettato la notazione matematica che sembrava naturale ai suoi utenti: A = B + C * D piuttosto che ADD B, C; STORE T; MULTIPLY T, D; STORE A.
FORTRAN ha sopravvissuto per 60+ anni. Rimane in uso attivo nell'informatica scientifica, nella fluidodinamica, nella modellazione climatica, & nella fisica computazionale. Hamming ha notato questa durabilità come prova di progettazione riuscita.
ALGOL
ALGOL (ALGOrithmic Language) è stato progettato da un comitato di logici & informatici che miravano al rigore matematico: un linguaggio logicamente pulito, formalmente definibile. La notazione Backus-Naur Form (BNF) per descrivere le grammatiche è stata inventata per specificare ALGOL.
ALGOL ha fallito in pratica. Nonostante la sua eleganza logica & la sua enorme influenza sulla progettazione dei linguaggi successivi (Pascal, C, & praticamente ogni linguaggio moderno derivano dai concetti di grammatica di ALGOL), ALGOL stesso non è mai stato ampiamente distribuito. Il verdetto di Hamming: logicamente progettato, umanamente inutilizzabile.
La Gerarchia dei Linguaggi
Hamming ha descritto una gerarchia naturale dal codice macchina attraverso l'assembly, i linguaggi di livello superiore, & in ultimo un 'linguaggio orientato ai problemi' vicino a come i professionisti pensano al loro dominio di problema. Ogni livello aggiunge leggibilità umana al costo dell'efficienza della macchina.
I Quattro Criteri di Progettazione del Linguaggio di Hamming
Hamming ha distillato la lezione di FORTRAN vs ALGOL in quattro criteri per un linguaggio di programmazione di successo:
1. Facile da imparare — un principiante può diventare produttivo rapidamente
2. Facile da usare — i compiti di routine richiedono una cerimonia minima
3. Facile da debuggare — gli errori producono messaggi significativi e localizzabili
4. Facile da usare le subroutine — il riutilizzo & l'astrazione non richiedono sforzi eroici
Ha aggiunto un'osservazione strutturale: il linguaggio umano ha circa il 60% di ridondanza; il linguaggio scritto circa il 40%. I linguaggi a bassa ridondanza (come APL) producono eleganti one-liner che gli esperti trovano belli & i principianti trovano opachi — & che contengono errori non rilevabili quando un singolo carattere cambia significato.
L'implicazione: un linguaggio progettato per l'eleganza logica ottimizza per il lettore sbagliato. Il programmatore è umano; gli umani hanno bisogno di ridondanza per catturare gli errori & comunicare l'intento.
Progettazione del Linguaggio Psicologica vs Logica
Hamming è tornato al contrasto FORTRAN/ALGOL come una lezione sulla dinamica istituzionale & umana, non solo sulla progettazione del linguaggio.
FORTRAN è stato progettato psicologicamente — per gli umani che lo avrebbero usato, specificamente scienziati che pensavano in notazione matematica. ALGOL è stato progettato logicamente — per la correttezza formale & l'eleganza teorica.
Il paradosso identificato da Hamming: un linguaggio logicamente corretto che gli umani resistono fallisce; un linguaggio pragmaticamente progettato che gli umani adottano ha successo, anche se è logicamente più confuso.
Ha citato APL come caso estremo: logicamente elegante, esprimibile in una riga, con il suo set di caratteri speciali. Gli esperti l'hanno amato. I programmatori normali l'hanno trovato illeggibile. Un singolo cambio di carattere potrebbe silenziosamente trasformare il significato di un programma. APL ha una piccola comunità devota & quasi zero uso mainstream.
L'argomento della ridondanza umana: il linguaggio parlato è ~60% ridondante (contesto ripetuto, parole chiarificanti, struttura prevedibile). Linguaggio scritto ~40% ridondante. Questa ridondanza serve per il rilevamento degli errori — gli umani sono inaffidabili, quindi il linguaggio ha evoluto per portare abbastanza informazioni ripetute per catturare & correggere gli errori. Un linguaggio a bassa ridondanza rimuove questa rete di sicurezza.
La Gerarchia dei Compilatori
Hamming ha descritto la stratificazione del compilatore/interprete: un programma può leggere un linguaggio di livello superiore & tradurlo a uno di livello inferiore. Impila questi livelli — ognuno traduce un livello verso il basso. In alto: un linguaggio specifico del dominio che gli esperti in un campo (biologia, finanza, fisica) scrivono naturalmente. In basso: codice macchina. Ogni transizione è un compilatore o un interprete.
Previsione della Sopravvivenza del Linguaggio
Nel 1993, Hamming aveva visto molti linguaggi avere successo & fallire. FORTRAN (1957) è sopravvissuto. ALGOL (1958) ha fallito. COBOL (1959) è sopravvissuto per decenni nell'informatica aziendale. LISP (1958) è sopravvissuto nella ricerca sull'IA. PL/I (1964) ha tentato di unificare tutto & ha fallito.
Il Modello Ricorrente
Il capitolo sulla storia del software di Hamming contiene una struttura ricorrente:
1. Esiste una limitazione dolorosa (indirizzi assoluti, notazione binaria, codice non mantenibile)
2. Qualcuno inventa un livello di astrazione che nasconde la limitazione
3. L'astrazione abilita una nuova scala, che crea nuove limitazioni dolorose
4. Ripeti
Binario → ottale/esadecimale → assembly simbolico → FORTRAN → programmazione strutturata → linguaggi orientati agli oggetti → linguaggi specifici del dominio. Ogni livello risolve il dolore più acuto del predecessore mentre introduce una nuova classe di problema.
Il problema del codice spaghetti (indirizzi assoluti) ha portato all'assembly simbolico. I grandi programmi assembly hanno portato a FORTRAN. I grandi programmi FORTRAN hanno portato alla programmazione strutturata & poi all'orientamento agli oggetti. La lezione di Hamming è terminata prima di queste transizioni successive, ma il modello continua.
La sua lezione per gli ingegneri: stai sempre risolvendo il dolore esposto dall'astrazione precedente. Capire il livello su cui sei attualmente richiede di sapere perché il livello sottostante esiste.