TinyGo 0.42 发布:runtime panic 现在可以 recover,新增 UEFI target,支持 Go 1.27 与 LLVM 22
TinyGo 0.42 最值得关注的变化是 runtime panic 变成了可恢复的——nil 指针解引用、除零、slice/map 越界、channel panic 都可以走 defer + recover,这是 TinyGo 和「大 Go」之间最老的差距之一。
发布页:
Go 1.27 与 LLVM 22
TinyGo 0.42 把 Go 版本支持推进到 1.27,官方发布的二进制就是在 1.27 下构建和测试的。Go 1.27 新引入的泛型方法(generic methods)也得到支持,靠的是升级 golang.org/x/tools。
构建链迁移到 LLVM 22,同时保留 LLVM 19 和 LLVM 20 可用,方便从发行版软件包构建的用户。哪个 TinyGo 版本对应哪个 Go 版本,见 Go 兼容矩阵。
panic recover 的具体范围
在这个版本之前,TinyGo 程序里出现 nil 指针解引用或除零,程序就直接停了,没有后续。0.42 之后:
可以通过 defer/recover 处理的:
- nil 指针解引用
- 除零
- slice 和 map 的越界操作
- channel panic
Windows 上外加了一个 vectored exception handler 来做同样的事,riscv64 上的 recover 也已经可用。
仍然不可 recover 的:
- out of memory
- 其他 fatal error
runtime 自己知道哪些 panic 能处理、哪些不能——OOM 这类失败保持不可恢复,因为确实没有可做的事。
这项工作的影响不止于错误处理。testing 包现在支持 Goexit、SkipNow 和 FailNow,t.Skip 与 t.Fatal 因此行为正确。这一处改动解锁了大量标准库测试套件。受支持包的最新清单见 TinyGo 文档中的 supported packages 列表。
UEFI target:在操作系统启动前跑 Go 程序
0.42 增加了一个最小化的 UEFI target。你可以写一个 Go 程序,用 TinyGo 编译,然后作为 UEFI 应用在任何操作系统启动之前运行。该 target 支持 UEFI time 和 events,默认使用 tasks scheduler,所以 goroutine 可用。
这是早期工作,还有很多要做,同时也说明编译器已经走到了哪一步。
ESP32
Espressif 的芯片无线能力很强,是使用最广的一类。0.41 开始的 ESP32 工作在 0.42 中继续推进:
- 原版 ESP32 获得了中断支持,带完整的 vector table;还有 timer alarms,以及 GPIO 引脚上的
SetInterrupt - 新增 ADC 驱动
- 中断驱动的 UART 接收
- flash XIP(execute in place),更大的程序现在可以正确烧录和运行
- WiFi 支持,来自
espradio包
无线方面,ESP32-C3 和 ESP32-S3 现在都支持蓝牙。
STM32 与其他新硬件
STM32 用户在这个版本里拿到的东西不少:
- F4 和 F7 系列新增 OTG FS USB 驱动
- 新增 STM32H7 支持,以及 NUCLEO-H753ZI 开发板
- 新增 STM32U031 芯片支持
- HSE 晶振频率可选
- 修复 UART 发送、波特率和中断处理
其他新增硬件:
- Puya PY32F 微控制器
- Pimoroni Blinky 2350 和 Badger 2350
- Seeed Studio XIAO nRF52840 的 'Plus' 版本
- Game Boy Advance 的 mGBA 调试支持
USB
USB 支持整体改进。端点改为动态注册,因此 RP2、SAMD21、SAMD51 和 nRF52840 现在支持双向端点。描述符也改为动态生成,并新增 USBDevice.Attach 和 USBDevice.Detach 方法。
以上只是本次发布的一部分功能和修复,完整列表见 CHANGELOG。
项目地址:
发布页: