I computer rappresentano dati e istruzioni attraverso sequenze di bit. Il collegamento tra ciò che scriviamo e ciò che avviene nei circuiti passa attraverso più livelli: applicazioni, sistema operativo, istruzioni macchina e componenti elettronici.
È il viaggio con cui apro il format Feel Geek. Parto da una domanda che continua ad affascinarmi: come può un gesto sulla tastiera trasformarsi in qualcosa che una macchina riesce a elaborare?
Il bit: due valori, molte combinazioni
Un bit può assumere due valori, indicati con 0 e 1. Una sequenza di n bit ammette 2ⁿ combinazioni diverse: con otto bit, cioè un byte, le combinazioni sono 256.
Questo non significa che i numeri binari siano tutti multipli di due. Significa che usano due cifre e un sistema posizionale basato sulle potenze di due. Per esempio, 101 in base due rappresenta 1 × 4 + 0 × 2 + 1 × 1, cioè 5.
Le stesse sequenze possono rappresentare cose diverse secondo la codifica scelta. Per interpretarle bisogna conoscere quella convenzione: i bit, da soli, non dicono se appartengano a un testo, a un'immagine o a un'istruzione.
Byte e capacità: distinguere prefissi decimali e binari
Nel video uso la convenzione storica che chiama kilobyte una quantità di 1024 byte. Per evitare ambiguità, la distinzione corretta è questa:
| Unità | Quantità |
|---|---|
| 1 byte | 8 bit |
| 1 kilobyte, kB | 1000 byte |
| 1 kibibyte, KiB | 1024 byte |
| 1 megabyte, MB | 1.000.000 byte |
| 1 mebibyte, MiB | 1.048.576 byte |
I prefissi binari permettono di indicare esplicitamente le potenze di due. Riferimento NIST sulle unità binarie.
Come i circuiti rappresentano 0 e 1
L'immagine della lampadina accesa o spenta aiuta a visualizzare due stati distinguibili. Nei circuiti digitali reali i valori logici sono associati a condizioni elettriche definite dal progetto.
I transistor permettono di realizzare circuiti che elaborano questi segnali. Non sono piccole lampadine e non vale la regola universale “otto transistor uguale un byte”: il numero di componenti dipende dal tipo di circuito e di memoria.
Anche la storia va distinta tra proposte teoriche, brevetti e dispositivi funzionanti. Un passaggio fondamentale fu il transistor a contatto puntiforme realizzato da John Bardeen e Walter Brattain nel 1947. Computer History Museum.
Dal programma alle istruzioni macchina
Scrivere direttamente codici macchina sarebbe difficile e strettamente legato all'architettura. I linguaggi di programmazione permettono di descrivere operazioni attraverso astrazioni più gestibili.
L'assembly fornisce una rappresentazione simbolica delle istruzioni di una determinata architettura; un assembler la traduce in codice macchina. Non è uno strumento universale per attribuire significato a qualsiasi numero binario.
Compilatori e interpreti intervengono in altri passaggi. Un compilatore traduce un programma in un'altra rappresentazione; un interprete ne esegue le operazioni attraverso un proprio meccanismo di esecuzione. Le due tecniche possono convivere, anche con compilazione durante l'esecuzione.
Per questo descrivere un linguaggio come esclusivamente “compilato” o “interpretato” è una semplificazione: conta anche l'implementazione utilizzata.
Il sistema operativo collega programmi e risorse
Quando premiamo un tasto, il sistema riceve un evento che può essere gestito da un'applicazione. Il programma usa le interfacce disponibili per elaborarlo e produrre un risultato.
Non è necessario immaginare ogni gesto come una nuova traduzione completa del programma. Molte istruzioni sono già pronte per essere eseguite; altre attività vengono gestite da librerie, runtime e servizi del sistema.
Questi livelli nascondono parte della complessità, ma non la eliminano. Permettono a chi sviluppa e a chi usa il computer di lavorare senza ricostruire ogni volta il funzionamento dei circuiti.
Una memoria finita impone dei limiti
Con un numero fissato di bit possiamo rappresentare un numero finito di configurazioni. Intervallo dei valori e precisione dipendono dalla codifica.
Non tutti i numeri possono quindi essere rappresentati esattamente con uno spazio limitato. Arrotondamenti e limiti di grandezza sono conseguenze concrete da considerare nei programmi, non dettagli che spariscono aumentando la complessità della macchina.
La storia: correggere una sovrapposizione importante
Nel racconto originale unisco impropriamente Turing, Enigma e Colossus. Il progetto di Colossus fu guidato da Tommy Flowers e riguardava le comunicazioni cifrate con Lorenz, non Enigma. The National Museum of Computing.
Anche Pascal appartiene al XVII secolo, non al XVI. Queste distinzioni non tolgono fascino al percorso: mostrano che l'informatica nasce da contributi diversi, non da una singola invenzione risolutiva.
Il punto d'arrivo resta quello che mi interessa condividere: tra una nostra intenzione e una risposta sullo schermo esiste un insieme di rappresentazioni e meccanismi progettati. Comprenderne anche solo alcuni rende la tecnologia meno misteriosa e molto più interessante.