Erlang Opcodes及其含义

Rob*_*loi 10 erlang opcode opcodes

Erlang VM使用的一些操作码具有明显的含义,但其他操作码是神秘的,它们似乎因微妙的差异而彼此不同.

举个例子:

  1. call_extcall_ext_only操作码之间有什么区别?
  2. allocateallocate_zero操作码之间有什么区别?
  3. test_heap用于什么操作码?它是某种检查还是它实际上在堆中分配了一些空间?它以某种方式与元组和列表的使用相关联,但在哪些方面呢?
  4. 这些论点的allocate含义是什么?

如果有人能够指出任何可用于Erlang VM使用的操作码的文档,或者如果他至少可以在上述方面给我启发,那将非常感激.

Pet*_*der 4

正如类似的 SO 问题erlang-documentation中所述:

请注意,汇编程序文件的格式没有记录,并且可能在版本之间发生变化 - 该选项主要用于内部调试使用。

如果你真的想知道发生了什么,似乎你必须在源代码中追踪它。大部分工作是在 erts/emulator/beam/beam_emu.c 中完成的(我已经研究过 otp_src_R15B02):

  1. call_ext:将继续指针设置为当前指令+2并调度/调用外部。call_ext_only: 不碰CP,直接派遣。(~第 1520 行)
  2. 两者都分配内存,但allocate_zero也将其初始化为0x00(~第 334 行)。
  3. test_heap:检查堆中Nh个字是否可用;如果没有,则进行垃圾收集。(~第 390 行)
  4. allocate(StackNeeded, NumberOfRegistersToPreserve)(~第 316 行)

整个文件是#definesgotos的复合体,一些宏在同一文件夹的 ops.tab 中定义。我也不是 erlang-asm 方面的专家,可能错过了一些东西。请记住这一点,并在开始使用我的陈述之前反复检查它们。

引用链接 SO-awnser 中的 TamasNagy 的话:

我不确定你想用这个实现什么,但核心 erlang 可能是进行代码操作的更好水平。

请在那里查找更多信息。Erlang 有它的优势,但文档不是其中之一。

问候。