Building
Requires Node.
$ yarn
Example
$ yarn tsc $ node build/jsc.js tests/tco.js $ node bin/index.js 12586269025
Features
- Functions and function calls
- Basic tail-call optimization
- Var, const, let declarations
- For, do, while statements
- Basic primitive operations
- Basic import support
- Number, string, boolean and null literals
- Basic value unboxing
Not (yet) supported
- Prototype functions
- Nested functions
- Closures
- And much, much more!
Code produced
The following:
function fib(n: number, a: number, b: number) { if (n == 0) { return a; } if (n == 1) { return b; } return fib(n - 1, b, a + b); }
Gets compiled to:
void tco_fib(const FunctionCallbackInfo<Value> &args) { Isolate *isolate = args.GetIsolate(); double tco_n = toNumber(args[0]); double tco_a = toNumber(args[1]); double tco_b = toNumber(args[2]); tail_recurse_1: ; bool sym_if_test_58 = (tco_n == 0); if (sym_if_test_58) { args.GetReturnValue().Set(Number::New(isolate, tco_a)); return; } bool sym_if_test_70 = (tco_n == 1); if (sym_if_test_70) { args.GetReturnValue().Set(Number::New(isolate, tco_b)); return; } Local<Value> sym_arg_83 = Number::New(isolate, (tco_n - 1)); Local<Value> sym_arg_92 = Number::New(isolate, (tco_a + tco_b)); tco_n = toNumber(sym_arg_83); tco_a = tco_b; tco_b = toNumber(sym_arg_92); goto tail_recurse_1; }