Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/y1yang0/yvm
[yvm] low performance garbage-collectable jvm
https://github.com/y1yang0/yvm
classloader cpp14 garbage-collector homemade java java-virtual-machine jvm mark-and-sweep
Last synced: about 1 month ago
JSON representation
[yvm] low performance garbage-collectable jvm
- Host: GitHub
- URL: https://github.com/y1yang0/yvm
- Owner: y1yang0
- License: mit
- Created: 2017-09-23T10:36:00.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2023-02-15T12:04:14.000Z (over 1 year ago)
- Last Synced: 2024-10-04T19:03:16.144Z (about 1 month ago)
- Topics: classloader, cpp14, garbage-collector, homemade, java, java-virtual-machine, jvm, mark-and-sweep
- Language: C++
- Homepage:
- Size: 3.8 MB
- Stars: 250
- Watchers: 15
- Forks: 55
- Open Issues: 5
-
Metadata Files:
- Readme: README.ZH.md
- License: LICENSE
Awesome Lists containing this project
README
# YVM
## 简介> [中文](./README.ZH.md) | [English](./README.md)
YVM是用C++写的一个玩具Java虚拟机,现在支持Java大部分功能,以及一个基于标记清除算法的并发垃圾回收器。YVM的实现遵守[Java虚拟机规范 8](https://docs.oracle.com/javase/specs/jvms/se8/jvms8.pdf)。时间有限没有为所有组件补充测试,另外Java语言的特性并没有完全覆盖,但是目前足够让我开心了,就这样了。如果你发现了bug,或者感兴趣想参与,请直接开Issue反馈或者提Pull Request贡献代码,谢谢。
## 构建和运行
```bash
# Note, C++14 is required at least.
$ cd yvm
$ cmake .
$ make
$ ./yvm
Usage:
yvm --lib=--lib= Tells YVM where to find JDK classes(java.lang.String, etc)
The full qualified Java class name, e.g. org.example.Foo
$ ./yvm --lib=/path/to/yvm/bytecode ydk.test.QuickSort
0 1 1 1 1 1 4 4 4 5 6 7 7 9 9 9 12 74 96 98 8989
```## 已实现特性
高级特性逐步支持中,可以开Issue提议或者直接PR。已实现的预言特性主要有下面这些:
+ Java基本算术运算,流程控制语句,面向对象。
+ [RTTI](./javaclass/ydk/test/InstanceofTest.java)
+ [字符串拼接(+,+=符号重载)](./javaclass/ydk/test/StringConcatenation.java)
+ [异常处理(可输出stacktrace)](./javaclass/ydk/test/ThrowExceptionTest.java)
+ [创建异步线程](./javaclass/ydk/test/CreateAsyncThreadsTest.java)
+ [Synchronized(支持对象锁)](./javaclass/ydk/test/SynchronizedBlockTest.java)
+ [垃圾回收(标记清除算法)](./javaclass/ydk/test/GCTest.java)![](./docs/snapshot.jpg)
示例Java小程序参见[here](javaclass/ydk/test/).
## 开发指南
### 1. 工作原理
1. `loadJavaClass("org.example.Foo")`
- findJavaClass查找已加载的类
- 查找失败,则从--lib路径加载,加载后存放到ClassSpace
2. `linkJavaClass("org.example.Foo")`
- 默认值初始化static字段
3. `initJavaClass("org.example.Foo")`
- Invoke `org.example.Foo.`
4. `invokeByName("org.example.Foo","main","([Ljava/lang/String;)V")`
- 初始化执行栈
- 从JavaClass查找main方法
- `execByteCodede`
- 在模拟的栈上解释执行字节码
- 如果遇到`invoke*`系列字节码,则递归调用`execByteCode`### 2. 代码结构
```bash
root@ubuntu:~/yvm/src$ tree .
.
├── classfile
│ ├── AccessFlag.h # 类,字段,方法的访问标志
│ ├── ClassFile.h # .class字节码对应的结构体
│ └── FileReader.h # 读取.class文件
├── gc
│ ├── Concurrent.cpp # 并发组件
│ ├── Concurrent.hpp
│ ├── GC.cpp # 垃圾回收
│ └── GC.h
├── interpreter
│ ├── CallSite.cpp # 调用点对象,描述具体的调用
│ ├── CallSite.h
│ ├── Internal.h # 虚拟机内部通用类型
│ ├── Interpreter.cpp # 代码执行引擎
│ ├── Interpreter.hpp
│ ├── MethodResolve.cpp # 调用方法解析
│ └── MethodResolve.h
├── misc
│ ├── Debug.cpp # 调试组件
│ ├── Debug.h
│ ├── NativeMethod.cpp # Java native方法实现
│ ├── NativeMethod.h
│ ├── Option.h # 参数和配置
│ ├── Utils.cpp # 工具组件
│ └── Utils.h
├── runtime
│ ├── JavaClass.cpp # 虚拟机中的类表示
│ ├── JavaClass.h
│ ├── JavaException.cpp # 异常处理
│ ├── JavaException.h
│ ├── JavaFrame.cpp # 运行时栈帧
│ ├── JavaFrame.hpp
│ ├── JavaHeap.cpp # 虚拟机堆,管理对象
│ ├── JavaHeap.hpp
│ ├── JavaType.h # 虚拟机中的Java类表示
│ ├── ClassSpace.cpp # 方法区,管理JavaClass
│ ├── ClassSpace.h
│ ├── ObjectMonitor.cpp # synchronized语义实现
│ ├── ObjectMonitor.h
│ ├── RuntimeEnv.cpp # 运行时结构定义
│ └── RuntimeEnv.h
└── vm
├── Main.cpp # 命令行解析
├── YVM.cpp # 虚拟机抽象。
└── YVM.h
```
Wiki和源码中有很多详细的开发文档,如果想探索关于`YVM`的更多内容,请移步浏览.## 开源协议
所有代码基于[MIT](./LICENSE)协议