YVM是用C++写的一个Java虚拟机,现在支持Java大部分功能,不过还有很多bug等待修复。 感兴趣的朋友pull request/fork/star吧!
:-0 高级特性逐步支持中,可以开Issue提议或者直接PR
- Java基本算术运算,流程控制语句,面向对象。
- RTTI
- 字符串拼接(+,+=符号重载)
- 异常处理(可输出stacktrace)
- 创建异步线程!
- 配置src/main.cpp
#include "YVM.h"
int main() {
const char * ydk[] = {
//该项目java lib文件所在的绝对路径
R"(C:\Users\Cthulhu\Desktop\yvm\javalib)"
};
YVM vm;
vm.warmUp(ydk, sizeof(ydk) / sizeof(ydk[0]));
vm.callMain("ydk/test/InheritanceTest"); //要运行的Java程序
system("pause");
return 0;
}
- 支持G++7.0,MSVC 2017,直接编译运行即可
部分JDK类是JVM运行攸关的,但由于JDK比较复杂不便于初期开发,所以这里用重写过的JDK代替,源码参见javalib_src目录,编译后*.class
文件位于javalib
目前重写过的JDK类有:
java.lang.String
java.lang.StringBuilder
java.lang.Throwable
java.lang.Math(::random())
java.lang.Runnable
java.lang.Thread
Code licensed under the MIT License.
javalib
YVM的运行时库,重写了部分JDK类。public
文档,图片src/JavaClass.h
.class
文件在YVM中的类表示src/Frame.h
函数调用栈src/MethodArea.h
方法区,管理JavaClasssrc/JavaHeap.h
堆管理类,拥有并管理所有实例和数组数据src/JavaType.h
虚拟机机对象表示src/RuntimeEnv.h
运行时数据。拥有堆,调用栈,和方法区数据src/CodeExecution.h
执行引擎,现在是解释执行
- YVM中类只有一种权威表示,即"package/foo/Bar",任何其他表示如"java.lang.Object","Thread.class"都拒绝加载
- 根据JVM SPEC,虚拟机执行引擎会直接操纵JDK一些类,如
java/lang/Class
,,java/lang/String
.为了实现一个"Runnable"的JVM,这里使用重写的同名类(位于javalib)代替。 - YVM不支持(未来也不打算)JavaSE6及其之前版本编译器编译的
.class
- 不能使用任何JDK的方法,不过部分运行攸关的JDK类已经重写过。输出可用
ydk.lang.IO
代替。 - YVM中
float
相等取6位小数精度,double
相等取12位小数精度