• Stars
    star
    222
  • Rank 179,123 (Top 4 %)
  • Language
    Go
  • License
    Other
  • Created almost 15 years ago
  • Updated over 7 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A customisable virtual machine written in Go
== About GoLightly ==

GoLightly is a lightweight virtual machine library implemented in Go, designed for flexibility and
reuse. Traditionally popular VMs have adopted a stack-based design as this is perceived to be easier
to implement than the register-based design that real-world hardware generally uses. There are
arguments both ways on which of the two approaches is 'better' and it's not our intention to mandate
either: a good VM toolkit should leave that decision to those who know which suits their purpose best.

However just because GoLightly adopts a careful neutrality on this issue doesn't mean that it has
nothing fresh to offer.

Firstly GoLightly provides support for vector instructions allowing each virtual processor to handle
large data sets more efficiently than in traditional VM designs. Not only is this a boon for fast
maths, it also allows complex data structures to be transferred between virtual processors with only
a couple of instructions.

And speaking of multiple virtual processors, once a processor has been initialised it can be cloned
with a single instruction and both processors are hooked together with a communications channel.

Each processor has its own dynamic instruction definition and dispatch mechanism providing a flexible
model during development. However function-based dynamic dispatch is more expensive than the
switch-based dispatch used in traditional VM designs so the latter is also supported via type
embedding of the ProcessorCore and method hiding of InlinedInstructions().

One interesting consequence of making each virtual processor configurable in this manner is that it
allows complex problems to be modelled in terms of several different processors running relatively
simple programs and arranged in a pipeline.

Likewise the ability to clone virtual processors can be used as a building block for transactional
and speculative execution.


== Tests and Benchmarks ==

Golightly includes a large collection of tests and benchmarks. A simple set of micro-benchmarks
is available to judge the relative cost of various standard Go instructions and idioms which can
be invoked from the command-line:

	cd go
	gotest -benchmarks="Benchmark"


Likewise the test suite for the VM primitives can be executed with:

	cd vm
	gotest

and the optional benchmarks invoked with:

	gotest -benchmarks="Benchmark"

These include extensive micro-benchmarks focusing on individual primitive operation performance which
will hopefully act as a useful guide to relative performance for those writing compilers or assemblers
targeting GoLightly virtual machines.

More Repositories

1

gospeed

Go micro-benchmarks for calculating the speed of language constructs
Go
120
star
2

GoNotebook

All source code from my golang book A Go Developer's Notebook
Go
111
star
3

slices

Implementations of slice-based data types in Go
Go
67
star
4

GoNetworking

Example code demonstrating how the use of Go's standard networking libraries for plaintext and encrypted communications, drawn from conference talks in 2014.
Go
30
star
5

serendipity

A pure Go relational database system ported from and inspired by SQLite 3
C
28
star
6

lists

Implementations of various linear and cyclic list data-structures for Go
Go
26
star
7

sequences

Generic Go iterators on steroids
Go
20
star
8

wendigo

An experimental translation of SQLite to Go - superseded by Serendipity
Go
19
star
9

chain

An implementation of the classic Lisp-style Cons list data structure, a chain of value-link pairs.
Go
18
star
10

sexp

An S-Expression library for Go
Go
17
star
11

raw

Taking a Ruby-shaped chainsaw to Go type safety in the interests of elegance
Go
17
star
12

greenspun

A collection of useful lisp functionality for inclusion in complex Go programs embracing Greenspun's 10th Law
Go
15
star
13

GoFORTH

A primitive Forth implementation in Go
Go
12
star
14

atomiser

an input scanner for reading s-expressions and turning them into go data objects
Go
9
star
15

typelib

A collection of container types for Go's core types providing a batteries-included experience as usually found in higher level languages such as Ruby and Python.
Go
8
star
16

vm-fragments

Code fragments from my talks on implementing virtual machines
Ruby
7
star
17

GoGenericsTalk

Code from a series of talks on Generics, Reflection, Higher-Order Functions and Collections in Go
Go
4
star
18

dice

A simple dice pool abstraction for pen-and-paper style games
Go
4
star
19

WebSocketTalk

Code from GoLab 2020 talk on WebSockets in Golang
Go
3
star
20

sets

Hash-based sets for go
Go
3
star
21

GoFigure

Trivial command-line file template tool written in Go
Go
3
star
22

goDB

A high-level database access library for Go
Go
3
star
23

intro_to_fp_in_go

Code from An Introduction to Functional Programming in Go
Go
2
star
24

maps

Go generic functions for manipulating map data types
Go
2
star
25

webcryptodemo

Simple examples of writing RESTy encrypted web services in #golang
Go
2
star
26

Ruby-Plumber-s-Toolkit

Code for interfacing Ruby with low-level OS facilities
2
star
27

jittery

Go package to use panic/recover for custom flow control.
Go
1
star
28

feyeleanor.github.com

Profile pages
1
star
29

GoParanoia

Code from the Golab 2019 workshop "Adventures in Paranoia with Go and SQLite"
Go
1
star