tinygo-org/tinygo
GitHub: tinygo-org/tinygo
TinyGo 是一个基于 LLVM 的 Go 编译器,专为微控制器、WebAssembly 和命令行工具等小型设备设计,旨在生成体积小巧的二进制文件。
Stars: 17316 | Forks: 1010
# TinyGo - 用于小设备的 Go 编译器
[](https://github.com/tinygo-org/tinygo/actions/workflows/linux.yml) [](https://github.com/tinygo-org/tinygo/actions/workflows/build-macos.yml) [](https://github.com/tinygo-org/tinygo/actions/workflows/windows.yml) [](https://github.com/tinygo-org/tinygo/actions/workflows/docker.yml) [](https://github.com/tinygo-org/tinygo/actions/workflows/nix.yml) [](https://circleci.com/gh/tinygo-org/tinygo/tree/dev)
TinyGo 是一个 Go 编译器,专为微控制器、WebAssembly (wasm/wasi) 和命令行工具等小型设备设计。
它复用 Go 语言工具所使用的库,并结合 [LLVM](http://llvm.org) 提供了一种替代方式来编译用 Go 编程语言编写的程序。
## 嵌入式
以下是一个示例程序,可在任何带有板载 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 ItsyBitsy M0 或任何支持板载 LED 的开发板上编译和运行,只需设置正确的 TinyGo 编译器目标即可。例如,以下命令可编译并烧录到 Arduino Uno:
```
tinygo flash -target arduino examples/blinky1
```
## WebAssembly
TinyGo 非常适合为浏览器 (WASM) 以及服务器和其他边缘设备 (WASI) 编译程序。
TinyGo 程序可在 [Fastly Compute](https://www.fastly.com/documentation/guides/compute/go/)、[Fermyon Spin](https://developer.fermyon.com/spin/go-components)、[wazero](https://wazero.io/languages/tinygo/) 以及许多其他 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 编译器的信息,请参阅[入门指南]( "如果 Python 可以运行在微控制器上,那么 Go 当然应该能够运行在更低层次的微控制器上。"
>
> — Rob Pike,[GopherCon 2014 开场主题演讲](https://www.youtube.com/watch?v=VoS7DsT1rdM&feature=youtu.be&t=2799)
TinyGo 是一个将 Go 引入单核微控制器和小规模系统的项目。它与 [emgo](https://github.com/ziutek/emgo) 类似,但主要区别在于我们希望保留 Go 内存模型(这意味着需要进行某种形式的垃圾回收)。另一个区别是 TinyGo 内部使用 LLVM 而不是生成 C 代码,这有望产生更小、更高效的代码,当然也提供了更大的灵活性。
最初的推理是:如果 [Python](https://micropython.org/) 可以在微控制器上运行,那么 [Go](https://golang.org/) 当然应该能够在更低层次的微控制器上运行。
## 许可证
本项目采用 BSD 3-Clause 许可证,与 [Go 项目](https://golang.org/LICENSE) 本身相同。
部分代码是从 LLVM 项目复制的,因此根据 [Apache 2.0 许可证的变体](http://releases.llvm.org/11.0.0/LICENSE.TXT) 获得许可。这已在这些文件的头部明确标注。
部分代码是从 Paul Stoffregen 的 Teensy 库复制和/或移植的,因此根据 PJRC 的许可证获得许可。这已在这些文件的头部明确标注。
标签:AI工具, Arduino, EVTX分析, Go编译器, IoT, LLVM, TinyGo, WASI, WASM, WebAssembly, 交叉编译, 嵌入式开发, 微控制器, 日志审计, 物联网, 硬件编程, 编程语言工具