YVM
Introduction
This is a toy Java virtual machine(JVM) that supports many of Java's language features, it also comes with an experimental mark-sweep
garbage collector. The implementation of this JVM follows the Java Virtual Machine Specification 8. I don't have enough time to write unit tests for each component, and I don't implement the full Java language features, but as far as pleasing myself, I think it's enough. If you find any bugs, or you want to implement any missing features, you can create an issue or pull request, respectively.
Build and Run
# Note, C++14 is required at least.
$ cd yvm
$ cmake .
$ make
$ ./yvm
Usage:
yvm --lib=<path> <main_class>
--lib=<path> Tells YVM where to find JDK classes(java.lang.String, etc)
<main_class> 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
Implemented Features
Advanced language features will support later, you can also create PR to contribute your awesome code. Implemented features are as follows:
- Java arithmetic, flow control, object-oriented programming(virtual method, inherit,etc.)
- Runtime type identification
- String concatenation
- Exception handling
- Async native threads
- Synchronized block with object lock
- Garbage Collection(With mark-and-sweep policy)
You can find some examples at here.
Hacking Guide
1. How does it work
loadJavaClass("org.example.Foo")
- findJavaClass if present
- Otherwise, loadJavaClass from --lib, all classes is stored in ClassSpace
linkJavaClass("org.example.Foo")
- Initialize static fields with default value
initJavaClass("org.example.Foo")
- Invoke
org.example.Foo.<clinit>
- Invoke
invokeByName("org.example.Foo","main","([Ljava/lang/String;)V")
- Prepare execution frame
- Find method from JavaClass
execByteCodede
- Interprete every bytecode on simulated stack
- Recursively call
execByteCodede
when performinginvoke*
bytecodes
2. Code structure
root@ubuntu:~/yvm/src$ tree .
.
โโโ classfile
โย ย โโโ AccessFlag.h # Access flag of class, method, field
โย ย โโโ ClassFile.h # Parse .class file
โย ย โโโ FileReader.h # Read .class file
โโโ gc
โย ย โโโ Concurrent.cpp # Concurrency utilities
โย ย โโโ Concurrent.hpp
โย ย โโโ GC.cpp # Garbage collector
โย ย โโโ GC.h
โโโ interpreter
โย ย โโโ CallSite.cpp # Call site to denote a concrete calling
โย ย โโโ CallSite.h
โย ย โโโ Internal.h # Types that internally used
โย ย โโโ Interpreter.cpp # Interpreter
โย ย โโโ Interpreter.hpp
โย ย โโโ MethodResolve.cpp # Resolve call site
โย ย โโโ MethodResolve.h
โโโ misc
โย ย โโโ Debug.cpp # Debugging utilities
โย ย โโโ Debug.h
โย ย โโโ NativeMethod.cpp # Java native methods
โย ย โโโ NativeMethod.h
โย ย โโโ Option.h # VM arguments and options
โย ย โโโ Utils.cpp # Tools and utilities
โย ย โโโ Utils.h
โโโ runtime
โย ย โโโ JavaClass.cpp # Internal representation of java.lang.Class
โย ย โโโ JavaClass.h
โย ย โโโ JavaException.cpp # Exception handling
โย ย โโโ JavaException.h
โย ย โโโ JavaFrame.cpp # Execution frame
โย ย โโโ JavaFrame.hpp
โย ย โโโ JavaHeap.cpp # Java heap, where objects are located
โย ย โโโ JavaHeap.hpp
โย ย โโโ JavaType.h # Java type definitions
โย ย โโโ ClassSpace.cpp # Store JavaClass
โย ย โโโ ClassSpace.h
โย ย โโโ ObjectMonitor.cpp # synchronized(){} block implementation
โย ย โโโ ObjectMonitor.h
โย ย โโโ RuntimeEnv.cpp # Runtime structures
โย ย โโโ RuntimeEnv.h
โโโ vm
โโโ Main.cpp # Parse command line arguments
โโโ YVM.cpp # Abstraction of virtual machine
โโโ YVM.h
See its wiki for more development details.
License
Code licensed under the MIT License.