66 lines
2.4 KiB
Org Mode
66 lines
2.4 KiB
Org Mode
#+title: Oreo's Virtual Machine (OVM)
|
|
#+author: Aryadev Chavali
|
|
#+date: 2023-10-15
|
|
|
|
A stack based virtual machine in C11, with a dynamic register setup
|
|
which acts as variable space. Deals primarily in bytes, doesn't make
|
|
assertions about typing and is very simple to target.
|
|
* How to build
|
|
Requires =GNU make=, a compliant C11 compiler. Code base has been
|
|
tested against =gcc= and =clang=, but given how the project has been
|
|
written without use of GNU'isms it shouldn't be an issue to compile
|
|
using something like =tcc= or another compiler (look at
|
|
[[file:Makefile::CC=gcc][here]] to change the compiler).
|
|
|
|
To build everything simply run ~make~. This will build:
|
|
+ [[file:lib/inst.c][instruction bytecode system]] which allows one to
|
|
target the VM by writing and reading instruction bytecode
|
|
+ [[file:vm/main.c][VM executable]] which can execute bytecode (your
|
|
=java= executable)
|
|
+ [[file:asm/main.c][Assembler executable]] which can assemble
|
|
compliant assembly code to VM bytecode
|
|
+ [[file:examples/][Assembly examples]] which provide some source code
|
|
examples on common programs one may write. Use this to figure out
|
|
how to write compliant assembly.
|
|
|
|
One may also build each component individually through the
|
|
corresponding recipe:
|
|
+ ~make lib~
|
|
+ ~make vm~
|
|
+ ~make asm~
|
|
+ ~make examples~
|
|
* Instructions to target the virtual machine
|
|
You need to link with the object files for
|
|
[[file:lib/base.c][base.c]], [[file:lib/darr.c][darr.c]] and
|
|
[[file:lib/inst.c][inst.c]] to be able to properly target the OVM.
|
|
The basic idea is to create instructions via ~inst_t~ then using the
|
|
~inst(s)_write_*~ API to generate bytecode (and write to a file).
|
|
|
|
Then to execute the program, the virtual machine interpreter ~ovm.out~
|
|
is used.
|
|
|
|
For clarity, one may build ~lib~ (~make lib~) then use the resulting
|
|
object files to link and create bytecode for the virtual machine.
|
|
* Lines of code
|
|
#+begin_src sh :results table :exports results
|
|
find -name '*.[ch]' -exec wc -l '{}' ';'
|
|
#+end_src
|
|
|
|
#+RESULTS:
|
|
| 301 | ./vm/runtime.h |
|
|
| 93 | ./vm/main.c |
|
|
| 1058 | ./vm/runtime.c |
|
|
| 435 | ./lib/inst.c |
|
|
| 39 | ./lib/darr.h |
|
|
| 243 | ./lib/inst.h |
|
|
| 42 | ./lib/heap.h |
|
|
| 90 | ./lib/base.h |
|
|
| 101 | ./lib/heap.c |
|
|
| 39 | ./lib/base.c |
|
|
| 77 | ./lib/darr.c |
|
|
| 601 | ./asm/parser.c |
|
|
| 143 | ./asm/main.c |
|
|
| 82 | ./asm/lexer.h |
|
|
| 54 | ./asm/parser.h |
|
|
| 541 | ./asm/lexer.c |
|