An ahead-of-time JavaScript compiler
npm install porfforPorffor is primarily built from scratch, the only thing that is not is the parser (using Acorn). Binaryen/etc is not used, we make final wasm binaries ourself. You could imagine it as compiling a language which is a sub (some things unsupported) and super (new/custom apis) set of javascript. Not based on any particular spec version.
bench for examples.npm install -g porffor@latest. It's that easy (hopefully) :)porf. Just run it with no script file argument.porf path/to/script.jsporf wasm path/to/script.js out.wasm. Currently it does not use an import standard like WASI, so it is mostly unusable on its own.porf native path/to/script.js out(.exe). You can specify the compiler with --compiler=clang|gcc|zig (clang by default), and which optimization level to use with --cO=Ofast|O3|O2|O1|O0 (Ofast by default). Output binaries are also stripped by default.
porf c path/to/script.js (out.c). When not including an output file, it will be printed to stdout instead.
porf profile path/to/script.js
porf debug path/to/script.js
--parser=acorn|@babel/parser|meriyah|hermes-parser (default: acorn) to set which parser to use--parse-types to enable parsing type annotations/typescript. if -parser is unset, changes default to @babel/parser. does not type check--opt-types to perform optimizations using type annotations as compiler hints. does not type check--valtype=i32|f64 (default: f64) to set valtype-O0 to disable opt-O1 (default) to enable basic opt (simplify insts, treeshake wasm imports)-O2 to enable advanced opt (partial evaluation). unstable!Promise and await have known bugs)eval()/Function() etc (since it is AOT)0.48.7. Let's break it down:0 - major, always 0 as Porffor is not ready yet48 - minor, total Test262 pass percentage (rounded half down, eg 49.4% -> 48, 49.5% -> 49)7 - micro, build number for that minor (incremented each git push)compiler: contains the compiler itselfbuiltins: built-in apis written in typescript2c.js: custom wasm-to-c engineassemble.js: assembles wasm ops and metadata into a spec-compliant wasm module/filebuiltins.js: all manually written built-ins of the engine (spec, custom. vars, funcs)builtins_precompiled.js: generated builtins from the builtins/ foldercodegen.js: code (wasm) generation, ast -> wasm. The bulk of the effortcyclone.js: wasm partial constant evaluator (it is fast and dangerous hence "cyclone")disassemble.js: wasm disassembler using internal debug infoencoding.js: utils for encoding things as bytes as wasm expectsexpression.js: mapping most operators to an opcode (advanced are as built-ins eg f64_%)havoc.js: wasm rewrite library (it wreaks havoc upon wasm bytecode hence "havoc")index.js: doing all the compiler steps, takes code in, wasm outopt.js: self-made wasm bytecode optimizerparse.js: parser simply wrapping acorn (or other acorn-like parsers)pgo.js: a profile guided optimizerprecompile.js: the tool to generate builtins_precompied.jsprefs.js: a utility to read command line argumentsprototype.js: some builtin prototype functions (~legacy)types.js: definitions for each of the builtin typeswasmSpec.js: "enums"/info from wasm specwrap.js: wrapper for compiler which instantiates and produces nice exports- runtime: contains utils for running JS with the compiler
- index.js: the main file, you probably want to use this
- repl.js: basic repl (uses node:repl)
- test262: test262 runner and utils
- Multi-value (required)
- Non-trapping float-to-int conversions (required)
- Bulk memory operations (optional, can get away without sometimes)
- Exception handling (optional, only for errors)
- Tail calls (opt-in, off by default)
purple in Welsh is porffor. Why purple?