Erlang Opcodes及其含义

时间:2012-11-15 12:19:45

标签: erlang opcode opcodes

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

举个例子:

  1. call_extcall_ext_only操作码之间有什么区别?
  2. allocateallocate_zero操作码之间有什么区别?
  3. 用于test_heap操作码的是什么?它是某种检查还是它实际上在堆中分配了一些空间?它以某种方式与元组和列表的使用相关联,但在哪些方面呢?
  4. allocate的论据代表什么?
  5. 如果有人能够指出我可以获得Erlang VM使用的opcodes的任何文档,或者如果他至少能够启发我以上几点,那将非常感激。

1 个答案:

答案 0 :(得分:4)

similar SO-questionthe erlang-documentation中所述:

  

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

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

  1. call_ext:将continuation pointer设置为当前指令+ 2 并调度/调用外部。 call_ext_only:不要触摸CP,只需发送即可。 (〜第1520行)
  2. 既分配内存,但allocate_zero也将其初始化为0x00(〜第334行)。
  3. test_heap:检查堆的Nh字是否可用;如果没有,做一个垃圾收集。 (〜第390行)
  4. allocate(StackNeeded, NumberOfRegistersToPreserve)(〜第316行)
  5. 整个文件是 #defines gotos 的组合,某些宏在同一文件夹的ops.tab中定义。我也不是erlang-asm的专家,也可能错过了什么。在开始使用它们之前,请记住这一点并交叉检查我的陈述。

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

      

    我不确定你想用这个来实现什么,但核心erlang可能是一个更好的代码操作级别。

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

    问候。