【问题标题】:Erlang Opcodes and their meaningErlang 操作码及其含义
【发布时间】:2023-03-13 23:15:01
【问题描述】:
Erlang VM 使用的opcodes 有一些含义很明显,但其他一些则很神秘,它们之间似乎存在细微差别。
举个例子:
-
call_ext 和 call_ext_only 操作码有什么区别?
-
allocate 和 allocate_zero 操作码有什么区别?
-
test_heap 操作码是做什么用的?是某种检查还是实际上在堆中分配了一些空间?它在某种程度上与元组和列表的使用有关,但在哪些方面?
-
allocate 的参数代表什么?
如果有人可以向我指出任何可用于 Erlang VM 使用的 opcodes 的文档,或者如果他至少可以就上述几点启发我,我将不胜感激。
【问题讨论】:
标签:
erlang
opcode
opcodes
【解决方案1】:
如similar SO-question 和the erlang-documentation 中所述:
请注意,汇编程序文件的格式没有记录,并且可能会在不同版本之间发生变化 - 此选项主要用于内部调试。
如果您真的想知道发生了什么,似乎您必须在源代码中追踪它。大部分工作都是在 erts/emulator/beam/beam_emu.c 中完成的(我已经查看了 otp_src_R15B02):
-
call_ext:将continuation pointer 设置为当前指令+2 并调度/调用外部。 call_ext_only:别碰CP,直接派送。 (~第 1520 行)
- 两者都分配内存,但
allocate_zero 还将其初始化为 0x00(~第 334 行)。
-
test_heap:检查堆的Nh个字是否可用;如果没有,请进行垃圾收集。 (~第 390 行)
-
allocate(StackNeeded, NumberOfRegistersToPreserve)(~第 316 行)
整个文件是#defines和gotos的复合体,一些宏定义在同一文件夹的ops.tab中。我也不是 erlang-asm 方面的专家,可能错过了一些东西。请记住这一点,并在开始使用我的陈述之前对其进行交叉检查。
从链接的 SO-awnser 引用 TamasNagy:
我不确定你想用这个实现什么,但 core erlang 可能是一个更好的代码操作级别。
请在此处查看更多信息。 Erlang 有它的优势,但文档不是其中之一。
问候。