Проект Solod предлагает минималистичное подмножество Go, которое компилируется не в машинный код напрямую, а транслируется в стандартный Си (C11) и затем собирается привычными компиляторами - GCC, Clang или zig cc. Язык Solod (сокращённо So) сохраняет значительную часть синтаксиса и идеологии Go, но принципиально отказывается от автоматического управления памятью и тяжёлого рантайма, стремясь дать разработчику "Go-подобный" опыт поверх инфраструктуры Си.
Что представляет собой Solod
Solod реализует ограниченный, но практичный поднабор Go:
- структуры и методы;
- интерфейсы;
- слайсы;
- возврат нескольких значений из функции (например, результат плюс код ошибки);
- дженерики;
- механизм отложенных вызовов `defer`.
Сознательно исключены каналы, горутины (сопрограммы) и замыкания - именно те элементы, которые сделали Go популярным в мире высокоуровневой конкурентности. Взамен Solod фокусируется на системном программировании и предсказуемой производительности с ручным контролем памяти.
Сам транспайлер написан на Go и распространяется под лицензией BSD. Поддерживаются Linux, macOS и Windows. За счёт родства синтаксиса с Go возможно использовать уже существующие инструменты: LSP-серверы, линтеры, IDE и редакторы, а также привычный для Go разработчиков инструмент `go test` (при соответствующей интеграции).
Память: без сборщика мусора и подсчёта ссылок
Ключевая идеологическая граница между Go и Solod - память. В Solod:
- нет сборщика мусора;
- нет автоматического выделения памяти в куче;
- не используется подсчёт ссылок.
По умолчанию все данные размещаются в стеке. Для ручной работы с кучей доступны функции стандартной библиотеки `Alloc` и `Free`. Разработчик сам отвечает за:
- выделение и освобождение памяти;
- предотвращение утечек;
- отсутствие висячих указателей.
Язык обеспечивает проверку типов и аварийное завершение программы при обращении за границы массива или слайса, но:
- не проверяет, что вы не возвращаете висячий указатель;
- не контролирует, освободили ли вы всю ранее выделенную память.
В качестве основного инструмента поиска ошибок работы с памятью рекомендуется использовать возможности современных компиляторов - прежде всего AddressSanitizer (`-fsanitize=address`), который помогает выявлять выходы за границы буферов, двойное освобождение и часть других типичных проблем.
Интеграция с миром Си
Одно из сильных мест Solod - тесная интеграция с экосистемой языка Си:
- код на Solod транспилируется в C11;
- функции на Solod могут быть вызваны из Си-кода;
- и наоборот, код на Solod может напрямую обращаться к функциям на Си;
- для работы приложений на Solod не требуется тяжёлый рантайм.
Помимо порта ряда Go-пакетов (например, `strings`, `io`, `bytes`, `mem`, `slices` и другие), в программах на Solod могут быть использованы обёртки над стандартной библиотекой Си (`libc`). Это делает язык особенно привлекательным в ситуациях, когда есть необходимость:
- расширить существующее Си-приложение кодом с более строгой типизацией;
- переносить привычные Go-библиотеки в среду, где основной стек - это C/C++;
- писать системные компоненты, драйверы, утилиты, которые должны собираться любым стандартным C-компилятором.
Области применения: "Си с лицом Go"
Автор проекта прямо указывает, что основное назначение Solod - системное программирование: низкоуровневые библиотеки, высокопроизводительные сервисы, утилиты, где важны:
- предсказуемая работа с памятью;
- минимальный рантайм;
- совместимость с Си;
- строгая статическая типизация и более современный синтаксис в стиле Go.
Solod можно рассматривать как попытку объединить:
- возможности и модель типов Go;
- с возможностью компиляции в C11;
- и с управлением памятью, близким к Си, без автоматической "магии".
Вторая сфера применения - перенос существующих Go-библиотек в мир C. Наличие уже портированных пакетов уровня `strings`, `bytes`, `slices` и т.п. создаёт фундамент для постепенной миграции части Go-кода туда, где Go-рантайм по каким-то причинам нежелателен или невозможен.
Производительность: быстрее Go в ряде сценариев
Отказ от сборщика мусора и тяжёлого рантайма даёт заметный выигрыш в скорости выполнения многих операций. По предоставленным тестам:
- функции из пакета `Byte` работают примерно в 1,5 раза быстрее при таком же объёме памяти;
- операции с байтовыми буферами:
- чтение - в среднем быстрее в ~1,3 раза;
- запись - быстрее в 2-4 раза;
- в пакете `Map`:
- выборка по целочисленному ключу быстрее в 3,4 раза;
- изменение карт по целочисленному ключу - медленнее в 1,6 раза;
- выборка по строковым ключам сопоставима с Go;
- модификация по строковым ключам - медленнее примерно в 1,5 раза;
- парсинг и форматирование целых чисел - примерно в 2 раза быстрее;
- операции с числами с плавающей запятой - в 1,5-1,2 раза быстрее;
- строковые функции - ускорение порядка 1,3 раза;
- создание строк - быстрее в 2-4 раза при одновременном снижении потребления памяти на 10-20%.
Эти цифры разумеется зависят от сценариев, но в совокупности демонстрируют: там, где нагруженные участки кода активно работают с памятью и строками, отсутствие GC и прямой контроль за выделением/освобождением дают серьёзный прирост.
Ограничения: что убрали из Go и зачем
Solod - это сознательно урезанный вариант Go. Самые обсуждаемые ограничения:
- нет горутин и каналов;
- нет замыканий;
- отсутствует богатый рантайм Go и стандартные средства конкурентности.
По сути, "удалены" именно те элементы, которые часто рассматривают как главное преимущество Go. Возникает естественный вопрос: если убрать горутины и каналы, остаётся ли что-то, ради чего вообще стоит выбирать Go-подобный синтаксис?
Ответ, заложенный в дизайн Solod: цель не в том, чтобы заменить Go, а в том, чтобы предложить:
- безопаснее и выразительнее, чем голый C;
- проще и легче по рантайму, чем полноценный Go;
- с возможностью встраивания в Си-проекты и использования стандартного C-toolchain.
То есть Solod позиционируется как инструмент для задач, где классические конкурентные фичи Go всё равно были бы недоступны или нежелательны (встраиваемые устройства, особо жёсткие требования к латентности, специфические системные библиотеки).
Дискуссии вокруг проекта: "ещё один велосипед"?
На фоне уже существующих языков не удивительно, что вокруг Solod возникают скептические мнения.
Часть разработчиков задаётся вопросом, зачем новый язык, если уже есть:
- Rust - как "принципиально новая" попытка решить проблемы управления памятью и безопасности на системном уровне без сборщика мусора, но с жёсткой моделью владения;
- V - также компилируемый в C язык, во многом позиционирующийся как лёгкая альтернатива Go, причём с поддержкой конкурентности с первых релизов;
- Lua и Vala - ориентированные на более высокоуровневую разработку, часто использующиеся для расширения приложений или быстрой разработки.
Критикуют также отсутствие "self-hosted" подхода: Solod сегодня зависит от Go - без него инструментарий не работает. С точки зрения сторонников минимализма это воспринимается как противоречие идее лёгкого системного языка, который теоретически мог бы компилировать сам себя.
Наконец, одну из линий обсуждения вызывает философия управления памятью. Сторонники высокоуровневых языков указывают, что ошибки наподобие переполнения буфера - "классическая проблема Си" и ради их устранения многие и выбирают современные языки с автоматическим управлением памятью. Противники отвечают, что:
- при строгой дисциплине и использовании проверенных библиотек можно писать безопасный код и без GC;
- ручной контроль над памятью остаётся незаменимым в ряде узкоспециализированных сценариев.
Solod в этом споре встаёт на сторону ручного контроля, но при этом всё-таки добавляет проверки границ слайсов и типобезопасность, что уже снижает часть рисков по сравнению с чистым C.
Сравнение с Go, Rust и C
Если кратко сопоставить:
Solod vs Go
- Плюсы Solod:
- меньше рантайм, нет GC;
- более предсказуемое потребление памяти;
- совместимость с Си через код на C11;
- возможен более высокий пиковый performance в CPU- и memory-intense задачах.
- Минусы:
- отсутствие горутин, каналов, замыканий;
- нет всей полноты стандартной библиотеки Go и инструментов на уровне языка;
- выше риск ошибок с памятью.
Solod vs C
- Плюсы Solod:
- более строгая типизация;
- синтаксис и абстракции в духе Go (слайсы, интерфейсы, дженерики, несколько значений из функции);
- встроенные проверки границ (panic вместо тихой порчи памяти).
- Минусы:
- дополнительный слой транспиляции;
- новая экосистема, меньшая база кода и опыт сообщества;
- всё равно остаётся ручное управление памятью.
Solod vs Rust
- Плюсы Solod:
- проще порог входа для тех, кто знает Go;
- более лёгкая модель без заимствований и строгого владения;
- более близкая к C сборка (через C11), удобная для встраивания в старые проекты.
- Минусы:
- нет системной защиты от целого класса memory-ошибок, которые Rust отсекает на этапе компиляции;
- отсутствие развитой экосистемы на уровне Rust;
- меньшая выразительность и меньше средств конкурентности.
Практические сценарии использования Solod
Где язык может быть действительно полезен:
1. Высокопроизводительные библиотеки для C-проектов.
Когда есть необходимость писать части логики с более богатой типовой системой, но без желания тянуть Go-рантайм.
2. Портирование кода с Go в среду без GC.
Если есть алгоритмы и библиотеки, изначально написанные на Go, и требуется перенести их туда, где наличие сборщика мусора нежелательно.
3. Эксперименты с системным программированием.
Solod может быть интересен как "учебная площадка" для разработчиков, которые хотят почувствовать разницу между автоматическим и ручным управлением памятью, не возвращаясь к "чистому" Си.
4. Инструменты, утилиты, CLI-приложения.
Там, где важна скорость старта, низкий overhead и отсутствие сложной инфраструктуры рантайма.
5. Встраиваемые и ресурсно-ограниченные системы.
В случаях, когда каждое лишнее выделение памяти и каждый фоновой поток критичен, Solod даёт возможность контролировать всё вручную, сохраняя при этом более удобный синтаксис.
Насколько оправдан отказ от горутин и каналов
Самый болезненный для поклонников Go вопрос: "зачем язык в стиле Go, если в нём нет того, за что любят Go - простой и мощной конкурентности?"
Ответ здесь зависит от целей:
- если вам нужен удобный язык для сервисов с большим количеством I/O, сетевых операций и масштабируемых обработчиков запросов - Solod не заменит Go;
- если же ключевые критерии - предсказуемость, контролируемая работа с памятью и тесная интеграция с Си, то отказ от горутин можно считать приемлемой платой.
Кроме того, наличие горутин и каналов в стиле Go почти неизбежно тянет за собой сложный рантайм, планировщик, дополнительные накладные расходы по памяти и CPU. Solod сознательно избегает этого, чтобы остаться ближе к "углеродному" миру C.
Итог
Solod - это не "ещё один Go" и не "убийца Rust", а специализированный инструмент на стыке Go и C:
- он даёт знакомый разработчикам Go синтаксис и часть его абстракций;
- использует традиционный C11 как целевой язык, что упрощает интеграцию с огромным существующим кодом;
- отказывается от сборщика мусора и сложного рантайма, полагаясь на ручное управление памятью и инструменты вроде AddressSanitizer;
- демонстрирует впечатляющий выигрыш в производительности в ряде типичных задач по работе с байтами, строками и картами.
Подходит Solod прежде всего тем, кто:
- ценит контроль и предсказуемость больше, чем автоматический комфорт;
- работает в мирах, где Си по-прежнему доминирует, но хочется более современного синтаксиса и лучшей типобезопасности;
- готов сознательно принять риски ручного управления памятью ради выигрыша в скорости и простоте интеграции.




Комментарии