Avanti Indietro Indice

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

Probabilmente saprete che ogni cosa in un computer viene memorizzata come stringa di bit (binary digit; possiamo immaginarli come molti piccoli interruttori). Ora vedremo come questi bit vengano impiegati per rappresentare le lettere e i numeri che il computer manipola.

Prima di poter affrontare questo argomento, è necessario comprendere la dimensione di parola del computer. Si tratta della dimensione preferita dal computer per spostare unità di informazioni; tecnicamente è l'ampiezza dei registri dei processore, ovvero le aree che il processore utilizza per compiere calcoli logici e aritmetici. Quando leggiamo che i computer hanno dimensione in bit (per esempio ``32-bit'' o ``64-bit'') ecco che cosa si intende.

La maggior parte dei computer (compresi i PC 386, 486, Pentium e Pentium II) ha una dimensione di parola di 32 bit. Le vecchie macchine 286 lavoravano a 16. Mainframe vecchio stile spesso hanno parole di 36 bit. Pochi processori (come Alpha di quella che prima era la DEC e ora è Compaq) hanno parole di 64 bit. La parola di 64 bit diverrà più comune nei prossimi cinque anni; Intel sta progettando di sostiuire il Pentium II con un chip a 64 bit chiamato `Merced'.

Il computer vede la memoria core come sequenza di parole numerate da zero in avanti, fino a valori molto grandi a seconda della dimensione della memoria. Tale valore è limitato dalla dimensione della parola, motivo per cui le vecchie macchine come i 286 dovevano svolgere complicati contorsionismi per indirizzare grandi quantità di memoria. Non li descriverò qui; procurano ancora degli incubi ai vecchi programmatori.

10.1 Numeri

I numeri sono rappresentati come parole o coppie di parole, a seconda della dimensione di parola del processore. Su macchine a 32 bit, la parola è la dimensione più comune.

L'aritmetica degli interi è simile ma non è esattamente identica alla matematica in base due. Il bit di ordine più basso è 1, il successivo 2, poi 4 e così via in notazione binaria. Ma i numeri dotati di segno sono rappresentati in notazione complemento a due. Il bit di ordine più alto è un bit di segno che rende negativa la quantità rappresentata, mentre ogni numero negativo può essere ottenuto dal valore positivo corrispondente invertendo tutti i bit. È per questo motivo che gli interi su una macchina a 32 bit devono essere compresi nell'intervallo tra -2^31 + 1 e 2^31 - 1 (dove ^ è l'operatore di elevamento a potenza, 2^3 = 8). Il 32-esimo bit è usato per il segno.

Alcuni linguaggi di programmazione danno accesso a una aritmetica senza segno ovvero una artimetica in base 2 con solo i numeri positivi e lo zero.

La maggior parte dei processori e alcuni linguaggi possono manipolare numeri in virgola mobile (funzionalità incorporata nel chip di tutti i processori recenti). I numeri in virgola mobile forniscono un intervallo più ampio degli interi e consentono di esprimere le frazioni. I modi in cui questo avviene sono diversi e un po' troppo complicati per essere affrontati in dettaglio in questa sede. Tuttavia, l'idea generale è molto simile alla cosiddetta `notazione scientifica', dove si può scrivere (per esempio) 1.234 * 10^23; la codifica del numero viene divisa in una mantissa (1.234) e in un esponente (23) che indica le potenze di dieci.

10.2 Caratteri

I caratteri sono normalmente rappresentati come stringhe di sette bit, in una codifica chiamata ASCII (American Standard Code for Information Interchange). Sulle macchine moderne, ciascuno dei 128 caratteri ASCII è dato dai sette bit più bassi di un ottetto a 8 bit; gli ottetti sono riuniti in parole di memoria in modo che (per esempio) una stringa di sei caratteri occupi solamente due parole di memoria. Per vedere una mappa dei caratteri ASCII, scrivere `man 7 ascii' al prompt di Unix.

Il paragrafo precedente, però, non è completamente corretto, per due ragioni. Quella minore è che il termine `ottetto' è formalmente corretto ma raramente utilizzato; la maggior parte delle persone si riferisce a un ottetto come a un byte e ritiene che i byte siano lunghi otto bit. Per essere corretti, il termine `byte' è più generale; per esempio, ci sono state macchine a 36 bit con byte di 9 bit (anche se probabilmente non capiterà più in futuro).

La ragione principale è, invece, che non tutto il mondo usa i codici ASCII. Infatti, molti paesi non possono usarli: mentre i codici ASCII funzionano bene per l'inglese americano, non contengono molte accentate e caratteri speciali necessari per le altre lingue. Persino l'inglese britannico ha il problema della mancanza di un segno per la sterlina.

Ci sono stati diversi tentativi di risolvere questo problema. Tutti fanno uso dell'ottavo bit non usato dai codici ASCII, che in questo modo risultano la metà inferiore di un set di 256 caratteri. Quello più largamente utilizzato è il set di caratteri `Latin-1' (o più formalmente ISO 8859-1). Si tratta del set di caratteri predefinito per Linux, HTML e X. Microsoft Windows usa una versione mutante di Latin-1 che aggiunge alcuni caratteri come le virgolette destre e sinistre, in posizioni lasciate libere da Latin-1 per ragioni storiche (per una resoconto severo dei problemi che ha provocato, vedere la pagina demoroniser.

Latin-1 gestisce le principali lingue europee, tra cui inglese, francese, tedesco, spagnolo, italiano, olandese, norvegese, svedese, danese. Tuttavia non è ancora sufficiente, per cui esistono altre serie di set di caratteri da Latin-2 a -9 per rappresentare il greco, l'arabo, l'ebraico e il serbo-croato. Per maggiori dettagli vedere la pagina ISO alphabet soup.

La soluzione definitiva è uno standard enorme chiamato Unicode (e il suo gemello identico ISO/IEC 10646-1:1993). Unicode è identico a Latin-1 nella 256 posizioni più basse. Nello spazio successivo dei 16 bit comprende greco, cirillico, armeno, ebraico, arabo, devanagarico, bengalese, gurmukhi, gujarati, oriya, tamil, telugu, kannada, malese, tailandese, lao, georgiano, tibetano, giapponese kana, il set completo del coreano hangul moderno e un set unificato di ideogrammi cinesi/giapponesi/coreani (CJK). Per maggiori dettagli vedere la Unicode Home Page.


Avanti Indietro Indice

Hosting by: hurra.com
Generated: 2007-01-26 17:56:13