IT

Язык программирования Goose: всё о новом языке, который обещает обогнать C++ и Rust

Goose — новый системный язык без кучи, сборщика мусора и аннотаций времени жизни. Автор утверждает, что он более чем в 3 раза быстрее идиоматичного C++. Как он работает и стоит ли его пробовать.

·3 мин. чтения
Язык программирования Goose: всё о новом языке, который обещает обогнать C++ и Rust

Одна из самых обсуждаемых тем среди разработчиков в последние недели — язык программирования Goose. Его создал Ваутер ван Оортмерссен, опытный разработчик и автор языка Lobster. Язык открыт под лицензией Apache 2.0, и самое любопытное: по словам автора, код компилятора почти полностью написан с помощью искусственного интеллекта на основе дизайна языка, разработанного человеком.

В большинстве языков динамические данные (массивы, строки) хранятся в куче, и для управления ими нужен сборщик мусора (Java, Go), подсчёт ссылок (Swift) или правила времён жизни (Rust). Goose не использует ничего из этого. Согласно документации, каждое динамическое значение размещается на специальных стеках данных, которыми управляет компилятор.

  • Каждый стек — это большая зарезервированная область адресов (по умолчанию 2 ГБ) с простым «bump pointer»
  • На одном стеке одновременно живёт только одно значение переменного размера, и оно всегда на вершине
  • При росте массива просто сдвигается указатель — ничего не копируется
  • Освобождение памяти при выходе из блока — одна операция записи

Соблюдение этих правил компилятор доказывает на этапе компиляции, а во время выполнения отслеживаются только указатели.

Читайте такжеDiscord переписали на Rust: новый клиент быстрее и потребляет на 70% меньше RAM

Как обеспечивается безопасность

Каждая ссылка привязана к своему «корню» — переменной, ограничивающей её время жизни. Компилятор сам выводит корни и отклоняет ссылки, которые переживают своего владельца. В отличие от Rust, программист не пишет никаких lifetime-аннотаций, а блоков unsafe нет.

Пример синтаксиса

Синтаксис Goose похож на C и довольно лаконичен. Например, структура с данными переменного размера объявляется так: struct Item { sku: u8[varint], qty: varint, cents: varint }. Есть три вида массивов: фиксированного размера, только растущие и растущие-сжимающиеся.

Скорость: цифры автора

Автор опубликовал замеры на 16 бенчмарках (среднее геометрическое). Согласно им, Goose:

  • примерно в 3,3–3,5 раза быстрее идиоматичного C++
  • в 1,16–1,26 раза быстрее вручную оптимизированного C++
  • в 1,12–1,19 раза быстрее лучшего безопасного кода на Rust
  • потребляет в 1,2–1,9 раза меньше памяти

Например, запись заказа в Goose занимает 29 байт и 0 выделений памяти, в C++ — 160 байт и 1 выделение, в Rust — 153 байта и 4 выделения. Важно помнить: это собственные бенчмарки автора, независимых проверок пока мало.

Ограничения

  • Рекурсивные функции не могут сохранять растущие данные через рекурсивный вызов
  • Нет «убегающих» замыканий и указателей на функции
  • Только компиляция всей программы целиком
  • Экосистема библиотек пока очень мала

Как попробовать

Для Goose есть готовые компиляторы под Windows x64, Linux x64 и macOS (Apple Silicon и Intel). Он транслирует код в один C-файл, поэтому работает везде, где есть компилятор C. Достаточно скачать релиз со страницы aardappel/goose на GitHub, добавить папку в PATH и запустить пример командой goose samples/01_tour.goose. В архиве есть и расширение для VS Code.

Вывод

Goose — интересный эксперимент с принципиально новым подходом к управлению памятью. Системным разработчикам, которым важна производительность, стоит следить за ним и попробовать. Но язык ещё молодой: для продакшена лучше дождаться независимых бенчмарков и более широкой экосистемы.

Источник: Goose (aardappel)

Похожие статьи