Escreves Go. Sai C legível. Zero runtime, zero GC, interop nativa. Parece magia, é engenharia.

Go é conhecido por ser uma linguagem de alta produtividade para backend, microserviços e tooling. Mas há um grupo de developers que olha para o Go e pensa: "gosto da sintaxe, das interfaces, dos testes, do LSP — mas preciso de controlo de sistemas, sem garbage collector, sem runtime pesado."

Solod (abreviado So) é a resposta. Criado por Anton Zhiyanov, o Solod é um subconjunto estrito de Go que se traduz para C11 legível. O resultado: usas a sintaxe e tooling do Go, e obténs binários C com zero overhead. Nenhum runtime. Nenhum GC. Nenhuma alocação escondida.

Neste artigo vais aprender:

  • O que é o Solod e como se compara a Go e C
  • Exemplos de código e saída C gerada
  • Benchmarks e análise de performance
  • Quando usar Solod vs. Go vs. C puro

Solod workflow

⬆ Workflow do Solod: código Go → tradutor → C11 → compilador C → binário nativo.


O que é o Solod

O Solod não é uma linguagem nova. É um strict subset de Go que se traduz para C11. Isto significa que escreves código Go normal — com structs, métodos, interfaces, slices, maps, múltiplos returns e defer — e o compilador Solod gera ficheiros .h e .c legíveis.

Características principais:

  • Zero runtime — sem garbage collector, sem reference counting, sem alocações escondidas
  • Stack-allocated por default — heap é opt-in via biblioteca standard
  • Standard library rica — tipos familiares do Go portados para C
  • Interop nativa com C — chamas C de So e So de C, sem CGO, sem overhead
  • Go tooling funciona — syntax highlighting, LSP, linting, go test

Exemplo de código

Aqui está um exemplo do site do Solod (playground interactivo):

package main

import (
    "solod.dev/so/conc"
    "solod.dev/so/mem"
    "solod.dev/so/sync/atomic"
)

type Account struct {
    Balance atomic.Int64
}

func (a *Account) Deposit(amount int64) {
    a.Balance.Add(amount)
}

func pay(arg any) {
    acc := arg.(*Account)
    acc.Deposit(10)
}

func main() {
    var acc Account

    opts := conc.PoolOptions{NumThreads: 4}
    pool := conc.NewPool(mem.System, opts)
    defer pool.Free()

    for range 100 {
        pool.Go(pay, &acc)
    }
    pool.Wait()

    println("balance is", acc.Balance.Load())
}
Copy

O tradutor Solod pega neste código e gera C11 com structs equivalentes, funções dispatch para métodos, e mapeamento directo das chamadas à biblioteca standard. O resultado é código C que qualquer compilador C11 (GCC, Clang, MSVC) consegue compilar para binário nativo.


Solod vs. Go vs. C

Característica Go Solod (So) C11
Runtime GC, scheduler, goroutines Zero — sem runtime Zero
Memory safety GC e bounds checking Bounds checking (opt-in) Nenhum
Goroutines Nativas (built-in) Biblioteca standard Bibliotecas (pthreads)
Interfaces Sim (dinâmicas) Sim (traduzidas para vtables C) Manual (vtables)
Generics Sim (1.18+) Limitado (em progresso) Não (macros)
Alocação default Heap Stack Stack
Tooling LSP, testes, fmt, lint Go tooling funciona Variável (clang-tidy, etc)
Interop C CGO (overhead) Nativa (sem overhead) Nativa
Output Binário com runtime Go Código C11 → binário nativo Binário nativo

Benchmarks e performance

O Solod está em desenvolvimento activo (v0.3 em progresso, v0.2 lançada). Os benchmarks iniciais mostram:

  • ~1:1 com C — código traduzido não tem overhead sintético; és tu a pagar pelo que usas
  • 2-5x mais rápido que Go em operações sem heap, porque não há GC pause nem tracking de alocações
  • Memória previsível — sem alocações ocultas, cada make e new é explícito

Nota: Não é justo comparar Go com Solod lado a lado para todos os workloads. Go brilha em concorrência massiva (goroutines) e I/O. Solod brilha em sistemas embebidos, kernel, firmware e cenários onde cada nanossegundo e byte contam.


Quando usar cada um

  • Usa Go — para APIs, microserviços, ferramentas de rede, processamento concorrente. Onde a produtividade importa mais que o último byte de performance.
  • Usa Solod — para firmware, embedded, WASM, kernels, bootloaders, drivers. Onde não podes ter runtime nem GC, mas queres a segurança de tipos e tooling do Go.
  • Usa C — quando precisas de controlo absoluto sobre cada instrução, quando estás a trabalhar num ecossistema C estabelecido, ou quando o Solod ainda não suporta alguma feature que precisas.

Estado actual e futuro

O Solod está em v0.2 (Julho 2026), com suporte para redes, WebAssembly e freestanding mode. A v0.3 vai adicionar concorrência (conc package mais completa). O suporte para generics é limitado, mas está no roadmap.

O projecto não está ready para produção, mas já é utilizável em projectos hobby. O autor recomenda experimentar com projectos pequenos para sentir o workflow.


Conclusão

O Solod é uma ideia que parece óbvia depois de a conheceres. Porque não usar a sintaxe moderna do Go para programar systems-level? A tradução para C não é nova (vários projectos fizeram isso), mas o Solod destaca-se pela qualidade do código C gerado — legível, idiomático C11 — e pela integração com o ecossistema Go.

Se és developer Go com curiosidade por sistemas embebidos ou low-level, ou és developer C que gostava de ter interfaces e testes sem dor de cabeça, o Solod merece um fim-de-semana de experimentação.

Recursos adicionais

Comentários (0)

Nenhum comentário ainda. Seja o primeiro!

Deixar comentário