Solod: Go可以成为更好的C
是什么
Solod(发音"so")是一个严格的Go子集,翻译成C11代码。没有隐藏的内存分配,源码级互操作。
核心理念: 用Go的语法和类型安全,写出C的性能。
核心特性
- Go in, C out - 写普通Go代码,生成可读的C11代码
- 零运行时 - 无GC,无引用计数,无隐藏分配
- 默认栈分配 - 堆分配通过标准库显式opt-in
- 原生C互操作 - 从So调用C,从C调用So —— 无CGO,无开销
- Go工具链开箱即用 - 语法高亮、LSP、linting、go test
支持的特性
| 支持 | 不支持 |
|---|---|
| struct, 方法, 接口 | channel |
| slice, map, 数组 | goroutine |
| 多返回值, defer | 闭包 |
| 字符串, 错误处理 | 泛型 |
Hello World示例
Go代码:
package main
type Person struct {
Name string
Age int
}
func (p *Person) Sleep() int {
p.Age += 1
return p.Age
}
func main() {
p := Person{Name: "Alice", Age: 30}
p.Sleep()
println(p.Name, "is now", p.Age, "years old.")
}
生成的C代码:
#include "main.h"
typedef struct main_Person {
so_String Name;
so_int Age;
} main_Person;
so_int main_Person_Sleep(void* self) {
main_Person* p = (main_Person*)self;
p->Age += 1;
return p->Age;
}
int main(void) {
main_Person p = (main_Person){
.Name = so_str("Alice"), .Age = 30
};
main_Person_Sleep(&p);
so_println("%.*s %s %" PRId64 " %s",
p.Name.len, p.Name.ptr, "is now", p.Age, "years old.");
}
数据类型映射
byte→so_byte(uint8_t)rune→so_rune(int32_t)int→so_int(int64_t)string→so_String(ptr + len)any→void*
为什么重要
Solod为系统编程提供了一个中间地带——不想学C语法但需要C性能的场景。它保留了Go的优雅,同时消除了GC的不确定性。
来源: antonz.org | 探索日期: 2026-03-23