Popcorn 1.0 发布:浏览器里跑 Elixir,底层从 AtomVM 换到 OTP/BEAM

Software Mansion 工程师 Kuba Gonet 于 2026 年 10 月 27 日发文宣布 Popcorn 1.0 稳定版:这是一款在浏览器里运行 Elixir 的库,底层虚拟机从面向嵌入式场景的 AtomVM,换成编译到 Wasm 的 OTP/BEAM。[1]

此前 Popcorn 走 AtomVM,体积小、启动快,但为贴近未修改的 Elixir 标准库,团队长期维护大量补丁,兼容成本越来越高。作者写到:BEAM 本身是移动靶,语言、字节码与语义并无完整规格,想在 AtomVM 上做到 100% 兼容并不现实。2025 年末 Mateusz Furga 尝试把 OTP/BEAM 编到 Wasm;次年一月在原型可跑之后,团队逐步把示例与 Elixir Language Tour 迁到新运行时。[1]

体积、启动与兼容面

按作者博客披露:当前随包约 730 KB Wasm(Brotli 压缩),冷启动约 200 ms(暖启动约 140 ms)。对照 AtomVM 一侧约 250 KB、启动约 80 ms;另需约 2.5 MB 标准库 .beam(可树摇)。作者称 AtomVM 启动约快 3.2 倍,但在测得的工作负载上 OTP 执行约快 3.4 倍至 1800 倍;解释型路径上 BEAM 评估模块约 70 ms,AtomVM 约 240 ms。另提供带 / 不带 crypto(OpenSSL 编进 Wasm)两套构建。[1]

BEAM 侧补上了当时 AtomVM 版本里缺的一批能力,如 bitstrings、正则、完整 ETS、protocols、部分 system/process_info 与缺失 NIF 等。官方示例站与 Local LiveView 已切到 OTP/BEAM。[1]

API 与浏览器边界

隔离从 iframe 改为 Web Workers,便于多 VM 实例,并降低主窗口被挂死的风险。网络上浏览器没有原生 TCP socket,Req 常用的 Finch 不可用;团队提供 Popcorn.Fetch,用浏览器 fetch() 做 Req 适配器(仍受 CORS、重定向与可设请求头等限制)。JS 侧 call/cast 现会真正落到 Elixir 的 handle_call/handle_cast,并补上 send()。[1]

浏览器侧仍无原生 socket、DNS、文件系统等;部分依赖已移除 NIF 的模块不可用。作者明确:这是「在浏览器里跑 Elixir / OTP 语义」,不是把任意服务端 OTP 应用原样搬进网页。[1]

升级步骤见官方文档与发版说明;破坏性变更多为机械替换。后续计划包括 PopDoc(交互式 ExDoc 插件)、Local LiveView 与体积优化等。[1]

说明:体积与启动数字据 Software Mansion 作者博客;与「馒头 PopcornMantou」等美食题材无关。浏览器限制与 OTP 子集以官方文档为准,本稿不写成可随意托管任意服务端 BEAM 应用。

来源

[1] Kuba Gonet / Software Mansion,《Popcorn 1.0: Moving from AtomVM to OTP/BEAM》,2026年10月27日;查询日 2026-10-28。

[2] Hacker News: Popcorn 1.0 Released,讨论帖;查询日 2026-10-28。

#Popcorn #Elixir #OTP #BEAM #Wasm #SoftwareMansion

排序方式 :

成为第一条评论!

Nobody's responded to this post yet. Add your thoughts and get the conversation going.