尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

ErlangRT vs ERTS 深度对比:Rust版BEAM与C版虚拟机的5大关键差异

ErlangRT vs ERTS 深度对比:Rust版BEAM与C版虚拟机的5大关键差异 ErlangRT vs ERTS 深度对比Rust版BEAM与C版虚拟机的5大关键差异【免费下载链接】ErlangRTErlang Replacement Therapy. Another attempt to make Erlang runtime (BEAM emulator) in Rust. Good news: I know what to do. Bad news: I have no clue how to Rust项目地址: https://gitcode.com/gh_mirrors/er/ErlangRT如果你听说过ErlangRT它正是用Rust语言重写的BEAM 虚拟机Erlang 运行时。本文以官方 C 版虚拟机ERTS为参照带你一次性看懂两者在语言模型、调度、垃圾回收、代码加载、指令分发五大维度的本质区别。无论你是想评估“Rust 版 BEAM”的成熟度还是单纯好奇如何用 Rust 复刻 Erlang 运行时这份对比清单都能帮你快速建立认知。 先看结论两者定位完全不同维度ERTS官方ErlangRTRust语言CRust成熟度生产级、稳定探索阶段PoC多核多调度器 工作窃取单调度器 朴素队列GC分代复制式复制式可泛型替换目标生产运行 Erlang 应用学习 / 技术验证一句话概括ERTS 是“拿来即用”的生产引擎ErlangRT 是一个用 Rust 重写的“可研究、可验证”的教学级 BEAM。作者甚至自嘲式地写道“我知道该怎么做坏消息是……我完全不知道怎么 Rust。”见 README.rst关键差异一编程语言与内存安全模型这是最根本的差异。ERTS 用 C 编写指针、内存、生命周期都由开发者手动管理性能极高但也更易出野指针等隐患。ErlangRT 则完全基于Rust 的所有权 借用检查器在编译期就能排除大量内存错误。核心运行时是一个库入口函数为start_emulator库本体与入口lib.rs、lib_main.rs可执行程序相当于erlmain.rs测试运行器相当于ct_runmain.rs 对新手意味着什么Rust 版在“安全”上天然占优但性能与底层细节的可控性需要更多打磨这也是它目前仍处于验证阶段的原因。关键差异二进程调度器SchedulerErlang 的并发基石是轻量级进程调度器决定了哪些进程先跑。两者实现思路差异明显ERTS使用侵入式双向链表组织进程配合**多调度器 工作窃取work-stealing**实现多核并行。ErlangRT当前采用朴素VecDeque运行队列按优先级分为Low / Normal / High三档且 Normal 进程享有8 倍调度优势常量NORMAL_ADVANTAGE 8。源码中甚至留下注释“更好的做法是像原版 ERTS 那样构建侵入式双向链表。”关键代码位置调度与优先级scheduler.rs进程定义含优先级、消息邮箱、运行上下文process.rs主循环取进程并执行指令片timeslicevm_loop.rs 结论ErlangRT 的调度是“单调度器 三优先级队列”适合学习 Erlang 调度模型ERTS 的多核并行则是生产级性能的关键。关键差异三堆内存与垃圾回收GC两者都采用复制式垃圾回收Copying GC但 ErlangRT 用 Rust 的**泛型 特质trait**把 GC 设计成可替换组件pub type Heap IncrementalHeapCopyingGc;这里Heap是“增量堆 复制式 GC”的组合CopyingGc可作为泛型参数被其它回收策略替换——这正是 Rust 相比 C 的抽象能力体现。堆还支持多种用途标注Designation如进程堆、模块字面量堆、二进制堆、程序参数堆等让不同内存区域职责清晰。相关源码堆与 GC 组合heap/mod.rs复制式 GC 实现gc_copying.rs增量堆heap_incremental.rs 对比ERTS 使用成熟的分代复制式GC区分新旧代以降低回收频率ErlangRT 当前聚焦“增量 复制”的基础回收分代等优化尚未完全落地。关键差异四BEAM 代码加载机制BEAM 字节码文件.beam如何被读入虚拟机是理解两者的又一窗口。ErlangRT 采用三阶段加载职责非常清晰Stage 1读取.beam文件填充加载器状态Stage 2把变更提交给 VM例如把文件里的原子注册进 VM 原子表Stage 3finalize生成 Erlang 模块对象交给代码服务器Code Server。这种“分阶段、可回滚式”的结构对阅读和学习非常友好方便在每一阶段插入断言与调试。相关源码加载器总览loader/mod.rs文件解析beam_file.rs标签/跳转表补丁impl_fix_labels.rs第二阶段提交impl_stage2.rs 对比ERTS 的加载逻辑深度融入其 C 引擎ErlangRT 把它拆解为可测试的独立阶段更贴近现代语言工程实践。关键差异五指令分发与 BIF 代码生成Codegen这是最能体现“Rust 工程化”的差异。ERTS 用 C 宏手写指令分发与 BIF 注册而 ErlangRT 引入了Python 代码生成流水线codegen通过一系列.tab表文件驱动生成指令定义表按 OTP 版本区分genop.tab已实现指令清单implemented_ops.tab已实现 BIF 清单implemented_native_funs.tab贡献者只需把某条指令/BIF 加入.tab再运行一次makecodegen 就会自动生成分发骨架开发者只需“补齐函数体”。这套机制让“实现第 N 条 BEAM 指令”变成高度标准化、可复制的动作。相关源码指令分发入口vm_dispatch.rsBIF / 原生函数注册registry.rs、mod.rs数据模型各种 BEAM 值类型boxed/mod.rs 对比ERTS 的分发是“手工优化的 C 大 switch”ErlangRT 用“表驱动 代码生成”换取一致性与可维护性是学习大型 VM 分发的优秀范本。 快速上手如何跑通 ErlangRT准备OTP 22 源码放在otp/子模块Makefile 会自动处理通过 Rustup 安装最新Rust Cargo执行构建与测试make查看支持的目标make test运行测试会尝试执行init:boot/1make doc生成文档到target/doc/erlang_rt/。入口流程进程创建 → 主循环tick可见于 lib_main.rs工作区结构见 Cargo.toml包含lib-erlangrt、erlexec、ct_run三个成员。总结如何理解这两者的关系想生产运行 Erlang 应用→ 选ERTS官方、多核、稳定。想学习“BEAM 如何用现代语言实现”、研究调度/GC/加载/分发→ErlangRT是难得的“活教材”。它的五大差异——Rust 内存安全、朴素调度器、泛型 GC、三阶段加载、表驱动代码生成——恰好把 ERTS 的复杂内核拆解成了可阅读、可修改的现代工程。对于想在 Rust 世界理解 Erlang 虚拟机的人来说这是一个绝佳的切入点。【免费下载链接】ErlangRTErlang Replacement Therapy. Another attempt to make Erlang runtime (BEAM emulator) in Rust. Good news: I know what to do. Bad news: I have no clue how to Rust项目地址: https://gitcode.com/gh_mirrors/er/ErlangRT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表