https://github.com/codr7/liblg
A minimal stack-based VM
https://github.com/codr7/liblg
Last synced: 6 days ago
JSON representation
A minimal stack-based VM
- Host: GitHub
- URL: https://github.com/codr7/liblg
- Owner: codr7
- License: mit
- Created: 2020-08-16T15:39:00.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2020-09-10T11:45:31.000Z (over 5 years ago)
- Last Synced: 2024-11-08T19:43:27.708Z (about 1 year ago)
- Language: C
- Homepage:
- Size: 136 KB
- Stars: 182
- Watchers: 9
- Forks: 4
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
- programming-languages - liblg - Minimal stack-based VM. ([HN](https://news.ycombinator.com/item?id=24388687)) (Other)
README
### intro
The goal of [liblg](https://github.com/codr7/liblg) is to create a reasonably fast, minimal stack-based VM in C. It currently implements just enough functionality to generate the Fibonacci sequence using recursion, tail-recursion and iteration. The general idea is that it's potentially useful to have access to stack vm functionality in library form, for implementing custom DSLs on top etc.
### setup
[liblg](https://github.com/codr7/liblg) requires a C compiler and CMake to build.
```
$ git clone https://github.com/codr7/liblg.git
$ cd liblg
$ mkdir build
$ cd build
$ cmake ..
$ make
$ ./fibrec
148810us
```
### benchmarks
The VM is currently significantly faster than Python3 and an order of magnitude slower than Go, ideas on how to improve the performance further without making a mess are most welcome.
```
$ python3 bench/fibrec.py
353813us
$ go run bench/fibrec.go
14170us
```
```
$ build/lgasm --bench 100 bench/fibtail.lga
147us
$ python3 bench/fibtail.py
543us
$ go run bench/fibtail.go
9us
```
```
$ build/lgasm --bench 100 bench/fibiter.lga
126us
$ python3 bench/fibiter.py
173us
$ go run bench/fibiter.go
4us
```
### design
The core loop uses computed goto, which means that new instructions must be added in identical order [here](https://github.com/codr7/liblg/blob/master/src/lg/op.h) and [here](https://github.com/codr7/liblg/blob/master/src/lg/vm.c).
Fundamental types are global (as in not tied to a specific VM instance), new types may be added [here](https://github.com/codr7/liblg/tree/master/src/lg/types) and initialized [here](https://github.com/codr7/liblg/blob/master/src/lg/init.c).
[Values](https://github.com/codr7/liblg/blob/master/src/lg/val.h) are represented as tagged unions.
### assembler
[liblg](https://github.com/codr7/liblg) comes equipped with a simple custom [assembler](https://github.com/codr7/liblg/tree/master/bench/fibtail.lga) that provides a transparent interface to it's functionality.
#### add
Pop and add the top of the stack to the previous item.
#### beq $offset $value $label
Branch to $label if the stack value att $offset is equal to $value.
#### bgr $offset $value $label
Branch to $label if the stack value att $offset is greater than $value.
#### ble $offset $value $label
Branch to $label if the stack value att $offset is less than $value.
#### call $label
Push the program counter on the call stack and jump to $label.
#### cp $offset
Push a copy of the value at stack $offset.
#### dec $offset
Decrease the value att stack $offset by one.
#### drop $offset $count
Drop $count items from stack $offset.
#### jmp $label
Jump to $label.
#### push $value
Push $value on the stack.
#### ret
Return from the current call.
#### stop
Stop execution.
#### swap
Swap the top two items on the stack.
### license
[MIT](https://github.com/codr7/liblg/blob/master/LICENSE.txt)