Hacker News 中文摘要

RSS订阅

Erlang ARM32 JIT诞生 -- Erlang ARM32 JIT is born

文章摘要

文章介绍了GRiSP团队在Erlang生态系统基金会的支持下,成功将BEAM JIT移植到ARM32位架构,并首次实现了通过JIT编译的ARM32机器代码运行Erlang函数,标志着Erlang ARM32 JIT的诞生。相关代码已开源。

文章总结

GRiSP生态系统:Stritzinger团队的Erlang ARM32 JIT开发里程碑

项目背景

Erlang生态系统基金会及其嵌入式工作组的支持下,我们成功实现了BEAM JIT(即时编译器)向ARM32位架构的移植。本文记录了首个重要里程碑的达成——通过JIT编译的ARM32机器代码执行了第一个Erlang函数。

技术突破

  1. 首次运行验证

    • 使用QEMU模拟器执行ARM32环境下的BEAM虚拟机,成功运行返回错误码42的Erlang函数: shell ~/arm32-jit$ echo $? 42
    • 代码已开源:stritzinger/otp arm32-jit分支
  2. 测试代码解析

    • 测试模块hello.erl包含一个模拟Erlang进程入口的start/2函数,通过调用erlang:halt/2实现有序关闭: erlang start(_BootMod, _BootArgs) -> halt(42, [{flush, false}]).
    • 通过修改BEAM的erl_init.c强制加载该模块,跳过了标准模块初始化流程。
  3. JIT核心机制

    • 共享代码片段:90+个全局共享指令片段被复用,减少重复编译。
    • 关键内置模块erts_beamasm模块包含7个管理Erlang进程的核心指令(如run_processnormal_exit等)。
    • ARM32汇编生成:启用-JDdump true参数可实时输出JIT生成的汇编代码,便于调试。

实现细节

  • 寄存器使用技巧:数值42通过ARM32的标签值机制隐藏(十六进制2A加上标签位变为2AF),存储在ErtsSchedulerRegisters结构的xregarray中。
  • 最小化实现策略:当前仅实现必要的BEAM指令(如call_light_bif),跳过非关键路径(如deallocreturn)。

后续计划

下一步将扩展hello模块以支持更多BEAM指令,通过增量开发验证各操作码的正确性。当前成果为后续开发提供了可靠的测试基准。

技术趣闻:为什么选择42?这个数字不仅是《银河系漫游指南》的经典梗,更因它在十六进制下能清晰展示BEAM的标签值机制(0x2A → 0x2AF)。

评论总结

以下是评论内容的总结:

  1. 关于ARM架构的疑问
  • 主要观点:质疑32位ARM架构是否在v7后停止更新
  • 引用评论: "I don't have any experience with ARM, but from what I've seen people write, isn't 32-bit ARM discontinued after v7?" ("我没有ARM使用经验,但根据看到的讨论,32位ARM不是在v7后就停止了吗?")
  1. 对ESP32 JIT的误解
  • 主要观点:误读标题引发的有趣反应
  • 引用评论: "Gah, misread that as esp32 JIT, which would be eye opening!" ("啊,误读成esp32 JIT了,那会是个惊人的发现!")
  1. 对Tcl和Erlang语言的看法
  • 主要观点:怀念Erlang但承认其小众性
  • 引用评论: "I miss working with Erlang especially, but it's also certainly kind of a niche thing. Other languages are faster and have more effort being put into them." ("我特别怀念使用Erlang的日子,但它确实比较小众。其他语言更快且投入的开发力量更多。")

总结呈现了三个不同的讨论方向:技术架构疑问、标题误读反应,以及对特定编程语言的评价。每个观点都保留了原始评论的关键表述。