# SimpleJVM **Repository Path**: sxudong/SimpleJVM ## Basic Information - **Project Name**: SimpleJVM - **Description**: 学习 JVM,用 Java 写一个可以跑的起来的 JVM - **Primary Language**: Java - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2021-11-30 - **Last Updated**: 2021-11-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SimpleJVM Forked: https://gitee.com/jeavenwong/SimpleJVM #### 介绍 学习 JVM,用 Java 写一个可以跑的起来的 JVM #### 开发环境 - 操作系统: Windows 10 - jdk: Zulu OpenJDK 1.8.0_252 - build: Maven 3.3.9 #### 模块介绍 - jvm-principle 模块是一个简易的虚拟机指令执行方式的demo,也是虚拟机最核心的逻辑。实现了 stack-based,rgister-based,stack and resgister hybrid 这三种方式的指令执行方式。 - jvm-core 模块计划实现 jvm 读取 classfile 进行解析,实现类加载机制,根据字节码来解释执行。 - jvm-tools 模块计划实现一些额外的功能,比如支持 AOT 编译,将源代码编译成机器码;以及 JIT 编译,将字节码编译成机器码。 - 因为实现 GC 的性价比太低,所以就看书学习吧,不实现了。(也没时间实现) - 如果做的快的话,可以用 ANTLR 实现 java 编译器前端 javac(应该没时间实现了) #### 预计实现功能 - 实现 classfile 的解析。(50%) - 实现类加载机制。(40%) - 实现字节码的解释执行。(30%) - 实现多线程。(0%) - 实现 jvm-tools 的功能。(0%) #### 被迫中断 由于学业和找工作压力,导致开发被迫无限期暂停。当然我的初衷,写这个仅仅 3000 行左右的玩具 JVM,完全是为了学习和玩耍,才决定写个玩具来体会下 JVM,非常感谢[孤星可](https://gitee.com/guxingke) 大佬开源的项目[mini-jvm](https://gitee.com/guxingke/mini-jvm/),给了我借鉴(copy)的机会,也确实很有收获,加深了对 JVM 的理解,可能很长时间都不能更新了,以后有机会再更新吧。 示例 ![sourcecode](https://gitee.com/sxudong/SimpleJVM/raw/master/pic/program.JPG) 字节码 ![bytecode](https://gitee.com/sxudong/SimpleJVM/raw/master/pic/bytecode.JPG) 运行效果 ![result](https://gitee.com/sxudong/SimpleJVM/raw/master/pic/result.JPG) 花了一周左右的时间,我写的 JVM 太渣了,没有肝下去,只能算搭了一个简易的框架demo出来,只能运行最最最简单的字节码,如果大家想要体会下动手写 JVM 的快感,可以参考大佬的代码,当然也可以参考我的代码(如果你看的下去可以重构)。 - 目前只实现了屈指可数的简单的指令,复杂的指令,比如 invokevirtual, getstatic都没有实现,当然实现完全是体力活,没有时间做了,以后有机会补上吧。 - 深刻理解了 JVM 方法调用的过程,虚拟机栈,栈帧,操作数栈,局部变量表。 - 简单模拟了类加载的双亲委派机制,感觉很简单。 - 体会了 native 方法实现原理。 - 没有实现类的构造方法的执行、类的静态变量初始化、静态块的初始化、父类和接口的方法调用等,肝不动。 - 没有实现 rt.jar 中的类以及一些常见的类,没有时间肝。 - 很想自己从 javac 编译器前端一直写到后端 JIT,太可惜了,以后有机会再补上吧。 #### 少一些功利主义的追求,多一些不为什么的执著,祝大家都能实现自己的梦想!!!