#+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= and 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 provides object files to target the VM + [[file:vm/main.c][VM executable]] which executes bytecode + [[file:asm/main.c][Assembler executable]] which assembles 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. Also a good test of both the VM and assembler. 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 | | 92 | ./vm/main.c | | 1059 | ./vm/runtime.c | | 500 | ./lib/inst.c | | 39 | ./lib/darr.h | | 265 | ./lib/inst.h | | 42 | ./lib/heap.h | | 90 | ./lib/base.h | | 101 | ./lib/heap.c | | 39 | ./lib/base.c | | 77 | ./lib/darr.c | | 654 | ./asm/parser.c | | 142 | ./asm/main.c | | 83 | ./asm/lexer.h | | 65 | ./asm/parser.h | | 549 | ./asm/lexer.c |