1
1
mirror of https://github.com/tweag/asterius.git synced 2024-09-11 08:55:32 +03:00
A Haskell to WebAssembly compiler
Go to file
Mathieu Boespflug dba369825d WIP
2020-05-02 09:46:42 +02:00
.buildkite Change the default rtsopts for asterius executables (#604) 2020-04-22 06:40:26 +02:00
.circleci Migrate most of CI logic from CircleCI to BuildKite (#588) 2020-04-17 11:39:29 +02:00
.devcontainer Misc improvements about the binaryen backend (#571) 2020-04-14 10:47:30 +02:00
.github Remove issue templates 2020-04-15 07:29:22 +02:00
asterius WIP 2020-05-02 09:46:42 +02:00
docs Fix some typos in docs (#612) 2020-04-24 18:00:46 +02:00
ghc-toolkit WIP 2020-05-02 09:46:42 +02:00
nixpkgs WIP 2020-05-02 09:46:42 +02:00
npm-utils WIP 2020-05-02 09:46:42 +02:00
utils Improve the hacking guide, .ghcid (#582) 2020-04-15 11:41:40 +02:00
wasm-toolkit WIP 2020-05-02 09:46:42 +02:00
.bazelrc WIP 2020-05-02 09:46:42 +02:00
.bazelrc.local WIP 2020-05-02 09:46:42 +02:00
.dockerignore Ship a subset of Stackage LTS packages in the pre-built Docker image (#355) 2019-12-03 14:20:45 +01:00
.envrc Add vscode remote containers support (#487) 2020-03-13 16:16:50 +01:00
.ghcid Fix blackholing behavior with multi-threading (#493) 2020-03-18 00:16:48 +01:00
.gitignore [ci skip] Avoid repeated stack invocations in .envrc (#463) 2020-02-27 13:13:24 +01:00
base.Dockerfile Update toolchain (#593) 2020-04-20 06:38:10 +02:00
BUILD.bazel WIP 2020-05-02 09:46:42 +02:00
dev.Dockerfile Update toolchain (#593) 2020-04-20 06:38:10 +02:00
lts-profile.sh Speed up the asterius-profile job (#597) 2020-04-20 13:12:43 +02:00
lts.sh Remove broken packages (#606) 2020-04-22 17:49:53 +02:00
profile.Dockerfile Run profiled build on CI (#594) 2020-04-20 10:31:30 +02:00
README.md Migrate most of CI logic from CircleCI to BuildKite (#588) 2020-04-17 11:39:29 +02:00
stack-profile.yaml Update toolchain (#593) 2020-04-20 06:38:10 +02:00
stack.yaml Update toolchain (#593) 2020-04-20 06:38:10 +02:00
stackage.Dockerfile [ci skip] Strip prof libs from base image (#509) 2020-03-26 16:54:00 +01:00
WORKSPACE WIP 2020-05-02 09:46:42 +02:00

Asterius: A Haskell to WebAssembly compiler

Docker Pulls Build status Gitter Netlify Status

Asterius is a Haskell to WebAssembly compiler based on GHC. It compiles Haskell source files or Cabal executable targets to WebAssembly+JavaScript code which can be run in Node.js or browsers. It features seamless JavaScript interop (lightweight Async FFI with Promise support) and small output code (~600KB hello.wasm for a Hello World). A lot of common Haskell packages like lens are already supported. The project is actively maintained by Tweag I/O.

Demos

Demos of popular Haskell apps, running in your browser:

Quickstart using the prebuilt Docker image

We host a prebuilt Docker image on Docker Hub. The image also ships ~2k prebuilt packages from a recent Stackage snapshot for convenience of testing simple programs without needing to set up a Cabal project.

To use the image, mount the working directory containing the source code as a Docker shared volume, then use the ahc-link program:

username@hostname:~/project$ docker run --rm -it -v $(pwd):/project -w /project terrorjack/asterius
asterius@hostname:/project$ ahc-link --input-hs main.hs

There are a lot of link-time options available to ahc-link, e.g. targeting the browser platform instead of node, adding extra GHC options or setting runtime parameters. Check the documentation for further details.

It's also possible to use ahc-cabal as a drop-in replacement of cabal to build a Cabal project. Use ahc-dist with --input-exe on the output "executable" file to generate actual WebAssembly and JavaScript artifacts. See the diagrams blog post for an example.

Check the official reference of docker run to learn more about the command given in the example above. The example opens an interactive bash session for exploration, but it's also possible to use docker run to invoke the Asterius compiler on local Haskell source files. Note that podman can be used instead of docker here.

Building and using asterius locally

See the Building guide in the documentation for details.

Hacking on Asterius

We recommend using VSCode Remote Containers to reproduce the very same dev environment used by our core team members. See the Hacking guide in the documentation for details.

Documentation

We have documentation and blog posts:

Also checkout the HIW 2018 lightning talk, and the slides of an introductory talk in 2020 here.

Note that they may be slightly out-of-date as the project evolves. Whenever you find something in the docs of blog posts which doesn't reflect the status quo, it's a bug and don't hesitate to open a ticket :)

What works now

  • Almost all GHC language features (TH support is partial, cross-splice state persistence doesn't work yet).
  • The pure parts in standard libraries and other packages. IO is achieved via rts primitives or user-defined JavaScript imports.
  • Importing JavaScript expressions via the foreign import javascript syntax. First-class garbage collected JSVal type in Haskell land.
  • Preliminary copying GC, managing both Haskell heap objects and JavaScript references.
  • Preliminary Cabal support.
  • Marshaling between Haskell/JavaScript types based on aeson.
  • Calling Haskell functions from JavaScript via the foreign export javascript syntax. Haskell closures can be passed between the Haskell/JavaScript boundary via StablePtr.
  • Invoking RTS API on the JavaScript side to manipulate Haskell closures and trigger evaluation.
  • A linker which performs aggressive dead-code elimination, producing as small WebAssembly binary as possible.
  • A debugger which checks invalid memory access and outputs memory loads/stores and control flow transfers.
  • Complete binaryen/wabt raw bindings, plus a monadic EDSL to construct WebAssembly code directly in Haskell.
  • A Haskell library to handle WebAssembly code, which already powers binary code generation.
  • Besides WebAssembly MVP and BigInt, no special requirements on the underlying JavaScript engine at the moment.

Contributors

                     

Asterius is maintained by Tweag I/O.

Have questions? Need help? Tweet at @tweagio.