TinyGo - 面向小型环境的 Go 编译器
TinyGo 是一个旨在用于小型场景(如微控制器、WebAssembly (wasm/wasi) 和命令行工具)的 Go 编译器。
它复用了 Go 语言工具 所使用的库,并结合 LLVM 提供了一种编译用 Go 编程语言编写的程序的替代方式。
[!IMPORTANT] 您可以通过 OpenCollective 进行财务捐助来支持 TinyGo。请参阅 https://opencollective.com/tinygo 以获取更多信息。谢谢!
嵌入式
以下是一个示例程序,当直接在任何带有板载 LED 的支持开发板上运行时,会闪烁内置的 LED:
package main
import (
"machine"
"time"
)
func main() {
led := machine.LED
led.Configure(machine.PinConfig{Mode: machine.PinOutput})
for {
led.Low()
time.Sleep(time.Millisecond * 1000)
led.High()
time.Sleep(time.Millisecond * 1000)
}
}
上述程序可以在 Arduino Uno、Adafruit Circuit Playground Express、Seeed Studio XIAO-ESP32S3 或任何内置 LED 的众多受支持开发板上,无需修改即可编译和运行,只需设置正确的 TinyGo 编译器目标即可。例如,以下命令可编译并烧录 Arduino Uno:
tinygo flash -target arduino-uno examples/blinky1
WebAssembly
TinyGo 非常适合将程序编译为可在浏览器(WASM)中使用,也可用于服务器及其他边缘设备(WASI)。
TinyGo 程序可运行于 Fastly Compute、Fermyon Spin、wazero 以及众多其他 WebAssembly 运行时。
以下是一个供 WASI 宿主应用程序使用的小型 TinyGo 程序:
package main
//go:wasmexport add
func add(x, y uint32) uint32 {
return x + y
}
这会将上述 TinyGo 程序编译为可在任何 WASI Preview 1 运行时上使用:
tinygo build -buildmode=c-shared -o add.wasm -target=wasip1 add.go
您也可以使用与 Go 1.24+ 相同的语法:
GOOS=wasip1 GOARCH=wasm tinygo build -buildmode=c-shared -o add.wasm add.go
安装
请参阅入门指南,了解如何安装 TinyGo,以及如何使用我们的 Docker 容器运行 TinyGo 编译器。
支持的目标
嵌入式
你可以将 TinyGo 程序编译到 150 多种不同的微控制器开发板上。
更多信息,请参阅 https://tinygo.org/docs/reference/microcontrollers/
WebAssembly
TinyGo 程序可以编译为 WASM 和 WASI 目标。
更多信息,请参阅 https://tinygo.org/docs/guides/webassembly/
操作系统
你还可以将程序编译为 Linux、macOS 和 Windows 目标。
更多信息:
当前支持的特性:
关于当前支持的 Go 语言特性的描述,请参阅 https://tinygo.org/lang-support/。
文档
文档位于我们的网站上,地址为 https://tinygo.org/。
你可以在 https://github.com/tinygo-org/tinygo-site 找到网站代码。
获取帮助
如果你希望以更互动的方式讨论 TinyGo 的使用或 开发,我们在 Gophers Slack 上有一个 #TinyGo 频道。
如果你需要 Gophers Slack 的邀请,你可以在此处生成一个, 通常很快就会到达(1 分钟以内):https://invite.slack.golangbridge.org
贡献
欢迎你的贡献!
请查看我们网站上的 Contributing 页面以获取详细信息。
项目范围
目标:
- 拥有非常小的二进制大小。不为未使用的功能付费。
- 支持大多数常见的微控制器板。
- 可通过 WebAssembly 在 Web 上使用。
- 良好的 CGo 支持,开销不超过普通函数调用。
- 支持大多数标准库包,并能在不修改的情况下编译大多数 Go 代码。
非目标:
- 在使用数百万个 goroutine 时保持高效。然而,良好的 goroutine 支持确实是一个目标。
- 速度赶上
gc。不过,LLVM 可能在优化某些方面表现更好,因此 TinyGo 在数值计算方面实际上可能会更快。 - 能够编译所有现有的 Go 程序。
该项目存在的原因
我们从未期望 Go 成为一种嵌入式语言,因此它存在严重的问题……
-- Rob Pike, GopherCon 2014 开幕主题演讲
TinyGo 是一个将 Go 引入微控制器和单核处理器小型系统的项目。它与 emgo 类似,但主要区别在于我们希望保留 Go 内存模型(这意味着需要某种形式的垃圾回收)。另一个区别是 TinyGo 内部使用 LLVM 而不是生成 C,这有望带来更小、更高效的代码,并肯定带来更大的灵活性。
最初的推理是:如果 Python 能在微控制器上运行,那么 Go 肯定也能在更低级别的微控制器上运行。
许可证
本项目采用 BSD 3-clause 许可证,与 Go 项目 本身相同。
部分代码复制自 LLVM 项目,因此采用 Apache 2.0 许可证的变体。这一点已在这些文件的头部明确标注。
部分代码复制和/或移植自 Paul Stoffregen 的 Teensy 库,因此采用 PJRC 的许可证。这一点已在这些文件的头部明确标注。