依赖 Go
摘要
Solod 是一种新的系统编程语言,它是 Go 的一个子集,复用 Go 的工具链和标准库,同时编译为 C11,提供手动内存管理。
<p><a href="https://lobste.rs/s/1ygxcp/relying_on_go">评论</a></p>
查看缓存全文
缓存时间: 2026/08/09 14:48
# 依赖 Go
来源:https://antonz.org/relying-on-go/
如今人人都在创造新的编程语言,通常是“像 Go 但功能更多”或“像 Rust 但更简单”的那种。
Solod(https://solod.dev/)是一种面向 C 和 Go 开发者的系统语言,它看起来可能像这类语言,但采取了不同的方法。
Solod 并非通常意义上的“类 Go”,也不是试图“修复 Go 的缺点”。在语言层面,Solod 实际上就是 Go 的一个*子集*。Solod 复用了 Go 现有的许多工具,包括语法高亮、LSP、linter 和包管理系统。
以这个快速入门指南为例:
**快速入门**
安装 So 命令行工具:
```
go install solod.dev/cmd/so@latest
```
创建一个新的 Go 项目,并添加 Solod 依赖以使用 So 标准库:
```
go mod init example
go get solod.dev@latest
```
编写普通的 Go 代码,但使用 Solod 包而非标准 Go 包:
```
package main
import "solod.dev/so/math"
func main() {
ans := math.Sqrt(1764)
println("Hello, world! The answer is", int(ans))
}
```
无需保存二进制即可运行:
就这样!
这里没有什么新东西。它基本上是标准的 Go 工作流,除了 `so run`——它是一个模仿 `go run` 的 Go 程序。
## Go 的标准库
Solod 还复用了大量 Go 标准库的代码和测试。其中一些直接取自 Go 源代码,比如下面这两个字符串函数:
```
// CutPrefix 返回去除给定前缀后的 s,并报告是否找到该前缀。
func CutPrefix(s, prefix string) (string, bool) {
if !HasPrefix(s, prefix) {
return s, false
}
return s[len(prefix):], true
}
// HasPrefix 报告字符串 s 是否以 prefix 开头。
func HasPrefix(s, prefix string) bool {
return len(s) >= len(prefix) && s[:len(prefix)] == prefix
}
```
> 当然,Solod 保留了 Go 作者的版权。
有些代码需要修改,以支持 Solod 使用的显式分配器手动内存管理:
```
// Go 版本。
func Clone(s string) string {
if len(s) == 0 {
return ""
}
b := make([]byte, len(s))
copy(b, s)
return unsafe.String(&b[0], len(b))
}
```
```
// Solod 版本。
func Clone(a mem.Allocator, s string) string {
if len(s) == 0 {
return ""
}
b := mem.AllocSlice[byte](a, len(s), len(s))
copy(b, s)
return string(b)
}
```
你大概能看出它们的相似之处。
## 持保留态度
Go 工具并不知道 Solod 是完整 Go 语言的一个子集,因此它们不会标记 Solod 不支持的语法特性,比如函数字面量或迭代器。这些诊断来自自定义的 `so` 工具:
```
package main
func main() {
f := func(n int) {
println(n)
}
f(42)
}
```
```
main.go:4:7: function literals are not supported
f := func(n int) {
^here
```
另外,尽管 Go 标准库的相当一部分是从原始源代码逐字或经过最小改动移植过来的,但这并不意味着代码自动正确。Solod 仍然需要自己的测试,包括在 sanitizer 和静态分析器下运行的测试。
## 归根结底都是 C
所有 Solod 代码都会被转换为标准 C11,然后用 GCC 或 Clang 编译。因此,Solod 对 C 工具链和数十年优化工作的依赖程度,不亚于对 Go 的依赖。
Solod 代码:
```
package main
import "solod.dev/so/math"
func main() {
// 这可能是什么呢?
ans := math.Sqrt(1764)
println("Hello, world! The answer is", int(ans))
}
```
转换后的 C 代码:
```
// -- main.h --
#pragma once
#include "so/builtin/builtin.h"
#include "so/math/math.h"
// -- main.c --
#include "main.h"
int main(void) {
// 这可能是什么呢?
double ans = math_Sqrt(1764.0);
so_println("%s %" PRIdINT, "Hello, world! The answer is", (so_int)(ans));
return 0;
}
```
C 版本当然更繁琐,尤其对于比这个更复杂的程序来说。但它仍然可读。
而且由于没有运行时,Solod 与 C 之间的互操作不需要任何额外成本。
## 最后的想法
一门新语言不一定需要一个新生态系统。
Solod 高度依赖 Go,我认为这是优势而非劣势。复用 Go 经过验证的工具和标准库,让 Solod 更可靠,也更容易使用。
如果你感兴趣,可以看看 Solod 的 readme(https://github.com/solod-dev/solod#readme)——里面有开始所需的一切。或者无需安装任何东西,直接在线试试(https://solod.dev/#try)。
★ 订阅(https://antonz.org/subscribe/)以获取最新文章。
相似文章
Solod: Go 可以成为更好的 C
Solod 是 Go 的一个严格子集,可编译为可读的 C11,零运行时,无GC,拥有丰富的标准库,让 Go 开发者获得系统级控制,同时为 C 程序员提供熟悉的工具链。
就用Go
一篇带有强烈观点的开发者文章倡导使用Go编程语言,强调其简洁的语法、强大的标准库、高效的并发模型以及单二进制部署,作为对过于复杂的现代技术栈的实用替代方案。
Go 语言服务器可以实现令人印象深刻的代码导航
Go 语言服务器 (gopls) 为 Go 开发者提供了令人印象深刻的代码导航功能,增强了 IDE 的能力。
Gossamer:一种具有真实goroutines和无暂停内存的Rust风格语言
Gossamer是一种受Rust启发的新编程语言,具有真实goroutines、基于引用计数和区域的无暂停确定性内存管理,以及配备LLVM编译的字节码虚拟机。它旨在提供富有表现力的语法,无需借用检查器或垃圾回收暂停。
Soppo - Go,但具备它所缺失的特性
Soppo 是一门新的编程语言,它在 Go 的基础上扩展了枚举、模式匹配、“?”错误传播运算符以及编译期空值安全,同时保持与现有 Go 代码和工具链的完全互操作性。