diff --git a/README.md b/README.md index 31956779..71e546c7 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,9 @@ [![Build Status](https://travis-ci.org/AssemblyScript/assemblyscript.svg?branch=master)](https://travis-ci.org/AssemblyScript/assemblyscript) -**AssemblyScript** compiles strictly typed [TypeScript](http://www.typescriptlang.org) to [WebAssembly](http://webassembly.org) using [Binaryen](https://github.com/WebAssembly/binaryen). Unlike other toolchains, `asc` generates minimal WebAssembly modules while being just an `npm install` away. +**AssemblyScript** compiles strictly typed [TypeScript](http://www.typescriptlang.org) to [WebAssembly](http://webassembly.org) using [Binaryen](https://github.com/WebAssembly/binaryen). It generates minimal WebAssembly modules while being just an `npm install` away. + +See [the AssemblyScript wiki](https://github.com/AssemblyScript/assemblyscript/wiki) for further instructions and documentation. Examples -------- @@ -27,10 +29,10 @@ A few early examples to get an idea: Or browse the [compiler tests](./tests/compiler) for a more in-depth overview of what's supported already. One of them is a [showcase](./tests/compiler/showcase.ts). -Getting started ---------------- +Installation +------------ -Note that this version of the compiler is relatively new and does not yet support some features a TypeScript programmer might expect, e.g., strings, arrays and classes. It is not on [npm](https://www.npmjs.com/package/assemblyscript), yet, but you can already try it out today: +Note that this version of the compiler is relatively new and that some features a TypeScript programmer might expect are [still in the works](https://github.com/AssemblyScript/assemblyscript/wiki/Status-and-Roadmap) (see also: [Limitations](https://github.com/AssemblyScript/assemblyscript/wiki/Limitations)). Therefore, it's not on [npm](https://www.npmjs.com/package/assemblyscript), yet, but you can already try it out today: ``` $> git clone https://github.com/AssemblyScript/assemblyscript.git @@ -39,23 +41,22 @@ $> npm install $> npm link ``` -Author your module using either - -* the [assembly definitions](./std/assembly.d.ts) ([base config](./std/assembly.json)) if all you care about is targeting WebAssembly/asm.js or -* the [portable definitions](./std/portable.d.ts) ([base config](./std/portable.json)) if you also want to compile to JavaScript using `tsc` - -and run: +Alternatively, it's also possible to point npm to the GitHub repository for now: ``` -$> asc yourModule.ts +$> npm install AssemblyScript/assemblyscript ``` -See [the AssemblyScript wiki](https://github.com/AssemblyScript/assemblyscript/wiki) for additional documentation. +Afterwards, once [your project is configured](https://github.com/AssemblyScript/assemblyscript/wiki/Configuring-a-project), it's just a matter of using your existing [TypeScript tooling](https://code.visualstudio.com) while coding, and [running the CLI](https://github.com/AssemblyScript/assemblyscript/wiki/Using-the-CLI) to build to WebAssembly: + +``` +$> asc myModule.ts -o myModule.wasm --optimize --validate --sourceMap +``` Building -------- -Building an UMD bundle to `dist/assemblyscript.js` ([binaryen.js](https://github.com/AssemblyScript/binaryen.js) remains an external dependency): +To build an UMD bundle to `dist/assemblyscript.js` ([binaryen.js](https://github.com/AssemblyScript/binaryen.js) remains an external dependency): ``` $> npm run build @@ -66,3 +67,5 @@ Running the [tests](./tests): ``` $> npm test ``` + +**Note** that freshly cloned copies of the compiler will use ts-node to run [the sources](./src) directly, which is useful in development. Once built, `asc` will use the distribution files instead. This can also be checked by running `asc -v` (it is running the sources if it states `-dev`). diff --git a/bin/asc.json b/bin/asc.json index 83a30284..065f087e 100644 --- a/bin/asc.json +++ b/bin/asc.json @@ -1,11 +1,11 @@ { "version": { - "desc": "Prints the compiler's version.", + "desc": "Prints just the compiler's version and exits.", "type": "boolean", "aliases": [ "v" ] }, "help": { - "desc": "Prints this message.", + "desc": "Prints this message and exits.", "type": "boolean", "aliases": [ "h" ] }, @@ -34,7 +34,7 @@ "type": "number" }, "validate": { - "desc": "Validates the module.", + "desc": "Validates the module using Binaryen. Exits if invalid.", "type": "boolean", "aliases": [ "c", "check" ] }, @@ -66,31 +66,34 @@ "type": "string" }, "noTreeShaking": { - "desc": "Disables compiler-level tree-shaking.", + "desc": "Disables compiler-level tree-shaking, compiling everything.", "type": "boolean" }, "noDebug": { - "desc": "Disables maintaining debug information in binaries.", + "desc": "Disables maintaining of debug information in binaries.", "type": "boolean" }, "noAssert": { - "desc": "Replaces assertions with NOPs.", + "desc": "Replaces assertions with just their value without trapping.", "type": "boolean" }, "noEmit": { - "desc": "Performs compilation as usual without emitting code.", + "desc": "Performs compilation as usual but does not emit code.", "type": "boolean" }, "noMemory": { - "desc": "Does not set up a memory.", + "desc": "Does not set up a memory. Useful for low-level WebAssembly.", "type": "boolean" }, "noLib": { - "desc": "Does not include the standard library.", + "desc": "Does not include the shipped standard library.", "type": "boolean" }, "lib": { - "desc": "Adds one or multiple paths to custom library components.", + "desc": [ + "Adds one or multiple paths to custom library components and", + "uses exports of all top-level files at this path as globals." + ], "type": "string" }, "trapMode": { diff --git a/examples/tlsf/tests/index.js b/examples/tlsf/tests/index.js index 848ca667..0d0aaf5b 100644 --- a/examples/tlsf/tests/index.js +++ b/examples/tlsf/tests/index.js @@ -1,11 +1,10 @@ -var fs = require("fs"); - -var runner = require("./runner"); +const fs = require("fs"); +const runner = require("./runner"); function test(file) { console.log("Testing '" + file + "' ...\n"); - var exports = new WebAssembly.Instance(WebAssembly.Module(fs.readFileSync(__dirname + "/../" + file)), { + const exports = new WebAssembly.Instance(WebAssembly.Module(fs.readFileSync(__dirname + "/../" + file)), { env: { abort: function(msg, file, line, column) { throw Error("Assertion failed: " + (msg ? "'" + getString(msg) + "' " : "") + "at " + getString(file) + ":" + line + ":" + column); @@ -21,29 +20,10 @@ function test(file) { return String.fromCharCode.apply(String, str); } - runner(exports, 10, 20000); // picked so I/O isn't the bottleneck + runner(exports, 50, 20000); // picked so I/O isn't the bottleneck console.log("mem final: " + exports.memory.buffer.byteLength); console.log(); } -function mem(memory, offset, count) { - if (!offset) offset = 0; - if (!count) count = 1024; - var mem = new Uint8Array(memory.buffer, offset); - var stackTop = new Uint32Array(memory.buffer, 4, 1)[0]; - var hex = []; - for (var i = 0; i < count; ++i) { - var o = (offset + i).toString(16); - while (o.length < 3) o = "0" + o; - if ((i & 15) === 0) { - hex.push("\n" + o + ":"); - } - var h = mem[i].toString(16); - if (h.length < 2) h = "0" + h; - hex.push(h); - } - console.log(hex.join(" ") + " ..."); -} - test("tlsf.untouched.wasm"); test("tlsf.optimized.wasm");