Skip to content

gasman/bonsai-c

Repository files navigation

bonsai-c

Very early work-in-progress

bonsai-c is a compiler from C to WebAssembly and asm.js-compatible Javascript, operating on a fundamentally different model to Emscripten.

Wait, what's wrong with Emscripten?

It's basically Java Applets 2.0.

It's perfect if you've got a great big POSIX C + SDL codebase that you want to run in its own self-contained environment in a browser, but it's not very helpful for writing idiomatic Javascript code that just needs to drop into optimised asm.js occasionally for some heavy lifting.

bonsai-c is a tool for writing programs, not porting them. By building a C compiler from the ground up, rather than bolting a Javascript backend onto a mature C compiler, we can tailor it to the needs of Javascript programmers. You can use it to write a function for calculating fibonacci numbers, and you will get back an asm.js-compliant Javascript module with an obvious entry point, for calculating fibonacci numbers. You will not get a mountain of runtime code to implement file handling and malloc and a million other things you didn't ask for.

bonsai-c won't provide a full C implementation from day one. It won't have fancy features like, for example, strings. What it will do is provide a way for programmers to harness the power of asm.js, with a syntax that's as familiar as it gets.

Build

Install Node.js.

Install jison:

npm install -g jison

Then, from the root of the codebase:

npm install
cd c_parser
npm run build-parser
cd ..

Usage

To compile to asm.js:

node bonsai-c.js --asmjs infile.c

To compile to WebAssembly text format:

node bonsai-c.js --wast infile.c

Running tests

From the root of the codebase:

node ./runtests.js  # run all tests
node ./runtests.js --asmjs  # run asm.js output tests only
node ./runtests.js --wast  # run WebAssembly text output tests only

To run the --wast tests, you must be running Node 8.2 or later, and have wast2wasm from the WABT suite in your path.