我们目前正致力于我们自己的Java虚拟机实现中的JIT编译部分。我们的想法是将给定的Java字节码简单地翻译成操作码,将它们写入可执行内存并直接调用方法的起始位置。
假设给定的Java代码如下:
现在,我们采取以下方法(假设给定的内存从0x1000开始,期望返回值在eax中):
假设给定的Java代码如下:
int a = 13372338;
int b = 32 * a;
return b;
现在,我们采取以下方法(假设给定的内存从0x1000开始,期望返回值在eax中):
0x1000: first local variable - accessible via [eip - 8]
0x1004: second local variable - accessible via [eip - 4]
0x1008: start of the code - accessible via [eip]
Java bytecode | Assembler code (NASM syntax)
--------------|------------------------------------------------------------------
| // start
| mov edx, eip
| push ebx
|
| // method content
ldc | mov eax, 13372338
| push eax
istore_0 | pop eax
| mov [edx - 8], eax
bipush | push 32
iload_0 | mov eax, [edx - 8]
| push eax
imul | pop ebx
| pop eax
| mul ebx
| push eax
istore_1 | pop eax
| mov [edx - 4], eax
iload_1 | mov eax, [edx - 4]
| push eax
ireturn | pop eax
|
| // end
| pop ebx
| ret
这种方法会像虚拟机本身一样简单地使用堆栈。
- 这种编译方法可行吗?
- 是否可能以这种方式实现所有Java指令?如何转换类似athrow/instanceof等命令?