CCC vs GCC: funziona davvero il compilatore C creato dall'AI di Anthropic?

CCC compila migliaia di file del kernel Linux ma fallisce nella fase finale e genera binari SQLite lentissimi. Uno studio indipendente esamina il comportamento del compilatore C creato con l'intelligenza artificiale da Anthropic.

Un compilatore C “nuovo” di zecca di solito passa anni a inciampare su casi limite prima di diventare affidabile. La sfida di inizio 2026 è invece molto ambiziosa: una toolchain completa scritta interamente da un modello generativo, capace di arrivare fino alla build del kernel Linux senza difficoltà. Anthropic ha battezzato il progetto CCC (Claude’s C Compiler) e ha dichiarato che tutto il codice è stato prodotto da Claude Opus 4.6, con intervento umano ridotto per definire test e guidare l’iterazione. L’idea è affascinante perché sposta l’attenzione sulla capacità di costruire un’intera filiera software orchestrata dall’AI.

Compilatore CCC di Anthropic in prova: tra ambizione tecnica e limiti strutturali

Per capire perché la notizia abbia fatto rumore serve un passo indietro: l’ingegneria dei compilatori è cresciuta insieme a UNIX e al linguaggio C. Nel corso di decenni si sono stratificate non soltanto le regole del linguaggio, ma anche convenzioni binarie e formati di output che devono essere rispettate. In questa prospettiva, il confronto con GCC (GNU Compiler Collection) – compilatore di riferimento per efficienza e ottimizzazione – non è una gara di prestigio, ma un modo concreto per misurare quanto un nuovo compilatore sia vicino a un uso credibile, soprattutto se si considerano le evoluzioni introdotte nelle versioni più recenti.

Un ricercatore e sviluppatore indipendente ha allestito due macchine virtuali Debian confrontando i file binari compilati dagli stessi sorgenti con GCC e CCC. Durate i test lo sviluppatore ha usato Linux 6.9 e SQLite, monitorando tempi, memoria e qualità dell’output.

I risultati ottenuti sono particolarmente significativi: CCC è in grado di compilare migliaia di file del kernel, cioè il nucleo centrale del sistema operativo, ma non riesce a completare la fase di link, ossia l’unione dei file compilati in un unico eseguibile. Per quanto riguarda la compilazione dei sorgenti di SQLite, CCC produce binari funzionalmente corretti ma con prestazioni molto inferiori rispetto a quelli generati da GCC.

Compilatore, assemblatore e linker

Quando si invoca un comando come gcc file.c, si attivano più passaggi. Il preprocessore gestisce le direttive come #include e #define, il compilatore traduce il sorgente in una forma più vicina alla macchina, l’assemblatore codifica le istruzioni, poi il linker unisce oggetti e librerie in un eseguibile.

L’aspetto centrale è che il linker non svolge una semplice operazione di unione dei file, ma ha il compito di collegare correttamente i simboli, organizzare in modo preciso le sezioni nel layout di memoria, applicare le relocation, cioè gli aggiustamenti degli indirizzi necessari perché il codice funzioni correttamente, e seguire indicazioni ben precise su come il programma deve essere disposto in memoria. In un progetto come il kernel Linux queste operazioni costituiscono elementi essenziali per il corretto funzionamento del sistema.

Cosa include CCC secondo il progetto

CCC è sviluppato in Rust e, per una scelta architetturale precisa, integra al proprio interno quasi tutta la toolchain di compilazione: un frontend per il linguaggio C, una rappresentazione intermedia (IR) basata su SSA, ovvero una forma in cui ogni variabile viene assegnata una sola volta per facilitare le analisi e le ottimizzazioni, una serie di passaggi di ottimizzazione, generatori di codice per diverse architetture, oltre a un assemblatore, un linker e al supporto per le informazioni di debug nel formato DWARF, utilizzate dai debugger per collegare il codice macchina al sorgente originale.

Dal repository risultano supportati target come x86-64, i686, AArch64 e RISC-V a 64 bit, con un driver che accetta numerose opzioni compatibili con quelle di GCC, così da potersi inserire senza attriti nei sistemi di build esistenti.

L’ampiezza del progetto è rilevante perché non si tratta di un semplice prototipo capace di compilare un banale “Hello, world”, ma di un insieme complesso di componenti che devono funzionare in modo coeso: anche una minima incongruenza nella gestione dei simboli, delle sezioni del binario o delle relocation è sufficiente a compromettere l’intero processo di compilazione, indipendentemente dal fatto che l’analisi sintattica del linguaggio C sia corretta.

Perché la compilazione del kernel Linux è una prova “dura” e SQLite un test “spietatamente pratico”

Dire “compilare il kernel” può avere due significati distinti. Il primo è riuscire a compilare senza errori tutte le unità scritte in linguaggio C, cioè i singoli file sorgente che compongono il kernel Linux: è già un risultato rilevante, perché il kernel utilizza funzionalità avanzate del linguaggio e molti casi limite che mettono sotto stress il compilatore.

Il secondo significato è ottenere correttamente il binario finale, chiamato vmlinux, cioè l’eseguibile completo risultante dalla fase di linking, in cui tutti gli oggetti compilati sono uniti rispettando sezioni di memoria speciali e meccanismi interni che dipendono da metadati estremamente precisi. Nella prova svolta, CCC è riuscito a raggiungere il primo obiettivo, ma non a completare il secondo.

SQLite, al contrario, rappresenta un banco di prova particolarmente efficace per una ragione chiara: la versione detta amalgamation concentra gran parte della logica del database in un unico file sorgente, producendo funzioni molto grandi e complesse.

In questo modo non si verifica soltanto la correttezza del supporto al linguaggio, ma si accede anche a una valutazione diretta della qualità del codice macchina generato dal compilatore.

Non a caso, i benchmark basati su SQLite sono spesso usati per confrontare compilatori e strategie di ottimizzazione: se il backend, cioè la parte che traduce il codice intermedio in istruzioni per la CPU, è inefficiente, l’impatto emerge immediatamente sia nei tempi di esecuzione sia nelle dimensioni del binario prodotto.

Che cosa dimostra davvero l’esperimento di Anthropic

L’esperimento CCC di Anthropic dimostra che un processo di sviluppo basato su test automatici e agenti software basati su AI può realizzare un progetto di primo livello, portando all’ottenimento di risultati notevoli nella compilazione “pura”, cioè nella capacità di trasformare il codice sorgente in output senza errori sintattici o di compilazione.

Al tempo stesso mette bene in evidenza che il divario tra una compilazione corretta e la produzione di binari realmente efficienti e correttamente collegabili, cioè eseguibili ottimizzati e integrabili in contesti complessi, dipende da dettagli di basso livello come la struttura del codice macchina e da una serie di ottimizzazioni. Tutti aspetti che nelle toolchain mature, ad esempio in GCC, sono il risultato di decenni di correzione di bug e di ricerca applicata.

Osservato da questa prospettiva, l’esperimento CCC è significativo perché va oltre un semplice annuncio: fornisce dati misurabili, riproducibili e descrive in modo esplicito i punti di fallimento, mostrando che la qualità del codice generato e l’accuratezza dei metadati, ovvero le informazioni usate dal linker e dagli strumenti di analisi, sono importanti quanto la capacità di interpretare correttamente il linguaggio C.

Ti consigliamo anche

Link copiato negli appunti