Avanti Indietro Indice

10. Come fa il computer a immagazzinare le cose in memoria?

Probabilmente sapete che nel computer tutto viene immagazzinato come serie di bit (binary digits, cifre binarie; potete pensarle come molti piccoli interruttori on-off). Qui spiegheremo come vengono usati quei bit per rappresentare le lettere ed i numeri che il vostro computer sta macinando.

Prima di arrivare a questo, dovete fare la conoscenza della dimensione di parola (word size) del vostro computer. La dimensione di parola è la dimensione preferita dal computer per muovere in giro unità di informazione; dal punto di vista tecnico è la capacità dei registri del processore, che sono i contenitori usati dal processore per fare calcoli aritmetici e logici. Quando leggete di computer con certe dimensioni di bit (ad esempio ``32-bit'' o ``64-bit''), si riferiscono a questo.

La maggior parte dei computer (compresi 386, 486, Pentium e Pentium II) hanno una word size di 32 bit. I vecchi 286 avevano una dimensione di parola di 16 bit. I mainframe vecchio stile spesso usavano parole di 36-bit. Alcuni processori (come l'Alpha prodotto da quella che era DEC ed ora è Compaq) hanno parole di 64-bit. Parole di 64-bit diverranno più comuni nei prossimi cinque anni; Intel ha in progetto la sostituzione del Pentium II con un chip a 64-bit chiamato `Merced'.

Il computer vede la memoria core come una sequenza di parole numerate da zero ad un qualche valore elevato che dipende dalla quantità della vostra memoria. Quel valore è limitato dalla dimensione di parola, che nei vecchi 286 costringeva a dolorose acrobazie per accedere a grandi quantità di memoria. Non li descriverò qui; fanno ancora venire gli incubi ai vecchi programmatori.

10.1 Numeri

I numeri vengono rappresentati o come parole o come coppie di parole, a seconda della dimensione di parola del processore. Una parola per una macchina a 32-bit è la dimensione più comune.

L'aritmetica dei numeri si avvicina ma non coincide con la matematica a base due. Il bit di ordine inferiore vale 1, il successivo 2, poi 4 e così via come nella binaria pura. Ma i numeri con segno vengono rappresentati con notazione complemento a due. Il bit di ordine superiore è il bit di segno che rende la quantità negativa e ogni numero negativo si può ottenere dal corrispondente valore positivo invertendo tutti i bit. Questo è il motivo per cui gli interi su una macchina a 32-bit vanno in una scala da -2^31 + 1 a 2^31 - 1 (dove ^ è l'operazione di elevamento a potenza, 2^3 = 8). Quel 32esimo bit viene usato per il segno.

Alcuni linguaggi per computer danno accesso alla aritmetica senza segno che è quella liscia a base 2 con i soli numeri positivi e lo zero.

La maggior parte dei processori e alcuni linguaggi possono gestire numeri in virgola mobile (capacità incorporata in tutti i processori recenti). I numeri in virgola mobile (floating-point) offrono una scala di valori molto più ampia rispetto agli interi e consentono di esprimere frazioni. I modi nei quali questo viene fatto variano e sono piuttosto complessi per essere discussi in dettaglio, ma l'idea generale è molto simile a quella della cosiddetta `notazione scientifica', dove si può scrivere (per esempio) 1.234 * 10^23; la codifica del numero è divisa in una mantissa (1.234) e una parte esponente (23) per il moltiplicatore a potenze di dieci.

10.2 Caratteri

I caratteri sono normalmente rappresentati come stringhe di sette bit ciascuno in una codifica chiamata ASCII (American Standard Code for Information Interchange). Sui computer moderni, ciascuno dei 128 caratteri ASCII sta nei sette bit inferiori di un otteto di 8-bit; gli otteti sono impacchettati in parole di memoria cosicché (ad esempio) una stringa di sei caratteri occupa solo due parole di memoria. Per vedere una tabella dei codici ASCII, digitate `man 7 ascii' al vostro prompt Unix.

Il paragrafo precedente è fuorviante per due motivi. Quello meno importante è che il termine `otteto' è formalmente corretto ma raramente usato in concreto; la maggior parte delle persone si riferisce ad un otteto come ad un byte e si aspetta che i byte siano di otto bit. In senso proprio, il termine `byte' è più generale; c'erano, ad esempio, macchine a 36-bit con byte da 9-bit (anche se probabilmente non ce ne saranno mai più).

Il motivo più importante è che non tutto il mondo usa l'ASCII. Infatti, la maggior parte del mondo non può -- ASCII, anche se va bene per l'inglese americano, non ha molti caratteri accentati e altri segni speciali che servono agli utenti di altre lingue. Anche l'inglese britannico si trova in difficoltà per la mancanza del simbolo della sterlina.

Ci sono stati numerosi tentativi di rimediare a questo problema. Tutti si servono del bit in più che l'ASCII non utilizza, rendendolo la metà inferiore di un insieme di 256 caratteri. Il più diffuso è l'insieme di caratteri noto come `Latin-1' (più formalmente ISO 8859-1). Questo è l'insieme di caratteri predefinito per Linux, l'HTML e X. Microsoft Windows usa una variante del Latin-1 che aggiunge alcuni caratteri come le doppie apici in posti lasciati inutilizzati dal Latin-1 per ragioni storiche (per un resoconto dei problemi che questo causa, v. demoroniser).

Il Latin-1 gestisce la maggior parte delle lingue europee, inclusi: inglese, francese, tedesco, spagnolo, italiano, olandese, norvegese, svedese, danese. Tuttavia, neppure questo è sufficiente ed esiste tutta una serie di insiemi di caratteri da Latin-2 a -9 per gestire lingue quali greco, arabo, ebreo e serbo-croato. Per maggiori dettagli, v. ISO alphabet soup.

La soluzione definitiva è uno standard possente chiamato Unicode (e il suo gemello identico ISO/IEC 10646-1:1993). L'Unicode è identico al Latin-1 nelle sue 256 caselle inferiori. In aggiunta, su uno spazio di 16-bit, include greco, cirillico, armeno, ebreo, arabo, devanagari, bengalese, gurmukhi, gujarati, oriya, tamil, telugu, kannada, malayalam, thai, lao, georgiano, tibetano, giapponese kana, l'insieme completo del coreano hangul moderno e un insieme unificato di ideogrammi cinesi giapponesi e coreani (CJK). Per maggiori dettagli, v. Unicode Home Page.


Avanti Indietro Indice