A more-than-minimal JVM written in Go.
- Java 17 functionality, but...
- No JNI (Oracle intends to replace it; see JEP 389)
- No security manager (Oracle intends to remove it; see JEP 411)
- No JIT
- Somewhat less stringent bytecode verification
- Does not enforce Java 17's sealed classes
- Gets options from the three environment variables. Details here
- Parses the command line; identify JVM options and application options
- Responds to most options listed in the
java -help
output
To do:
- Handling @files (which contain command-line options)
- Parsing complex classpaths
- Correctly reads and parses most classes
- Extracts bytecode and parameters needed for execution
- Automated pre-loading of core Java classes (
Object
, etc.) java.*
,javax.*
,jdk.*
,sun.*
classes are loaded from theJAVA_HOME
directory (i.e., from JDK binaries)- Handles JAR files
To do:
- Handle more-complex classes
- Handle interfaces
- Handle inner classes
- Performs format check of class file.
- Linking, preparation, and initialization -- minimally and only as needed at execution time
To do:
- Verification
- Robust preparation and initialization
- Execution of bytecode ✏️ The primary focus of current coding work
190 bytecodes fully operational, including one- and multi-dimensional arrays
To do:
- invokedynamic
- Calls to superclasses
- Inner and nested classes
- Exception-tree walking
- Annotations
- Instruction-level tracing (use
-trace:inst
to enable this feature) - Extensive logging data (use
-verbose:finest
to enable. Caveat: this produces a lot of data)
To do:
- Emit instrumented data to a port, for reading/display by a separate program.
GC is handled by the golang runtime, which has its own GC
A detailed roadmap to the code base can be found in the wiki.
The project's home page carries a lengthy note at the bottom that expresses our thanks to vendors and programmers who have made the Jacobin project possible. They are many and we are deeply grateful to them.