Vai al contenuto

In Goose gli array crescono senza traslocare

Il linguaggio sperimentale Goose tiene fermi i dati mentre gli array crescono e controlla i riferimenti senza annotazioni di lifetime. La contropartita sono vincoli precisi sulla loro organizzazione.

Che succede

Chi ha conservato un riferimento a un elemento di un vettore C++ conosce la seccatura: se il contenitore cresce e sposta i dati, quel riferimento può diventare inutilizzabile. Goose, linguaggio sperimentale di Wouter van Oortmerssen, già autore di Lobster, costruisce il proprio modello di memoria attorno a una garanzia diversa: gli array crescono senza cambiare posto.

I dati dinamici vivono in stack assegnati dal compilatore, senza heap allocator né garbage collector. Per aggiungere spazio si avanza un puntatore; alla fine dell’ambito si riporta indietro. Il compilatore ricostruisce da quale variabile dipende ogni riferimento e rifiuta quelli che potrebbero sopravviverle, senza chiedere annotazioni di lifetime.

Questa libertà ha confini piuttosto rigidi: nelle funzioni ricorsive, per esempio, non si possono conservare dati espandibili attraverso la chiamata successiva; alcuni contenitori si possono scorrere ma non indicizzare direttamente. Il codice è aperto, compila in C e ci sono compilatori per Windows, macOS e Linux. I risultati favorevoli rispetto a C++ e Rust vengono dalla suite del progetto: il motivo per esplorarlo resta il modello di memoria, non una vittoria universale di velocità.

Perché conta

In Goose la stabilità dei riferimenti dipende da come si organizzano i dati fin dall’inizio. Rinunciando a parte della flessibilità dei contenitori, il linguaggio evita spostamenti e libera intere strutture con un solo arretramento del puntatore. Il lavoro risparmiato durante l’esecuzione si paga con vincoli sulla struttura del programma.

Vuoi sapere di più su pillole come questa?