我正在研究 Android Dalvik VM,当我阅读文件 vm/mterp/out/InterpC-portable.cpp 中的 mterp 代码时遇到一个问题。实际上它是dalvik vm的主要解释器循环来解释dex文件中的字节码。如果我写了这个文件,我会选择一个 switch-case 结构来做这样的事情:
while (hasMoreIns()) {
int ins = getNextIns();
switch(ins) {
case MOV:
//interprete this instruction
...
break;
case ADD:
...
break;
...
default: break;
}
}
但是,mterp 使用的内容与我的想法非常不同,它使用了一些神奇的代码(对我而言),如下所示:
FINISH(0);
HANDLE_OPCODE(OP_NOP)
FINISH(1);
OP_END
HANDLE_OPCODE(OP_MOVE)
...
OP_END
...
我用谷歌搜索它,发现它似乎是一个修改过的“线程”样式执行,它与 switch-case 样式不同并且具有更好的性能,因为它删除了 while 循环中的分支操作。但我仍然无法理解这段代码以及为什么它的性能更好。它如何找到解释器的下一个代码?