Если вы пишете на Go и вам нужна низкоуровневая работа с памятью или вызов C-библиотек без оверхеда от Cgo — Solod именно для этого.
Что это такое
Solod (сокращённо
So) — системный язык программирования. Синтаксис почти полностью совпадает с Go, но код транспилируется в C и компилируется в нативный бинарник через GCC или Clang. Никакого рантайма, никакого GC, никаких пауз.Выпущена версия v0.1 с портированной стандартной библиотекой Go и улучшенным интеропом с C.
Портированы пакеты из стандартной библиотеки Go:
io, bufio, fmt — ввод-вывод общего назначенияbytes, strings, strconv, unicode/utf8 — работа со строками и байтамиslices, maps — обобщённые структуры данныхcrypto/rand, math/rand — генерация случайных данныхflag, os, path — CLI и файловая системаlog/slog — структурированные логиtime — работа со временемПлюс два собственных пакета:
mem — управление памятью с подключаемыми аллокаторами, и c — хелперы для интеропа с C.Как выглядит интероп с C
Вот как подключить SQLite через его C API с помощью директивы
so:include и инструмента sobind:package main
import "solod.dev/so/c"
//so:include <sqlite3.h>
//so:extern SQLITE_OK
const sqliteOK = 0
//so:extern
type sqlite3 struct{}
func sqlite3_open(filename string, ppDb **sqlite3) int32
func sqlite3_exec(arg0 *sqlite3, sql string, ...) int32
Функции без тела транспилятор сам считает extern-декларациями. Go-строка в вызове
sqlite3_exec автоматически превращается в const char* — без ручного преобразования.Память: явная, но управляемая
Подход к аллокациям похож на Zig — всё выделяется явно через интерфейс
mem.Allocator. Например, при чтении значения из SQLite:name, err := m.Get(mem.System, "name")
// ...
mem.FreeString(mem.System, name)
Можно использовать
mem.System (libc malloc/free) или арену на стеке:var buf [1024]byte
arena := mem.NewArena(buf[:])
name, _ := m.Get(&arena, "name")
Нет пауз GC, нет моста Cgo при вызове C-библиотек. Платить за это приходится ручным управлением памятью.
Solod v0.1 подходит для домашних проектов и CLI-утилит — пакет
flag работает так же, как в Go. Примеры cat, head, sort, wc есть в репозитории.➡️ Попробовать в браузере
➡️ Репозиторий
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoLive