
Se c’è una cosa che mi fa sempre fare un passo indietro è quando vedo un titolo tipo ‘The Art of Computer Programming’. Suona epico, no? È la roba che ti fa pensare che per fare un semplice script Python devi prima capire la storia della teoria dei gruppi e della semiotica. La realtà, però, è che la maggior parte dei libri su compilatori sono opere monumentali, troppo ampie, piene di spunti così generali che alla fine ti senti un po’ come se avessi studiato tutto tranne il punto chiave.
I compiler sembrano, per natura, una bestia incomprensibile. Ci sono le grammatiche, le macchine a stati finiti, la conversione… sembra un incubo teorico. Ma un’analisi storica e tecnica mi ha fatto capire una cosa fondamentale: se smonti il mito, l’idea di un compilatore si riduce a una serie di trasformazioni disciplinate su una rappresentazione interna del programma.
Qua la cosa diventa bella. L’approccio che ho trovato più interessante, e che vale anche per i maker che progettano un flusso di lavoro super complesso, è quello di scomporre il problema in passaggi minimi. Non devi cercare un interruttore magico che ti porta al codice perfetto. Devi vedere il processo come una catena di trasformazioni—un ‘pass’ che trasforma un input (ad esempio, codice sorgente) in un output leggermente modificato (una struttura dati), e così via.
Questo è un concetto enorme, ma super pratico. Significa che se stai costruendo un tuo parser custom per un linguaggio super specifico (che sia per controllare i movimenti di un braccio robotico o per un microcontrollore particolare), non devi scrivere tutto in un unico blocco monolitico. Puoi farlo in blocchi: il primo pass analizza il tipo di dato, il secondo pass controlla la sintassi, il terzo pass genera il codice target. Separare queste preoccupazioni è oro colato. Aiutati della AST (Abstract Syntax Tree) – la struttura dati interna del tuo programma – è il modo migliore per mantenere tutto ordinato. E giuro, se devi padroneggiare l’AST, ti consiglio di non usare linguaggi che ti fanno soffrire con le strutture dati rigide. Lisp, Erlang, Haskell… questi sono i linguaggi che sono nati per manipolare alberi come se fosse un gioco da tavolo.
Cosa significa tutto questo per noi che ci piacciono di più mettere le mani in pasta? Significa che non devi essere un matematico rinascimentale per farlo. Se ti piace smontare un Raspberry Pi per capire come comunicano i bus I2C, o se passi notti a debuggare l’output di un programma che non vuole compilare, questo è il tuo manuale di istruzioni. I compiler sono sistemi di *flusso di dati* avanzati. Smetti di vederli come magia nera accademica e inizia a vederli come una pipeline di trasformazioni.
Quindi, la prossima volta che senti parlare di compilatori e ti ritrovi spaventato dal gergo, ricorda che è più un problema di ingegnerizzazione elegante che di pura magia matematica. E questo, credetemi, è molto più figo da affrontare in un workshop con caffè, birra e un po’ di glitch artistici.
Source: Want to Write a Compiler? Just Read These Two Papers (2008)
