/yvm

自制JVM

Primary LanguageC++MIT LicenseMIT

YVM

YVM是用C++写的一个Java虚拟机,现在支持Java大部分功能,不过还有很多bug等待修复。 感兴趣的朋友pull request/fork/star吧!

已支持语言特性

:-0 高级特性逐步支持中,可以开Issue提议或者直接PR

使用方法

  1. 配置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;
}
  1. 支持G++7.0,MSVC 2017,直接编译运行即可

关于JDK

部分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

运行效果

  • helloworld
  • 快速排序
  • 异常调用栈轨迹
  • 创建线程

License

Code licensed under the MIT License.

{↓ For developers who want to explore more...}

{Big picture}

{Components}

  • javalib YVM的运行时库,重写了部分JDK类。
  • public 文档,图片
  • src/JavaClass.h .class文件在YVM中的类表示
  • src/Frame.h 函数调用栈
  • src/MethodArea.h 方法区,管理JavaClass
  • src/JavaHeap.h 堆管理类,拥有并管理所有实例和数组数据
  • src/JavaType.h 虚拟机机对象表示
  • src/RuntimeEnv.h 运行时数据。拥有堆,调用栈,和方法区数据
  • src/CodeExecution.h 执行引擎,现在是解释执行

{Public design, private implementation}

  1. YVM中类只有一种权威表示,即"package/foo/Bar",任何其他表示如"java.lang.Object","Thread.class"都拒绝加载
  2. 根据JVM SPEC,虚拟机执行引擎会直接操纵JDK一些类,如java/lang/Class,,java/lang/String.为了实现一个"Runnable"的JVM,这里使用重写的同名类(位于javalib)代替。
  3. YVM不支持(未来也不打算)JavaSE6及其之前版本编译器编译的.class
  4. 不能使用任何JDK的方法,不过部分运行攸关的JDK类已经重写过。输出可用ydk.lang.IO代替。
  5. YVM中float相等取6位小数精度,double相等取12位小数精度