💡 Синтаксис Go, скорость C, без рантайма
Если вы пишете на 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
//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 есть в репозитории.
➡️ https://clc.to/cnOOWA
➡️ https://clc.to/Ujp4aA
📍 Навигация: https://clc.to/fuWG8g • https://clc.to/_Jfhrg • https://clc.to/zbSIdg
🐸
#GoLive