编程 TinyGo 0.44:interp 把 map lookup 和 memset 提前到编译期,启动路径再减一段

2026-10-31 21:07:17

TinyGo 0.44:interp 把 map lookup 和 memset 提前到编译期,启动路径再减一段

v0.44.0 于 2026-10-28 发布,官方博客在 2026-10-29 跟进,距离 0.43 只隔了几周。这版的主线是三件事:二进制更小、RAM 占用更低、启动更快。

  • 博客:https://tinygo.org/blog/2026/tinygo-0.44-smaller-faster-better/
  • Release:https://github.com/tinygo-org/tinygo/releases

更省内存:更多初始化挪到编译期

interp 包现在能在编译期执行更多程序初始化逻辑,包括 map lookup、memset、接口哈希、私有原子操作,以及 deferred 初始化——这些都能提前算出来。

在真实操作系统上,os 包不再为程序从未使用过的临时文件做启动工作。

合起来的效果是二进制更小、RAM 占用更低、启动更快。

更快:跳过不可能失败的检查

  • 编译器会跳过那些永远不可能失败的 slice 越界检查。
  • 更多字符串比较场景不再拷贝 byte slice。
  • RP2040/RP2350 的 PLL 计算从启动阶段移了出去。

这几项都不需要改代码,重新编译即可。

多核:cores 调度器加核心亲和性

cores 调度器在 RP2040/RP2350 上已经成熟,这一版新增了核心亲和性:可以选择 goroutine 跑在哪个核上。同时修复了调度器锁饥饿问题(schedulerUnlockAndWait),随机数读取现在跨核安全。

ESP32-S3 加入多核支持:两个 Xtensa LX7 核都能用 cores 调度器跑 goroutine,同样包含核心亲和性。另外还补上了 USB-OTG device 支持和 flash BlockDevice 支持。

新板子

  • Arduino Uno R4 Minima
  • Arduino Uno R4 WiFi(首次支持 Renesas)
  • NUCLEO-F401RE
  • M5Stack StampFly

ESP32xx 系列另有一批修复。

WebAssembly

  • GC 只扫描 Asyncify 栈的活跃部分。
  • sleep 时间取整正确。
  • WASI 文件读写不再报告负数计数。
  • 在 JavaScript 环境下环境变量解析正确。
  • Linux 上的 wasm-opt 改为链接 mimalloc,构建更快。

drivers 0.37:十个新驱动,不做堆分配

新增设备:

  • Bosch BMI270 IMU
  • Bosch BMM150 磁力计
  • CAP1166 触摸/LED 控制器
  • ILI9325 8 位并口显示屏
  • TI INA3221 三通道电源监测
  • PixArt PMW3901 光流传感器
  • SN3218 LED 驱动
  • ST7036 字符 LCD
  • VL53L3CX ToF 传感器
  • Waveshare 2.7 英寸 e-Paper(epd2in7)

新驱动都不做堆分配,部分旧驱动也去掉了分配。ESP32/ESP32-S3/ESP32-C6 增加编码器支持。

espradio 与蓝牙

espradio 方面:

  • 经典 ESP32 上的蓝牙现在可用。
  • ESP32-S3 上 radio 可以跑在 core 0,cores 调度器同时在另一个核上跑你的代码。
  • 直接迁移到最新的 lneto netstack,新增 NTP、RSSI、发射功率控制、可配置接收 ring,以及不分配内存的 ESP-NOW 收发。

蓝牙方面:

  • 新增 WebAssembly + Web Bluetooth API 后端,覆盖 central 角色,同一份 Go 代码可以直接在网页里跟设备通信。
  • HCI/L2CAP/ATT 移入 hci 包,不再依赖 build tag,可以在主机上测试,覆盖率 87%,期间发现并修掉了一批 bug。
  • 常用类型 UUID/MAC 移到 ble 包,并保留别名。
  • nRF52840 增加发射功率、DC/DC 转换器控制、USB 线拔出检测,附带低功耗 beacon 示例。
  • Windows 上的稳定性改进。

升级注意事项与其余改动

  • 这一版用 LLVM 23 构建,最低支持的 LLVM 版本提高到 15,低于 15 的构建环境需要先升级。
  • 新增 -panic-unwind=none 编译选项。
  • ESP32 烧录时不再擦除整片 flash,行为与之前不同。
  • espflasher 升到 0.9.2。
  • ESP32-S3/ESP32-C3 使用大 flash 段的启动镜像问题已修复;RP2040 板子的 flash 容量也已修正。
  • cgo flag 的处理方式与 go 命令对齐。
  • reflect 修复 Value.SetPointer、FieldByIndex。
  • testing 支持 B.Loop、benchmark context、ReportMetric。
  • interp 修复 ctlz、指针派生整数、部分加载。
  • runtime:核心亲和性、clock handoff、threads 调度器下的信号处理、Boehm 下的 MemStats 分配计数、Boehm 下的 finalizer。
  • ESP32-S3 cores 调度器与中断处理上下文相关的 bug 修复。
  • USB CDC 在主机重新配置后恢复 TX。

发布说明与新版本下载见 GitHub releases 页面。

复制全文 生成海报 Go TinyGo 嵌入式 WebAssembly 蓝牙

推荐文章

程序员茄子在线接单