镜像概述和主要用途
TinyGo是一个适用于小型环境(如微控制器、WebAssembly (Wasm) 和命令行工具)的Go编译器。它重用Go语言工具库和LLVM,提供另一种编译Go程序的方式,旨在生成小型二进制文件并支持资源受限的设备。
核心功能和特性
主要功能
- 极小的二进制大小:只为使用的功能付费,避免不必要的开销
- 广泛的硬件支持:支持多种微控制器板、WebAssembly和Linux环境
- WebAssembly兼容性:可编译Go程序为WebAssembly在网页中运行
- 良好的CGo支持:函数调用开销低,接近常规函数调用
- 标准库支持:支持大多数标准库包,无需修改即可编译多数Go代码
项目目标
- 生成极小的二进制文件
- 支持大多数常见微控制器板
- 可在Web中通过WebAssembly使用
- 提供良好的CGo支持,无额外开销
- 支持大多数标准库包,编译多数Go代码无需修改
非目标
- 使用多个核心
- 在大量goroutine下保持高效(但良好的goroutine支持是目标)
- 与
gc一样快(但LLVM可能在某些优化上更优,如数值计算)
- 能编译所有Go程序
使用场景和适用范围
- 微控制器开发:为Arduino、Adafruit等系列开发板编译嵌入式程序
- WebAssembly应用:生成轻量级Wasm模块用于网页交互
- 小型命令行工具:创建资源占用低的命令行应用
- 物联网设备开发:为资源受限的IoT设备编写Go程序
支持的目标平台
TinyGo可编译程序至微控制器、WebAssembly和Linux。目前支持以下62种微控制器板:
- Adafruit Circuit Playground Bluefruit
- Adafruit Circuit Playground Express
- Adafruit CLUE
- Adafruit Feather M0
- Adafruit Feather M4
- Adafruit Feather M4 CAN
- Adafruit Feather nRF52840 Express
- Adafruit Feather STM32F405 Express
- Adafruit Grand Central M4
- Adafruit ItsyBitsy M0
- Adafruit ItsyBitsy M4
- Adafruit ItsyBitsy nRF52840
- Adafruit Matrix Portal M4
- Adafruit Metro M4 Express Airlift
- Adafruit PyBadge
- Adafruit PyGamer
- Adafruit PyPortal
- Adafruit QT Py
- Adafruit Trinket M0
- Arduino Mega 1280
- Arduino Mega 2560
- Arduino MKR1000
- Arduino Nano
- Arduino Nano33 IoT
- Arduino Uno
- Arduino Zero
- BBC micro:bit
- BBC micro:bit v2
- Digispark
- Dragino LoRaWAN GPS Tracker LGT-92
- ESP32
- ESP8266
- Game Boy Advance
- Makerdiary nRF52840-MDK
- Makerdiary nRF52840-MDK USB Dongle
- Microchip SAM E54 Xplained Pro
- nice!nano
- Nintendo Switch
- Nordic Semiconductor PCA***
- Nordic Semiconductor PCA***
- Nordic Semiconductor PCA***
- Nordic Semiconductor pca***
- Particle Argon
- Particle Boron
- Particle Xenon
- Phytec reel board
- PineTime DevKit
- PJRC Teensy 3.6
- PJRC Teensy 4.0
- ProductivityOpen P1AM-100
- Seeed Wio Terminal
- Seeed Seeeduino XIAO
- Seeed Sipeed MAix BiT
- SiFIve HiFive1
- ST Micro "Nucleo" F103RB
- ST Micro "Nucleo" F722ZE
- ST Micro "Nucleo" L031K6
- ST Micro "Nucleo" L432KC
- ST Micro "Nucleo" L552ZE
- ST Micro STM32F103XX "Bluepill"
- ST Micro STM32F407 "Discovery"
- X9 Pro smartwatch
更多信息请参见支持的开发板列表。欢迎提交拉取请求以支持更多开发板!
使用方法和配置说明
安装与运行
有关安装TinyGo以及使用Docker容器运行TinyGo编译器的信息,请参见入门指南。
示例:编译并烧录程序
以下是一个控制内置LED闪烁的示例程序,可直接在任何支持的带内置LED的开发板上运行:
go
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:
shell
tinygo flash -target arduino examples/blinky1
目前支持的Go语言特性
有关当前支持的Go语言特性的描述,请参见语言支持。
文档
文档位于官方网站:[***]
网站代码托管在[***]
获取帮助
如果您需要更互动的方式讨论TinyGo的使用或开发,可加入Gophers Slack上的#TinyGo频道。
如需Gophers Slack邀请,可通过此处生成,通常会很快(1分钟内)收到。
贡献
欢迎您的贡献!
详情请参见CONTRIBUTING.md文档。
项目存在的原因
我们从未期望Go成为嵌入式语言,因此它存在一些严重问题……
—— Rob Pike,GopherCon 2014开幕主题演讲
TinyGo旨在将Go引入微控制器和单处理器核心的小型系统。它与emgo类似,但主要区别在于TinyGo希望保留Go内存模型(这意味着需要某种垃圾回收)。另一个区别是TinyGo内部使用LLVM而非生成C代码,这有望生成更小、更高效的代码,并提供更大的灵活性。
最初的想法是:如果Python可以在微控制器上运行,那么Go当然也能在更低级的微控制器上运行。
许可证
本项目采用BSD 3条款许可证,与Go项目相同。
部分代码从LLVM项目复制而来,因此采用Apache 2.0许可证变体。这些文件的头部已明确注明。
部分代码从Paul Stoffregen的Teensy库复制和/或移植而来,因此采用PJRC许可证。这些文件的头部已明确注明。