Rob*_*loi 10 erlang opcode opcodes
Erlang VM使用的一些操作码具有明显的含义,但其他操作码是神秘的,它们似乎因微妙的差异而彼此不同.
举个例子:
call_ext和call_ext_only操作码之间有什么区别?allocate和allocate_zero操作码之间有什么区别?test_heap用于什么操作码?它是某种检查还是它实际上在堆中分配了一些空间?它以某种方式与元组和列表的使用相关联,但在哪些方面呢?allocate含义是什么?如果有人能够指出任何可用于Erlang VM使用的操作码的文档,或者如果他至少可以在上述方面给我启发,那将非常感激.
正如类似的 SO 问题和erlang-documentation中所述:
请注意,汇编程序文件的格式没有记录,并且可能在版本之间发生变化 - 该选项主要用于内部调试使用。
如果你真的想知道发生了什么,似乎你必须在源代码中追踪它。大部分工作是在 erts/emulator/beam/beam_emu.c 中完成的(我已经研究过 otp_src_R15B02):
call_ext:将继续指针设置为当前指令+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 的话:
我不确定你想用这个实现什么,但核心 erlang 可能是进行代码操作的更好水平。
请在那里查找更多信息。Erlang 有它的优势,但文档不是其中之一。
问候。