barebones bytecode interpreter in C
Go to file
Peter McGoron 5f3275cf2d add signed division IDIV 2023-02-11 20:49:39 +00:00
asm add signed division IDIV 2023-02-11 20:49:39 +00:00
c_test python ffi: test parsing 2023-02-08 04:15:54 +00:00
.gitignore prototype bytecode interpreter 2023-02-05 11:44:37 +00:00
LICENSE.md prototype bytecode interpreter 2023-02-05 11:44:37 +00:00
Makefile add compile t est 2023-02-09 16:16:41 +00:00
README.md start assembler 2023-02-07 16:38:04 +00:00
creole.c add signed division IDIV 2023-02-11 20:49:39 +00:00
creole.h add signed division IDIV 2023-02-11 20:49:39 +00:00

README.md

Creole is a bytecode designed for simple implementations.

Bytecode Format

Each creole line consists of pseudo-UTF-8 characters. The first byte is an unsigned number between 0 and 127 (the high bit is clear). Each suceeding pseudo-UTF-8 character is encoded as follows:

  • 110HHHHx 10xxxxxx
  • 1110HHHH 10xxxxxx 10xxxxxx
  • 11110HHH 10Hxxxxx 10xxxxxx 10xxxxxx
  • 111110HH 10HHxxxx 10xxxxxx 10xxxxxx 10xxxxxx
  • 1111110H 10HHHxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
  • 11111110 10HHHHxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

The first four bytes determine the type:

  • 0: Value is a register.
  • 1: Value is immediate.

All other values are reserved. Overlong values are allowed, and for some argument values they are necessary. All lines are terminated by a byte of all zeros.

Design Philsophy

Creole is small but not minimal. It is easy to add instructions, and the amount of labels, registers, and stack space can changed at runtime. System calls can be added dynamically, but static instructions that take at most 3 arguments should be hard-coded.