An open API service indexing awesome lists of open source software.

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

Awesome Lists containing this project

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)