Un linguaggio per l’era degli agenti
“Heroes”
Decenni di storia dei linguaggi, condensati in meno di 16K token.
Si legge come Python e ha tutta la potenza del C. Molti degli errori che fanno gli LLM, i modelli di AI che scrivono codice, qui semplicemente non compilano. Niente parentesi graffe, niente punti e virgola. Nessun interprete, nessuna macchina virtuale. Niente null nei tuoi tipi, niente eccezioni. Nessun garbage collector, nessun runtime pesante. Abbastanza maturo da compilare il proprio compilatore. Abbastanza piccolo da stare in un prompt. Quello che scrivi diventa un eseguibile standalone.
variant Token
number
value: i64
word
text: str
plus
times
open
close
# What a token is called in a message.
function name_of(t: Token) -> str
return match t
.number _ => "a number"
.word _ => "a word"
.plus => "`+`"
.times => "`*`"
.open => "`(`"
.close => "`)`"
ometti un caso e non compila · leggi l’esempio →
- 16K token: il tetto della specifica La specifica descrive tutto il linguaggio in circa sette pagine. Un token è un frammento di testo che il modello legge o genera. Con una specifica breve, nel prompt resta spazio per il tuo programma. la specifica → perché è progettato così → domande frequenti →
- 0 eccezioni, garbage collector, null nei tuoi tipi Il codice indica dove un valore può mancare o un’operazione può fallire. La memoria viene liberata automaticamente, senza un garbage collector, cioè un sistema che cerca i dati inutilizzati e può mettere in pausa il programma. come gestire gli errori →
- 1 comando per tutti gli strumenti Un solo eseguibile permette di compilare, eseguire, testare, formattare e controllare il codice. È scritto in Heroes. si compila da solo →
Il conteggio dietro gli 16K è quello del modello stesso, preso attraverso l’API di conteggio dei token di Claude e registrato insieme al modello che lo ha prodotto; un test tiene la specifica sotto quel tetto a ogni commit.
Tutto il linguaggio, in un file solo: curl -L heroes-lang.org/spec.md
Il compilatore segnala gli errori
Un modello scrive totl al posto di total. Nei linguaggi che permettono di dichiarare una variabile assegnandole un valore, un refuso del genere può creare una nuova variabile. Heroes distingue la dichiarazione dalla modifica: il compilatore rifiuta il nome sconosciuto e suggerisce la correzione:
error[unknown_name]: nothing named `totl` is in scope — did you mean `total`?
at tests/golden/check/typo-not-a-new-binding.hero:10:9
|
10 | totl @ total + x #~ unknown_name
| ^^^^
fix (certain): rename to `total`
Il compilatore segnala anche gli argomenti con etichetta scambiati, i casi mancanti e le parole chiave prese da altri linguaggi. Ogni messaggio indica il problema e la posizione nel codice. Quando può, suggerisce una correzione; quelle contrassegnate da certain si possono applicare automaticamente. Altri esempi di errori →
Heroes usa le librerie C
Per funzioni matematiche, file, socket, database e grafica, Heroes usa librerie C. Bastano poche righe per dichiarare le funzioni di una libreria nel tuo programma. Clang, il compilatore C, verifica queste dichiarazioni sull’header della libreria, il file che ne descrive funzioni e tipi. Se i tipi non corrispondono, la compilazione si ferma.
extern "math.h" link "m"
function sqrt(x: f64) -> f64
function pow(base: f64, exponent: f64) -> f64
function floor(x: f64) -> f64
Tra gli esempi trovi programmi che usano un database, chiamano una libreria grafica e inviano una richiesta web. Le pagine mostrano anche l’output registrato, quando disponibile. Gli esempi con librerie C →
La tesi
Un linguaggio progettato perché ogni sbaglio plausibile di un modello sia un errore di compilazione produrrà programmi funzionanti spendendo meno token in totale di un linguaggio convenzionale, anche se ogni singolo programma costa più token da scrivere.
Una parte della tesi è già stata verificata. heroes mutate introduce un errore realistico alla volta in programmi funzionanti e conta quanti errori rileva il compilatore. Ripete poi la prova con i controlli specifici di Heroes disattivati. La differenza sta nelle regole che chiedono il nome di un argomento e vietano di riusare un nome già dichiarato: senza quelle, quegli errori compilano. La stessa tabella dice anche quali errori nessun controllo prende.
L’altra parte è il numero totale di token che costa un programma funzionante, correzioni comprese, con i controlli specifici di Heroes accesi e con gli stessi controlli spenti. Lo strumento che lo misura ha fatto un giro, su compiti scritti e sigillati prima, con una previsione pubblicata prima. Con i controlli specifici di Heroes e senza, i modelli hanno risolto gli stessi compiti entro tre tentativi: per l’esperimento, questo risultato si chiama non conclusivo. Le cifre si dichiarano alla soglia di pubblicazione. Il confronto con altri linguaggi viene dopo. Cosa è misurato → I risultati disponibili →
Eseguilo · speed of life ·
Heroes è in beta: il linguaggio cambia ancora. La versione che compili qui sotto è heroes 0.5.0. Fino alla 1.0.0 un cambio del numero di mezzo può cambiare il linguaggio stesso, mentre un cambio dell’ultimo numero non lo cambia mai. Un programma che scrivi oggi potrebbe richiedere piccole modifiche più avanti.
$ git clone https://github.com/heroes-lang/heroes
$ cd heroes
$ clang -I runtime seed/heroes.c runtime/runtime.c -o heroes
$ ./heroes run examples/gallery/03-fallible.hero
read 42
failed: not_a_digit (expected 0-9)
20
La terza riga costruisce il compilatore da un solo file C. Richiede meno di quattro secondi su un MacBook Air, la macchina da cui viene ogni misura di
questo sito. Quel file C è stato generato dal compilatore Heroes, quindi clang è l’unica cosa
che ti serve. La riga che dice failed è l’esempio che rifiuta
un carattere che non sa leggere.
La guida per iniziare → · il linguaggio, un’idea alla volta →
Chi lo sta costruendo
Una persona e un assistente AI. La persona non aveva mai scritto sul serio un compilatore prima di questo, ma aveva studiato la storia dei linguaggi e dei compilatori, e da quello studio è nato il libro qui sotto. L’assistente segue regole scritte nel repository, l’archivio del progetto. Ogni modifica al linguaggio viene esaminata da un panel di cinque giudici, quattro dei quali possono porre un veto. L’autore approva o respinge ogni decisione. Chi ha scritto tutto questo → · come si valutano le modifiche →