Język programowania Goose: wszystko o nowej propozycji, która ma pokonać C++ i Rust
Goose to nowy język systemowy bez sterty, bez garbage collectora i bez adnotacji czasu życia. Twórca twierdzi, że działa ponad 3 razy szybciej niż idiomatyczny C++. Jak to działa i czy warto go wypróbować.

Jednym z najgłośniej dyskutowanych tematów wśród deweloperów w ostatnich tygodniach jest język programowania Goose. Został stworzony przez Woutera van Oortmerssena, weterana programowania i autora języka Lobster. Goose jest dostępny jako open source na licencji Apache 2.0, a co najciekawsze, jego autor twierdzi, że kompilator powstał niemal w całości przy udziale sztucznej inteligencji na bazie zaprojektowanej przez człowieka specyfikacji języka.
Główna idea: brak sterty
W większości języków dane dynamiczne, takie jak tablice i ciągi znaków, żyją na stercie i wymagają garbage collectora (Java, Go), zliczania referencji (Swift) lub reguł czasu życia (Rust) do zarządzania nimi. Goose nie używa żadnego z tych rozwiązań. Zgodnie z dokumentacją, każda wartość dynamiczna żyje na stosach danych zarządzanych przez kompilator.
- Każdy stos to duża rezerwacja przestrzeni adresowej (domyślnie 2 GB) z prostym wskaźnikiem narastającym (bump pointer)
- Na jednym stosie w danym momencie żyje tylko jedna wartość o zmiennym rozmiarze i zawsze znajduje się ona na szczycie
- Zwiększanie rozmiaru tablicy po prostu przesuwa wskaźnik — nic nie jest przenoszone
- Zwolnienie pamięci przy wyjściu z zakresu to pojedynczy zapis
Kompilator udowadnia te reguły w czasie kompilacji; w czasie wykonywania śledzone są wyłącznie wskaźniki narastające.
Jak działa bezpieczeństwo
Każda referencja ma statyczny „korzeń” – zmienną, która ogranicza jej czas życia. Kompilator sam wyznacza korzenie i odrzuca referencje, które przeżyłyby swojego właściciela. W przeciwieństwie do języka Rust, programiści nie piszą żadnych adnotacji czasu życia i nie ma tu pojęcia unsafe.
Przedsmak składni
Goose ma zwięzłą składnię przypominającą język C. Struktura z danymi o zmiennym rozmiarze jest deklarowana następująco: struct Item { sku: u8[varint], qty: varint, cents: varint }. Istnieją trzy rodzaje tablic: o stałym rozmiarze, tylko rosnące oraz rosnąco-malejące.
Szybkość: liczby podane przez autora
Autor opublikował wyniki z 16 benchmarków (średnia geometryczna). Według nich Goose jest:
- około 3,3–3,5x szybszy niż idiomatyczny C++
- 1,16–1,26x szybszy niż ręcznie zoptymalizowany C++
- 1,12–1,19x szybszy niż najlepszy bezpieczny Rust
- zużywa 1,2–1,9x mniej pamięci
Przykładowo, rekord zamówienia zajmuje w Goose 29 bajtów i zero alokacji, w porównaniu do 160 bajtów i jednej alokacji w C++ oraz 153 bajtów i czterech alokacji w Rust. Należy pamiętać, że są to autorskie benchmarki twórcy; niezależna weryfikacja jest na razie ograniczona.
Ograniczenia
- Funkcje rekurencyjne nie mogą zachowywać danych o rosnącym rozmiarze pomiędzy wywołaniami rekurencyjnymi
- Brak uciekających domknięć (escaping closures) lub wskaźników na funkcje
- Kompilacja wyłącznie całego programu
- Ekosystem bibliotek jest nadal bardzo mały
Jak go wypróbować
Gotowe kompilatory są dostępne dla systemów Windows x64, Linux x64 oraz macOS (Apple Silicon i Intel). Goose kompiluje się do pojedynczego pliku C, więc działa wszędzie tam, gdzie działa kompilator C. Pobierz wydanie ze strony aardappel/goose na GitHubie, dodaj folder do zmiennej środowiskowej PATH i uruchom przykład poleceniem goose samples/01_tour.goose. W archiwum znajduje się również rozszerzenie dla VS Code.
Werdykt
Goose to fascynujący eksperyment z autentycznie nowym podejściem do zarządzania pamięcią. Programisty systemowi, dla których wydajność ma znaczenie, powinni go śledzić i wypróbować. Język jest jednak nowy: w zastosowaniach produkcyjnych rozsądnie jest poczekać na niezależne benchmarki i większy ekosystem.
Źródło: Goose (aardappel)



