# Solod:手动内存管理和 C 编译的 Go 子集
Solod (So) 是一个开源项目,提供 Go 的一个子集,可以转译为 C11。该代码可以使用 GCC、Clang 或 zig cc 编译,无需运行时或垃圾回收器。转译器使用 Go 编写,采用 BSD 许可,支持 Linux、macOS 和 Windows。
手动内存管理消除了垃圾回收、自动分配和引用计数。内存默认放置在栈上,通过标准库的 Alloc/Free 可以访问堆。内置类型检查和数组越界边界检查,但不跟踪悬垂指针和内存泄漏。调试时推荐使用 AddressSanitizer(-fsanitize=address)。
支持的特性
Solod 保留了 Go 的关键特性以提升便利性:
- 结构体和方法。
- 接口。
- 切片。
- 多值返回(结果 + 错误)。
- 泛型。
- Defer。
缺少通道、goroutine 和闭包——重点在于确定性和性能。
与现有 Go 工具集成:LSP 服务器、linter、IDE、go test。Solod 代码可以从 C 调用,反之亦然,无需运行时。
库和用例
已移植到 C 的 Go 包:
- strings
- io
- bytes
- mem
- slices
提供 libc 的封装。主要用例:
- 使用 Go 语法和 C 级别的类型进行系统编程。
- 将 Go 库移植到 C 项目。
- 无垃圾回收开销的高性能应用。
性能
基准测试显示相对于 Go 的优势:
| 操作 | 相对于 Go 的加速 | 内存消耗 |
|----------------------------|------------------|--------------|
| 字节函数 | 1.5 倍 | 相同 |
| 字节缓冲区(读取) | 1.3 倍 | — |
| 字节缓冲区(写入) | 2–4 倍 | — |
| 映射(int 键获取) | 3.4 倍 | — |
| 映射(int 键修改) | 0.6 倍(较慢) | — |
| 映射(string 键获取) | 持平 | — |
| 映射(string 键修改) | 0.67 倍 | — |
| int 解析/格式化 | 2 倍 | — |
| float | 1.5/1.2 倍 | — |
| 字符串函数 | 1.3 倍 | — |
| 字符串创建 | 2–4 倍 | -10–20% |
Solod 适合寻求 Go 表现力和 C 低级控制平衡的中高级开发者。
关键点
- 无垃圾回收:手动内存管理以实现可预测性能。
- C 互操作:无需运行时的直接调用。
- Go 工具:与生态系统的兼容性。
- 性能:在关键操作中比 Go 快 1.3–4 倍。
- 检查:无运行时开销的边界检查和类型安全。
— Editorial Team
暂无评论。