Ciao, e benvenuto nella terza puntata della sessantasettesima stagione. Abbiamo detto che il compilatore è un traduttore. Ma ogni traduttore, prima di poter tradurre, deve fare una cosa: capire il testo di partenza. Oggi entriamo nella prima metà del suo lavoro, quella della comprensione. Vediamo come il compilatore passa dal tuo testo, una semplice sequenza di caratteri, al significato di ciò che hai scritto.
Partiamo da come noi stessi leggiamo una frase, perché il compilatore fa la stessa cosa. Quando leggi, non percepisci lettere sparse. Prima raggruppi le lettere in parole. Poi metti le parole in relazione secondo la grammatica, capendo chi è il soggetto, chi il verbo. E infine, da quella struttura, afferri il significato: cosa dice davvero la frase. Tre livelli, dal segno più piccolo al senso complessivo. Il compilatore ripercorre esattamente questa scala, con nomi tecnici ma con la stessa logica di sempre.
Vediamo il primo passo: dalle lettere alle parole. Il tuo codice, per la macchina, all'inizio è solo un lungo filo di caratteri, uno dietro l'altro, senza confini. Il primo compito del compilatore è spezzare quel filo nelle parole del linguaggio: questo è un nome che hai scelto, questo è un numero, questo è un simbolo che significa più, questa è una parola riservata del linguaggio. È come mettere gli spazi mentali tra le parole di una frase scritta tutta attaccata. Alla fine di questo passaggio, il testo non è più una sequenza di caratteri, ma una sequenza di parole riconosciute, ognuna con il suo ruolo.
Vediamo il secondo passo, ed è il più affascinante: dalle parole alla struttura. Avere le parole non basta: bisogna capire come si legano tra loro. Qui il compilatore costruisce quello che possiamo immaginare come l'albero della frase. Prende le parole e le organizza in una struttura ad albero che cattura la grammatica del tuo codice: questa operazione va fatta prima di quest'altra, questo blocco sta dentro quest'altro, questa condizione governa queste righe. È lo stesso lavoro che a scuola chiamavano analisi grammaticale, applicato al codice: scoprire l'ossatura nascosta sotto la sequenza piatta delle parole.
Voglio soffermarmi su quell'albero, perché è il cuore di tutto. Quella struttura ad albero è la vera forma del tuo programma, molto più delle righe che hai scritto. Da lì in poi, il compilatore smette di ragionare sul testo e comincia a ragionare sull'albero. Tutto quello che verrà dopo, i controlli, le trasformazioni, la traduzione finale, lavora su quell'ossatura, non più sui caratteri. Ed è anche il punto in cui salta fuori il primo tipo di errore che conosci bene: se le parole non si incastrano in una struttura valida, il compilatore non riesce a costruire l'albero, e ti segnala un errore di grammatica, un errore di forma.
Vediamo il terzo passo: dalla struttura al significato. Ora che il compilatore ha l'ossatura, può chiedersi se ciò che hai scritto ha senso. Non basta che una frase sia grammaticalmente corretta: deve anche voler dire qualcosa di sensato. Il verde dorme furiosamente è grammaticale, ma non significa niente. Allo stesso modo, il compilatore controlla: questo nome esiste davvero, o non l'hai mai definito? Stai sommando due cose che si possono sommare, o stai mescolando cose incompatibili? Stai usando qualcosa nel posto giusto? È il controllo del significato, ed è qui che nasce gran parte degli errori che ti fermano prima ancora di eseguire.
Ecco l'immagine che tiene insieme le tre fasi, così le fissi. Pensa a un insegnante che corregge un tema scritto in una lingua straniera. Prima riconosce le singole parole, e segna quelle che non esistono. Poi guarda la costruzione delle frasi, e segna quelle sgrammaticate. Infine legge il senso, e segna le frasi che, pur corrette, non vogliono dire nulla o si contraddicono. Tre passaggi, dal più meccanico al più profondo. Il compilatore, nella prima metà del suo lavoro, è esattamente quell'insegnante severo: legge, struttura, e giudica se ciò che hai scritto sta in piedi.
Resta una lezione che va oltre i compilatori. Capire qualcosa, davvero, è sempre un salire di livello: dai segni alle parole, dalle parole alla struttura, dalla struttura al senso. Saltare un gradino non funziona, né per una macchina né per una persona. E c'è un motivo per cui il compilatore fa tutta questa fatica di comprensione prima di tradurre: non si può tradurre bene ciò che non si è capito. Vale per lui, e vale per noi ogni volta che affrontiamo qualcosa di nuovo: prima capirlo per davvero, poi agire.
Per oggi ci fermiamo qui. Abbiamo seguito la prima metà del lavoro del compilatore, quella della comprensione, la stessa scala che saliamo noi leggendo una frase. Primo passo: dalle lettere alle parole, spezzare il filo di caratteri nelle parole del linguaggio. Secondo passo: dalle parole alla struttura, costruire l'albero della frase, la vera forma del tuo programma, da cui nasce l'errore di grammatica. Terzo passo: dalla struttura al significato, controllare che ciò che hai scritto abbia senso, da cui nascono tanti errori che ti fermano prima di eseguire. Come un insegnante che corregge parole, costruzione e senso. La lezione: non si può tradurre bene ciò che non si è capito. Nella prossima puntata: dal significato alla macchina. Nelle note trovi qualche spunto. Se ti è utile, condividila. Grazie per l'ascolto, e ci sentiamo alla prossima.