Skip to content
/ tiny-vm Public

A Kotlin project to implement a basic virtual machine

Notifications You must be signed in to change notification settings

mxm/tiny-vm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 

Repository files navigation

tiny-vm

tiny-vm is an attempt to create a virtual machine similar to the Java Virtual Machine (JVM). Like the JVM, it doesn't run machine code but a very minimalist assembly language.

Operations

The language supports the following operations:

INSTR Description
HALT Halts the machine
NOOP Does nothing
LOAD $1 $2 Loads $2 into register $1
ADD $1 $2 $3 Loads the result of registers $1 + $2 into register $3
PRINTREG $1 Prints register $1
PRINT $1 $2 Prints a string with length $1 and UTF-8 encoded contents $2

Frontend

The Main class accepts a file as the first argument which it will attempt to read the above instructions from. It will then compile these to the above binary format. The following would be a valid program:

# just a simple program
PRINT hello world!
NOOP
LOAD 0 128
PRINTREG 0
LOAD 1 2
PRINTREG 1
ADD 0 1 2
PRINTREG 2
HALT

Intermediate Code

During intermediate code generation, the code is written in a file with the .tiny extension. The instructions are encoded as follows:

INSTR FORMAT Description
HALT byte 0 Halts the machine
LOAD byte 1, byte $1, int $2 Loads $2 into register $1
ADD byte 2, byte $1, byte $2, byte $3 Loads the result of $1 + $2 into $3
NOOP byte 9 Does nothing
PRINTREG byte 42, byte $1 Prints register $1
PRINT int $1, byte[] $2 Prints a string with length $1 and UTF-8 encoded contents $2

Execution

Afterwards it is run. Instructions from the intermediate code are executed one by one.

The output of the above program will be:

0 Executing Print
  "hello world!"
1 Executing Noop
2 Executing Load
3 Executing PrintRegister
  Register 0: 128
4 Executing Load
5 Executing PrintRegister
  Register 1: 2
6 Executing Add
7 Executing PrintRegister
  Register 2: 130
8 Executing Halt

Building

To build and run tests, execute gradle build or create a jar with gradle jar.

Running an example

  1. Run gradle jar

  2. Go to the directory build/libs which contains the tiny-vm.jar file.

  3. Write a program or copy the program in the Frontend section above. Hint: Don't forget to use HALT as the last statement.

  4. Run the program via java -jar tiny-vm.jar test.txt.

  5. Enjoy :)

About

A Kotlin project to implement a basic virtual machine

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages