Linguaggi di programmazione e compilatori
Editura Academiei RSR, 1987
Origini didattiche
Il libro del 1987 trae origine da una serie di tre manuali universitari, comprendenti le quattro parti del corso, pubblicati tra il 1982 e il 1984:
- Linguaggi e compilatori. Parte I: Linguaggi di programmazione (1982)
- Linguaggi e compilatori. Parte II: Programmazione in Pascal
- Linguaggi e compilatori. Parte III: Introduzione ai sistemi formali e Parte IV: Progettazione dei compilatori (1984)
La serie fu consolidata e sviluppata in questo volume, destinato non soltanto agli studenti, ma anche agli informatici interessati ad approfondire i linguaggi di programmazione e, soprattutto, i loro traduttori.
Copie digitalizzate del libro
Sintesi
Il libro «Linguaggi di programmazione e compilatori» (Editura Academiei RSR, 1987) è concepito come una sintesi unitaria tra i fondamenti teorici e le tecniche ingegneristiche necessarie per definire e implementare i linguaggi di programmazione. Deriva da un corso avanzato di lunga durata, articolato su tre semestri e tenuto a partire dal 1980, nel quale riunivo teoria degli automi, linguaggi formali e compilatori. Il suo obiettivo è insieme umano e tecnico: il linguaggio costituisce la principale convenzione di cooperazione tra uomo e calcolatore, mentre il compilatore è il meccanismo che rende eseguibile tale convenzione, trasformando i programmi da descrizioni in processi reali, non mediante ricette isolate, ma attraverso una metodologia coerente.
L’idea centrale del libro è che la traduzione dei programmi possa essere trattata come un’operazione formalizzabile: una trasformazione sistematica tra due descrizioni dello stesso algoritmo, dal linguaggio sorgente verso forme più vicine alla macchina. In questo quadro, a ogni linguaggio corrisponde implicitamente una macchina virtuale che attribuisce significato ai suoi costrutti, mentre la compilazione diventa la disciplina d’interfaccia tra l’universo di tale macchina virtuale e quello della macchina reale.
La struttura è esplicitamente tripartita, preceduta da un’introduzione concettuale sui sistemi, l’informazione, la comunicazione, i linguaggi e la traduzione. L’intento è chiarire che un compilatore non è un espediente tecnico, ma la risposta a una necessità generale di trasformazione controllata delle rappresentazioni:
- Parte I – Linguaggi di programmazione. Costruisce l’«anatomia» dell’oggetto da tradurre. I linguaggi sono analizzati come sistemi stratificati sul piano lessicale, sintattico e semantico, attraverso la prospettiva dell’implementazione: variabili, compresa la dualità indirizzo/valore, attributi e binding, dichiarazioni, strutture dati, espressioni e istruzioni, procedure e passaggio dei parametri, gestione della memoria in esecuzione mediante allocazione statica, stack e heap.
- Parte II – Introduzione alla teoria della compilazione. Presenta il formalismo strettamente necessario alla progettazione dei compilatori: gerarchia di Chomsky, linguaggi regolari e liberi dal contesto, automi finiti e automi a pila, schemi di traduzione guidata dalla sintassi, automi di traduzione e grammatiche attribuite di Knuth, come ponte tra sintassi e semantica.
- Parte III – Progettazione dei compilatori. È il «laboratorio» nel quale il compilatore diventa una vera catena di produzione: analisi lessicale, analisi sintattica mediante le famiglie LL e LR, analisi semantica, codice intermedio — alberi, codice a tre indirizzi e backpatching —, tabella dei simboli, gestione degli errori, ottimizzazioni, generazione del codice oggetto, interpreti, assembler e macroassembler, fino ai moduli rilocabili e al ruolo del linker.
Il libro si distingue per il rifiuto di separare la teoria dalla pratica: ogni tema segue il percorso «motivazione – algoritmo – implementazione», formando non soltanto conoscenze tecniche, ma anche una disciplina del pensiero. Un elemento unificante è il ricorso sistematico al modello di «macchina» — astratta o virtuale, dotata di stati, pila, tabelle e azioni — che struttura la medesima logica dal riconoscimento alla traduzione e fino alla generazione del codice, offrendo al lettore un modo di pensare estensibile alla progettazione di altre applicazioni software complesse.





