【发布时间】:2013-10-01 12:19:59
【问题描述】:
我们目前正在开发我们自己的 Java 虚拟机实现的 JIT 编译部分。我们现在的想法是将给定的 Java 字节码简单地转换为操作码,将它们写入可执行内存并直接调用方法的开头。
假设给定的 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 指令?如何翻译诸如throw/instanceof 和类似命令之类的内容?
【问题讨论】:
-
这和C++有什么关系?
-
嗯,虚拟机以及实际编译和生成方法的调用都是用 C++ 实现的,可能不是最相关的标签,但也很重要。
-
您发布的代码都不是 C++。您在问如何在程序集中实现 Java 字节码。
-
“可行”是指“不会崩溃和烧毁”还是“运行良好,代码合理”?更一般地说,您为什么要创建自己的 JVM,包括 JIT 编译器?无论您是在做研究、只是在学习一些东西,还是试图获得良好的表现,我给出的答案都会有所不同。
-
Thomas:好的,但是标签现在应该不重要了.. @delnan:我所说的可行是指一个运行良好并产生合理代码的解决方案。 JVM 正在集成到我们开发的内核中,该内核仅用于托管 VM - 因此需要良好的性能。
标签: c++ assembly jvm jit vm-implementation