zub 0.2.21

A fast, stack-based virtual machine for dynamic languages, with an intuitive IR-builder, garbage collection and NaN-tagging.
Documentation
# Zub VM
> A super-fast, stack-based virtual machine for dynamic languages

## Features

- NaN-tagging value representation
- Mark n' sweep garbage collection
- Compact bytecode format
- Easy-to-use intermediate representation

## Milestones

- [x] Refined VM based on work by [Mr Briones]https://github.com/cwbriones
- [x] Tracing garbage collector
- [x] High-level IR
- [x] Compilation of IR
- [ ] Optimizer (currently 80-90% Python speed, aiming for much faster)
- [x] Profiler and disassembler

## Example

### Building IR is easy

Getting your backend up and running shouldn't have to be hard.

The following code builds IR for evaluating `sum = 20.0 + 30.0`:

```rust
let mut builder = IrBuilder::new();

let a = builder.number(20.0);
let b = builder.number(30.0);

let sum = builder.binary(a, BinaryOp::Add, b);

builder.bind(Binding::global("sum"), sum);
```

When you feel like the IR is looking smooth. Simply let VM throw it through the compiler, and run it.

```rust
let mut vm = VM::new();
vm.exec(&builder.build());
```

## Languages

### Hugorm

Hugorm is a dynamic, python-like language being built for small data science and game projects.

[https://github.com/nilq/hugorm](https://github.com/nilq/Hugorm)

### Examples

The `examples/` folder includes two small language implementations running on the ZubVM.

#### Atto

Atto is a functional, minimal language that showcases how little code is needed to implement a working, Turing-complete language. The syntax can be seen in the following teaser:

```hs
fn sum x is
    if = x 0
        1
    + sum - x 1 sum - x 1

fn main is
    sum 12
```

#### Mini

Mini is a simple language that looks basically like a mix of Rust and JavaScript. It covers a bit wider set of features than Atto. This does show in the size of the language though.

```rust
let bar = 13.37;

fn foo() {
  fn baz(c) {
    return c + bar;
  }
  
  return baz(10);
}

global gangster = foo();
```


## Special thanks

- [zesterer]https://github.com/zesterer
- [cwbriones]https://github.com/cwbriones
- [evolbug]https://github.com/evolbug