Erlang VM使用的一些opcodes具有明显的含义,但其他一些是神秘的,它们似乎因微妙的差异而彼此不同。
举个例子:
call_ext
和call_ext_only
操作码之间有什么区别?allocate
和allocate_zero
操作码之间有什么区别?test_heap
操作码的是什么?它是某种检查还是它实际上在堆中分配了一些空间?它以某种方式与元组和列表的使用相关联,但在哪些方面呢?allocate
的论据代表什么?如果有人能够指出我可以获得Erlang VM使用的opcodes的任何文档,或者如果他至少能够启发我以上几点,那将非常感激。
答案 0 :(得分:4)
如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:
我不确定你想用这个来实现什么,但核心erlang可能是一个更好的代码操作级别。
请查看更多信息。 Erlang有它的优势,但文档不是其中之一。
问候。