Codice Codifica Complessità


Dove approfondiamo, un poco, l’idea di codifica. Dove proviamo a renderci conto di cosa voglia dire quella sigla, UTF-8, che compare qua e là. Dove magari scopriamo che certi caratteri strani che appaiono in talune pagine web, diventano leggibili aggeggiando con il menu del browser. Dove potremmo meravigliarci di come la complessità delle grafie sia riducibile a soli uno e zero. Dove Dante ci aiuta a toccar con mano la potenza esplosiva dell’esponenziale

Le macchine digitali, almeno quelle che siamo in grado di produrre e usare oggi, sono macchine deterministiche. Masticano solo un oggetto che può avere solo due stati, zero ed uno. Eppure le stiamo utilizzando per rappresentare il mondo, che è immensamente complesso e non deterministico. Ne abbiamo costruite una grande quantità in grande varietà, poi le abbiamo collegate con una varietà altrettanto grande di modi. Ora il numero delle macchine è quasi uguale a quello degli uomini viventi, o forse anche più grande. Su questa complessa infrastruttura è emerso un altro mondo, riflesso e espansione del nostro mondo fisico; un mondo i cui elementi sono le menti degli uomini. Tutto questo partendo da macchine che masticano solo bit. Come è possibile questo? Come fa a rappresentare il mondo, in tutta la sua vertiginosa complessità, una macchina composta da macchine così semplici?

Due parole per provare a rendersi conto di cosa si possa mettere dentro a una manciata di bit

Tutto quello che si può fare, con macchine di tale disarmante semplicità, è di unire più bit in nuovi aggregati, e poi lavorare su questi. Tali gruppi di bit, sono fatti corrispondere a entità che ci sono famigliari, numeri, lettere, simboli: la codifica è il ponte che congiunge un mondo che pare esser fatto di semplicità pura, di soli zero ed uno composto, con il nostro mondo, ovvero con la complessità tout court, dove piccole zattere deterministiche navigano in un oceano di indeterminazione, ora cozzando le une contro le altre, ora smarrendosi nel caos, tessuto disordinato e ricorsivo di determinismo e altro caos, di continuo e discontinuo.

La codifica è una semplice corrispondenza fra sequenze di bit e oggetti. La corrispondenza è biunivoca: ad ogni sequenza corrisponde un solo oggetto e ad ogni oggetto corrisponde una sola sequenza. Il numero di bit che si decide di usare influenza il numero di oggetti che si possono rappresentare. Un bit, avendo due soli stati, 0 e 1 , può rappresentare due oggetti. Una sequenza di due bit consente di rappresentare quattro oggetti, avendo quattro stati possibili: 00, 01, 10, 11 . È evidente che, aggiungendo un bit a sinistra, si raddoppiano gli stati possibili, perché i due stati del primo bit a destra, 0 e 1 , vengono ripetuti per il valore 0 e per il valore 1 del nuovo bit a sinistra. Ed è altrettanto evidente che questo meccanismo si ripete ogni volta che aggiungiamo un bit a sinistra della sequenza, non importa il numero dei bit alla sua destra. Quindi, aggiungendo un terzo bit potremo rappresentare 2 x (4) oggetti, un quarto 2 x (8) oggetti e così via. Poiché ad ogni bit aggiunto si moltiplica il numero degli oggetti per due, possiamo valutare al volo il numero di oggetti rappresentabile con n bit mediante la semplice espressione 2n .

Comunemente a tutti i sistemi di numerazione arabica, i bit “pesano” in modo diverso a seconda della loro posizione: aggiungendo il secondo bit si aggiungono 2 oggetti, aggiungendo per esempio l’ottavo bit si aggiungono 128 oggetti, aggiungendo il sedicesimo bit si aggiungono 32768 oggetti. Si capisce facilmente così la natura esponenziale della “capienza” di una sequenza di bit in funzione del loro numero. Si capisce altettanto facilmente il senso della terminologia che definisce bit più significativi quelli a sinistra e bit meno significativi quelli a destra della sequenza.

La prima codifica dei caratteri alfabetici e numerici

Nel post Andando dove mi portano i feedback … avevo menzionato una particolare codifica, che è l’American Standard Code for Information Interchange (ASCII). La codifica ASCII è sintetizzata in una tabella nella quale ad ogni carattere dell’alfabeto latino corriponde una sequenza di 7 bit, quindi per memorizzare ogni carattere occorreva un byte ( 1 byte = 8 bit) del quale andava sprecato l’ottavo bit, quello più significativo . Fino a circa la metà degli anni 90, manipolare testo voleva dire lavorare con i caratteri ASCII o al massimo con una delle tante estensioni ASCII che stavano proliferando in quegli anni. Infatti la codifica ASCII è sodisfacente solo per la lingua inglese, nella quale non compaiono le lettere accentate, ma non per la maggior parte delle altre lingue, anche limitandosi solo a quelle il cui alfabeto è di origine latina, per via di una varietà di possibili accentazioni. Così, per un certo tempo ogni comunità linguistica si è costruita la propria estensione, utilizzando i 128 stati in più resi disponibili dal bit più significativo del byte.

Il tentativo della codifica universale

Poi, nella prima metà degli anni 90, Internet è esplosa avvolgendo il pianeta e perfondendo tutte le attività umane. In tale situazione la confusione dei codici ASCII si è rivelata del tutto insufficiente a codificare la varietà dei simboli delle lingue umane e ha visto la luce un processo piuttosto ingarbugliato teso alla creazione di una codifica universale. Omettiamo qui i particolari di questo processo per giungere allo standard Unicode.

L’utilità di questo meccanismo va ben oltre la rappresentazione delle lettere acccentate a noi familiari, potendo rappresentare caratteri con accenti multipli, simboli matematici, caratteri braille, e i caratteri molto più “pittorici” che caratterizzano tante altre lingue. La lista delle lingue delle quali è stato codificato l’alfabeto è impressionante: latino, greeco, cirillico, ebraico, arabo, armeno, and georgiano, gli ideogrammi cinese, giapponesi, coreani, e ancora le scritture hiragana, katakana, hangul, devanagari, bengali, gurmukhi, gujarati, oriya, tamil, telugu, kannada, malayalam, thai, lao, khmer, bopomofo, tibetano, runico, etiopico, cherokee, mongolo, ogham, myanmar, sinhala, thaana, yi per nominarne alcune, anzi, per copiarne alcune, perché alcune di queste non le ho neanche mai sentite nominare. E il lavoro di codifica continua, con altre scritture, anche di interesse storico, quali quella cuneiforme e quella dei geroglifici, oppure con scritture che sono creazioni letterarie, quali la lingua degli elfi, il tengwar, inventato di sana pianta da John R. R. Tolkien!

È assolutamente affascinante gironzolare in questa Babele, per esempio nella pagina di Wikipedia dedicata a Unicode. Se scorrete la pagina osservando la colonna di sinistra, vedete una sequela di lingue e di grafie, che potete seguire e ammirare. Io mi ci perdo facilmente, in preda allo stupore per la varietà dei modi escogitati per comunicare. Alcuni di quegli alfabeti sono semplicemente meravigliosi.

E se io non li vedo?

Non è detto che tutti i caratteri più inusuali siano visibili, come avverte Wikipedia in quel box in alto a destra nella pagina che vi ho indicato. In questo caso, e in tutti gli altri nei quali vi potrebbe capitare di non vedere correttamente e più banalmente, le lettere accentate di una lingua europea, si tratta di aggeggiare con il comando di menu del browser che è qualcosa tipo Visualizza -> Codifica, View -> Character Encoding, più o meno. Troverete una lista di opzioni possibili che si riferiscono alle codifiche che il vostro browser dovrebbe essere in grado di gestire. Per esempio Western (ISO-8859-1) (Europa occidentale o simili) rappresenta l’estensione della codifica ASCII per gli accenti delle lingue europee, mentre Unicode (UTF-8) rappresenta la codifica Unicode [1], appunto. Ebbene, se avete problemi di rappresentazione di caratteri nelle pagine web, di solito utilizzando quest’ultima codifica le cose vanno a posto. Potete sperimentare divertendovi a fare il contrario, per esempio scegliendo la codifica per vedere che succede nella pagina di Wikipedia dedicata a Unicode, per esempio selezionando la codifica Western (ISO-8859-1), e poi viceversa.

Immagino che oggi nessuno possa considerare troppo remoti i mondi nei quali si comunica in quei modi così diversi. Io ho avuto studenti cinesi, arabi, israeliti, africani, e in alcuni casi è stato interessante dare loro una mano affinché potessero usare un nostro computer per comunicare con il loro mondo.

Ma siamo sicuri di avere “sentito” la vertigine dell’esponenziale

Sì, proprio sentito, come un fastidio per l’impossibile brutalmente sbattuto in faccia. Una sensazione non del tutto piacevole che una espressione banale, come 2n non può dare, a meno che uno non sia dotato di sensibilità matematica.

Visto che stiamo ronzando intorno all’idea di universale, facciamoci raccontare qualcosa in proposito da uno che l’idea di universale certamente la evoca.

Nella Divina Commedia, Paradiso, XXVIII canto (vers. 88-93), Dante, a proposito delle parole appena pronunciate da Beatrice, scrive

E, poi che le parole sue restaro,
non altrimenti ferro disfavilla
che bolle, come i cerchi sfavillaro:
l’incendio suo seguiva ogni scintilla;
ed eran tante, che ‘l numero loro
più che ‘l doppiar de li scacchi s’immilla.

Il numero delle scintille scaturite dalle parole di Beatrice si moltiplicano come le faville del ferro nella forgia, s’immillano più che il raddoppiare degli scacchi [2].

Qui Dante si rifà ad una leggenda di origine orientale secondo la quale, l’inventore degli scacchi avrebbe chiesto al re di Persia che voleva compensarlo, un chicco di grano sulla prima casella, due sulla seconda, quattro sulla terza e via raddoppiando. Al re questo sembrò nulla ma quando il calcolo fu fatto, emerse che neanche coltivando a grano tutte le terre conosciute sarebbe stato possibile soddisfare tale richiesta!

Proviamo a farci un’idea di questa quantità. Prima di tutto bisogna appurare quanti sono i chicchi di grano. Nella prima casella poniamo un chicco. Nella seconda 2 e in tutto sono 3. Nella terza 4 e in tutto sono 7. È facile vedere che se il numero della casella che stiamo riempiendo è n , il numero di chicchi è dato da 2n-1 . Quindi per 64 caselle, il numero totale di chicchi sarà dato da 264-1 .

Questa scritturina pare innocua e invece è una bomba! Per farsi un’idea del suo valore conviene esprimerlo in potenze di 10 anzichè di 2. Questo si fa risolvendo la seguente equazione

10x=264

Usando i logaritmi si ricava x:

x=64 x log_102=19.3

Quindi il numero di chicchi è circa 1019.3 . Detto in parole sarebbero più di 10 miliardi di miliardi di chicchi – 109 fa un miliardo, questo per 109 fa un miliardo di miliardi, per 10 ancora farebbe 10 miliardi di miliardi .

Ho preso un pugnello di grano, una giumèlla [3] direbbe il mio amico Pietro, e giocando con la bilancia, ho appurato che ci vogliono 100 chicchi per fare 5 grammi, più o meno. Un chicco di grano pesa quindi 5 x 10-2 grammi = 50 milligrammi. Facendo il conto si trova che la quantità richiesta dal matematico al suo re è pari a 5 x 1011.3 tonnellate, più di cento miliardi di tonnellate. Sembra effettivamente tanta roba ma è così tanta che si fa fatica a visualizzarla!

Leggo su un testo tecnico (pdf, pag. 139. La produzione e il commercio del grano duro nel Mondo ed in Italia, F. Sgroi, V. Fazio)

Dal 1998 al 20061 la produzione mondiale di grano duro è stata in media di circa 35,5 milioni di
tonnellate annue, con valori compresi tra il minimo storico di 31,8 milioni di tonnellate del 2001 ed il
valore record registrato per il 2004 di 40,5 milioni di tonnellate.

Dunque con il grano che il re di Persia avrebbe dovuto dare all’arguto inventore degli scacchi, l’umanità (di oggi) ci camperebbe 1000 anni!


[1] UTF (Uniform Transformation Table) descrive il modo nel quale il numero Unicode, corrispondente a ciascun carattere, viene di fatto accomodato in una sequenza di byte. Potrebbe essere anche divertente approfondire un attimo ma ho paura di svagolare troppo. Basti sapere che è un sistema ingegnoso e non del tutto banale per far sì che UTF-8 rimanga completamente compatibile con l’ormai enorme mole di documenti scritti con la codifica mono-byte ASCII. Questo vuole dire che per esempio un browser settato per leggere documenti con la codifica UTF-8 legge anche correttamente documenti codificati in ASCII.

Un’altra cosa, per vedere la codifica con cui è scritta una pagina web, andate a vederne la sorgente, come ormai sapete fare, da qualche parte all’inizio, troverete UTF-8 o ISO-qualcosa.

[2] Spesso sento dire cose del tipo:

… i giovani pensano che nella rete ci sia tutto … la rete è mero strumento di ricerca di cose … ma come fare a sapere che una cosa è attendibile …

Internet è come il ritratto di Dorian Gray. Perché in Internet c’è effettivamente tutto. È il mondo, è il luogo – per ora – dove tutto il pensiero del mondo è reso immediatamente accessibile. Ed essendoci tutto c’è tutto il bene e tutto il male possibile, il mondo appunto. Dipende da noi, cercare di estrarre il bene. E noi pensiamo davvero che per questo ci possa essere un manuale? Una ricetta?

Tornerò su questo.

Diverso tempo fa, per chissà quale caso strano mi rammentai che da qualche parte nella Commedia c’era un riferimento alla leggenda dell’inventore degli scacchi, e mi ricordavo a malapena di quell’immilla. Mi posi quindi a cercare nel libro, ma non fui buono di trovarlo, almeno nel tempo che potevo concedermi per quel capriccio. M’accostai allora a Google e scrissi: divina commedia immilla.

Poi ho ripreso in mano il volume commentato dal Sapegno, ed è da quello che ora ho ricopiato quei versi, perché m’ha fatto piacere fare così. Ma ringrazio Google per avermi dato una bella mano.

[3] Dal Devoto Oli:

Giumèlla s.f. Quanto è contenuto nel cavo delle mani accostate insieme con le dita congiunte: due g. d’ulive secche. Loc. avv., non com. a giumelle, in abbondanza. [Lat. gemella (manus) incr. con (mani) giu(nte)].

12 pensieri riguardo “Codice Codifica Complessità”

  1. Mi piace il paragone tra Internet e il ritratto di Dorian Gray, rende bene l’idea ” Oggigiorno si conosce il prezzo di tutto, ma non si conosce il valore di niente.”

    — Oscar Wilde
    dal libro “Il ritratto di Dorian Gray” di Oscar Wilde

  2. Ho finalmente capito a cosa serve UTF 8 e per me non è stato facile perchè, di fronte a cose così tecniche, più che provare le vertigini, mi sembra di leggere il Voynich.
    A proposito come la mettiamo con quello?

  3. Sì Monica, è vero. Lo avevi anche detto ieri in aula virtuale, poi mi sono dimenticato di rispondere, distratto dalla chat veloce e dalla parlantina di GranDiPepe 🙂

Lascia un commento