10

Erlang VM 使用的一些操作码具有明显的含义,但其他一些则是神秘的,它们之间似乎存在细微差别。

举个例子:

  1. call_ext和操作码有什么区别call_ext_only
  2. allocate和操作码有什么区别allocate_zero
  3. 操作码是做什么test_heap用的?是某种检查还是实际上在堆中分配了一些空间?它在某种程度上与元组和列表的使用有关,但在哪些方面呢?
  4. 代表的论点是什么allocate

如果有人可以向我指出任何可用于 Erlang VM 使用的操作码的文档,或者他至少可以在上述几点上启发我,我将不胜感激。

4

1 回答 1

4

正如在类似的 SO-questionerlang-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 有它的优势,但文档不是其中之一。

问候。

于 2012-11-16T11:06:52.240 回答