Introduzione ai sistemi informatici, 6e - Capitolo 2

Page 1

L’informazione e la sua codifica

2

Obiettivi di apprendimento

■ ■ ■ ■

Rappresentazione e memorizzazione dell’informazione Codifica digitale e analogica Codifica binaria Codifica di dati e istruzioni

Una delle principali organizzazioni internazionali nel settore delle tecnologie dell’informazione, l’Association for Computing Machinery (ACM), ha definito l’informatica come lo “studio sistematico degli algoritmi che descrivono e trasformano l’informazione: la loro teoria, analisi, progetto, efficienza, realizzazione e applicazione”. Secondo un’altra definizione, più sintetica ma altrettanto diffusa, l’informatica è la “scienza della rappresentazione e dell’elaborazione dell’informazione”. È interessante rilevare come queste definizioni si riferiscano solo implicitamente alla tecnologia dei calcolatori e attribuiscano invece un ruolo centrale al concetto di informazione, considerato fondamentale anche per la caratterizzazione delle telecomunicazioni, definite come finalizzate alla “trasmissione rapida a distanza dell’informazione”. Per comprendere lo sviluppo dei sistemi informatici è perciò indispensabile analizzare in qualche dettaglio il concetto di informazione.

2.1

Il concetto di informazione

Consideriamo i due fogli illustrati in Figura 2.1. Nonostante abbiano una struttura fisicamente simile, inchiostro su un supporto cartaceo, i due oggetti

Icone foglio:©Aleshin_Aleksei/Shutterstock

Figura 2.1 Due fogli macchiati di inchiostro: portano informazione?

02txt.indd 15

Un foglio cosparso di macchie

12/01/22 08:38


16

Capitolo 2

L’informazione e la sua codifica

Figura 2.2 La stessa informazione (“il numero 10”) scritta su supporti differenti.

11

10

10 9 8 7 6

sono molto diversi da punto di vista del loro contenuto, cioè dell’informazione che si può ottenere dalla loro osservazione. Quando si parla di informazione, si dice che questa è “portata da”, o “trasmessa su”, o “memorizzata in”, o “contenuta in” qualcosa; questo “qualcosa” però non è l’informazione stessa. I fogli in Figura 2.1 non sono informazione, ma la portano: carta e macchie di inchiostro costituiscono solo il supporto fisico per il qualcosa a cui si è effettivamente interessati: i testi, le immagini, la musica che vi sono scritti sopra. Questa distinzione e questa relazione tra il supporto su cui qualcosa è scritto e il “qualcosa” stesso sono del tutto generali: l’informazione è disponibile solo in quanto è accessibile il supporto su cui essa è mantenuta. Ogni supporto ha poi le sue proprie caratteristiche in quanto mezzo su cui può essere scritta dell’informazione: per esempio, alcuni supporti sono particolarmente adatti alla trasmissione di informazione, ma non alla sua memorizzazione (è il caso dell’aria, che trasporta l’informazione sonora di una sinfonia ma non è in grado di mantenere tale informazione nel tempo, cioè appunto di memorizzarla), mentre per altri supporti vale il viceversa (è il caso dei compact disc, utilizzati per la memorizzazione di informazione in forma digitale ma non leggibili direttamente da esseri umani). La stessa informazione può essere scritta su supporti differenti, come mostra per esempio il caso illustrato in Figura 2.2. Analogamente, la cosa è meno tipica ma non meno significativa, uno stesso supporto può portare informazioni differenti. Per esempio la scritta “fare” porta un’informazione diversa se la si legge in italiano oppure in inglese, e sul supporto illustrato in Figura 2.3 può essere letto sia il pronome “io” sia il numero dieci. La relazione tra informazione e sistemi fisici impiegati come supporti per l’informazione stessa è dunque complessa. L’insieme delle regole che definiscono tale relazione, cioè stabiliscono quelle corrispondenze che consentono Figura 2.3 Uno stesso supporto che può portare informazioni differenti.

02txt.indd 16

I0 12/01/22 08:38


Capitolo 2

Codifica

L’informazione e la sua codifica

Il numero dieci Informazione

17

Figura 2.4 Un esempio di operazioni di codifica e di decodifica.

Supporto fisico

10

Decodifica

di leggere informazione da un supporto e di scrivere informazione su un supporto, è una componente basilare di un linguaggio. In termini generali, si può chiamare codifica l’operazione con cui l’informazione viene scritta su un supporto fisico e decodifica l’operazione con cui l’informazione, precedentemente scritta su un supporto fisico, viene letta (Figura 2.4). La distinzione tra informazione e supporti fisici è dunque in termini di entità informazionali ed entità fisiche: l’informazione richiede un supporto fisico, ma non coincide con esso. L’informazione è un’entità extra-fisica, sottoposta alle leggi della fisica solo in quanto, appunto, necessariamente basata su un supporto fisico. Così, mentre per esempio si considera fondamentale per il mondo fisico un principio di conservazione della materia-energia, al contrario l’informazione può venire creata e distrutta. Una sinfonia, prima di essere composta, semplicemente non esisteva e quindi il compositore ne è a buon diritto considerabile il creatore, anche se naturalmente non è il creatore del supporto che ha impiegato per scrivere la sinfonia. E se tale sinfonia viene dimenticata e se ne perde qualsiasi traccia, si può ritenere che in quanto entità di informazione sia stata a tutti gli effetti distrutta. In senso lato si può dunque interpretare quella tra supporto fisico e informazione come una relazione tra materia e forma: la stessa materia può venire plasmata e assumere forme diverse. Spesso si è appunto interessati alla forma delle cose e non alla materia da cui sono costituite, pur essendo la materia necessaria perché tale forma si possa manifestare. Approfondimento 2.1

Informazione e pattern recognition Per giungere a riconoscere informazione da un supporto fisico occorre applicare un processo di astrazione, attraverso il quale un sistema fisico viene considerato dal punto di vista della sua forma. Per esempio, si potrebbe considerare che i sistemi fisici illustrati nella figura a pagina seguente portino la stessa informazione perché, nonostante non condividano nemmeno un atomo, vengono riconosciuti

02txt.indd 17

come realizzazioni di una stessa forma (in inglese: pattern), descritta come “ovale con breve segmento intersecante in basso”. I programmi di riconoscimento dei caratteri (Optical Character Recognition, OCR) in dotazione agli scanner effettuano una tale attività di pattern recognition e riconducono perciò uno stato fisico, corrispondente in questo caso a una macchia di inchiostro, a un grafema; analogamente operano i

12/01/22 08:38


18

Capitolo 2

L’informazione e la sua codifica

programmi di dettatura automatica, che riconoscono fonemi da suoni.

Q

Q

È suggestiva al riguardo la seguente rappresentazione: Pattern (grafema) Classe di equivalenza di macchie

Pattern (fonema) Classe di equivalenza di suoni

Sistema fisico (macchia di inchiostro)

2.1.1

Sistema fisico (suono)

A un pattern, il grafema della ‘Q’ per esempio, si giunge riconoscendo che il supporto fisico considerato appartiene alla classe di equivalenza delle configurazioni riconoscibili come “un esempio di ovale con breve segmento intersecante in basso”. Tale pattern può essere dunque interpretato come ciò che hanno in comune macchie di inchiostro come quelle indicate sopra. D’altra parte, grafemi e fonemi sono esempi di entità di informazione “a basso livello”, in quanto ancora vincolate a specifici sistemi fisici. Il passaggio da pattern a simboli richiede un ulteriore processo di astrazione: la lettera ‘Q’ (ovvero il concetto stesso di ‘Q’) è più astratta del suo grafema e del suo fonema proprio perché prescinde completamente dalle caratteristiche di ogni specifico supporto fisico, e può essere intesa a sua volta come la classe di equivalenza dei diversi pattern (grafemi, fonemi ecc.) che contribuiscono a far riconoscere la lettera ‘Q’ da diversi supporti fisici.

La condizione fondamentale per l’esistenza di informazione

Anche se per scrivere informazione è necessario un supporto fisico, non tutti i sistemi fisici risultano adatti come supporti per l’informazione. Sotto quali condizioni, dunque, un dato supporto fisico risulta adatto a mantenere una certa informazione? Secondo un’accezione molto generale del concetto, si ottiene informazione quando, dato un insieme di alternative a priori possibili, grazie alla lettura del supporto alcune di queste vengono selezionate e altre eliminate. Condizione necessaria perché un supporto sia in grado di portare informazione è perciò che esso possa assumere configurazioni (o stati) differenti, a ognuna delle quali venga associata una differente entità di informazione. Un supporto che non può avere diverse configurazioni non può portare alcuna informazione. Il caso più semplice è quello in cui le configurazioni distinguibili per il supporto sono solo due. Per esempio, un foglio in grado di contenere al più una macchia di inchiostro può presentarsi in due differenti configurazioni: foglio senza macchia e foglio con macchia. A ognuna di queste configurazioni si può associare una diversa entità di informazione, per esempio note musicali (una se la macchia è presente sul foglio, e un’altra altrimenti), oppure lettere dell’alfabeto italiano, o cifre numeriche. Pur di raggiungere un opportuno accordo al riguardo, le entità di informazione rappresentate potrebbero essere anche molto complesse: il foglio senza macchia potrebbe rappresentare la Divina commedia e il foglio con la macchia I promessi sposi. Per interpretare le differenti configurazioni del supporto in termini di informazione è dunque necessario un codice, cioè una regola, la cui validità è concordata per convenzione tra tutti coloro che debbano usare quell’informazione con quel supporto. Il codice associa a ogni configurazione ammessa un’entità di informazione. La definizione di un codice comporta perciò che siano identificati in modo non ambiguo l’insieme delle possibili configura-

02txt.indd 18

12/01/22 08:38


Capitolo 2

L’informazione e la sua codifica

19

zioni del supporto e l’insieme delle possibili entità di informazione cui ci si vuole riferire: definendo il codice si specifica una regola di associazione degli elementi del primo insieme a elementi del secondo. Variando il codice è dunque possibile riferirsi a entità di informazione anche completamente differenti utilizzando uno stesso supporto fisico (per un esempio, ci si riferisca ancora alla Figura 2.3). 2.1.2

Configurazioni e configurazioni elementari, simboli e messaggi

Generalmente si adottano supporti fisici le cui configurazioni sono costituite da successioni di configurazioni più semplici, o “configurazioni elementari”. È il caso della pagina su cui è scritto questo testo: la sua configurazione complessiva, che viene appunto letta come un unico testo, è ottenuta mediante un’opportuna giustapposizione di macchie di inchiostro, ognuna delle quali porta come informazione una lettera dell’alfabeto italiano, o una cifra, o un segno di punteggiatura. In questi casi, ben noti all’esperienza comune, si applica dunque un principio di composizionalità: come la configurazione del supporto è ottenuta dall’insieme ordinato delle configurazioni elementari da cui esso è costituito, così l’informazione complessivamente portata dal supporto, chiamata messaggio, si ricava dall’insieme ordinato dei simboli, cioè delle entità di informazione che corrispondono alle singole configurazioni elementari. Riepilogando: ⦁ il supporto fisico assume una configurazione scelta all’interno dell’insieme ⦁ ⦁ ⦁ ⦁

02txt.indd 19

delle possibili configurazioni: per esempio, una configurazione è l’insieme delle macchie di inchiostro su questa pagina; ogni configurazione è definita come una successione di configurazioni elementari, in cui ogni configurazione elementare è scelta all’interno dell’insieme delle possibili configurazioni elementari: per esempio, una configurazione elementare è la macchia di inchiostro corrispondente a una lettera su questa pagina; è definito l’insieme dei messaggi, cioè delle entità di informazione che possono essere associate alle configurazioni del supporto fisico: per esempio, un messaggio è il testo scritto su questa pagina; così come una configurazione è ottenuta come una composizione di configurazioni elementari, un messaggio è ottenuto componendo dei simboli, cioè delle “entità elementari di informazione”: per esempio, sono simboli una lettera dell’alfabeto italiano, un segno di punteggiatura, uno spazio tra parole; il codice che stabilisce una relazione tra configurazioni del supporto fisico e messaggi è in effetti definito da una relazione tra configurazioni elementari e simboli (per esempio, questa relazione stabilisce che a una certa macchia sulla pagina viene associata una certa lettera dell’alfabeto italiano), oltre che da una regola che specifica come i simboli devono essere composti per generare un messaggio. Nel caso dell’italiano questa regola indica semplicemente che le entità di informazione che corrispondono alle lettere e agli altri segni devono essere lette da sinistra a destra. Più complesso è, per esempio, il codice per i numeri, che specifica non solo che “10” è diverso da “01” ma anche che “10” sta per il numero dieci.

12/01/22 08:38


20

Capitolo 2

L’informazione e la sua codifica

La scomposizione di configurazioni in configurazioni elementari e corrispondentemente di messaggi in simboli è molto potente: volendo interpretare il messaggio scritto in una configurazione del supporto fisico basta infatti disporre di un codice che associ configurazioni elementari a simboli e di una regola che indichi come comporre i simboli in un messaggio (nell’esempio indicato tale regola è particolarmente semplice: leggere ogni riga di simboli da sinistra a destra e dall’alto al basso). Il codice da configurazioni elementari a simboli ha generalmente un grado di complessità assai inferiore a quello del codice da configurazioni a messaggi, quindi, operativamente, è più semplice da memorizzare e applicare. 2.1.3

Livelli di informazione e significato

Consideriamo l’esempio di un messaggio trasmesso mediante un telegrafo in cui si adotta il codice Morse. Il supporto fisico è in tal caso un conduttore elettrico la cui configurazione è rapidamente variabile nel tempo, dato che si fa transitare in esso corrente continua a intervalli, per periodi brevi oppure lunghi, intervallata da periodi di assenza di corrente. Poiché i simboli che si vogliono utilizzare sono “punti” e “linee”, che verranno poi impiegati in opportune successioni per codificare le lettere dell’alfabeto, è necessario scegliere una regola che specifichi, in riferimento alla corrente elettrica, come punti e linee sono rappresentati sul supporto fisico. Per esempio: ⦁ passa corrente per 1 s ⇒ punto ⦁ passa corrente per 2 s ⇒ linea ⦁ non passa corrente per 1 s ⇒ separazione tra punti e linee della stessa ⦁ non passa corrente per 2 s ⇒ separazione tra due lettere

lettera

Allora, per esempio, “passa corrente per 1 s, non passa per 1 s, passa per 2 s” è la configurazione che corrisponde alla successione di simboli “punto linea”. È poi noto che il codice Morse specifica una relazione tra successioni di punti e linee e lettere dell’alfabeto (e cifre): ⦁ ⦁ ⦁ ⦁

punto linea ⇒ lettera “A” linea punto punto punto ⇒ lettera “B” linea punto linea punto ⇒ lettera “C” ecc.

In questo insieme di regole, a sinistra delle frecce compaiono simboli e a destra altri simboli a essi corrispondenti. La relazione che associa messaggi a configurazioni del supporto fisico può essere dunque complessa. Nel caso illustrato, per esempio: ⦁ configurazione del supporto fisico (livello fisico, LF):

passa corrente per 2 s, non passa per 1 s, passa per 1 s, non passa per 2 s, passa per 2 s, non passa per 1 s, passa per 2 s, non passa per 1 s, passa per 2 s ⦁ messaggio, al livello logico 1 (LL1): linea punto, separazione di lettera, linea linea linea ⦁ messaggio, al livello logico 2 (LL2): “N” “O” ⦁ messaggio, al livello logico 3 (LL3): “NO”, con il significato (per esempio) di “incontro non confermato”

02txt.indd 20

12/01/22 08:38


Capitolo 2

L’informazione e la sua codifica

21

Le relazioni tra questi livelli sono basate ognuna su un codice che interpreta il significato delle entità che compaiono al livello precedente in termini delle entità del livello successivo: possono perciò essere intese come relazioni di significazione. Per esempio, la relazione tra LF e LL1 stabilisce il significato che viene attribuito alle configurazioni del supporto fisico (passa o non passa corrente nel conduttore e per quanto tempo) in termini di entità più astratte: punti e linee. A sua volta, la relazione tra LL1 e LL2 assegna un significato a successioni di tali punti e linee in termini di lettere dell’alfabeto. Infine, la relazione tra LL2 e LL3 sottintende una convenzione stipulata tra i due comunicanti, che hanno concordato che il messaggio “NO” significa “incontro non confermato” (si può immaginare che le entità di informazione riconosciute come possibili secondo questo particolare codice fossero “NO” e “SÌ”). È chiaro che questo genere di attribuzione di significato a una configurazione del supporto fisico o a un’entità di informazione è convenzionale: a una stessa configurazione o entità sono quindi associabili significati differenti, senza che nessuno di questi sia in alcun modo “più giusto”, o “più necessario”, degli altri. Approfondimento 2.2

Informazione sintattica, semantica e pragmatica Si è visto come il concetto di informazione intervenga ad almeno due livelli distinti: un livello fisico, in cui l’informazione è connessa alla selezione di una specifica configurazione da un insieme di configurazioni possibili, e un livello logico, in cui per ogni configurazione si stabilisce un significato in termini di entità di informazione, o messaggi. Si può considerare in effetti un terzo livello in cui interviene il concetto di informazione, allorché a una configurazione del supporto fisico cui si è attribuito un significato si intende associare un “valore”, che metta in evidenza se e in quale misura lo scopo per cui l’informazione è stata generata / trasmessa / ricevuta è stato raggiunto. In sintesi, questi tre livelli possono essere caratterizzati come segue: 1. si tratta di informazione quando ci si chiede se un certo supporto fisico è adatto, in base alle configurazioni che può assumere, a mantenere un certo messaggio. Ci si pone dunque un problema di relazioni tra segni, cioè tra configurazioni del supporto fisico. A questo livello si parla di informazione sintattica; 2. si tratta di informazione quando ci si chiede quale significato sia da attribuire a una certa configurazione del supporto fisico. Ci si pone dunque un problema di relazioni tra segni e significati. A questo livello si parla di informazione semantica; 3. si tratta infine di informazione quando ci si chiede quale valore sia da attribuire a una certa configurazione del supporto fisico. Ci si pone dunque un pro-

02txt.indd 21

blema di relazioni tra segni (e significati) e valori. A questo livello si parla di informazione pragmatica. Ognuna di queste accezioni del concetto di informazione implica, nei fatti se non logicamente, la precedente: ha senso porsi il problema semantico di quale sia il significato di una configurazione solo dopo che si sia risolto il problema sintattico se una tale configurazione possa avere un tale significato, e generalmente ha senso porsi il problema pragmatico di quale sia il valore del significato di una configurazione solo dopo che si sia risolto il problema semantico se un tale significato sia effettivamente associato a una tale configurazione. Mentre l’informazione sintattica è dunque in sé oggettiva e dipende solo dalle caratteristiche fisiche del supporto che si adotta, l’informazione semantica e ancor più quella pragmatica includono una certa componente di soggettività, dovuta al fatto che una stessa configurazione potrebbe avere (e in certa misura sempre ha) significati e valori differenti per individui differenti. Tornando all’esempio di una trasmissione telegrafica che utilizza il codice Morse, la trasmissione certamente porta informazione sintattica, e più formalmente si può dire che fornisce una “quantità di informazione” non nulla e misurabile, poiché le configurazioni che il supporto può assumere sono molteplici. La trasmissione può portare informazione semantica (la quantità di informazione semantica viene spesso definita come

12/01/22 08:38


22

Capitolo 2

L’informazione e la sua codifica

il “contenuto” del messaggio) soltanto se il destinatario del messaggio è in grado di associare alla configurazione un significato, cioè se conosce l’alfabeto Morse e ha concordato una semantica comune con colui che ha inviato il messaggio. Nel caso in cui il significato del messaggio sia compreso, la quantità di informazione pragmatica varierà poi in base alla rilevanza che il destinatario stesso attribuisce al messaggio. Se il messaggio inviato è scritto in una lingua non nota al destinatario, la quantità di informazione semantica e la quantità di informazione pragmatica saranno nulle, mentre la quantità di informazione sintattica, che è appunto indipendente dall’effettiva comprensione del messaggio, sarà comunque maggiore di zero. Su queste basi, a partire dal 1920 circa è stata stabilita una teoria dell’informazione sintattica, il cui obiettivo è fornire dei criteri per stabilire se un supporto è adeguato alla trasmissione di segnali, e se tale trasmissione è accurata. Tanto tale teoria è sviluppata e utilizzata, quanto invece una teoria dell’informazione semantica (e a maggior ragione una teoria dell’infor-

2.1.4

mazione pragmatica) è ancora in uno stato iniziale, così che quando si parla tout court di “teoria dell’informazione” si intende solitamente la teoria che tratta degli aspetti sintattici dell’informazione. Per quale ragione ci si dovrebbe interessare al solo livello sintattico? Un adeguato trattamento dell’informazione pone dei problemi con un rilevante impatto sul versante tecnologico, quali: un certo supporto può essere utilizzato per la memorizzazione di una certa quantità di informazione? con quale velocità una certa quantità di informazione può essere trasferita a distanza mediante un certo supporto? con quale grado di accuratezza un certo messaggio è stato trasmesso? È importante notare come la risoluzione di tali problemi non richieda che sia compreso un significato per l’informazione al cui trattamento si è interessati, quindi possa essere raggiunta a un livello anche solo puramente sintattico. Anche qui, nel seguito, ci si interesserà esclusivamente del livello sintattico dell’informazione, ed è a esso che ci si riferirà parlando, per brevità, di “informazione”.

Informazione e riduzione dell’incertezza

La presenza di informazione è dunque condizionata dal fatto che il supporto fisico adottato sia in grado di assumere una varietà di configurazioni differenti. Questa condizione si riferisce a una caratteristica del supporto fisico ed è quindi oggettiva, ma ha comunque un risvolto soggettivo, dal punto di vista di un essere umano che leggendo il supporto sia interessato all’informazione da esso portata. Se la nostra ignoranza, o più formalmente la nostra incertezza, circa l’effettiva configurazione del supporto viene ridotta dall’accesso al supporto, allora sembra del tutto ragionevole affermare che tale atto ha portato dell’informazione. Se fossimo in grado di valutare il grado di incertezza in cui ci trovavamo prima della lettura e quello successivo a essa, la quantità di informazione portata dalla configurazione che abbiamo letto sul supporto potrebbe essere definita proprio come una funzione della differenza tra tali gradi di incertezza. Si supponga di conoscere le possibili configurazioni di un supporto prima di accedervi ma di non sapere quale di queste sia quella effettivamente assunta. Se dalla lettura del supporto siamo in grado di stabilirne la configurazione, allora la lettura è analoga alla selezione di un elemento da un insieme di elementi noti, come nel caso dell’estrazione di una pallina da un’urna di cui conosciamo il contenuto: quanto più è numeroso l’insieme, tanto maggiore sarà allora l’informazione portata dalla lettura (detto altrimenti, e in modo più preciso: quanto meno è probabile che si presenti una configurazione, tanto maggiore è l’informazione che essa porta). Su questa idea si basa la misura della quantità di informazione proposta da Ralph Hartley nel 1928 e generalizzata da Claude Shannon nel 1948. Si può notare che questa modalità di quantificazione non richiede che sia associato alcun significato alla configurazione: l’urna potrebbe contenere

02txt.indd 22

12/01/22 08:38


Capitolo 2

L’informazione e la sua codifica

23

palline contrassegnate da numeri, di cui un significato è comunque noto, oppure da ideogrammi in una lingua che ci è ignota, e il discorso circa l’informazione portata dalla lettura manterrebbe comunque la sua validità. Questa interpretazione del concetto di informazione è dunque mantenuta al livello puramente sintattico. La quantità di informazione che si ottiene selezionando una configurazione da un insieme che ne contiene due assume il ruolo di “unità elementare” di informazione ed è chiamata bit. La risposta “sì” oppure “no” a una domanda porta dunque 1 bit di informazione, la risposta a due domande di tal genere (che corrisponde alla selezione tra quattro alternative: “sì-sì”, “sì‑no”, “no-sì”, “no-no”) porta 2 bit di informazione, e così via.

2.2

La codifica dei dati e delle istruzioni

Introdotto il concetto di informazione, è ora possibile esaminare le modalità di codifica dell’informazione che sono più frequentemente utilizzate nelle tecnologie dell’informazione e della comunicazione. È utile a questo punto far riferimento all’architettura del modello di von Neumann presentato nel capitolo precedente: l’unità di elaborazione manipola i dati ed esegue le istruzioni contenute nell’unità di memorizzazione. Per questo motivo le istruzioni e i dati devono essere codificati in un formato adatto alla memorizzazione e alla manipolazione da parte di un esecutore automatico. Si consideri come esempio la formalizzazione dei valori numerici che viene comunemente adottata: per rappresentare i numeri si utilizzano successioni di simboli, scelti da un insieme finito detto alfabeto. Nella rappresentazione usuale dei numeri, per esempio, l’alfabeto consiste, oltre che nelle cifre ‘0’, ‘1’, ..., ‘9’, nel separatore decimale (‘,’), nel separatore delle migliaia (‘.’) e nei segni positivo (‘+’) e negativo (‘−’). Si noti che non tutte le successioni dei simboli compresi nell’alfabeto identificano in modo corretto un dato. Per esempio, mentre la successione “1.234,5” è la rappresentazione di un numero, “1,23,45” non lo è. A ogni alfabeto è quindi associato un insieme di regole di composizione che definiscono le successioni ben formate, cioè quelle che appunto consentono di identificare dei dati. Per dati numerici una di tali regole stabilisce per esempio che può essere presente al più un separatore decimale, mentre una frase in lingua italiana è ben formata se, tra l’altro, non include due segni di punteggiatura contigui. Come si è visto, successioni ben formate di simboli di un alfabeto sono associate a dati mediante codici. Nel caso dei numeri, il codice normalmente adottato è basato sulla posizione delle cifre (e perciò è chiamato “notazione posizionale”); il significato della successione “1.234,5” è 1 migliaio sommato a 2 centinaia sommato a 3 decine sommato a 4 unità sommato a 5 decimi, più sinteticamente: 1 × 103 + 2 × 102 + 3 × 101 + 4 × 100 + 5 × 10−1 mentre per esempio a “1,23,45” non è attribuito alcun significato perché non si tratta di una successione ben formata. Si noti che uno stesso alfabeto può dare luogo a interpretazioni diverse al variare del codice: nei Paesi anglo-

02txt.indd 23

12/01/22 08:38


24

Capitolo 2

L’informazione e la sua codifica

sassoni, per esempio, i caratteri di separazione delle migliaia e dei decimali sono invertiti rispetto alla convenzione indicata sopra. Pertanto, in Italia la successione “123,456” si interpreta come “centoventitré virgola quattrocentocinquantasei millesimi”: 1 × 102 + 2 × 101 + 3 × 100 + 4 × 10−1 + 5 × 10−2 + 6 × 10−3 mentre in Inghilterra corrisponde a “centoventitremila quattrocentocinquantasei”: 1 × 105 + 2 × 104 + 3 × 103 + 4 × 102 + 5 × 101 + 6 × 100 due valori evidentemente diversi tra loro (questa differenza di codifica crea un problema di notazione relativo a quale separatore decimale utilizzare. Il motivo per cui ci si adeguerà qui alla convenzione anglosassone, impiegando quindi il carattere ‘.’, è che nei linguaggi di programmazione è questa la codifica adottata. Per non ingenerare confusione, come separatore di migliaia si utilizzerà uno spazio oppure l’apice diritto). Il numero di simboli dell’alfabeto determina il numero delle possibili successioni diverse costituite da un numero prefissato di simboli. Per esempio, con un alfabeto di 10 simboli, supponiamo le cifre del sistema decimale, si ottengono 103 diverse successioni di 3 simboli, da “000” a “999”, che nella codifica comunemente adottata corrispondono ai numeri interi positivi costituiti al più da tre cifre. In generale, dato un alfabeto di n simboli, si ottengono nk diverse successioni di lunghezza k, naturalmente non tutte necessariamente ben formate. 2.2.1

La codifica binaria

L’alfabeto più semplice che si possa adottare per la codifica di dati e istruzioni è costituito da due soli simboli, di solito indicati convenzionalmente come ‘0’ e ‘1’ (ma non c’è nulla di specifico, e in particolare nulla di quantitativo, in questa indicazione: invece di ‘0’ e ‘1’ tali simboli potrebbero essere denotati come “bianco” e “nero”, “vero” e “falso” ecc.). Gli attuali calcolatori impiegano per la memorizzazione dei dati e delle istruzioni proprio dei dispositivi, detti bistabili, in grado di assumere stabilmente una configurazione scelta tra due differenti (per esempio in corrispondenza alla presenza o assenza di un determinato valore di tensione elettrica ai capi del dispositivo): un alfabeto di questo genere, chiamato binario, è alla base dell’elaborazione automatica dell’informazione. I dispositivi bistabili sono usualmente chiamati bit, da binary digit (cifra binaria): come le cifre decimali sono gli elementi base nella rappresentazione usuale dei numeri decimali, i bit sono dunque gli elementi dei codici utilizzati dai calcolatori (il bit è anche l’unità elementare di informazione: benché i due significati siano distinti, ci sono delle ovvie ragioni per questa sinonimia). Nell’ipotesi che una qualsiasi successione di bit sia ben formata, con k bit si possono ottenere 2k successioni diverse. Per esempio, le 23 = 8 successioni di 3 bit sono 000, 001, 010, 011, 100, 101, 110 e 111. A una successione di 8 bit, con cui si possono dunque rappresentare 28 = 256 dati diversi, si dà il nome di byte, e di questo si considerano i multipli kilobyte, megabyte, gigabyte, terabyte ecc., rispettivamente indicati con le sigle KB, MB, GB, TB ecc. Nel Sistema Inter-

02txt.indd 24

12/01/22 08:38


Capitolo 2

L’informazione e la sua codifica

25

Approfondimento 2.3

Rappresentazione binaria e realizzazione fisica dei calcolatori Il grande impiego della rappresentazione binaria per l’informazione deriva dalla facilità con cui è possibile trovare in natura fenomeni fisici, e corrispondentemente costruire dispositivi, che siano bistabili, cioè che in ogni istante assumano stabilmente uno stato scelto tra due possibili. Una comune lampadina elettrica, per esempio, in ogni istante può essere accesa o spenta, senza possibilità di equivoco; altri esempi notevoli sono costituiti dallo stato di polarizzazione di un materiale magnetico (convenzionalmente “positivo” o “negativo”), dallo stato di un interruttore elettrico (che può essere “chiuso” o “aperto”), ma anche da un banale recipiente per liquidi (che può essere “vuoto” o “pieno”, ovvero “non vuoto”). L’ultimo esempio, sebbene di scarsa utilità pratica, offre lo spunto per una riflessione, in quanto costituisce un caso in cui sembra apparentemente facile definire lo stato “vuoto”, mentre è necessario chiedersi quanto liquido deve essere contenuto nel recipiente affinché esso possa essere considerato inequivocabilmente pieno. Tale problema sarà approfondito nel seguito di questo capitolo. In linea di principio, uno qualsiasi di questi fenomeni è ugualmente valido per mantenere e trasformare informazione, ma allo stato attuale questioni di costo e di efficienza privilegiano la tecnologia elettronica come la migliore scelta per la realizzazione dei calcolatori. Il motivo principale è l’esistenza del transistor, un componente elettronico che può essere usato come un interruttore, operando come un dispositivo bistabile. Il successo del transistor è dovuto alla possibilità di produrlo in maniera economica concentrandone un gran numero su piccole superfici e all’alta velocità con cui è possibile comandarne la commutazione tra i due stati. Il termine “transistor” individua una classe di dispositivi elettronici realizzati in modi diversi e con materiali diversi, ma caratterizzati dallo stesso comportamento. A titolo di esempio, consideriamo il transistor BJT focalizzandoci solo sul suo uso come interruttore. I transistor presentano 3 connettori, detti in questo caso collettore, base ed emettitore, indicati nella seguente configurazione (che include una resistenza di protezione):

Collettore

Va

Vu

Vi Base

Emettitore

Quando alla base è applicata un’opportuna tensione elettrica di ingresso Vi, il transistor si comporta come un interruttore chiuso (ricordiamo che un interruttore chiuso consente lo stabilirsi di una corrente elettrica nel circuito in cui è inserito; in pratica, la terminologia per gli interruttori è opposta a quella per le porte, che permettono il passaggio quando sono aperte), quindi la corrente fluisce dal collettore verso l’emettitore, che in questa configurazione è a potenziale minimo, essendo messo a terra: di conseguenza la tensione di uscita Vu è nulla. Viceversa, se la tensione applicata in ingresso è nulla, il transistor si comporta come un interruttore aperto e la tensione di uscita è pari alla tensione di alimentazione Va. Questo meccanismo consente di utilizzare il transistor per mantenere un bit di informazione, che può essere letto in uscita senza cancellarlo, semplicemente pilotando opportunamente la tensione di ingresso, con il vantaggio di avere un periodo di commutazione molto breve, dell’ordine del nanosecondo. Nonostante la sua versatilità, la tecnologia elettronica comincia tuttavia a mostrare i propri punti vulnerabili, costituiti dall’eccessivo aumento dell’assorbimento di potenza (e della conseguente necessità di dissipazione di calore) al crescere della frequenza operativa e dalla impossibilità di spingere all’infinito la miniaturizzazione dei componenti utilizzati con il miglioramento dei processi produttivi (già oggi lo spessore dei conduttori è di pochi atomi). Sebbene esistano ancora margini di miglioramento, nulla fa escludere che nel prossimo futuro la tecnologia elettronica possa essere affiancata da altre tecnologie (ottiche, già molto diffuse, o basate per esempio sulla fisica dei quanti o sulla nanotecnologia meccanica), o addirittura rimpiazzata in alcune applicazioni di punta.

nazionale di Unità, i prefissi kilo, mega, giga, tera ecc. sono per convenzione associati a potenze crescenti di 10, rispettivamente 103, 106, 109, 1012 ecc.; nel caso binario, questi multipli sono invece associati alle potenze di 2, cercando comunque di approssimare i valori comunemente utilizzati: un kilobyte corrisponde quindi a 210 = 1024 byte, un megabyte a 210 kilobyte e quindi a 220 = 1 048 576 byte, un gigabyte a 230 byte, un terabyte a 240 byte, e così via.

02txt.indd 25

12/01/22 08:38


26

Capitolo 2

L’informazione e la sua codifica

Approfondimento 2.4

La norma IEC per i prefissi binari La sempre più ampia diffusione delle tecnologie dell’informazione e della comunicazione ha reso critica l’ambiguità sottostante all’uso dei prefissi definiti dal Sistema Internazionale di unità per indicare dei valori binari. Basti pensare che all’aumentare di una grandezza aumenta anche l’errore che si commette nell’interpretare la grandezza come binaria invece che decimale (o viceversa); in effetti, la differenza tra 103 e 210 è di circa il 2%, mentre la differenza tra 1012 e 240 è di quasi il 10%! Un caso sintomatico è quello dei dispositivi di memoria per calcolatori. Dal momento che i produttori tendono a impiegare il Sistema Internazionale, un disco dichiarato per esempio da 120 GB contiene 120 000 000 000 byte. Gli utenti sono invece ormai abituati a considerare le dimensioni della memoria, a prescindere dal fatto che si tratti di RAM o di memoria di massa, in termini di potenze di 2, pertanto si aspettano che un disco da 120 GB contenga 120 × 2030 = 128 849 018 880 byte. Problemi analoghi si pongono nel mondo delle telecomunicazioni, in cui da sempre viene utilizzato il Sistema Internazionale, con la conseguenza che una velocità di trasmissione dei dati lungo una rete per Grandezza

Nome

Simbolo

Kilo binario

Kibi

Ki

210

esempio di 100 megabit/secondo corrisponde esattamente a 100 × 106 bit/secondo, a differenza di quanto molti utenti potrebbero immaginare. È interessante segnalare, in un contesto così confuso, la posizione della International Electrotechnical Commission (IEC), che ha pubblicato una norma per l’introduzione di prefissi binari diversi da quelli del Sistema Internazionale, come indicato nella tabella che segue. L’utilizzo di questi prefissi può risolvere l’ambiguità nell’espressione delle grandezze binarie: per esempio la capacità di un disco fisso può essere 120 GB = 111.76 GiB. A tutt’oggi, comunque, i prefissi binari sono adottati in modo limitato e si tende piuttosto sempre più spesso a impiegare i prefissi del Sistema Internazionale nella loro accezione originale, quella cioè che fa riferimento alle potenze di 10. Considerando che spesso i valori numerici di cui si tratta sono molto elevati, vale per altro l’indicazione generale che in molti casi è sufficiente far riferimento a tali valori in termini di soli ordini di grandezza, per cui per esempio 1 MB è un valore dell’ordine di 1 KB × 1 KB, cioè, più o meno, 1 milione di byte. È questa l’impostazione che adotteremo anche nel resto di questo libro. Valore 1024

Analogo SI

Differenza %

103

2.40% 4.86% 7.37%

Mega binario

Mebi

Mi

(210)2

1 048 576

(103)2

Giga binario

Gibi

Gi

(210)3

1 073 741 824

(103)3

Tera binario

Tebi

Ti

(210)4

1 099 511 627 776

(103)4

9.95%

Peta binario

Pebi

Pi

(210)5

1 125 899 906 842 624

(103)5

12.59%

Exa binario

Exbi

Ei

(210)6

1 152 921 504 606 846 976

(103)6

15.29%

1 180 591 620 717 411 303 424

(103)7

18.06%

1 208 925 819 614 629 174 706 176

(103)8

20.89%

Zetta binario

Zebi

Zi

(210)7

Yotta binario

Yobi

Yi

(210)8

Nelle pagine che seguono vengono dapprima presentate le modalità di codifica binaria abitualmente adottate per i dati non numerici e per le istruzioni. Successivamente si affronta il problema della codifica binaria dei dati numerici. 2.2.2

La codifica dei dati non numerici

Nella gran parte delle applicazioni informatiche è necessario trattare con dati non numerici, come singoli caratteri alfanumerici (‘a’, ‘b’, ..., ‘Y’, ‘Z’, ‘;’, ...) e loro successioni, che vengono generalmente denominate stringhe. Per esempio la stringa “fare” è composta dai caratteri ‘f’, ‘a’, ‘r’, ‘e’, la stringa “Informatica” è formata dai caratteri ‘I’, ‘n’, ‘f’, ‘o’, ‘r’, ‘m’, ‘a’, ‘t’, ‘i’, ‘c’, ‘a’.

02txt.indd 26

12/01/22 08:38


Capitolo 2

L’informazione e la sua codifica

27

Per comprendere come sia possibile codificare in modo binario questi caratteri, si prenda in esame un esempio più semplice, ma abbastanza comune: in molte applicazioni occorre memorizzare ed elaborare i riferimenti ai giorni della settimana, dal lunedì alla domenica. Come già detto, l’unità elementare di informazione elaborata da un calcolatore è il bit, un elemento che può assumere il valore 0 o 1. Considerato un insieme di dati da codificare, un singolo bit consente di distinguere i dati in due sottoinsiemi. In riferimento ai giorni della settimana, con un bit si possono distinguere per esempio i giorni che si trovano nella prima metà della settimana, associati al valore 0, dai successivi, associati al valore 1. Essendo l’insieme composto da un numero dispari di elementi, si ipotizzi per esempio che i primi quattro giorni (considerando il lunedì come primo giorno della settimana) appartengano al primo sottoinsieme e i tre successivi al secondo. Questa classificazione non consente però ancora di identificare in modo univoco la posizione di un giorno all’interno della settimana: del giovedì, per esempio, si può solo concludere che appartiene alla prima metà. Il ragionamento può essere però ripetuto sul sottoinsieme relativo alla prima metà della settimana, suddividendolo a sua volta in due sottoinsiemi, identificati con un secondo bit. Il sottoinsieme {lunedì, martedì} viene così associato alla successione 00, mentre {mercoledì, giovedì} a 01. L’identificazione viene resa univoca introducendo un terzo bit, così che la posizione del giovedì all’interno della settimana viene codificata dalla successione 011. Per identificare un qualunque altro giorno non servono più di tre alternative: tre bit è quindi la quantità di informazione sufficiente per identificare univocamente un giorno della settimana. La Figura 2.5 riporta anche le successioni di bit associate agli altri giorni della settimana. In effetti, con tre bit si possono codificare 23 = 8 diverse entità di informazione, una in più di quanto richiesto in questo esempio. In generale, il problema è: dato un insieme S costituito da #S elementi, come identificare univocamente tali elementi mediante una codifica binaria, cioè impiegando un alfabeto composto da due soli simboli? Se si suppone, per semplicità, di adottare successioni binarie di lunghezza k costante, occorre allora stabilire il valore minimo k che permetta di rappresentare gli #S elementi dell’insieme S. Si è già detto come una successione di k bit consenta di identificare n = 2k elementi diversi; il problema posto è inverso: dato il numero #S di elementi da identificare, occorre ora determinare la lunghezza k delle successioni richieste. Dunque: k = ⎡log2 #S⎤ dove ⎡x⎤ denota la funzione che associa a un numero x il minimo intero maggiore o uguale a x. Per esempio, per codificare univocamente gli elementi di Lunedì Martedì Domenica Mercoledì Sabato Giovedì Venerdì

02txt.indd 27

Lunedì Giovedì Martedì Mercoledì Domenica Sabato Venerdì

0 1

Lunedì Martedì Giovedì Mercoledì Sabato Venerdì Domenica

00 01 10 11

Lunedì Martedì Mercoledì Giovedì Venerdì Sabato Domenica

000 001 010 011 100 101 110 111

Figura 2.5 Suddivisione dell’insieme dei giorni della settimana in sottoinsiemi identificati da diverse successioni di bit.

12/01/22 08:38


28

Capitolo 2

L’informazione e la sua codifica

un insieme S costituito da #S = 13 elementi occorrono successioni di almeno ⎡log2 13⎤ = ⎡3.7⎤ = 4 bit. Una volta determinata la lunghezza minima k che le successioni devono avere per generare una codifica distinta per ogni elemento di S, resta l’arbitrarietà di definire uno specifico codice. Per esempio, se S = { α , β , γ , δ } (quindi #S = 4), si può assegnare 00 ad α, 01 a β, 10 a γ e 11 a δ, oppure 11 ad α, 10 a β, 01 a γ e 00 a δ. Se si considera ancora l’esempio relativo ai giorni della settimana, la Figura 2.6 riporta un esempio di codifica diverso da quello illustrato in Figura 2.5, ma altrettanto valido. In questo caso si può notare come sia arbitraria anche la scelta delle configurazioni da utilizzare quando non tutte le 2k configurazioni possibili sono necessarie: nel primo esempio era la successione 111 a non essere associata a nessun giorno, mentre in questo secondo caso è la successione 000 a restare inutilizzata. Si consideri ora il problema di specificare una codifica binaria adatta a documenti scritti in un linguaggio naturale come l’italiano o l’inglese. In questo caso occorre stabilire innanzitutto il numero dei simboli da codificare: le lettere dell’alfabeto sono 26, che diventano 52 distinguendo maiuscole e minuscole; le cifre decimali sono 10 (da 0 a 9); una trentina di simboli servono per i segni di interpunzione e per caratteri di uso corrente (‘+’, ‘*’, ‘%’ ecc.). A questi si devono aggiungere alcuni caratteri speciali, associati a funzioni di controllo e che come tali non vengono stampati ma di cui, in alcuni casi (per esempio CANC, ESC, INVIO), esistono i tasti sulla tastiera dei calcolatori. Si arriva così a circa 120 simboli diversi, per la cui codifica sono perciò necessari almeno 7 bit (infatti 27 = 128: con successioni di 7 bit si possono codificare fino a 128 caratteri diversi). In effetti, il sistema di codifica tradizionale per la rappresentazione di caratteri alfanumerici è il cosiddetto codice ASCII (American Standard Code for Information Interchange), che nella sua versione originaria (Tabella 2.1) prevede proprio successioni di lunghezza k = 7 (esistono versioni estese del codice ASCII, basate su successioni di 8 bit, che consentono di rappresentare 256 caratteri, quindi anche caratteri non previsti nella lingua inglese come, per esempio, le lettere accentate). Simile ad ASCII è il codice EBCDIC (Extended Binary-Coded Decimal Interchange Code), sviluppato da IBM e basato anch’esso su successioni di 8 bit. In realtà i codici a 8 bit non sono sufficienti nemmeno per rappresentare l’insieme dei caratteri utilizzati in Europa: basti pensare alle lingue scandinave, all’alfabeto greco e a quello cirillico, e il problema diventa ancora più critico volendo trattare anche lingue extra-europee come l’arabo e le lingue orientali. Per rendere possibile la codifica contemporanea di questo grande insieme di caratteri è stato definito un ulteriore standard, UNICODE, basato Figura 2.6 Un secondo esempio di codifica dei giorni della settimana.

02txt.indd 28

Lunedì Martedì Domenica Mercoledì Sabato Giovedì Venerdì

Sabato Giovedì Martedì Domenica Lunedì Mercoledì Venerdì

0 1

Giovedì Martedì Sabato Mercoledì Domenica Lunedì Venerdì

00 01 10 11

Giovedì Sabato Martedì Domenica Mercoledì Venerdì Lunedì

000 001 010 011 100 101 110 111

12/01/22 08:38


Capitolo 2 Tabella 2.1

29

L’informazione e la sua codifica

Il codice ASCII a 7 bit: nella prima colonna sono riportati i primi tre bit della codifica, mentre nella prima riga sono riportati gli altri quattro bit; in questo modo il carattere che corrisponde al codice 1100001 si trova all’incrocio della riga 110 con la colonna 0001 (ed è il carattere ‘a’). I primi 32 caratteri non sono indicati perché corrispondono a caratteri di controllo

0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 010

space !

"

#

$

%

&

'

(

)

*

+

,

-

.

/

011

0

1

2

3

4

5

6

7

8

9

:

;

<

=

>

?

100

@

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

101

P

Q

R

S

T

U

V

W

X

Y

Z

[

]

^

_

110

a

b

c

d

e

f

g

h

i

j

k

l

m

n

o

111

p

q

r

s

t

u

v

w

x

y

z

{

|

}

~

canc

su successioni di 16 bit e quindi in grado di codificare 216 = 65 535 diversi caratteri. Per facilitare il passaggio da ASCII a UNICODE, i primi 128 caratteri del codice UNICODE sono gli stessi del codice ASCII. I successivi invece corrispondono ad altri alfabeti (greco, cirillico, armeno, ebraico, devanagari ecc.), a simboli di utilizzo particolare (interpunzione, segni diacritici, simboli di valute, simboli matematici, simboli grafici ecc.), a simboli utili per la scrittura delle lingue orientali (simboli fonetici, ideogrammi ecc.). Purtroppo, anche UNICODE non riesce a coprire tutti i simboli utilizzati da tutte le lingue del mondo (e il fatto che gli alfabeti occidentali siano, in qualche modo, privilegiati rispetto ai simboli utilizzati nelle lingue orientali potrebbe offrire un sottile punto di discussione nel confronto attuale sui temi della globalizzazione). In effetti è stato stimato che siano più di 200 000 i simboli utilizzati in tutto il mondo, ma il problema ha una natura diversa dalla semplice copertura estensionale dei simboli. Si consideri, per esempio, cosa succede quando si introduce un nuovo termine: a differenza di quanto accade per l’italiano o l’inglese, in cui nuovi termini si compongono comunque da simboli alfabetici esistenti, nella codifica delle lingue non alfabetiche come il giapponese o il cinese occorre introdurre nuovi simboli per i nuovi termini e questo rende decisamente complessa la definizione di un adeguato alfabeto di simboli. 2.2.3

La codifica delle istruzioni

Per rendere possibile l’esecuzione di programmi da parte di un calcolatore è necessario che questi siano codificati mediante un linguaggio, chiamato linguaggio macchina, che l’unità di elaborazione del calcolatore è in grado di interpretare. Data la scelta di impiegare dispositivi bistabili, per definire questo linguaggio ancora una volta si impiega un alfabeto composto da due soli simboli, ‘0’ e ‘1’. La codifica delle istruzioni segue allora lo schema presentato in precedenza per i caratteri alfanumerici: stabilite quante e quali sono le istruzioni da codificare, si determina la lunghezza delle successioni di bit e si procede a stabilire una corrispondenza tra istruzioni e successioni di bit. La Tabella 2.2 presenta un esempio in cui la codifica è basata su successioni di 8 bit: in questo caso il sottosistema di elaborazione sarebbe dunque in grado di interpretare ed eseguire al massimo 28 = 256 diverse istruzioni. A ogni istruzione è assegnato un codice univoco (chiamato codice operativo, opcode in breve), che l’esecutore deve decodificare per identificare quali operazioni effettuare. La scelta delle configurazioni da assegnare alle diverse

02txt.indd 29

12/01/22 08:38


30

Capitolo 2

L’informazione e la sua codifica Tabella 2.2 Esempio di codifica a 8 bit delle istruzioni per un linguaggio macchina Istruzioni aritmetico-logiche

Istruzioni per il trasferimento dati

Istruzioni di controllo

Codice

Istruzione

Codice

Istruzione

Codice

Istruzione

0111 1100

ADD

1110 1000

LOAD

0100 1001

IF_EQ

0111 1101

SUB

1111 1000

STORE

0100 1000

GOTO

0111 1110

AND

... ... ...

... ... ...

0100 1100

RETURN

... ... ...

... ... ...

... ... ...

... ... ...

... ... ...

... ... ...

istruzioni viene compiuta cercando di rendere efficiente la fase di decodifica, un obiettivo talmente rilevante che spesso i progettisti preferiscono utilizzare un numero superiore di bit a quello minimo richiesto, quindi accettando di non utilizzare alcune configurazioni, pur di rendere la più semplice e quindi la più veloce possibile la fase di decodifica delle istruzioni. Oltre al codice operativo, un’istruzione deve anche contenere gli eventuali riferimenti ai dati necessari per completare l’esecuzione. Nel caso di una tipica operazione aritmetica come l’addizione, per esempio, è necessario che sia specificato dove leggere i due operandi da sommare e dove scrivere il risultato. Naturalmente il numero dei dati da specificare è variabile, in funzione delle istruzioni (si noti inoltre che alcuni dati potrebbero essere indicati implicitamente, per esempio imponendo che il risultato sia memorizzato nella stessa locazione di memoria da cui è prelevato il primo operando). La Figura 2.7 riporta alcuni esempi di formato delle istruzioni in linguaggio macchina. 2.2.4

La codifica binaria di dati numerici

Per comprendere le tecniche di codifica dei numeri in un calcolatore è utile far riferimento alla notazione decimale che si adotta abitualmente. Questa rappresentazione è di tipo posizionale, cioè il valore di ogni cifra dipende dalla sua posizione nella successione di simboli che rappresenta il numero. Per esempio, la successione “4243” è interpretata come 4 × 103 + 2 × 102 + 4 × 101 + 3 × 100. Una stessa cifra in posizioni differenti possiede valori diversi: i due simboli ‘4’ nell’esempio indicano rispettivamente le migliaia e le decine. Per un generico numero intero composto da n cifre si ha: cn −1cn − 2 ...c1c0 =

cn −1 × 10n −1 + cn − 2 × 10n − 2 + ... + c1 × 101 + c0 × 100

Codice operativo

Destinazione

Sorgente 1

Codice operativo

Destinazione

Sorgente 1

Codice operativo

Sorgente 2

Estensione del codice operativo Operando (immediato)

Operando (immediato)

Figura 2.7 Esempi di alcuni formati utilizzati per istruzioni in linguaggio macchina. La destinazione rappresenta la locazione di memoria dove collocare il risultato dell’operazione indicata dal codice operativo ed effettuata sui valori degli operandi collocati in memoria in sorgente 1 e 2 o forniti direttamente nel corpo dell’istruzione come operando immediato. Un’istruzione potrebbe non fornire un risultato esplicito (terzo caso). In alcuni casi l’istruzione viene ulteriormente caratterizzata con l’estensione del codice operativo.

02txt.indd 30

12/01/22 08:38


Capitolo 2

L’informazione e la sua codifica

31

dove ogni ci è una cifra tra 0 e 9. Una notazione visuale conveniente per favorire l’interpretazione posizionale delle cifre di un numero può essere data in forma tabellare, esplicitando di fatto quanto sottinteso nella pratica e indicando sopra ogni cifra il relativo fattore moltiplicativo: 103

102

101

100

4

2

4

3

Questa stessa rappresentazione può essere adottata anche per numeri espressi in una base di numerazione diversa da dieci, che metta a disposizione B cifre, comprese tra 0 e B − 1. In tal caso: cn −1 × B n −1 + cn − 2 × B n − 2 + ... + c1 × B1 + c0 × B 0

cn −1cn − 2 ...c1c0 =

Nel caso della numerazione binaria (dunque per B = 2), l’alfabeto comprende solo due cifre, 0 e 1, e il valore associato per esempio al numero 101100due (con il pedice indichiamo la base della numerazione adottata, quindi il codice per interpretare correttamente il numero) può essere convertito in base dieci nel seguente modo:

101100due  = + = + =

25

24

23

22

21

20

1

0

1

1

0

0

1dieci × 25dieci + 0dieci × 24dieci + 1dieci × 23dieci + 1dieci × 22dieci + 0dieci × 21dieci + 0dieci × 20dieci = 1dieci × 32dieci + 0dieci × 16dieci + 1dieci × 8dieci + 1dieci × 4dieci + 0dieci × 2dieci + 0dieci × 1dieci = 32dieci + 8dieci + 4dieci = 44dieci

In pratica ogni cifra della rappresentazione binaria viene interpretata in base dieci a seconda del peso che le viene associato dalla sua posizione nella rappresentazione binaria. Sviluppando tutti i conti in base dieci si ottiene la rappresentazione decimale del numero. Questo procedimento può essere adottato anche su numeri più grandi: 28

27

26

25

24

23

22

21

20

1

0

1

1

1

0

1

0

1

101110101due  = 1dieci × 28dieci + 0dieci × 27dieci + 1dieci × 26dieci + + 1dieci × 25dieci + 1dieci × 24dieci + 0dieci × 23dieci + + 1dieci × 22dieci + 0dieci × 21dieci + 1dieci × 20dieci = =1dieci × 256dieci + 0dieci × 128dieci + 1dieci × 64dieci + + 1dieci × 32dieci + 1dieci × 16dieci + 0dieci × 8dieci + + 1dieci × 4dieci + 0dieci × 2dieci + 1dieci × 1dieci = = 256dieci + 64dieci + 32dieci + 16dieci + 4dieci + 1dieci = = 373dieci Questi esempi mostrano la procedura che si può utilizzare per convertire la rappresentazione binaria di un numero nella corrispondente rappresentazione decimale. Il passaggio inverso, cioè dalla rappresentazione decimale a quella binaria, potrebbe essere effettuato nello stesso modo, rappresentando le diverse cifre del numero in notazione binaria e scrivendo, sempre in base due, anche il peso associato alle diverse cifre sulla base della posizione che

02txt.indd 31

12/01/22 08:38


32

Capitolo 2

L’informazione e la sua codifica

occupano. Per esempio, 565dieci può essere convertito in rappresentazione binaria come segue: 2 1 0 565dieci = 5dieci × 10 dieci + 6dieci × 10 dieci + 5dieci × 10 dieci = 10 1 = 101due × 1010 due + 110due × 1010 due + 101due × 10100due = = 101due × 1100100due + 110due × 1010due + 101due × 1due = = 111110100due + 111100due + 101due = 1000110101due Tuttavia questa operazione risulta complessa, a causa della nostra scarsa abitudine a operare con numeri rappresentati in basi diverse da quella decimale. È più comodo adottare una procedura diversa per convertire la rappresentazione decimale di un numero nella corrispondente rappresentazione binaria (o nella rappresentazione dello stesso numero in una qualsiasi altra base diversa da dieci). Si consideri di nuovo l’espressione: cn −1cn − 2 ...c1c0 = cn −1 × B n −1 + cn − 2 × B n − 2 + ... + c1 × B1 + c0 × B0 = = cn −1 × B n −1 + cn − 2 × B n − 2 + ... + c1 × B + c0 (infatti B1 = B e B 0 = 1) che rappresenta un generico numero scritto in una base B, che in questo contesto si può ipotizzare diversa da dieci. Dividendo il numero per il valore della base, il risultato che si ottiene è: cn −1 × B n −1 + cn − 2 × B n − 2 + ... + c1 × B + c0 B che può essere scomposto in modo da evidenziare quoziente e resto: cn −1 × B n −1 + cn − 2 × B n − 2 + ... + c1 × B c + 0 = B B c = cn −1 × B n − 2 + cn − 2 × B n −3 + ... + c1 + 0 B n−2 n −3 quoziente = cn −1 × B + cn − 2 × B + ... + c1 resto = c0 I valori del resto e del quoziente della divisione (come pure il valore del numero originario) non dipendono dalla base di rappresentazione adottata, perciò, quale che sia la base di rappresentazione utilizzata per eseguire le operazioni, il resto della divisione corrisponde all’ultima cifra della rappresentazione in base B del numero. Applicando lo stesso procedimento al quoziente risultante dal primo passaggio si ottiene la penultima cifra della rappresentazione in base B del numero e ripetendo la procedura è possibile ottenere tutte le altre cifre del numero. Per esempio, i passi necessari per convertire il numero 573dieci in un numero binario sono: 573dieci : 2dieci ⇒ quoziente 286dieci : 2dieci ⇒ quoziente 143dieci : 2dieci ⇒ quoziente 71dieci : 2dieci ⇒ quoziente 35dieci : 2dieci ⇒ quoziente 17dieci : 2dieci ⇒ quoziente 8dieci : 2dieci ⇒ quoziente 4dieci : 2dieci ⇒ quoziente 2dieci : 2dieci ⇒ quoziente 1dieci : 2dieci ⇒ quoziente

02txt.indd 32

286dieci 143dieci 71dieci 35dieci 17dieci 8dieci 4dieci 2dieci 1dieci 0dieci

resto resto resto resto resto resto resto resto resto resto

1dieci (cifra binaria meno significativa) 0dieci 1dieci 1dieci 1dieci 1dieci 0dieci 0dieci 0dieci 1dieci (cifra binaria più significativa)

12/01/22 08:38


Capitolo 2

L’informazione e la sua codifica

33

o, con la notazione usata per il calcolo manuale della divisione, iterata fino a ottenere un risultato nullo: 573 :2 1 286 :2 0 143 :2 1 71 :2 1 35 :2 1 17 :2 1 8 :2 0 4 :2 0 2 :2 0 1 :2 1 0 Alla fine, leggendo i resti dal basso verso l’alto, si ottiene la rappresentazione binaria del numero: 1 000 111 101due= 573dieci. Con una successione di n bit si possono rappresentare i 2n numeri naturali (cioè interi positivi) da 0 a 2n − 1 (nell’esempio riportato in Tabella 2.3, n è uguale a 4 quindi sono rappresentati i primi 24 = 16 numeri naturali, quelli che vanno da 0 a 15). La lunghezza delle successioni di bit adottate stabilisce quindi il massimo numero che può essere rappresentato. A proposito della rappresentazione dei numeri, è importante tenere in considerazione che, per varie questioni realizzative, il numero di bit con cui ogni calcolatore mantiene nella sua memoria gli oggetti è prefissato: si parla a questo riguardo di lunghezza dei registri di memoria, un valore che è generalmente un multiplo del byte. L’uso di registri a lunghezza fissa limita l’insieme dei numeri rappresentabili, con conseguenze che vedremo sulla realizzazione delle operazioni aritmetiche. Attualmente nei linguaggi di programmazione per la codifica dei numeri naturali si utilizzano prevalentemente successioni di 32 bit, che consentono quindi di rappresentare i numeri compresi tra 0 e 232 − 1 = 4 294 967 295 ≈ 4 × 109. Si noti che raddoppiando la lunghezza delle successioni il massimo numero rappresentabile aumenta esponenzialmente; per esempio passando da 32 a 64 bit il massimo numero rappresentabile diventa 264 − 1 ≈ 16 × 1018 = 1.6 × 1019 e cresce quindi di circa 10 ordini di grandezza (si dice che un valore è superiore a un altro di un ordine di grandezza quando il primo valore è circa dieci volte maggiore del secondo). A causa del minor numero di simboli dell’alfabeto binario rispetto a quello decimale, un numero codificato in notazione binaria richiede ovviamente più cifre rispetto a quelle impiegate in notazione decimale. Allora, per rendere più sintetica la scrittura dei numeri elaborati dai calcolatori, si sceglie Tabella 2.3

I primi 16 numeri naturali rappresentati nel sistema binario e in quello decimale

Base due

02txt.indd 33

dieci

Base due

dieci

Base due

dieci

Base due

dieci

0000

0

0100

4

1000

8

1100

12

0001

1

0101

5

1001

9

1101

13

0010

2

0110

6

1010

10

1110

14

0011

3

0111

7

1011

11

1111

15

12/01/22 08:38


34

Capitolo 2

L’informazione e la sua codifica

sovente di impiegare la base 16 (una notazione detta esadecimale), dunque impiegando un alfabeto di sedici cifre: {‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’}. La procedura per convertire una codifica decimale in esadecimale è analoga a quella presentata prima per la conversione in binario. Per esempio, i passi necessari per convertire il 573dieci in esadecimale sono: 573dieci : 16dieci ⇒ quoziente 35dieci resto 13dieci = Dsedici (cifra binaria meno significativa) 35dieci : 16dieci ⇒ quoziente 2dieci resto 3dieci = 3sedici 2dieci : 16dieci ⇒ quoziente 0dieci resto 2dieci = 2sedici (cifra binaria più significativa) Alla fine, leggendo i resti dal basso verso l’alto, si ottiene la rappresentazione esadecimale del numero: 23Dsedici = 1 000 111 101due = 573dieci. Poiché 16 = 24, questa notazione gode della seguente proprietà particolare: ciascuna cifra esadecimale corrisponde a un gruppo di quattro cifre binarie. Questa proprietà rende molto semplice la conversione dei numeri binari in numeri esadecimali. Considerando il numero ottenuto sopra, 1 000 111 101due, le cifre possono essere raggruppate a quattro a quattro, partendo da destra e spostandosi verso sinistra, ottenendo così 0010 0011 1101due avendo aggiunto due 0 per completare il gruppo più a sinistra. Se adesso a ciascun gruppo si associa la cifra esadecimale corrispondente, si arriva alla rappresentazione del numero in base sedici: 23Dsedici. 2.2.5

Codifica binaria dei numeri interi e operazioni aritmetiche

La codifica binaria dei numeri interi Il modo più semplice per codificare in binario i numeri interi, dunque positivi e negativi, consiste nell’indicarne il segno seguito dal valore assoluto (cioè appunto senza segno), come succede normalmente nella codifica decimale. Questa rappresentazione, chiamata codifica con modulo e segno, utilizza il primo bit della successione per indicare il segno (0 positivo e 1 negativo) e i restanti per la rappresentazione del valore assoluto del numero. Quando si hanno a disposizione n bit questa codifica consente di rappresentare i numeri interi compresi tra −2n −1 + 1 e 2n −1 − 1. Per esempio, con 4 bit a disposizione si possono rappresentare i numeri interi che vanno da −7 (= −24 −1 + 1) a 7 (= 24 −1 − 1), come illustrato in Tabella 2.4. La codifica con modulo e segno ha il difetto di duplicare la rappresentazione del numero 0, come se −0 fosse diverso da +0, riducendo di fatto di uno il numero dei valori rappresentabili. Tabella 2.4 Numeri interi rappresentati nel sistema binario utilizzando 4 bit e una codifica con modulo e segno Base due

02txt.indd 34

dieci

Base due

dieci

Base due

dieci

Base due

dieci −4

0000

+0

0100

+4

1000

−0

1100

0001

+1

0101

+5

1001

−1

1101

−5

0010

+2

0110

+6

1010

−2

1110

−6

0011

+3

0111

+7

1011

−3

1111

−7

12/01/22 08:38


Capitolo 2

L’informazione e la sua codifica

35

Per questo e altri motivi che vedremo più avanti, questa codifica è stata poco utilizzata nei calcolatori elettronici, dove si preferisce adottare la rappresentazione in complemento a due: il numero x viene rappresentato dal valore binario naturale corrispondente a 2n + x dove n è il numero esatto di bit utilizzati per la codifica. Si consideri, per esempio, di voler codificare dei numeri interi in complemento a 2 utilizzando esattamente 4 bit. In questo caso n 4 2= 2= 16 quindi la rappresentazione del numero x = +5dieci è n 2 + x = 16dieci +5dieci = 21dieci = 10101due, ma i bit disponibili per la codifica sono solo 4 perciò viene rimosso il bit più significativo (il primo della successione) conservando solo 0101C2 che rappresenta la codifica in complemento a due di +5dieci e che peraltro coincide con la codifica binaria naturale del numero 5dieci (anche se la rappresentazione naturale di 5dieci richiede solo 3 bit). Se invece si vuole rappresentare un numero negativo, per esempio −5dieci, si ottiene 16dieci − 5dieci = 11dieci = 01011due, da cui, eliminando ancora il bit più significativo, si ottiene 1011C2. Se si torna a considerare la notazione posizionale che associa a ciascuna cifra un peso che dipende dalla posizione della cifra, si può notare che nella rappresentazione binaria in complemento a due il valore rappresentato dal numero si può ottenere anche associando alla cifra più significativa un peso negativo, mentre tutte le altre cifre mantengono il peso originario positivo. In questo modo il valore di un numero cn−1cn−2...c1c0 scritto in complemento a due è dato dalla seguente espressione: −cn −1 × 2n −1 + cn − 2 × 2n − 2 + ... + c1 × 21 + c0 × 20 Per esempio, il valore del numero 0101C2 è −0 × 23 + 1 × 22 + 0 × 21 + 1 × 20 = 5dieci, mentre 1011C2 corrisponde a −1 × 23 + 0 × 22 + 1 × 21 + 1 × 20 = −5dieci. In particolare, la configurazione 0000C2 rappresenta −0 × 23 + 0 × 22 + 0 × 21 + 0 × 20 = 0dieci, mentre 1000C2 corrisponde a −1 × 23 + 0 × 22 + 0 × 21 + 0 × 20 = −8dieci. Esiste cioè una sola rappresentazione dello zero e le 16 diverse configurazioni di quattro bit permettono di codificare i numeri interi compresi tra −8dieci e +7dieci, come indicato in Tabella 2.5. Da un punto di vista strettamente operativo, è possibile ottenere la rappresentazione in complemento a due di un numero binario negativo con un semplice procedimento meccanico (perfettamente equivalente a quello indicato sopra) che consiste in: ⦁ rappresentare il numero (negativo) in binario senza tenere conto del

segno (per esempio, per −5, 0101due);

Tabella 2.5 Numeri interi codificati in complemento a due utilizzando 4 bit Codifica C2

02txt.indd 35

dieci

Codifica C2

dieci

Codifica C2

dieci

Codifica C2

dieci

0000

+0

0100

+4

1000

−8

1100

−4

0001

+1

0101

+5

1001

−7

1101

−3

0010

+2

0110

+6

1010

−6

1110

−2

0011

+3

0111

+7

1011

−5

1111

−1

12/01/22 08:38


36

Capitolo 2

L’informazione e la sua codifica

⦁ negare i valori dei singoli bit, ovvero sostituire ogni 0 con 1 e viceversa ⦁ aggiungere 1 al risultato ottenuto e considerare il numero di bit esatti

(0101due diventa 1010due);

della rappresentazione (1010due +1 = 1011C2).

Il fatto che esista una sola rappresentazione dello zero impedisce di bilanciare i numeri positivi e quelli negativi: infatti, con quattro bit si possono rappresentare, oltre allo zero, otto numeri negativi (fino a −8dieci) ma solo sette numeri positivi (fino a 7dieci). Più in generale, la rappresentazione in complemento a due utilizza n bit per rappresentare i numeri che vanno da −2n −1 fino a 2n −1 − 1. Per esempio, con 8 bit (cioè con un byte) si possono rappresentare tutti i numeri interi compresi tra −27 = −128 e 27 − 1 = 127; con 32 bit (che è la dimensione tipica dei dati numerici utilizzati nei personal computer attuali) si codificano tutti i numeri interi compresi tra −231 = −2 147 483 648 fino a 231 − 1 = 2 147 483 647. Dall’esame dei valori riportati in Tabella 2.5 si può notare anche che il primo bit di tutti i numeri positivi è 0, mentre i numeri negativi hanno il primo bit uguale a 1. In effetti, nella rappresentazione in complemento a due il primo bit rappresenta il segno del numero, anche se nella definizione formale il segno non è mai stato considerato in maniera esplicita, al contrario di quanto fatto nella codifica in modulo e segno dove il primo bit è esplicitamente designato come indicatore del segno del numero rappresentato. Esaminando le successioni di bit illustrate in Tabella 2.6 si possono osservare alcune interessanti proprietà della rappresentazione in complemento a due. Innanzitutto si può vedere come, data la codifica di un valore su n bit, sia possibile ottenere la codifica dello stesso valore su n + k bit semplicemente replicando k volte a sinistra il primo bit della successione originaria. Si consideri per esempio il numero −7dieci: la sua codifica su 4 bit è “1001”, quella su 5 bit è “11001” mentre quella su 8 bit è “1111 1001”, in pratica il primo bit della prima codifica è 1 e viene replicato un numero di volte sufficiente a riempire tutti i bit aggiuntivi. Questa procedura viene spesso definita “estensione del segno” perché il bit replicato è quello che rappresenta il segno del numero (1 per i numeri negativi e 0 per quelli non negativi). Tabella 2.6 Rappresentazioni in complemento a due con successioni di bit di lunghezza diversa (“NA” significa “non applicabile”) Naturale in base dieci

02txt.indd 36

Complemento a due 2 bit

3 bit

4 bit

5 bit

8 bit

16 bit

−13

NA

NA

NA

1 0011

1111 0011

1111 1111 1111 0011

−7

NA

NA

1001

1 1001

1111 1001

1111 1111 1111 1001

−4

NA

100

1100

1 1100

1111 1100

1111 1111 1111 1100

−1

11

111

1111

1 1111

1111 1111

1111 1111 1111 1111

+1

01

001

0001

0 0001

0000 0001

0000 0000 0000 0001

+4

NA

NA

0100

0 0100

0000 0100

0000 0000 0000 0100

+7

NA

NA

0111

0 0111

0000 0111

0000 0000 0000 0111

+13

NA

NA

NA

0 1101

0000 1101

0000 0000 0000 1101

12/01/22 08:38


Capitolo 2

L’informazione e la sua codifica

37

Approfondimento 2.5

Successioni di bit e loro interpretazione secondo codici diversi È interessante confrontare le diverse codifiche binarie dei valori numerici presentate nelle pagine precedenti. La prima tabella riporta quattro colonne per ogni valore numerico compreso tra −8dieci e +8dieci. La colonna “dieci” riporta la codifica decimale che viene normalmente adottata; nella colonna “due” sono scritti i valori in binario naturale, e perciò non c’è alcuna rappre-

sentazione dei numeri negativi; la colonna “MS” comprende le rappresentazioni binarie in modulo e segno, dove il primo bit rappresenta il segno del numero, e per questo sono previste due rappresentazioni diverse di zero (+0 e −0); infine, la colonna “C2” riporta la rappresentazione in complemento a due (“NA” significa “non applicabile”).

Codifica

Codifica

dieci

due

MS

C2

dieci

due

MS

C2

+0 +1 +2 +3 +4 +5 +6 +7 +8

0000 0001 0010 0011 0100 0101 0110 0111 1000

0000 0001 0010 0011 0100 0101 0110 0111 NA

0000 0001 0010 0011 0100 0101 0110 0111 NA

−0 −1 −2 −3 −4 −5 −6 −7 −8

0000 NA NA NA NA NA NA NA NA

1000 1001 1010 1011 1100 1101 1110 1111 NA

0000 1111 1110 1101 1100 1011 1010 1001 1000

La seconda tabella riporta gli stessi dati della precedente, organizzati in modo diverso. Nella prima colonna sono riportate tutte le sedici possibili successioni di quattro bit (infatti 24 = 16), mentre nelle colonne suc-

cessive viene riportato il valore ottenuto adottando tre diverse interpretazioni: quella binaria naturale (colonna “due”), quella binaria in modulo e segno (colonna “MS”) e quella in complemento a due (colonna “C2”).

Interpretazione

Interpretazione

Codifica

due

MS

C2

0000 0001 0010 0011 0100 0101 0110 0111

+0 +1 +2 +3 +4 +5 +6 +7

+0 +1 +2 +3 +4 +5 +6 +7

+0 +1 +2 +3 +4 +5 +6 +7

Mentre le tre interpretazioni danno valori identici per le configurazioni che iniziano con 0 e che corrispondono ai valori positivi, le successioni di bit che iniziano con 1 sono interpretate in maniera completamente diversa nei tre casi. Per esempio la successione di bit “1101” può essere interpretata come +13, −5 oppure −3 a seconda della codifica adottata. Se ne può quindi concludere che il valore di una successione di bit non dipende solo dalla successione stessa, ma anche dal codice che si utilizza per interpretarla. Si consideri come ulteriore esempio la successione di bit ‘‘1000001’’. Se viene interpretata secondo la codifica binaria naturale, il valore che le viene associato è:

02txt.indd 37

Codifica 1000 1001 1010 1011 1100 1101 1110 1111

due

MS

C2

+8 +9 +10 +11 +12 +13 +14 +15

−0 −1 −2 −3 −4 −5 −6 −7

−8 −7 −6 −5 −4 −3 −2 −1

1dieci × 26dieci + 1dieci × 20dieci = 1000001due = = 1dieci × 64dieci + 1dieci × 1dieci = 65dieci Se invece viene interpretata in modulo e segno, il valore è —1dieci. L’interpretazione secondo la codifica in complemento a due corrisponde a: 1000001due = −1dieci × 26dieci + 1dieci × 20dieci = = −1dieci × 64dieci + 1dieci × 1dieci = −63dieci Infine, se si considera la codifica ASCII illustrata in Tabella 2.1, la successione “1000001” corrisponde alla lettera “A”.

12/01/22 08:38


38

Capitolo 2

L’informazione e la sua codifica

Un’altra interessante proprietà è che la codifica in complemento a due del numero −x si ottiene dalla codifica del numero x con una semplice procedura: partendo da destra e spostandosi verso sinistra nella successione, si mantengono inalterati tutti i bit fino al primo 1 compreso che si incontra e si complementano gli altri bit, che si trovano dunque a sinistra del primo 1. Per esempio, dato il fatto che la codifica di +4dieci su 5 bit è 00100C2, la codifica di −4dieci si può ottenere lasciando invariati gli ultimi tre bit (“...100”) e cambiando gli altri due, che da “00...” diventano quindi “11...”, in modo da ottenere la successione 11100C2 che in effetti corrisponde al numero −4dieci. In maniera analoga, partendo dalla codifica su 8 bit di −13dieci, che è 11110011C2, si può ottenere la codifica di +13dieci partendo da destra e lasciando invariato l’ultimo bit (“...1”) e cambiando tutti gli altri in modo da ottenere 00001101C2. Le operazioni aritmetiche A quello della rappresentazione dei numeri si affianca il problema della realizzazione delle operazioni algebriche fondamentali (per esempio, addizione dei numeri con segno e cambiamento di segno, mediante combinazioni delle quali è possibile realizzare anche sottrazioni, moltiplicazioni e divisioni). Il problema si pone in quanto, se sulle rappresentazioni dei numeri positivi (almeno nei due casi presentati, che non costituiscono le uniche possibilità) l’esperienza comune suggerisce come eseguire le somme “in colonna” in modo del tutto analogo a come si fa in base dieci, per le somme che coinvolgono numeri negativi è necessaria qualche accortezza in più, peraltro in dipendenza dalla rappresentazione adottata. È interessante e utile visualizzare mediante diagrammi la corrispondenza tra valori e rappresentazioni nei due casi presentati. Dalla Figura 2.8 si può notare come la necessità di avere una rappresentazione articolata su un numero finito di bit per i numeri interi vada tenuta in debita considerazione quando si vuole affrontare il problema di eseguire operazioni matematiche. Operare sulle rappresentazioni in formato binario può causare problemi Figura 2.8 Interpretazione grafica delle rappresentazioni dei numeri interi.

1111 1110 1101 1100 1011 1010 1001 1000 0111 0110 0101 0100 0011 0010 0001 0000 –7 –6 –5 –4 –3 –2 –1 0 1 2 3 4 5 6 7

Codifica con modulo e segno

02txt.indd 38

1111 1110 1101 1100 1011 1010 1001 1000 0111 0110 0101 0100 0011 0010 0001 0000 –8 –7 –6 –5 –4 –3 –2 –1 0 1 2 3 4 5 6 7

Codifica in complemento a due

12/01/22 08:38


Capitolo 2

L’informazione e la sua codifica

39

durante l’esecuzione di operazioni matematiche innanzitutto quando gli operandi siano rappresentabili ma non lo sia il risultato: qualora l’operazione fosse comunque eseguita, il risultato sarebbe interpretato in maniera scorretta, in quanto la successione di bit ottenuta rappresenta un altro numero. Si consideri per esempio la somma algebrica tra 6dieci e 2dieci, rappresentabili con 0110due e 0010due: la somma tra 0110due e 0010due ha come risultato 1000due, che però viene interpretato come 0dieci nella rappresentazione con segno e modulo e come −8dieci nella rappresentazione in complemento a due. Analogamente, aggiungendo ripetutamente un’unità a un determinato valore si percorreranno ciclicamente i due rami del grafico relativo alla rappresentazione scelta. Inoltre le due rappresentazioni, che coincidono per quanto riguarda la rappresentazione dei numeri positivi, differiscono per quanto concerne i negativi: quindi è necessario adottare opportuni algoritmi per eseguire le operazioni matematiche elementari che sfruttino le peculiarità delle differenti rappresentazioni e gestiscano correttamente gli operandi negativi. La rappresentazione con segno e modulo rende difficile l’esecuzione e il controllo delle operazioni aritmetiche e richiede dispositivi di calcolo relativamente complessi, perché è necessario trattare in maniera esplicita il segno (per esempio, nel caso di somma algebrica bisogna identificare a priori il segno dei due operandi e la procedura che deve essere seguita per svolgere l’operazione cambia a seconda che i due addendi abbiano o meno lo stesso segno). Al contrario, una caratteristica, la più interessante, della rappresentazione in complemento a due è la facilità con cui consente di eseguire le somme algebriche dei numeri. Si consideri innanzi tutto che alla base della somma binaria stanno le seguenti espressioni: 0 + 0 = 0, 0 + 1 = 1, 1+ 0 = 1, 1 + 1 = 10 (cioè 0 con il riporto di 1). Queste espressioni permettono di eseguire le somme di numeri binari naturali in modo del tutto analogo a quanto imparato a scuola per le somme dei numeri naturali, come indicato in Figura 2.9, dove il riporto viene indicato dagli 1 scritti in corsivo sopra la colonna alla sinistra di quella che li ha prodotti. La somma algebrica dei numeri interi rappresentati in complemento a due può essere effettuata seguendo le stesse regole illustrate sopra per la somma dei numeri naturali senza dover considerare in alcun modo il segno dei due operandi, come si può dedurre dagli esempi riportati in Figura 2.10. La rappresentazione in complemento a due è basata sull’aver fissato a priori il numero di bit da utilizzare per la rappresentazione dei numeri, così che i bit eccedenti vengono trascurati, come indicato negli esempi della parte bassa nella Figura 2.10. Nel caso si volesse ottenere un risultato codificato su di un numero di bit maggiore di quello utilizzato per gli operandi sarebbe necessario estendere la rappresentazione degli operandi stessi, repli-

11 0 0 0 1 1 0 0 1due + 0 0 1 1 1 1 0 0due = 0 1 0 1 0 1 0 1due

2 5dieci + 6 0dieci = 8 5dieci

11 0 0 1 0 1 1 0 0due + 0 1 0 0 1 1 1 0due = 0 1 1 1 1 0 1 0due

4 4dieci + 7 8dieci = 1 2 2dieci

Figura 2.9 Operazioni di somma di numeri binari naturali (le cifre in corsivo sono i riporti). Con gli 8 bit utilizzati negli esempi qui riportati si possono rappresentare i numeri naturali fino a 255dieci. Operazioni che producono un risultato maggiore provocano il superamento della capacità di rappresentazione (in inglese: overflow).

02txt.indd 39

12/01/22 08:38


40

Capitolo 2

L’informazione e la sua codifica

Figura 2.10 Operazioni di somma di numeri binari in complemento a due (le cifre in corsivo sono i riporti). Con gli 8 bit utilizzati negli esempi qui riportati si possono rappresentare i numeri interi da −128dieci fino a +127dieci.

1 1 0 0 0 1 1 0 0 1c2 +

+ 2 5dieci +

1 0 0 1 0 1 1 0 0c2 +

+ 4 4 dieci +

0 1 0 1 0 1 0 1c2

+ 8 5dieci

1 1 0 1 1 1 1 0c2

− 3 4 dieci

0 0 1 1 1 1 0 0c2 =

1 1

+ 6 0dieci =

1

1 0 1 1 0 0 1 0c2 =

1 1

1 1 1 0 0 1 1 1c2 +

− 2 5dieci +

1 1 0 0 0 1 0 0c2 =

− 6 0dieci =

1 1 0 1 0 1 0 1 1c2

− 8 5dieci

− 7 8dieci =

1 1

1 1 0 1 0 1 0 0c2 +

− 4 4 dieci +

0 1 0 0 1 1 1 0c2 =

+ 7 8dieci =

1 0 0 1 0 0 0 1 0c2

+ 3 4 dieci

cando dunque un numero sufficiente di volte il primo bit, prima di effettuare l’operazione. Il superamento della capacità di calcolo viene rilevato confrontando il segno degli operandi con quello del risultato: se i due operandi hanno lo stesso segno mentre il risultato ha il segno opposto, allora si è verificato un overflow, come succede nelle operazioni riportate in Figura 2.11. Nei primi due casi si evidenzia il comportamento agli estremi dell’insieme dei valori rappresentabili. In effetti, quando i due operandi hanno segno opposto non si potrà mai verificare un overflow, perché il valore assoluto del risultato dell’addizione sarà sempre inferiore ad almeno uno dei due valori assoluti degli operandi. Se invece i due operandi hanno lo stesso segno, il superamento della capacità di rappresentazione della codifica in complemento a due produrrà un valore con un segno opposto a quello degli operandi. L’operazione di moltiplicazione non è particolarmente critica, se si considerano esclusivamente gli aspetti relativi alla sua realizzazione su calcolatore e si prescinde da questioni di prestazioni, in quanto è sempre possibile realizzarla tramite addizioni successive. Infatti: k ⋅ x = x + x  + ... + x k volte

Effettuare una moltiplicazione in binario mediante l’algoritmo classico utilizzato per la moltiplicazione tra decimali è addirittura più semplice che nel caso decimale: infatti tale algoritmo prevede la moltiplicazione del mol1111111 0 1 1 1 1 1 1 1 c2 + 0 0 0 0 0 0 0 1c2 = 1 0 0 0 0 0 0 0c2

+ 1 2 7dieci + + 1dieci = − 1 2 8dieci

1 1 0 0 0 0 0 0 0c2 + 1 1 1 1 1 1 1 1c2 = 1 0 1 1 1 1 1 1 1c2

− 1 2 8dieci + − 1dieci = + 1 2 7dieci

111 010 001 100

11 0 1 1 1 0c2 + 1 1 1 0 0c2 = 0 1 0 1 0c2

11 1 1 0 0 0 1 0 0c2 + 1 0 1 1 0 0 1 0c2 = 1 0 1 1 1 0 1 1 0c2

+ 7 8dieci + + 6 0dieci = − 1 1 8dieci

− 6 0dieci + − 7 8dieci = + 1 3 4dieci

Figura 2.11 Operazioni di somma di numeri binari in complemento a due (le cifre in corsivo sono i riporti) che provocano un overflow. Siccome i risultati delle operazioni superano la capacità di rappresentazione in complemento a due con 8 bit, la somma algebrica di due valori positivi produce un risultato negativo e quella di due valori negativi produce un risultato positivo.

02txt.indd 40

12/01/22 08:39


Capitolo 2

L’informazione e la sua codifica

41

tiplicando per ogni singola cifra del moltiplicatore, per ricavare i risultati intermedi che poi saranno sommati tenendo conto della posizione iniziale della cifra usata. Nel sistema binario ogni cifra del moltiplicatore può valere soltanto 0 o 1: nel primo caso il risultato parziale corrispondente è uguale a 0, nel secondo caso è uguale al moltiplicando (in nessuno dei due casi dunque viene eseguita una moltiplicazione vera e propria), quindi ogni moltiplicazione può essere eseguita tramite spostamenti a sinistra (ovvero moltiplicazioni per le potenze di due, in analogia alle moltiplicazioni per le potenze di 10, che si effettuano spostando a sinistra le cifre e inserendo uno 0 finale) e somme. Poiché nessuna delle rappresentazioni esaminate offre vantaggi nel caso di moltiplicazioni che coinvolgano numeri negativi, presentiamo in Figura 2.12 esclusivamente esempi di moltiplicazioni tra positivi rappresentati su 8 bit (quindi in un intervallo tra 0 e 255), tenendo conto che è possibile operare con i negativi gestendo separatamente i valori assoluti e i segni di moltiplicando e moltiplicatore per poi riportare il risultato nella rappresentazione prescelta. In generale, la rappresentazione esatta del prodotto tra due numeri positivi rappresentati su n bit richiede 2n bit, come evidenziato dal secondo esempio in figura: questo comporta in generale particolari accorgimenti nella realizzazione della moltiplicazione nei calcolatori. La semplicità delle operazioni di somma algebrica effettuate sui numeri in complemento a due e la possibilità di eseguire moltiplicazioni tra interi tramite somme e spostamenti a sinistra ha permesso la realizzazione di dispositivi capaci di effettuare queste operazioni in maniera molto efficiente e rapida, dispositivi che stanno alla base dell’unità aritmetico-logica (Arithmetic Logic Unit — ALU) contenuta nella CPU di un calcolatore (questo argomento sarà ripreso nel Capitolo 6, in cui viene illustrata l’architettura complessiva di un calcolatore).

0 00 000 0000 0 0000 00 0000 000 0000

0000 1 1 1 0 due × 0000 0 1 0 1 due =

14 dieci × 5 dieci =

111 0000 0000 00 1 1 0000 0000 000 00 0

70dieci

1 1 1 0 due 000 due 1 0 due 0 due

Figura 2.12 Operazioni di moltiplicazione di numeri binari positivi.

due due due due

000 0000 0 1 00 0 1 1 0 due 0 1 1 0 1 000 due × 0000 1 1 00 due = 1 0 01 01 1 0000 0 0000 00 0000 000 0000

0000 0000 10 10 0 1 00 0000 000 00 0

0000 due 000 due 00 due 0 due

1 1 2dieci × 1 2dieci = 224 dieci 1 1 2 dieci 1 344 dieci

due due due due

000 0 1 00 1 1 1 0 0000 due

02txt.indd 41

12/01/22 08:39


42

Capitolo 2

L’informazione e la sua codifica

Approfondimento 2.6

Le operazioni elementari sui bit È uso comune rappresentare in forma tabellare le operazioni elementari sui bit, che comprendono oltre ad addizione e moltiplicazione anche le operazioni logiche. Queste ultime interpretano i valori dei bit in termini non numerici, ma di verità o falsità, generalmente assegnando al simbolo ‘1’ il valore VERO e al simbolo ‘0’ il valore FALSO. Le operazioni logiche (chiamate anche

“booleane”, dal logico-matematico inglese George Boole, che ne studiò le proprietà) fondamentali sono il NOT, l’AND e l’OR: il NOT nega il valore di verità del suo operando, mentre l’AND restituisce il valore VERO soltanto entrambi i suoi operandi sono veri e l’OR restituisce il valore FALSO soltanto se entrambi i suoi operandi sono falsi:

+ 0 1

0 0 1

1 1 0

× 0 1

0 0 0

1 0 1

AND 0 1

0 0 0

1 0 1

OR 0 1

0 0 1

1 1 1

Nelle tabelle (si è omessa quella relativa al NOT, che è banale) i possibili valori per i due operandi sono riportati sulla prima riga e sulla prima colonna, mentre il risultato dell’operazione per ogni coppia di valori è posto nel corpo della tabella nella posizione a essa corrispondente. Per l’addizione bisogna ricordare che nel caso in cui entrambi gli operandi valgano 1 viene generato un riporto unitario. Si noti che la moltiplicazione tra bit e l’operazione AND sono equivalenti (e nella pratica quando non c’è possibilità di ambiguità si usa comunemente per l’AND la stessa notazione usata per indicare la moltiplicazione tra interi). In effetti vale una proprietà molto utile: è possibile descrivere una qualsiasi operazione sui bit in termini di un’opportuna espressione composta da sole operazioni di NOT, AND e OR. Per esempio, l’addizione tra a e b

2.2.6

in termini di sole operazioni booleane assume l’espressione ((a AND NOT b) OR (NOT a AND b)), che è vera solo nei due casi (a = 1, b = 0), (a = 0, b = 1), mentre l’espressione del riporto coincide con l’operazione AND. L’equivalenza tra interpretazione matematica e interpretazione logica delle operazioni elementari sui bit è di fondamentale importanza per la realizzazione dei calcolatori elettronici: infatti è possibile realizzare agevolmente mediante transistor alcune operazioni booleane direttamente in hardware. Le tre realizzazioni più semplici riguardano un’altra terna sufficiente a realizzare una qualsiasi operazione sui bit tramite la composizione degli operatori NOT, NAND (Negative AND, che si ottiene applicando NOT al risultato di un AND) e NOR (Negative OR, che si ottiene applicando NOT al risultato di un OR).

La codifica binaria dei numeri razionali

In molte applicazioni non è sufficiente trattare con numeri interi e occorre operare anche con numeri decimali. Un primo problema che al riguardo si pone è dovuto al fatto che la rappresentazione esatta di un numero decimale potrebbe richiedere un numero di cifre illimitato (si pensi a 1 / 7 = 0.142857142857...dieci oppure a π = 3.14159265359...dieci ), mentre la rappresentazione che può essere utilizzata da un esecutore automatico deve prevedere solo successioni di bit di lunghezza finita. Per questo motivo è necessario approssimare numeri di questo genere con numeri razionali il cui numero di cifre sia limitato a priori, ma sia comunque sufficiente a garantire un grado di precisione appropriato agli scopi dell’elaborazione. Per esempio, π potrebbe essere approssimato come 3.14dieci oppure 3.1416dieci. È perciò utile introdurre il concetto di cifre più significative: nelle rappresentazioni basate sulla notazione posizionale, a prescindere dalla base utilizzata, le

02txt.indd 42

12/01/22 08:39


Capitolo 2

L’informazione e la sua codifica

43

cifre più significative sono quelle associate ai pesi maggiori. Per esempio, nel numero 723 456dieci, la cifra più significativa è 7, associata al peso 105, seguita da 2, con peso 104, e così via. Quando si considerano i numeri maggiori di 1 le cifre più significative sono quelle poste più a sinistra; nel caso di numeri minori di 1, che iniziano con 0 seguito dal separatore decimale, le cifre più significative sono le prime diverse da 0 che si incontrano andando da sinistra verso destra. Per esempio, nel numero 0.0072345dieci la cifra più significativa è 7, con peso 10−3, seguita da 2, con peso 10−4, e così via. Quando i numeri da codificare hanno un valore assoluto molto grande o molto piccolo, è spesso sufficiente considerare solo le cifre più significative, adottando una rappresentazione che viene indicata come notazione scientifica, per cui un numero viene rappresentato in base 10 come 0.m × 10e, cioè indicandone il segno (+ oppure −), il coefficiente m, detto mantissa, e l’esponente e a cui elevare la base della numerazione (più in generale, in accordo a questa notazione un numero in base B viene rappresentato come 0.m × Be). In questo modo, per esempio, adottando questa notazione il numero −123 450 000 000dieci viene rappresentato come −0.12345 × 1012 dieci, dove: ⦁ il segno è negativo, ⦁ la mantissa è 12345dieci, ⦁ l’esponente è 12dieci.

Il numero 0.0000012345dieci, che corrisponde a 0.12345 × 10−5, ha invece: ⦁ segno positivo, ⦁ mantissa 12345dieci, ⦁ esponente −5dieci.

Nella rappresentazione si fissano la lunghezza massima in cifre della mantissa e dell’esponente (e si scelgono le relative rappresentazioni), che individuano l’intervallo all’interno del quale cadono tutti i numeri rappresentabili. Si noti che questa rappresentazione prevede nel caso generale che la mantissa sia normalizzata, ovvero che il coefficiente m inizi con una cifra diversa da 0, per dare una rappresentazione univoca del numero (normalizzata la mantissa resta individuato un unico esponente corrispondente) e sfruttare tutte le cifre della mantissa per una rappresentazione del numero quanto più precisa possibile. Tuttavia, per rappresentare numeri più piccoli in valore assoluto del minimo numero rappresentabile mediante mantissa normalizzata ed esponente minimo si deroga alla normalizzazione e si ammettono mantisse che abbiano degli zeri iniziali. In questo modo si riduce l’ampiezza dell’intervallo dei numeri non rappresentabili con le ipotesi fissate (in quanto avrebbero rappresentazioni indistinguibili da quella dello 0), che costituisce l’area di underflow. Lo stesso principio può essere adottato per la rappresentazione binaria dei numeri razionali: il numero 101010000due diventa 0.10101 × 1001001 due , dove il segno è positivo, la mantissa è 10101due e l’esponente è 01001C2 (si noti come l’esponente sia un numero intero e per questo sia necessario adottare una rappresentazione che permetta la codifica anche di valori negativi, come, per esempio, quella in complemento a due). Per operare con numeri di questo tipo, è sufficiente conoscere, e quindi memorizzare, segno, mantissa ed esponente.

02txt.indd 43

12/01/22 08:39


44

Capitolo 2

L’informazione e la sua codifica

Figura 2.13 Numeri razionali rappresentabili con la codifica IEEE-754 a precisione singola.

Area di overflow negativo (−∞)

Numeri negativi con mantissa normalizzata

−1038

Area di underflow

Numeri positivi con mantissa normalizzata

−10−38 −10−45 0 10−45 10−38

Area di overflow positivo (+∞)

1038

Numeri negativi Numeri positivi con mantissa con mantissa non normalizzata non normalizzata

Stabilire il numero di bit da utilizzare è una scelta critica: cambiando il numero di cifre dedicato alla rappresentazione di mantissa ed esponente si può infatti modificare la precisione dei risultati che si ottengono. L’interesse a uniformare la precisione di calcolo nelle diverse situazioni (calcolatori di produttori diversi e con strutture differenti) ha condotto alla definizione di una norma internazionale (IEEE-754), proposta dall’Institute of Electrical and Electronic Engineers (IEEE), che stabilisce la lunghezza di mantissa ed esponente (Figura 2.13): ⦁ per i numeri cosiddetti “a precisione singola” sono previsti 32 bit, dei

quali il primo codifica il segno, i successivi 8 il valore dell’esponente e i restanti 23 la mantissa. In questo modo si possono rappresentare i numeri compresi approssimativamente tra −1038 e −10−38 e tra 10−38 e 1038, con una precisione di circa 7 cifre decimali significative (in effetti, utilizzando anche una notazione non normalizzata, cioè ipotizzando che la mantissa possa cominciare con uno o più 0, si può arrivare a rappresentare anche un valore di circa 10−45); ⦁ per i numeri cosiddetti “a precisione doppia” sono previsti 64 bit, dei quali il primo è quello di segno, i successivi 11 codificano l’esponente e i restanti 52 la mantissa. In questo modo si possono rappresentare i numeri compresi approssimativamente tra −10308 e −10−308 e tra 10−308 e 10308, con una precisione di circa 17 cifre decimali significative.

2.3

Codifica analogica e codifica digitale

All’inizio di questo capitolo la codifica è stata definita come l’operazione con cui l’informazione viene scritta su un supporto fisico. Abbiamo d’altra parte riconosciuto come spesso tale operazione sia compiuta in due fasi (Figura 2.14): ⦁ dapprima l’entità di informazione da codificare viene convertita in una

seconda entità di informazione (per esempio, l’entità di informazione “numero dieci” può essere convertita nella successione “1010” mediante la codifica binaria naturale); ⦁ quindi l’entità di informazione così ottenuta viene scritta sul supporto fisico (per esempio, ogni cifra binaria della successione “1010” potrebbe essere scritta su un dispositivo bistabile come una lampadina, accendendola se la cifra è ‘1’ e lasciandola spenta se è invece ‘0’).

02txt.indd 44

12/01/22 08:39


Capitolo 2

La successione binaria “1010”

Prima fase della codifica

Il numero dieci

L’informazione e la sua codifica

Informazione Supporto fisico

Seconda fase della codifica

45

Figura 2.14 Un esempio di codifica come operazione in due fasi.

1010

L’analisi compiuta finora è stata prevalentemente dedicata alla prima fase della codifica, nell’ipotesi che la fase di scrittura su supporto non offra alternative di rilievo né ponga problematiche significative. In effetti, lo straordinario sviluppo tecnologico degli ultimi decenni ha reso disponibili dispositivi fisici bistabili (nella forma di elementi di circuiti integrati, dischi magnetici e ottici ecc.) in quantità talmente elevate e a costi talmente ridotti da spiegare il loro attuale diffuso impiego e da giustificare quindi l’implicita assunzione che tali dispositivi costituiscano il supporto fisico di elezione per la codifica di informazione. D’altra parte, questa logica di codifica, che può essere chiamata digitale binaria, non è certamente l’unica possibile, né l’unica utilizzata: sono possibili forme di codifica sia digitale non binaria sia analogica. In particolare, la distinzione tra digitale e analogico consente di chiarire ancor meglio le caratteristiche dell’operazione di codifica e la natura delle relazioni tra mondo fisico e mondo dell’informazione. Come abbiamo visto, il concetto sintattico di informazione è fondato sulla possibilità di distinzione: “è questo, ma avrebbe potuto essere quest’altro”. Si tratta perciò, in linea di principio, di informazione di tipo puramente classificatorio, utile per discriminare tra elementi compresi in un insieme finito: l’unico requisito del supporto è la capacità di mantenere distinte le configurazioni che identificano entità di informazione diverse (nel caso binario, per esempio, è sufficiente che lo stato del supporto che memorizza la cifra ‘1’ sia riconoscibile come diverso dallo stato che memorizza la cifra ‘0’). D’altra parte, è chiaro che in molti casi l’informazione che si tratta è più che classificatoria, dato che consente non solo di riconoscere distinzioni, ma anche, per esempio, di stabilire relazioni d’ordine (“questo è maggiore di quest’altro”) o metriche (“questo è distante un certo valore da quest’altro”). È il caso, per esempio, dei voti che vengono assegnati come risultati di un esame: il voto 30 non solo è diverso dal voto 18, ma è anche maggiore di questo e, sotto ipotesi generalmente accettate, la distanza che c’è tra il voto 18 e il voto 24 è la stessa che c’è tra il voto 24 e il voto 30. La presenza di un ordine o una metrica arricchisce l’insieme delle entità di informazione di una struttura, cioè di informazione sul “cosa si può fare” con le

02txt.indd 45

12/01/22 08:39


46

Capitolo 2

L’informazione e la sua codifica

entità di informazione dell’insieme, in termini di relazioni di confronto e operazioni di combinazione. Si tratta di informazione sull’informazione, che potrebbe essere chiamata dunque meta-informazione, e in presenza della quale l’insieme delle entità di informazione diventa un sistema, cioè appunto un insieme-con-struttura. Si pone allora il problema di come fare in modo che le configurazioni del supporto su cui viene codificata l’informazione siano in grado di portare anche questa meta-informazione, così che l’accesso alle configurazioni porti informazione non solo di identificazione ma anche di ordine, metrica ecc. Per risolvere questo problema sono possibili due strategie generali: utilizzare un supporto in grado di portare esplicitamente la meta-informazione oppure rappresentare implicitamente la meta-informazione nella regola di codifica. 1. Prima strategia: meta-informazione esplicita nel supporto. In questo caso si sceglie un supporto in modo che sull’insieme delle sue configurazioni sia definita una relazione analoga a quella che è presente tra entità di informazione. Per esempio, per indicare il voto conseguito da uno studente si può utilizzare un rettangolo la cui superficie è proporzionale al voto: tra le dimensioni dei rettangoli è stabilita una relazione di ordine analoga alla relazione d’ordine che esiste tra i voti. Se si osservano e , appare chiaramente non solo che la le configurazioni prima codifica un voto “maggiore” di quello codificato dalla seconda, ma anche che la distanza tra i due voti è unitaria. 2. Seconda strategia: meta-informazione implicita nella regola di codifica. In questo caso si impiega un supporto a cui si impone solo di assumere configurazioni molteplici e distinguibili l’una dall’altra; per portare la meta-informazione si utilizza una regola di codifica definita in modo estensionale, specificando cioè per ogni configurazione l’entità di informazione associata. Riprendendo l’esempio precedente, il voto ottenuto da uno studente può essere espresso da una configurazione convenzionalmente scelta in un insieme, per esempio {■, □, ☼, ◘, ◙, ●}; se i voti diversi da comunicare fossero al più 6. È chiaro, in tal caso, che la regola di codifica deve essere comunicata agli studenti, in modo da consentire loro un’opportuna decodifica, dunque l’associazione di un voto specifico a ogni simbolo. Se si adotta questa strategia, è solo attraverso la conoscenza esplicita della regola di codifica che si arriva a riconoscere che le configurazioni del supporto forniscono, implicitamente, la meta-informazione definita sulle entità di informazione. Per chiarire le differenze tra queste strategie è utile esaminare come nei due casi sia possibile gestire una modifica dell’insieme delle entità di informazione provocata, per esempio, dalla decisione di valutare gli studenti utilizzando anche “mezzi voti” (come 51/2) e non solo voti interi. La prima soluzione è applicabile senza variazioni: un rettangolo di 5.5 quadretti codifica il voto 51/2. La seconda soluzione, invece, richiede di aumentare il numero di oggetti con cui si codificano i voti, estendendo in conseguenza la regola di codifica, che deve essere ridefinita in modo estensionale perché sia in grado di rappresentare le nuove entità di informazione introdotte. Nella loro logica di realizzazione della codifica, le due soluzioni discusse nell’esempio sono affini rispettivamente ai dispositivi presentati in

02txt.indd 46

12/01/22 08:39


Capitolo 2

L’informazione e la sua codifica

47

©koya979/Shutterstock

©Alaettin YILDIRIM/Shutterstock

Figura 2.15 Dispositivi analogici (a) e digitali (b) per la visualizzazione del valore di una grandezza.

(a)

(b)

Figura 2.15: indicatori a lancette su una scala graduata (a) e dispositivi di visualizzazione per cifre (b). Nel primo caso le entità di informazione sono codificate mediante configurazioni che variano in modo analogo alle entità di informazione: nell’esempio dei voti era la superficie del rettangolo, nell’orologio analogico è la posizione della lancetta sulla scala. Nel secondo caso, invece, le entità di informazione vengono codificate mediante configurazioni convenzionali: nell’esempio dei voti erano i simboli {■, □, ☼, ◘, ◙, ●}, nell’orologio digitale sono pattern di segmenti illuminati che decodifichiamo leggendo le cifre decimali una alla volta. Le due strategie di codifica vengono definite rispettivamente analogica e digitale. Una codifica è realizzata in modo analogico quando stabilisce una relazione di analogia tra struttura delle configurazioni e struttura delle entità di informazione; la meta-informazione è rappresentata dal supporto. Una codifica è invece realizzata in modo digitale quando la meta-informazione è rappresentata solo implicitamente nella codifica. È possibile confrontare i due esempi di codifica rispetto a cinque criteri. 1. Modalità di definizione della codifica: l’analogico si basa tipicamente su una definizione intensionale (ossia basata su una regola sintetica), mentre il digitale, a causa della necessità di elencare esplicitamente le corrispondenze tra configurazioni ed entità di informazione, non può che essere basato su una definizione estensionale (ovvero basata sull’elencazione delle corrispondenze tra configurazioni ed entità di informazione). 2. Ridefinizione della codifica al variare dell’insieme delle entità di informazione: se variano le entità di informazione l’analogico non impone di principio alcun intervento sulla regola di codifica, risultando perciò assai più flessibile del digitale, che invece richiede una ridefinizione della regola stessa, o quantomeno una sua estensione che consenta la rappresentazione delle nuove entità di informazione. 3. Applicabilità in funzione della cardinalità dell’insieme delle entità di informazione: grazie alla possibilità di definizione implicita della regola di codifica, l’analogico è di principio applicabile più ampiamente del digitale, dato che può essere impiegato anche nel caso in cui le entità di informazione non siano stabilite, o comunque non siano in numero limitato, a priori. Nuovamente, il fatto di dover definire la codifica per elencazione rende invece il digitale applicabile solo nel caso di insiemi di entità di informazione a cardinalità finita e i cui elementi sono noti a priori.

02txt.indd 47

12/01/22 08:39


48

Capitolo 2

L’informazione e la sua codifica

4. Applicabilità in funzione della struttura dell’insieme delle entità di informazione: analogico e digitale manifestano, a questo riguardo, le differenze maggiori. Se sull’insieme delle entità di informazione è assente qualsiasi struttura, l’unico modo per definire una codifica è estensionale tramite corrispondenze esplicitamente stabilite. In tal caso, l’analogico non è utilizzabile e la strategia per consentire a un sistema fisico di fungere da supporto è unica: il digitale. D’altra parte, anche in presenza di una struttura, il digitale opera come se tale struttura fosse assente, prescindendo da essa nella definizione della codifica. In questo, perciò, il digitale risulta applicabile in modo più generale che non l’analogico. 5. Condizioni sul supporto: l’applicabilità effettiva dell’analogico dipende dalla disponibilità di un supporto in grado di ricreare tra le sue configurazioni una struttura corrispondente a quella presente sull’insieme delle entità di informazione. Nel caso digitale, invece, basta che il supporto sia in grado di assumere un numero di configurazioni diverse sufficiente a codificare tutte le entità di informazione. La Tabella 2.7 sintetizza schematicamente le differenze che sono state evidenziate tra le strategie di codifica analogica e digitale. Il confronto tra le due strategie diventa particolarmente interessante quando l’insieme delle entità di informazione da rappresentare non è predefinito, una situazione che si presenta quando si considerano grandezze fisiche come il volume di un suono oppure il colore di un oggetto. In questi casi si applica facilmente la strategia analogica, e si codificano le grandezze tramite supporti caratterizzati da una struttura simile a quella della grandezza da rappresentare: il volume di un suono, per esempio, può essere codificato utilizzando una tensione elettrica variabile in modo proporzionale al volume. Per poter applicare in questi casi la strategia digitale, nella prima fase della codifica occorre attuare un’operazione di digitalizzazione dell’informazione. 2.3.1

La digitalizzazione

Per codificare in modo digitale una grandezza fisica i cui valori si assumono variabili in un intervallo continuo è necessario effettuare un’operazione di discretizzazione di tali valori, attraverso un procedimento di approssimazione con uno dei valori compresi nell’insieme di quelli previsti. Tabella 2.7

02txt.indd 48

Confronto tra le due strategie adottabili per la codifica dell’informazione: analogica (meta-informazione esplicita nel supporto) e digitale (metainformazione implicita nella regola di codifica) Analogico

Digitale

Modalità di definizione della codifica

Intensionale

Estensionale

Ridefinizione della codifica al variare dell’insieme delle entità di informazione

Nessuna ridefinizione è necessaria

Occorre estendere il processo definito in precedenza

Applicabilità in funzione della cardinalità dell’insieme delle entità di informazione

Applicabile anche per cardinalità non finita

Applicabile solo per cardinalità finita e con entità note a priori

Applicabilità in funzione della struttura dell’insieme delle entità di informazione

Applicabile solo se una struttura è presente

Applicabile in ogni caso

Condizioni sul supporto

Applicabile solo con supporti con struttura

Applicabile in ogni caso

12/01/22 08:39


Capitolo 2

L’informazione e la sua codifica

49

Un esempio di questo procedimento, chiamato quantizzazione, è quello illustrato in Figura 2.16: l’insieme dei valori che la grandezza in esame può assumere viene suddiviso in un numero finito di sottoinsiemi, ognuno dei quali viene quindi rappresentato mediante una codifica digitale. Nell’esempio è prevista una suddivisione su otto livelli, in modo da poter impiegare una codifica a tre bit (infatti 23 = 8: la lunghezza della successione di bit necessaria per codificare ogni livello viene chiamata in questo contesto numero di bit di quantizzazione). Per codificare un valore della grandezza fisica si individua dunque il sottoinsieme cui appartiene, e si determina la relativa codifica. Questo modo di operare comporta necessariamente una perdita di informazione, perché tutti i valori compresi nello stesso sottoinsieme sono codificati nello stesso modo e diventano indistinguibili. Questo fenomeno può essere limitato e reso irrilevante riducendo la dimensione dei sottoinsiemi, quindi aumentando corrispondentemente il numero di sottoinsiemi individuati, al prezzo di un aumento della lunghezza delle successioni necessarie per la codifica: se per otto livelli bastano tre bit, per codificare cento livelli servono sette bit e, in generale, per codificare n livelli servono ⎡log2 n⎤ bit. La strategia di digitalizzazione diventa ancor più complessa quando occorre codificare grandezze fisiche che variano nel tempo (come l’intensità di un suono) oppure nello spazio (come il colore di un’immagine) oppure sia nel tempo sia nello spazio (come i colori di una ripresa video). Si consideri, per esempio, il problema in Figura 2.17. L’operazione di quantizzazione deve essere in tal caso ripetuta per tutti gli istanti di tempo durante i quali si vuole mantenere l’informazione sulla grandezza. Occorre perciò effettuare un’operazione di campionamento della grandezza: si suddivide l’intervallo di tempo considerato in sottointervalli e per ciascuno di essi si sceglie un istante di riferimento; il valore che la grandezza assume in quell’istante viene considerato come rappresentativo del valore di tutto l’intervallo. La Figura 2.18 illustra come sia possibile ricostruire l’andamento della grandezza a partire dalla codifica digitale. Ampiezza della grandezza fisica

Codifiche assegnate ai valori scelti per rappresentare gli insiemi 100

100

100 101

101

111

111

110

110 010 Valori rappresentativi dei diversi insiemi

011 001 000

Demarcazione degli insiemi individuati

010 001 001

Figura 2.16 Esempio di quantizzazione dell’informazione associata a una grandezza fisica. L’insieme delle possibili entità di informazione viene suddiviso in un numero finito di sottoinsiemi, a ognuno dei quali viene associata una codifica digitale. In questo caso è prevista una quantizzazione su 8 livelli, dunque a 3 bit. Sulla destra è riportata la codifica di alcuni valori; si noti come valori diversi possano essere codificati nello stesso modo.

02txt.indd 49

12/01/22 08:39


50

Capitolo 2

L’informazione e la sua codifica

Ampiezza A3

A2

A1

A0 t1 T1

t2 T2

t3 T3

t4 T4

t5 T5

t6 T6

t7 T7

Tempo

Figura 2.17 Andamento di una grandezza fisica nel tempo, campionamento e successiva quantizzazione. L’intervallo di tempo considerato è suddiviso nei sottointervalli di campionamento Ti e per ciascuno di essi viene scelto l’istante di campionamento ti in cui il valore della grandezza viene rilevato. In questo caso la quantizzazione è su quattro livelli, quindi il risultato del campionamento, espresso dalla successione dei livelli associati ai campioni, è A2 A2 A0 A1 A3 A3 A1 che corrispondono ai riquadri in grigio nella figura (se i livelli fossero codificati in binario, la successione potrebbe essere, per esempio, 10 10 00 01 11 11 01).

Mentre il parametro che qualifica la quantizzazione è il numero di bit, il campionamento è caratterizzato dalla frequenza di campionamento, definita come il numero di campioni che vengono acquisiti nell’unità di tempo: per grandezze variabili con sufficiente rapidità, l’unità di tempo impiegata è il secondo, e perciò la frequenza di campionamento si misura in numero di campioni al secondo, o hertz (Hz). Per esempio, un’operazione di campionamento effettuata con una frequenza di 5 Hz consiste nell’acquisizione di 5 campioni al secondo, quindi (nell’ipotesi che il periodo di campionamento sia costante) nell’acquisizione di un campione ogni 0.2 secondi. Ampiezza A3 a3 Andamento originario della grandezza

A2 a2

A1 a1

Andamento della grandezza ricostruito dai valori campionati

A0 a0 t1 T1

t2 T2

t3 T3

t4 T4

t5 T5

t6 T6

t7 T7

Tempo

Figura 2.18 Ricostruzione dell’andamento della grandezza a partire dai valori campionati e quantizzati. Per ogni livello di quantizzazione Aj viene scelto un valore rappresentativo aj che si assume sia stato rilevato all’istante di campionamento ti: il punto così individuato viene utilizzato per ricostruire l’andamento della grandezza (nella figura si può rilevare come l’interpolazione di questi punti permette di ricostruire la curva con un’approssimazione migliore di quella che si può ottenere da un andamento a gradini).

02txt.indd 50

12/01/22 08:39


Capitolo 2

L’informazione e la sua codifica

51

Se con la quantizzazione si discretizza il valore della grandezza, il campionamento discretizza il tempo in cui la grandezza viene osservata. Come accade per la quantizzazione, anche nel caso del campionamento la discretizzazione può provocare una perdita di informazione, dovuta al fatto che si considera un campione come rappresentativo di tutti i valori che la grandezza assume in un intervallo di tempo. Anche per ridurre la perdita di informazione dovuta al campionamento è perciò possibile aumentarne la frequenza, riducendo l’intervallo di tempo che separa due campioni successivi (a questo proposito, nel Capitolo 5 è presentato un teorema che fornisce una condizione per campionare un segnale senza perdere informazione). Un tipico esempio di informazione che sempre più spesso viene codificata in modo digitale attraverso campionamento e quantizzazione è il suono (Figura 2.19). Sulle principali piattaforme di streaming audio la codifica digitale del suono è ottenuta attraverso un campionamento con una frequenza di 44 100 Hz e una quantizzazione su 65 536 livelli (ogni campione viene quindi codificato con una successione di 16 bit, dato che 216 = 65 536). In questo modo un secondo di musica stereo richiede 44 100 campioni di 16 bit (2 byte) ciascuno per due canali, quindi 176 400 byte. Con questi valori, l’errore che si commette nell’operazione di digitalizzazione e di ricostruzione del segnale sonoro è difficilmente rilevabile da parte di un orecchio umano. Le operazioni di campionamento e quantizzazione si possono applicare anche quando si vuole ottenere una codifica digitale di grandezze che variano nello spazio invece che nel tempo. Si consideri per esempio la codifica di un’immagine: il campionamento consiste nel dividere l’immagine in sottoinsiemi, per ognuno dei quali si dovrà prelevare un campione che si considera rappresentativo del colore di tutto il sottoinsieme. Questi sottoinsiemi sono trattati come gli elementi di base dell’immagine digitale, e sono chiamati pixel (una contrazione di picture element). Come nel campionamento della musica, in cui quanti più campioni vengono rilevati nell’unità di tempo tanto più precisa è la riproduzione del suono, così nel caso delle immagini, quanti

©doctor_bass/Shutterstock

Figura 2.19 Onda sonora ricavata a partire dai dati digitalizzati di circa mezzo secondo di musica. Le due parti rappresentano i due canali stereo.

02txt.indd 51

12/01/22 08:39


52

Capitolo 2

L’informazione e la sua codifica

più pixel vengono considerati per unità di superficie tanto più precisa sarà la riproduzione dell’immagine. Nel caso delle immagini, la quantizzazione corrisponde alla codifica del colore associato a ogni pixel: poiché 256 livelli di grigio possono essere sufficienti per rappresentare un’immagine in bianco e nero, serviranno 8 bit per ogni pixel. I più recenti formati di codifica digitale delle immagini utilizzano 32 bit, cioè 4 byte, per codificare il colore di ciascun pixel: 8 bit per ognuna delle tre componenti fondamentali (secondo il modello RGB: red, green, blue, per cui ogni colore viene ottenuto per sovrapposizione di queste tre componenti) e altri 8 per gestire le trasparenze. Perciò un’immagine costituita da 800 × 600 pixel richiede 1 920 000 byte per essere memorizzata senza utilizzare alcuna forma di compressione, cioè in quello che viene definito formato bitmap, un formato che codifica ciascun pixel indipendentemente dagli altri. Approfondimento 2.7

Le ragioni del successo della codifica digitale Perché oggi si preferisce così frequentemente la strategia di codifica digitale? Il fatto è che nessun sistema fisico è perfettamente isolato rispetto all’ambiente circostante; ciò implica che l’ambiente potrà comunque produrre degli effetti sul sistema (il cosiddetto rumore), in grado di perturbarne la configurazione. Nel momento in cui si sceglie un sistema fisico come supporto per informazione, ci si pone perciò, in particolare, l’obiettivo di ridurre il più possibile tale rumore o almeno i suoi effetti sulla possibilità di decodifica dell’informazione. È chiaro che un supporto usato con una codifica analogica non è particolarmente adatto allo scopo, perché ogni configurazione potrebbe essere lecita dal punto di vista informazionale, quindi risulta in generale impossibile distinguere l’eventuale presenza di rumore. Si consideri invece la strategia di codifica basata sulla replica di valori binari, in cui ogni valore è portato da un supporto caratterizzato da due soli stati stabili: per esempio un dispositivo elettrico potrebbe essere caratterizzato come dispositivo bistabile secondo quanto indicato nella figura che segue: i valori della tensione che può essere presente ai capi del dispositivo, supposti nell’intervallo tra 0 e 5 volt, costituiscono un continuum; dati i due valori nominali di 0 volt 5 4 3 2 1 0

02txt.indd 52

(“dispositivo spento”) e 5 volt (“dispositivo acceso”), si possono allora usare, per esempio, tutti i valori tra 0 e 1 volt per la configurazione “spento” e tutti i valori tra 4 e 5 volt per la configurazione “acceso”. Si ottengono così due vantaggi: 1. si introduce una tolleranza a piccoli effetti di rumore (anche in presenza di tensioni spurie fino a 1 volt, le configurazioni rimangono stabili); 2. si introduce la possibilità di riconoscimento automatico della presenza di rumore (una tensione di 3 volt corrisponde a uno stato vietato per gli scopi di informazione, in quanto non riferito ad alcuna configurazione). Naturalmente tutto ciò ha un costo: mentre la codifica analogica è in grado di portare quantità di informazione limitate solo dalla capacità di osservazione sul supporto, quella digitale è assai inefficiente proprio dal punto di vista della quantità di informazione che è in grado di portare, ed è dunque utilizzabile solo in presenza di sistemi in grado di compensare questa inefficienza con notevoli capacità di replica e di gestione di supporti binari replicati. È proprio questo il ruolo che storicamente hanno avuto i calcolatori digitali.

Valore della tensione (V) Valori accettati come indicatori della configurazione “1” (acceso) Valori “vietati” dal punto di vista informazionale: un valore compreso in questa zona è considerato un errore generato da disturbi esterni Valori accettati come indicatori della configurazione “0” (spento)

12/01/22 08:39


Capitolo 2

L’informazione e la sua codifica

53

Approfondimento 2.8

Codici a barre I prodotti di consumo sono generalmente dotati di un codice a barre, a testimonianza del successo di questo sistema di identificazione. La sua affermazione in tutti i settori industriali e nei servizi è stata determinata dal basso costo di produzione e applicazione dell’etichetta e dalla semplicità di utilizzo del sistema di lettura nel suo complesso: lo sviluppo di sistemi di stampa economici e di elevata qualità ha permesso infatti di integrare la marcatura bar code direttamente sulle linee produttive e di spedizione.

Il bar code è un codice digitale formato da barre e spazi allineati in parallelo. Le successioni di linee ampie o strette e di spazi possono essere interpretate come codici alfanumerici. Le etichette su cui sono rappresentati i codici a barre possono essere letti da un laser ottico sfruttando la diversa riflessione del fascio luminoso che le righe e gli spazi provocano. Nonostante siano stati creati numerosi tipi di codifica in funzione delle differenti necessità di applicazione, due sono quelli che si sono imposti e che godono della maggiore diffusione: il codice EAN (European Article Number) è il più diffuso a livello europeo per la marcatura all’origine dei prodotti finiti; il codice UPC (Universal Product Code) svolge una funzione analoga negli Stati Uniti.

2.3.2

La sostanziale standardizzazione del codice a barre ha contribuito a facilitare l’interoperabilità dei sistemi di lettura utilizzati dai diversi attori all’interno delle filiere, garantendo la possibilità di identificare i prodotti e i materiali lungo tutta la catena di fornitura.

Analogamente, il codice QR (Quick Response Code) viene rappresentato su etichette di forma quadrata e con una struttura a matrice. Grazie alle sue caratteristiche, l’etichetta può contenere una quantità maggiore di informazione rispetto a un codice a barre tradizionale: per questa ragione, e per il fatto che l’etichetta può essere letta da qualsiasi smartphone dotato di fotocamera, il codice QR ha trovato applicazione in contesti diversi, dalla tracciabilità di prodotti alla distribuzione di informazione come, per esempio, indirizzi internet, biglietti da visita, menù nei ristoranti o testi di vario genere.

La compressione dei dati

Nella presentazione delle modalità di codifica digitale dell’informazione discusse finora non ci siamo preoccupati di valutare, se non marginalmente, il costo e l’efficienza della codifica. Quanto finora esposto infatti legava la scelta delle rappresentazioni soltanto all’esigenza di stabilire una codifica dell’informazione che consentisse una corretta decodifica e fosse comoda da manipolare per realizzare le trasformazioni più frequenti. Cambiando modalità di codifica è spesso possibile introdurre codifiche più efficienti, a parità di informazione contenuta, riducendo il numero di bit richiesti: un’operazione chiamata compressione dei dati, con vantaggi dal punto di vista dei costi di memorizzazione e di trasmissione dei dati (a questo proposito si veda anche quanto presentato nel Capitolo 7). Tale operazione rende però meno agevole realizzare le trasformazioni necessarie sui dati stessi perché si devono studiare algoritmi alternativi o, nella maggior parte dei casi, riportare i dati nella forma originaria prima di qualsiasi loro elaborazione. L’operazione di compressione sfrutta generalmente una serie di informazioni relative alla natura, alla struttura e alla destinazione d’uso dei dati da

02txt.indd 53

12/01/22 08:39


54

Capitolo 2

L’informazione e la sua codifica

comprimere. Alcune tecniche di compressione risultano perciò particolarmente adatte a una specifica applicazione (per esempio, il trattamento di testi) e potrebbero portare addirittura a una codifica peggiore in termini di bit utilizzati qualora fossero impiegate per altre applicazioni. È perciò appropriato introdurre una classificazione delle principali tecniche di compressione in funzione delle aree in cui esse sono adottate. Una prima classificazione generale distingue le tecniche di compressione in lossless (senza perdita) e lossy (con perdita). Le tecniche di compressione lossless mantengono l’informazione originaria, permettendo di ricostruirla con la semplice inversione dell’operazione di compressione, che opera riducendo, e al limite eliminando, le ridondanze presenti nell’informazione stessa. Si adottano dunque gli algoritmi lossless quando non si può perdere informazione, pena l’inutilizzabilità della stessa. È il caso, per esempio, di programmi in formato eseguibile o di documenti in formato binario (come i file doc e docx di Microsoft Word), ma è chiaro che gli algoritmi lossless possono essere impiegati per qualsiasi tipo di file. Algoritmi di tipo lossless sono anche utilizzati per la generazione di archivi di file o cartelle (come i formati ZIP or RAR), che grazie alla compressione occupano tipicamente meno spazio. A fronte di questa generalità, il limite degli algoritmi che rientrano in questa categoria è il loro (relativamente) ridotto rapporto di compressione, che comunque è fortemente variabile in funzione del tipo di file che viene compresso, a causa della diversa ridondanza dei dati presenti nei vari tipi di file (indicativamente, 3:1 o più per file di testo e 2:1 o meno per i file di programma in formato binario; con un rapporto di compressione uguale a 2:1 la dimensione del file compresso è metà di quella del file originale). Le tecniche lossless possono essere divise a loro volta in tecniche statistiche e tecniche basate sulla sostituzione. Nel primo caso l’informazione viene analizzata dal punto di vista statistico al fine di assegnare ai simboli una nuova rappresentazione caratterizzata da una lunghezza in bit variabile, che utilizzi successioni di bit più brevi per i simboli più frequenti. Per esempio, si consideri una successione di un milione di caratteri, ognuno scelto dall’insieme {A, C, G, T}; la codifica digitale usuale prevede di assegnare a ciascuno dei quattro simboli una successione di due bit, per esempio: A = 00, C = 01, G = 10 e T = 11. La lunghezza complessiva della successione è quindi pari a 2 milioni di bit. Si ipotizzi ora che la frequenza dei quattro caratteri all’interno della successione non sia la stessa, e in particolare che il carattere A si presenti nel 50% dei casi, la C nel 25% dei casi, mentre la G e la T solo nel 12.5% dei casi. Si potrebbe allora utilizzare una codifica diversa, basata su successioni a lunghezza variabile e che tenga conto di questa specifica distribuzione; per esempio: A = 0, C = 10, G = 110 e T = 111. In questo caso la lunghezza complessiva della successione risulterebbe inferiore: (1 × 50% + 2 × 25% + 3 × 12.5% + 3 × 12.5%) bit/carattere × 1 milione di caratteri, cioè 1.75 milioni di bit, 250 000 meno di quanti erano necessari nel caso precedente. Il cambiamento di codifica permette di ridurre il numero di bit utilizzato senza perdere informazione (naturalmente occorrerebbe verificare che la successione binaria è decodificabile univocamente, cioè da essa è ricostruibile non ambiguamente la successione originale: un compito, semplice, che lasciamo al lettore). Un esempio di algoritmo di compressione statistico è dato dall’algoritmo di Huffman.

02txt.indd 54

12/01/22 08:39


Capitolo 2

L’informazione e la sua codifica

55

Le tecniche basate sulla sostituzione sfruttano invece la regolarità dei dati e operano sostituendo simboli elementari della nuova rappresentazione a successioni di simboli ripetute della rappresentazione originale. I criteri di sostituzione possono essere di complessità variabile: un esempio semplice è dato dall’algoritmo RLE (Run Length Encoding), che opera sostituendo a successioni di simboli uguali una rappresentazione formata dalla coppia 〈numero di ripetizioni, simbolo ripetuto〉, che può dimostrarsi molto efficace per rappresentare informazioni poco variabili. Per esempio, potrebbe essere compressa in questo modo un’icona in bianco e nero, che può essere infatti considerata come una matrice di punti bianchi o neri che formano l’immagine, sovente con lunghe successioni di punti dello stesso colore contigui. Un esempio più complesso della stessa classe è dato dalle tecniche basate su dizionario. In questo caso il processo di compressione si articola in due fasi: nella prima fase il documento viene analizzato completamente alla ricerca di successioni ripetute, che vengono inserite in un elenco di coppie 〈successione, simbolo nella nuova rappresentazione〉 detta “dizionario”; nella seconda fase a ogni occorrenza di una successione presente del dizionario viene sostituito il corrispondente simbolo. Al solo scopo di farsi un’idea generale di come funziona questa tecnica, si consideri la frase “I re di Francia della dinastia Carolingia sono: Carlo II, Luigi II di Francia, Luigi III di Francia, Carlomanno di Francia, Carlo III detto il grosso, Odo, Carlo III detto il semplice, Roberto I di Francia, Rodolfo Duca di Borgogna, Luigi IV di Francia, Lotario di Francia, Luigi V di Francia” (292 caratteri), in cui si possono individuare alcune successioni ripetute: Indice

Parola

Ripetizioni

1

di

10

2

Francia

8

3

II

5

4

Luigi

4

5

Carlo

4

6

detto

2

7

il

2

Sostituendo a ogni successione individuata il corrispondente indice (assumendo per semplicità che gli indici non siano simboli ammessi nella codifica di partenza e che non sia necessario distinguere maiuscole e minuscole) si ottiene la nuova codifica “I re 1 2 della 1nastia Carolingia sono: 5 3, 4 3 1 2, 4 3I 1 2, 5manno 1 2, 5 3I 6 7 grosso, Odo, 5 3I 6 7 semplice, Roberto I 1 2, Rodolfo Duca 1 Borgogna, 4 IV 1 2, Lotario 1 2, 4 V 1 2”, composta da 187 caratteri (64% della lunghezza originaria), aggiungendo ai quali anche i 35 caratteri occupati dalle parole inserite del dizionario necessario per la decompressione (ognuna considerata con un carattere separatore supplementare alla fine) si ottengono comunque 222 caratteri occupati (76% della lunghezza originaria). Naturalmente gli algoritmi effettivamente adottati nelle applicazioni operano con modalità più complesse e tra loro diversificate, descrivere rigorosamente le quali va oltre lo scopo di questo capitolo. Appartiene a questa classe di tecniche, in particolare, la famiglia di algoritmi detta LZ, da Abraham Lempel e Jacob Ziv che iniziarono gli studi su di essa.

02txt.indd 55

12/01/22 08:39


56

Capitolo 2

L’informazione e la sua codifica

Le tecniche di compressione lossy sono basate su alcune considerazioni concernenti la qualità dell’informazione realmente necessaria per l’uso che se ne deve fare. Il principio è che si può accettare di perdere durante la compressione una parte dell’informazione originale se il risultato che si ottiene dalla decompressione consente ancora un uso appropriato dell’informazione stessa. Generalmente, a una maggiore compressione equivalgono file di dimensioni minori e una perdita di informazione maggiore. Le tecniche lossy sono impiegate soprattutto per il trattamento di immagini fisse (per esempio i formati JPEG, PNG e GIF) e in movimento (per esempio MPEG 2, utilizzato nei DVD, e MPEG 4), e di segnali audio (per esempio MP3 e AAC), dato che in una tipica applicazione che fa uso di dati di questo genere l’informazione disponibile è in quantità superiore rispetto alle possibilità dell’utente di usufruirne. Un esempio molto conosciuto in cui le tecniche di compressione lossy sono utilizzate è YouTube, in cui l’utente ha possibilità di scegliere la qualità del video selezionato, a cui corrispondono livelli di compressione diversi. Per quanto riguarda le immagini fisse, le tecniche si basano sulla scarsa capacità di risoluzione dell’occhio umano o sulla sua capacità di reintegrare automaticamente l’informazione eliminata in un’immagine riducendo il numero e i gradienti di colore, o sostituendo i gradienti originali con una versione ricostruita in base a un’informazione parziale. Per quanto concerne i segnali video, alle suddette possibilità si somma quella offerta dalla ridondanza del flusso di informazione nel tempo: ogni fotogramma può infatti essere codificato mantenendo soltanto le differenze rispetto al fotogramma precedente, a partire da un’immagine iniziale per il periodo considerato. Per quanto attiene, infine, ai segnali audio, si sfruttano le conoscenze sulla risposta meccanica dell’orecchio umano agli stimoli per eliminare i dettagli che non sono nella gamma di frequenze udibili o che non sono intelligibili perché coperti da suoni ravvicinati a volume maggiore. A ciò va aggiunto che questo tipo di informazione viene spesso veicolato attraverso un canale di trasmissione a capacità limitata (si pensi al video streaming) o viene usato tramite un terminale con limitazioni (come nel caso di smartphone di bassa qualità), il che rende ulteriormente inutile preservare informazione non fruibile, cosa che causerebbe soltanto uno spreco ingente di risorse. Gli algoritmi lossy sono quindi generalmente caratterizzati da un rapporto di compressione variabile a discrezione dell’utente: più alto è il rapporto di compressione che si sceglie, quindi maggiore è la quantità di informazione che si è disposti a perdere, minore sarà la qualità dell’informazione disponibile a seguito della compressione stessa.

02txt.indd 56

12/01/22 08:39


Capitolo 2

L’informazione e la sua codifica

57

Domande ed esercizi di riepilogo 2.1 Descrivere le motivazioni che portano alla scelta della codifica binaria. 2.2 Quanti bit sono necessari per codificare in binario i numeri da 0 a 37? 2.3 Proporre una codifica per i giorni della settimana basata su un alfabeto di 3 simboli. 2.4 Codificare in binario i numeri in base dieci: 139, 8.25. 2.5 Codificare in base 3 i numeri in base dieci: 139, 230. 2.6 Codificare in complemento a due su 8 bit i numeri: +19, −38. 2.7 Eseguire in binario le operazioni tra interi positivi codificati su 8 bit: 21 + 13, 35 − 18, 129 + 131, segnalando eventuali condizioni di overflow. 2.8 Elencare vantaggi e svantaggi della codifica analogica e della codifica digitale. 2.9 Descrivere le principali tipologie di tecniche di compressione. 2.10 Descrivere i vantaggi della notazione esadecimale. 2.11 Si ipotizzi che in Italia circolino circa 20 milioni di veicoli; se la targa di ciascun veicolo fosse

02txt.indd 57

espressa da un numero (a) binario oppure (b) esadecimale, quale sarebbe la lunghezza minima (numero di cifre) di ciascuna targa? Indicare i passaggi logici con cui si arriva alla risposta, che può essere ricavata senza eseguire la conversione in binario del numero indicato. 2.12 Indicare qual è il significato della successione di cifre “1001001” a seconda che sia interpretata (a) come un numero in base due; (b) come un numero in base dieci e (c) come un numero in base sedici. 2.13 Eseguire le seguenti operazioni utilizzando la codifica binaria in complemento a due su 8 bit: 35 + 18, 35 − 18, 101 + 51, 101 − 51, segnalando eventuali condizioni di overflow. 2.14 Per digitalizzare un segnale analogico è necessario eseguire le due operazioni di campionamento e di quantizzazione. Indicare quali sono i parametri che caratterizzano tali operazioni e spiegare in che modo tali parametri possono influenzare la qualità della codifica finale. 2.15 Codificare in complemento a due i numeri +191, −387 utilizzando (a) il numero minimo di bit necessari per la codifica; (b) 16 bit. Scrivere poi in ottale ed esadecimale i risultati così ottenuti.

12/01/22 08:39


58

Capitolo 2

Mappa semantica Concetto di informazione

(Non) riducibilità dell’informazione a eventi fisici

Descrizione dello stesso evento dal punto di vista fisico e informazionale

Trattamento dell’informazione

Software come esempio di entità di informazione “non riducibile”

Sistemi fisici impiegati come supporto per l’informazione

Classificazione dei supporti

Quantità di informazione e incertezza

Codifica e decodifica

Motivi della complessità della codifica

Livelli di codifica

Riduzione della complessità: entità di informazione come successioni di simboli

Codifica analogica e codifica digitale

Configurazioni e simboli

Digitalizzazione

Sintassi e semantica dell’informazione

Transistor e porte logiche

Concetto di bit

Operazioni in binario

Codifica binaria

Codifica dei dati e codifica delle istruzioni

Codifica dei numeri interi Compressione dei dati

Quantizzazione

Campionamento Codifica dei numeri razionali

Compressione con perdita di informazione (lossy)

02txt.indd 58

Compressione senza perdita di informazione (lossless)

12/01/22 08:39


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.