Sono un ex allievo del Liceo Classico "Lagrangia" e ora studio ingegneria informatica al Politecnico di Torino. Forse sono anche altro, ma questo dovrebbe bastare per poter leggere l’articolo seguente. Per convincervi a leggere, invece, non saprei cosa aggiungere. Però posso anticiparvi che potreste trovare una formula per tradurre le versioni e un modo creativo per utilizzare il vostro vecchio dizionario di greco nei ritagli di tempo... Oggi vorrei presentarvi uno dei miei più fidati compagni degli ultimi anni. È una parola, una parola che ho sentito spesso pronunciare, in vari ambienti, ma molte volte ho avuto la sensazione che chi la usava non ne conoscesse bene il significato. Si tratta di un concetto molto importante, basilare oserei dire, dell’informatica. Ma poiché l’informatica ultimamente è entrata prepotentemente nella vita quotidiana di tutti, è diventata una parola di un certo rilievo anche tra i non addetti ai lavori.
Non vedo perché tergiversare ancora, la parola è algoritmo. Tanto per cominciare, ha la a minuscola e non è quell’entità misteriosa e oscura che ci nasconde i post di alcuni amici su Facebook o ci mostra le pubblicità personalizzate su Google. O meglio, quelle “cose” sono particolari tipi di algoritmi (o entità più sofisticate composte anche da quei particolari tipi di algoritmi), ma sono molto complesse e, soprattutto, tenute gelosamente segrete dalle potenti aziende che le sfruttano. Perciò mettiamole da parte, almeno per questo articolo. Un algoritmo è, in poche parole, una sequenza finita di istruzioni che risolvono un problema. Gli algoritmi si possono trovare in qualunque campo: esempi di algoritmi con cui sicuramente avete familiarità sono le istruzioni per montare un mobile dell’Ikea o un giocattolo della Lego, le indicazioni stradali per raggiungere un determinato posto, o ancora una ricetta culinaria. Gli algoritmi ricevono dei “valori in ingresso” (farina, uova, acqua e tutti gli altri ingredienti) e portano chi li esegue a produrre dei “valori in uscita” (la torta). Sono importanti in ambito informatico perché sono l’unico modo che abbiamo per dire ai computer che cosa vogliamo che facciano, ma naturalmente sono un concetto conosciuto e studiato già ben prima dell’invenzione dei computer… Per chiarire meglio come funziona un algoritmo, vorrei fare un esempio con una situazione che ben conoscete: immaginiamo di avere davanti una versione di greco. Ecco… magari molti di voi avrebbero preferito la ricetta della torta, ma siamo sul blog degli ex allievi del Liceo Classico, e credo che se siete arrivati fin qui una spolverata di greco non sarà così spiacevole… Per prima cosa diamo uno sguardo agli ingredienti, ciò che noi informatici chiamiamo “strutture dati”. Abbiamo un foglietto fotocopiato, di solito una metà di A4 che ci fa sperare che la versione non sia troppo lunga, su cui possiamo leggere il titolo, una breve introduzione e un numero variabile di righe scritte in alfabeto greco. Chiamiamo questo oggetto, in gergo, “file di input”. C’è poi un foglio protocollo bianco, su cui dovremo scrivere la nostra traduzione, che con molta fantasia da qui in avanti rinomineremo “file di output”. Il terzo e ultimo elemento è il dizionario: vi lascio liberi di scegliere se immaginarvi un Rocci o un Montanari, l’algoritmo dovrebbe funzionare in entrambi i casi.
Ricapitolando, ecco in tutto il suo splendore l’algoritmo completo per una versione di greco:
Faccio notare alcune parole chiave all’inizio di alcune istruzioni: "Per ogni" e "Se". Sono presenti in tutti i linguaggi di programmazione (naturalmente nella versione inglese "for"/"for each" e "if") e identificano i costrutti di base, le componenti elementari, di qualsiasi algoritmo: comprendere come funzionano costituisce una buona parte di ciò che c’è da sapere sugli algoritmi. In poche parole, il costrutto "Per ogni" si chiama ciclo: consiste nel ripetere un certo numero di istruzioni (nell’esempio, quelle spostate più a destra rispetto alla riga che contiene la parola chiave) per un determinato numero di volte o fino al verificarsi di una determinata condizione (sempre nell’esempio, finché non finiscono le frasi della versione). In questo secondo caso, è possibile trovare anche la parola chiave "while", "finché". Il costrutto introdotto dal "se", invece, si chiama ramificazione: alcune istruzioni si eseguono solo se si verificano determinate condizioni, altrimenti se ne eseguono altre (nel nostro esempio, "se non conosci la parola, cerca sul dizionario, altrimenti non fare niente e vai avanti": la seconda parte è sottintesa perché non c’erano istruzioni particolari da aggiungere, ma se ce ne fosse stato bisogno, sarebbe bastato inserire la parola chiave che ho tradotto con "altrimenti", "else"). Vorrei aggiungere ancora una considerazione: ho liquidato la ricerca sul dizionario come un’operazione banale, che non richiedeva ulteriori spiegazioni. In informatica non è proprio così: i problemi di ricerca sono tra i più frequenti, e anche tra i più studiati. Mi servono ancora un paio di termini tecnici: ogni voce del dizionario è composta da una "chiave" (il lemma, in grassetto e in ordine alfabetico) e un "contenuto" (la definizione). Noi, partendo da una chiave, vogliamo confrontarla con quelle presenti nel dizionario fino a trovarne una uguale, e a quel punto leggerne il contenuto. La prima difficoltà, nel nostro caso, è ottenere la chiave: dal momento che la versione non è fatta solo di avverbi, non è così immediato risalire al nominativo singolare dei nomi o soprattutto alla prima persona singolare presente dei verbi (ok, diciamocelo chiaramente: in alcuni casi è maledettamente difficile…). Superato questo scoglio, cosa possiamo dire a qualcuno che non ha mai visto un dizionario (o a un computer, che di solito non può avere esperienza) che cosa deve fare? Da dove deve iniziare a confrontare le chiavi? Visto da questa prospettiva il problema non sembra più così banale: se lo facciamo partire dall’inizio potrebbe non arrivare mai alla parola voluta prima della fine delle due ore. Rischia di diventare lunga anche se lo facciamo partire dall’inizio di ogni lettera, sfruttando le coste colorate o le linguette che spesso si vedono nei dizionari più "vissuti". Idea! Lo facciamo partire dalle prime due lettere, avremmo meno voci da scorrere! E perché non dalle prime tre o quattro? Saremmo sempre più vicini! Beh… in questo caso non basteranno 24 linguette, ma ce ne vorranno 576, 13.824 o 331.776: capite bene che diventerebbe un grosso problema anche solo trovare la linguetta giusta! Appurato che la "ricerca lineare", come viene chiamato l’algoritmo appena descritto, non può essere una soluzione efficiente al nostro problema, vi presento la "ricerca dicotomica". Avrete sicuramente già sentito questa soave parola greca in filosofia, qui la utilizziamo nel suo significato più immediato e brutale: tagliare in due. Ci portiamo a metà del dizionario e confrontiamo la nostra chiave con quella che ci troviamo davanti: se ci è andata bene, sono uguali, e allora abbiamo finito; altrimenti, la chiave che cerchiamo può venire prima oppure dopo nell’ordine alfabetico. A questo punto, tagliamo in due il dizionario e teniamo solo la metà che ci interessa: ora abbiamo un nuovo dizionario grande la metà, andiamo di nuovo al centro e ripetiamo esattamente come prima. Come chi è stato attento avrà sicuramente notato, abbiamo applicato di nuovo il paradigma divide et impera e siamo passati da un mattone di cui tutte le povere schiene degli studenti conoscono la mole ad avere, nel caso più sfortunato, un dizionario composto da una sola parola, che siamo capaci di consultare senza perdere troppo tempo. La cosa sorprendente è che con il mio GI, che sostiene di contenere 140.000 voci (non ho mai controllato di persona, ma spero possiate comprendere), vi posso assicurare che utilizzando questo sistema è possibile trovare qualsiasi parola in, al massimo, diciotto passaggi! Per chi se lo stesse chiedendo, è il logaritmo in base due di 140.000 arrotondato per eccesso, ma come si arrivi a questo risultato è una storia un po’ più lunga e non me la sento di raccontarla qui ed ora… Come vedete, questo secondo algoritmo è molto più veloce del primo. Naturalmente ci sono modi ancora più veloci, come la ricerca “intelligente” che gli studenti arrivano a padroneggiare inconsciamente dopo anni di esperienza, ma è più difficile da spiegare al nostro amico di cui sopra, che non ha mai visto un dizionario, o a un computer, anche se su quest’ultimo si stanno concentrando alcune tra le più recenti ricerche nell’ambito dell’informatica: il cosiddetto machine learning. Tuttavia, la "ricerca dicotomica" ha una grossa limitazione: presuppone che le chiavi siano già state in qualche modo ordinate in precedenza. Ma questa è un’altra storia… Ho tenuto per la conclusione la prima domanda che personalmente, da ex classicista, mi sarei fatto subito dopo la definizione: da dove deriva la parola algoritmo? Ha un suono grecheggiante, ma i significati non sembrano incastrarsi tanto bene: la radice alg- rimanda alla sfera del dolore, ad ἄλγος e a parole come analgesico, nostalgia, sciatalgia eccetera; ῥυθμός vuol dire ritmo o cadenza; ma un ritmo addolorato o un dolore ritmato non assomigliano proprio a quello che stiamo cercando… E non sembra venirci in aiuto neanche ἀριθμός, numero, da cui derivano parole come aritmetica o logaritmo. In questo caso, però, non c’entra il greco: la parola algoritmo deriva dalla traslitterazione del nome di un matematico arabo, nato nell’attuale Uzbekistan nel IX secolo, Muhammad Al-Khwarizmi. La cosa curiosa è che a lui si può ricondurre anche un’altra parola entrata nell’italiano corrente: infatti dal titolo della sua opera principale, "al-Kitāb al-mukhtaṣar fī ḥisāb al-jabr wa al-muqābala" viene la parola algebra. Michele Pistan
0 Comments
Leave a Reply. |
Ex allievi Liceo Classico “Lagrangia”Un blog per raccontare il Liceo Classico "Lagrangia" di Vercelli e quanti hanno trascorso nelle aule di via Duomo anni importanti della propria formazione. Storie, interviste, approfondimenti culturali e molto altro a cura dell'Associazione ex allievi. Archivi
Giugno 2021
Categorie
Tutti
|