BCPL: il nonno dimenticato del C — Storia, caratteristiche ed esempio di codice
BCPL (Basic Combined Programming Language) è l'antenato diretto di B e C. Progettato da Martin Richards all'Università di Cambridge nel 1966, fu il primo linguaggio a dimostrare che un linguaggio di programmazione di sistema poteva essere allo stesso tempo piccolo, portatile e abbastanza potente da scrivere il proprio compilatore.
Perché BCPL era importante
- Portabilità prima di tutto: il compilatore era diviso in front-end (parser) e back-end (generatore codice). Il retargeting su una nuova CPU (PDP-10, 68000, x86, MIPS) richiedeva settimane, non anni.
- Programmazione di sistema: nessuna dipendenza da libreria runtime. Accesso diretto alla memoria tramite puntatori. Usato per scrivere kernel OS (TRIPOS, AmigaDOS), compilatori, editor.
- Minimalismo: un solo tipo di dato: la parola (intero/puntatore larghezza macchina). Nessun tipo, nessuna struct, nessun float — costruisci tutto da parole.
- Ha influenzato direttamente il C: Ken Thompson ha semplificato BCPL per creare B (per PDP-7 Unix). Dennis Ritchie ha aggiunto i tipi → C. Il modello bytecode Java riecheggia la rappresentazione intermedia O-code di BCPL.
Caratteristiche chiave del linguaggio
- Strutturato a blocchi: `$( ... $)` per istruzioni composte (come `{ }` in C).
- Puntatori/Indirezione: `!ptr` (dereferenziazione), `ptr!i` (indicizzazione array). `rv` (valore risultato) per return.
- Allocazione dinamica: `getvec(n)` / `freevec(vec)` — gestione heap manuale.
- Compilazione condizionale: `#if`, `#unless` — pionieristico per il 1967.
- Assembly inline: `code` ... `endcode` per operazioni specifiche macchina.
Hello World in BCPL (stile Martin Richards)
GET "libhdr" LET start() = VALOF $( writes("Hello, World!*N") RESULTIS 0 $) Nota: `writes` scrive una stringa; `*N` è newline. `VALOF`/`RESULTIS` è il meccanismo di ritorno funzione.
L'innovazione O-code
BCPL compilava in O-code (Object code) — un semplice bytecode a macchina a pila. Il backend traduceva O-code in assembly di destinazione. Questa architettura a due passaggi (Frontend → O-code → Backend) è il progetto per:
- Pascal P-code
- Java JVM bytecode
- LLVM IR
- WebAssembly
Dove vive BCPL oggi
- AmigaOS / MorphOS / AROS: componenti core OS ancora in BCPL (Cintcode VM).
- Sistema Cintcode di Martin Richards: attivamente mantenuto; gira su Linux, Windows, Raspberry Pi. Sito ufficiale.
- Retro computing / Educazione: insegnamento costruzione compilatori (compilatore monopezzo sta in 2000 righe).
BCPL non è "morto" — è il DNA architettonico dentro ogni programma C, C++, Java, Go, Rust e Swift in esecuzione oggi.