adaengine/gravity-lang
Gravity is a powerful, dynamically typed, lightweight, embeddable programming language written in C without any external dependencies (except for stdlib). It is a class-based concurrent scripting language with modern <a href="https://github.com/apple/swift">Swift</a>-like syn
What Gravity code looks like
class Vector {
// instance variables
var x = 0;
var y = 0;
var z = 0;
// constructor
func init (a = 0, b = 0, c = 0) {
x = a; y = b; z = c;
}
// instance method (built-in operator overriding)
func + (v) {
if (v is Int) return Vector(x+v, y+v, z+v);
else if (v is Vector) return Vector(x+v.x, y+v.y, z+v.z);
return null;
}
// instance method (built-in String conversion overriding)
func String() {
// string interpolation support
return "[\(x),\(y),\(z)]";
}
}
func main() {
// initialize a new vector object
var v1 = Vector(1,2,3);
// initialize a new vector object
var v2 = Vector(4,5,6);
// call + function in the vector object
var v3 = v1 + v2;
// returns string "[1,2,3] + [4,5,6] = [5,7,9]"
return "\(v1) + \(v2) = \(v3)";
}
```Features
- multipass compiler with optimizer
- dynamic typing
- classes and inheritance
- higher-order functions and classes
- lexical scoping
- coroutines (via fibers)
- nested classes
- closures
- garbage collection (mark-and-sweep)
- operator overriding
- string interpolation
- enums, modules, and structs (value types)
- switch/case and ranges
- optional modules (Math, File, JSON, ENV)
- powerful embedding API with bridging support
- built-in unit tests
- built-in JSON serializer/deserializer
- optional semicolons
Building
Make (Linux / macOS / BSD)
make # Build the gravity CLI executable
make mode=debug # Debug build with symbols
make lib # Build shared library (libgravity.dylib/so/dll)
make staticlib # Build static library (libgravity.a)
make example # Build the C embedding API example
make clean # Clean all build artifactsCMake (cross-platform, including Windows)
cmake -B build
cmake --build build
cmake -B build -DBUILD_CLI=OFF
cmake --build buildRequires a C99 compiler. No external dependencies.
Usage
./gravity file.gravity # Compile and execute a source file
./gravity -c file.gravity # Compile to bytecode (outputs gravity.g)
./gravity -o out.json -c file.gravity # Compile to a specific output file
./gravity -x gravity.g # Execute precompiled bytecode
./gravity -i 'return 2 + 3' # Execute inline code
./gravity -t test/unittest # Run unit testsTesting
./gravity -t test/unittest # Run all unit tests via the VM
./test/unittest/run_all.sh # Run all unit tests via shell script (with per-test timeouts)
./gravity test/unittest/somefile.gravity # Run a single test fileThe test/ directory also contains fuzzy/ (randomised fuzzing inputs) and infiniteloop/ (tests that must terminate with a runtime error rather than hang).
Project Structure
src/
├── cli/ Command-line interface
├── compiler/ Lexer, parser, AST, semantic analysis, IR, optimizer, codegen
├── runtime/ Stack-based VM, built-in types and core methods
├── shared/ Value representation, opcodes, hash table, array, memory/GC
├── optionals/ Optional modules: Math, File, JSON, ENV
└── utils/ Debug disassembler, JSON serialization, file I/O, UTF-8For a comprehensive technical deep-dive into the implementation, see ARCHITECTURE.md.
Embedding API
Gravity is designed to be embedded inside a host application. The complete API lives in src/runtime/gravity_vm.h and src/compiler/gravity_compiler.h. A minimal example:
#include "gravity_compiler.h"
#include "gravity_core.h"
#include "gravity_vm.h"
static void report_error(gravity_vm *vm, error_type_t type,
const char *description, error_desc_t desc, void *xdata) {
printf("%s\n", description);
}
int main(void) {
const char *source = "func main() { return 6 * 7; }";
gravity_delegate_t delegate = {.error_callback = report_error};
// compile
gravity_compiler_t *compiler = gravity_compiler_create(&delegate);
gravity_closure_t *closure = gravity_compiler_run(compiler, source, strlen(source), 0, true, true);
// create VM and transfer compiler-owned objects into it
gravity_vm *vm = gravity_vm_new(&delegate);
gravity_compiler_transfer(compiler, vm);
gravity_compiler_free(compiler);
// execute and read result
if (gravity_vm_runmain(vm, closure)) {
gravity_value_t result = gravity_vm_result(vm);
gravity_value_dump(vm, result, NULL, 0); // prints: 42
}
gravity_vm_free(vm);
gravity_core_free();
return 0;
}See examples/example.c and the embedding documentation for the full bridging API.
Special thanks
Gravity was supported by a couple of open-source projects. The inspiration for closures comes from the elegant <a href="http://www.lua.org" target="_blank">Lua</a> programming language; specifically from the document <a href="http://www.cs.tufts.edu/~nr/cs257/archive/roberto-ierusalimschy/closures-draft.pdf">Closures in Lua</a>. For fibers, upvalues handling and some parts of the garbage collector, my gratitude goes to <a href="http://journal.stuffwithstuff.com" target="_blank">Bob Nystrom</a> and his excellent <a href="https://github.com/munificent/wren">Wren</a> programming language. A very special thanks should also go to my friend Andrea Donetti who helped me debugging and testing various aspects of the language.
Documentation
The <a href="https://marcobambini.github.io/gravity/#/README">Getting Started</a> page is a guide for downloading and compiling the language. There is also a more extensive <a href="https://gravity-lang.org">language documentation</a>. Official wiki is used to collect related projects and tools. For implementation internals, see the Architecture Document.
Where Gravity is used
- Gravity is the core language built into Creo (https://creolabs.com)
- Gravity is the scripting language for the Untold game engine (https://youtu.be/OGrWq8jpK14?t=58)
Changelog
See CHANGELOG.md for a summary of changes across versions.
Community
[[GitHub Discussions]](https://github.com/marcobambini/gravity/discussions)
Questions, ideas, and general discussion are welcome in GitHub Discussions.
Contributing
Contributions to Gravity are welcomed and encouraged!<br> More information is available in the official CONTRIBUTING file.
- <a href="https://github.com/marcobambini/gravity/issues/new">Open an issue</a>:
if you need help if you find a bug if you have a feature request to ask a general question
- <a href="https://github.com/marcobambini/gravity/pulls">Submit a pull request</a>:
* if you want to contribute
License
Gravity is available under the permissive MIT license.
Package Metadata
Repository: adaengine/gravity-lang
Default branch: master
README: README.md