I linguaggi fuori
Come diceva C-3PO?
Sono fluente in oltre sei milioni di forme di comunicazione.
Quando abbiamo lanciato la nostra organizzazione, uno studente dodicenne, il suo primo giorno di uno stage estivo sulla programmazione, si è vantato di essere fluente in sei lingue e linguaggi. Alla domanda su quali, ha risposto: Inglese, Scratch, Java, JavaScript e un po’ di Python.
Ma sono solo cinque, ha puntualizzato uno dei consulenti.
Oh, dimenticavo, ha risposto: Mia mamma mi ha anche insegnato il linguaggio dei segni. Ha iniziato a comporre l’alfabeto con la totale sicurezza che hanno, a volte, i dodicenni fluenti.
Uno degli altri ragazzi partecipanti allo stage ha inavvertitamente posto una profonda domanda filosofica: Che cosa significa fluente?.
Significa che lo sai, gli ha risposto il primo ragazzo, alzando gli occhi al cielo, come se la domanda fosse offensivamente banale.
Mentre lo stage di programmazione procedeva, divenne chiaro che conosceva fluentemente solo l’inglese. La sua presunta fluenza in Scratch gli derivava dall’aver fatto un’ora di programmazione alle scuole elementari. La sua fluenza in Java/JavaScript gli derivava dal fatto che suo padre (uno sviluppatore web a tempo pieno) un giorno gli aveva spiegato la differenza tra Java e JavaScript mentre gli mostrava un frammento di codice JavaScript che aveva scritto per lavoro. La sua fluenza in Python gli derivava da alcune lezioni online che aveva seguito insieme a suo padre, che aveva deciso che per lui Python fosse un primo linguaggio migliore di JavaScript. La sua fluenza nel linguaggio dei segni americano si riduceva a conoscere le parole affamato e latte, più una quindicina di lettere dell’alfabeto.
Tuttavia, abbiamo imparato molto da questo ragazzo. Questa era la prima volta che sentivamo qualcuno affermare di essere fluente in un linguaggio di programmazione e confondere così platealmente questa fluenza con la fluenza nel linguaggio naturale come l’inglese e il linguaggio dei segni.
Linguaggi senza lingua
Se siamo al corrente, ovvero siamo programmatori, la cosa ci farà sorridere. Ma non è interamente colpa delle persone. In italiano abbiamo risolto il problema parlando di lingua straniera e di linguaggio di programmazione (nessuno in Italia parlerebbe di linguaggio tedesco o di lingua JavaScript, ma la parola inglese language copre entrambi i significati, e così Java, Scratch, Python, Racket e così via sono tutti languages, come lo spagnolo, il francese o il finlandese. Vale la pena di chiedersi da dove arriva quella parola.
I linguaggi di programmazione non sono sempre universalmente stati chiamati linguaggi. Il primo pioniere della computer science, Charles Babbage, introdusse negli anni Quaranta del XIX secolo il termine notazione. Negli anni Quaranta del secolo scorso, Konrad Zuse inventò quello che chiamò semplicemente calcolo dei piani (Plankalkül, in tedesco), che riconosciamo, a posteriori, essere il primo linguaggio di programmazione di alto livello al mondo. Alcune delle prime cose che oggi chiamiamo linguaggi sono stati semplicemente chiamati autocodifiche dai loro creatori. Sì, un tempo le persone erano molto più accorte nella scelta dei nomi di questi linguaggi tecnologici.
Ma negli anni Cinquanta, la parola linguaggio cominciò a essere usata per denominare per esempio ALGOL (ALGOrithmic Language), uno dei primi linguaggi di programmazione.
Oggi, a volte troviamo il termine all’interno del nome di alcuni linguaggi, come HTML (HyperText Markup Language) o SQL (Structured Query Language). Ma in gran parte non ci pensiamo troppo su, facendo riferimento all’intera categoria di tecnologie chiamandole linguaggi.
E non c’è niente di sbagliato in tutto questo.
Dobbiamo solo essere consapevoli della confusione che ciò può causare. Gli studenti spesso non sono consapevoli di come i linguaggi di programmazione differiscano da quelle altre cose che chiamiamo lingue o linguaggi, quelli con cui abbiamo molta più familiarità e che probabilmente usiamo fin dall’alba della nostra specie. Allo stesso modo, gli insegnanti a volte faticano ad articolare le relazioni che li legano: esagerando le somiglianze o, al contrario, le differenze.
Dare un nome a qualcosa è un potente atto linguistico. Dire che qualcosa è una lingua o un linguaggio è un potente atto metalinguistico. Quando facciamo una cosa del genere, vale la pena di chiedersi perché lo facciamo.
La parola language, naturalmente, come lingua e linguaggio, deriva dalla parola latina lingua. Non sorprende, quindi, che il concetto sia ancorato al discorso. Eppure, proprio quelle tecnologie che sono molto meno lingue del linguaggio dei segni o dell’italiano o dell’inglese sono entrate nell’alveo dei linguaggi senza troppe storie, gratuitamente.
Chi ha pagato l’iscrizione al club?
A quanto pare, i matematici avevano adottato la parola linguaggio prima ancora che venissero concepiti i moderni computer e i loro linguaggi di programmazione. In Principia Mathematica si distingue regolarmente tra linguaggio ordinario (la lingua madre degli autori Russell e Whitehead, l’inglese) e cose come il linguaggio logico (le loro notazioni matematiche). Questi matematici del XX secolo non furono i primi a fare queste distinzioni metalinguistiche. La cosa risale a molto più lontano.
I matematici per secoli hanno sviluppato le loro notazioni mentre contemporaneamente e responsabilmente separavano i loro linguaggi (così li chiamavano) di nuova costruzione dalla loro lingua madre. Augustus De Morgan, famoso per i suoi contributi alla logica matematica e all’algebra e per essere stato insegnante di calcolo di Ada Lovelace, parlò esattamente di questa separazione:
Abbandonando i significati dei simboli [matematici], abbandoniamo anche quelli delle parole [della lingua naturale] che li descrivono. Quindi l’aggiunta deve essere, per il momento, un suono privo di senso. È una modalità di combinazione rappresentata dal +; quando il + riceve il proprio significato, altrettanto farà anche la parola addizione. … Nessuna parola o segno aritmetico o algebrico ha un minimo significato in questo capitolo… Se qualcuno dovesse affermare che + e – potrebbero significare ricompensa e punizione, e A, B, C e così via potrebbero rappresentare virtù e vizi, il lettore potrebbe credergli o contraddirlo, a suo piacimento…
Sta dicendo che la parola addizione è semplicemente importata dal linguaggio naturale, ma quando si attraversa la soglia tra il linguaggio naturale e l’algebra, diventa un suono privo di senso. Anche il senso della frase l’addizione opera su numeri è, sottolinea, troppo vaga. Innanzitutto, ci si chiede perché non abbia usato qualcosa come gorblesnop se, davvero, voleva una parola priva di senso. Tuttavia, farlo per tutte le operazioni e per tutti i linguaggi simbolici concepibili, obbliga la mente a destreggiarsi tra troppe parole che non hanno alcun senso in alcuna lingua.
Anche i progettisti di linguaggi di programmazione, nel corso dei decenni, hanno importato parole dall’inglese piuttosto che inventare nuove parole: if, class, object, graph, interpret, compile, execute, tree, branch, library e così via. Queste, se usati da programmatori, non mantengono il significato ambiguo che hanno nell’inglese. Assumono un significato molto più preciso e tecnico in inglese di programmazione.
Il club del calcolo di Babbage
Ancor prima, già nel 1813, quando Charles Babbage era semplicemente uno studente universitario a Cambridge, molto prima che lavorasse al suo Difference Engine o al suo Analytical Engine, scrisse quello che egli chiamava linguaggio simbolico, descrivendo tali concetti matematici come strumenti per rilassare la mente:
È lo spirito di questo linguaggio simbolico… (così tanto all’unisono in tutte le nostre facoltà) che porta l’occhio … a condensare pagine in righe e volumi in pagine; ad accorciare la strada verso la scoperta e a preservare la mente, non affaticata dai continui sforzi di attenzione ai dettagli, in modo che possa esercitare tutto il proprio vigore sui fatti più importanti.
Questo è stato scritto nella prefazione di un manifesto scritto da un piccolo gruppo di studenti rivoluzionari di Cambridge chiamato Analytical Society, di cui Babbage era membro fondatore. L’obiettivo del gruppo era di apportare un cambiamento linguistico al loro sistema educativo: far sì che Cambridge abbandonasse l’uso della notazione di calcolo di Newton nei libri di testo e negli esami, e usasse piuttosto la notazione più popolare nell’Europa continentale: quella di Leibniz.
È forse il primo esempio dell’adozione su larga scala di un linguaggio simbolico da parte di un sistema educativo, sostituito poi da un altro, più popolare. Nella computer science, questo accade comunemente con i linguaggi simbolici dei nostri giorni: prima che le università insegnassero Java, insegnavano C++ e Pascal; oggi, sempre più istituzioni si stanno spostando su Python, che è ora il linguaggio più insegnato. E domani? Chissà…
La Analytical Society di Babbage si basava meno sul calcolo e più su un’idea psicologica, quando afferma che:
un linguaggio di simboli può essere uno strumento migliore per la mente rispetto a un altro.
Successivamente, Babbage continuerà a occuparsi di quello per cui è più famoso: inventare l’Analytical Engine, una macchina in grado di manipolare simboli. Questa macchina sarebbe programmabile in una notazione di sua invenzione: un linguaggio simbolico. In altre parole, la carriera del padre della computer science è stata, dai suoi anni universitari in poi, intrecciata con i linguaggi simbolici, ciò che i matematici oggi chiamerebbero linguaggi formali. Questa è un’ampia categoria linguistica che include notazioni matematiche come quelle di De Morgan e Babbage, nonché i moderni linguaggi di programmazione come Java e Python.
Tra il 1837 e il 1845, Babbage e Lovelace avrebbero scritto (usando la loro notazione) le prime cose che gli storici considerano programmi per computer; un secolo prima della costruzione storica del primo computer hardware (il computer elettronico Z3 di Konrad Zuse, nel 1941).
Oggi, i linguaggi di programmazione che insegniamo e apprendiamo a scuola sono istanze di una lunga e costante tradizione nella progettazione dei linguaggi, che precede addirittura le prime macchine elettriche su cui hanno operato. Le macchine non sono affatto l’origine di questi linguaggi; e pensare così sarebbe ingiusto nei loro confronti.
In effetti, non c’è nemmeno un’ambiguità uovo/gallina qui: i linguaggi di programmazione sono stati realizzati un secolo prima delle prime macchine programmabili. Babbage non arrivò mai a realizzare l’Analytical Engine.
Differenze
È facile trovare differenze tra Java e l’inglese, oppure tra Scratch e il linguaggio dei segni. Per quanto diversi, i linguaggi di programmazione e i linguaggi naturali hanno effettivamente una cosa sorprendente in comune: in una macchina per risonanza magnetica, un apparecchio utilizzato per scattare immagini del cervello in funzione, le parti del cervello di un programmatore che si attivano quando leggono un programma sono le stesse che si illuminano in tutti gli esseri umani quando leggono un testo in linguaggio naturale.
Descrizioni finite dell’Infinito
La terza edizione dell’American Heritage Dictionary of the English Language conta più di 350.000 parole (Sukhanov 1992). Il Dizionario accademico del lituano ne contiene circa mezzo milione (Lietuviµ kalbos žodynas 2005). Il dizionario online del Turkish Language Institute contiene oltre 600.000 parole (Turkish Language Institute 2019). E il dizionario online per il nord e sudcoreano contiene oltre 1,1 milioni di parole (National Institute of Korean Language 2019).
Le lingue sono cose grosse.
Detto questo, si può benissimo sostenere che il numero di parole contenute in un dizionario non denoti realmente le dimensioni di una lingua. È vero. Il diplomato medio americano, all’uscita dalle scuole superiori conosce circa 45.000 parole. E sebbene possa conoscere e riconoscere 45.000 parole, il vocabolario attivo dell’adulto medio americano è più vicino a 20.000 parole. È di gran lunga inferiore alle 350.000 parole presenti nel dizionario inglese. E va bene. Conoscere tutte le parole di un dizionario non è esattamente un requisito per la padronanza di una lingua. Tuttavia, che si guardi al numero di parole contenute in un dizionario o a qualcosa di più modesto, si avrà la stessa impressione paragonando quel numero a quelli, più piccoli, che descrivono le dimensioni dei linguaggi di programmazione.
Java, per esempio, è formato da circa 50 parole chiave. Il fatto è che nessuno impara Java con facilità imparando semplicemente le definizioni per quelle parole chiave. Esse rimangono semplicemente simboli privi di senso, fino a quando non vengono combinati con altri simboli in base a determinate regole.
Anche queste regole, tuttavia, sono poco numerose rispetto alle molte regole grammaticali delle lingue naturali. Le regole di Java stanno in un’unica pagina web. Sebbene il loro numero cresca a mano a mano che il linguaggio si evolve, non sono mai state più di qualche centinaio.
Anche includendo tutto il vocabolario e tutte le regole grammaticali di Java, restiamo nell’ordine delle centinaia, mentre la nostra stima più conservativa delle dimensioni del vocabolario inglese è di 20.000 parole definite ambiguamente, oltre a molte (spesso subdole) regole grammaticali. Questa differenza dovrebbe servire a dimostrare che quando parliamo di lingue naturali, siamo semplicemente a un altro livello. Molto superiore. Come minimo duecento volte superiore. Come massimo… è perfino difficile stimarlo.
Scheme, famoso per essere forse il più piccolo linguaggio di programmazione che una mente umana possa utilizzare con una certa efficacia, è formato da 5 parole chiave e 8 forme sintattiche. Peter Norvig (attuale direttore della Ricerca in Google), ha scritto su questo argomento, dimostrando in un post che è possibile ricreare Scheme con meno di 120 righe di codice Python (Norvig 2010). Questo, da solo, dovrebbe illustrare quanto sappiano essere piccoli i linguaggi di programmazione. Potete ricrearne uno all’interno di un altro.
L’idea stessa di ricreare il cinese nell’inglese, invece, è priva di senso. Quanto inglese dovrebbe essere speso per articolare appieno le sottigliezze della lingua cinese, dalle definizioni delle parole agli usi grammaticali? Sicuramente qualcosa più di 120 righe.
Tuttavia, non sottovalutiamo la complessità dei linguaggi di programmazione. Dopotutto, un pianoforte contiene solo 88 tasti (e in realtà solo 12 toni, replicati su varie ottave). Eppure, per essere fluenti nel linguaggio del pianoforte occorrono molti anni. In effetti, il numero di modi piacevoli in cui questi 12 toni possono essere organizzati è, a tutti gli effetti, infinito.
Infiniti sono anche i modi in cui è possibile combinare anche quelle cinque parole chiave di Scheme. Per non parlare del fatto che una di queste parole chiave è define
, che consente di aggiungere nuove parole chiave. Quindi è un po’ come un pianoforte che ha un meta-tasto il quale consente di aggiungere nuovi tasti. Ma… ignoriamolo, per ora.
I linguaggi iniziano in piccolo. Eppure, in quei piccoli spazi, contengono già i semi dell’infinito. Questa è una qualità vitale di tutti i linguaggi: sono generativi. Dato un tempo sufficiente, individui fluenti nel linguaggio possono generare un numero infinito di nuove espressioni, tutte grammaticalmente corrette, tutte uniche, tutte significative. Questo vale sia per le lingue naturali sia per i linguaggi di programmazione. Questa connessione tra i due tipi di linguaggi è stata articolata dal linguista Noam Chomsky.
Come imbottigliare la volontà umana
Una determinata lingua viene trasmessa ad altri esseri umani attraverso un qualche tipo di canale. L’inglese, l’italiano e le altre lingue parlate possono utilizzare il canale vocale-uditivo, cioè la voce e l’udito. I linguaggi dei segni usano il canale fisico-visivo, cioè dei segni e la vista. Anche la lingua scritta fa uso di un canale fisico-visivo, cioè la scrittura e la visione.
In un certo senso, i linguaggi di programmazione sono simili ai linguaggi scritti, in quanto condividono lo stesso canale. Noi digitiamo, altri vedono.
Inoltre, possiamo dire che raramente (o forse mai) fanno uso del canale vocale-uditivo. Proviamo a leggere ad alta voce dei programmi. Non stiamo dicendo che il pubblico non capirà nulla; ma ben presto ci diranno di tacere e di dare loro da leggere il codice sorgente.
Questa è certamente una differenza, il canale, una differenza chiave. Senza dubbio, la natura visiva della programmazione deve rientrare in qualsiasi discussione seria sull’apprendimento di un linguaggio di programmazione.
Ma prima di lasciarci alle spalle l’idea dei canali, non è strano parlare di canali per un linguaggio di programmazione? Quando si tratta di programmazione, non deve necessariamente esistere un canale tra due esseri umani. I programmi non devono affatto essere mezzi di comunicazione.
Siamo in grado di scrivere programmi in segreto; possiamo persino eseguirli. Se i programmi che scriviamo non vengono mai visti da occhi diversi dai nostri, questo non cambia la loro capacità di muovere le cose nel mondo. Digitiamo programmi in un computer e poi la loro storia si dipana. La presenza di un’altra mente umana oltre a quella dell’autore non è mai strettamente necessaria. Una volta in esecuzione, le leggi della fisica hanno già preso il controllo degli avvenimenti. Tali leggi operano al di là della nostra consapevolezza o attenzione. È come rilasciare un masso, che poi rotola giù da una collina; meglio, miliardi di piccoli massi, chiamati elettroni.
Per dirla in modo molto drammatico, gli autori di programmi possono anche morire, non così i loro programmi.
In molte automobili di oggi, quando giriamo il volante facciamo in modo che il computer dell’auto esegua il codice che serve per far sterzare le ruote dell’auto. L’aspetto di quel codice e che cosa può comunicare leggendo il suo codice sorgente sono cose misteriose. Purtuttavia, le ruote sterzano. E la nostra società va avanti.
All’ingresso della sua Scuola di Atene, si dice che Platone avesse scritto: Non osi entrare nessuno che ignori la geometria. Forse sulla scuola per i maghi della programmazione dovrebbe essere scritto: Non osi entrare nessuno che scriva programmi esclusivamente per le macchine.
I programmatori saggi lo sanno bene. Ma il motivo per cui dobbiamo specificarlo così precocemente è che tutti possiamo non riuscirci. Quindi questa deve essere una pratica e una disciplina. Non basta scrivere, occorre scrivere bene, scrivere con chiarezza, scrivere per gli altri, e migliorare la scrittura nel tempo.
Le lingue naturali sono simili. Ma la differenza è ancora netta: nelle lingue naturali, l’opzione di scrivere incidentalmente per le macchine o qualcosa di simile, non esiste. Liberati da questa opzione, siamo liberi da quella tentazione.
Ora che ci siamo liberati
Abbiamo appena speso molte parole, in lingua, per articolare le differenze tra linguaggi di programmazione e linguaggi naturali. Ma la verità è che i due si intrecciano in modi davvero affascinanti.
Sì, i linguaggi di programmazione sono più piccoli (in termini di puro vocabolario) e, sì, usano un canale diverso e, sì, non hanno nemmeno necessariamente bisogno di un canale e, sì, hanno significati precisi e non generano sconcerto quando ne creiamo nuove versioni. Ma i linguaggi di programmazione e i linguaggi naturali sono uniti in modo ciclico. La costruzione di nuovi linguaggi di programmazione spesso richiede anche la costruzione di un nuovo linguaggio umano altamente specializzato. E la costruzione di nuovi linguaggi umani altamente specializzati spesso deriva dalla costruzione di nuovi linguaggi di programmazione.
Inoltre, come abbiamo già prefigurato, il cervello del programmatore elabora i linguaggi di programmazione con le stesse aree che elaborano il linguaggio naturale. Quindi, forse i due tipi di linguaggi sono più simili di quanto appaiano a prima vista.
Le loro somiglianze potrebbero non essere sempre evidenti dall’esterno. Ma la scienza è chiara: all’interno, in termini di attività neurocognitive, sono interconnessi.
Continua…
Questo articolo richiama contenuti dal capitolo 1 di Insegnare il coding.
Immagine di apertura di Fezbot2000 su Unsplash.
L'autore
Corsi che potrebbero interessarti
Progettare una Landing Page - Che Funziona
Comunicazione digitale Food & Wine - Iniziare Bene
Machine Learning & Big Data per tutti