Skip to content
SWI-Prolog ported to WebAssembly
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
dist
example
README.md

README.md

SWI-Prolog ported to WebAssembly

This repository contains instructions to compile a Prolog implementation SWI-Prolog (http://swi-prolog.org) to WebAssembly.

Compilation

These compilation instructions assume Linux-based host machine. The resulting WebAssembly binary is platform-independent.

Preparation

You need to download the Emscripten compiler. Follow the instruction on its homepage.

After the successful installation load the Emscripten environment into the current terminal session (asjust path):

source ./emsdk_env.sh

Dependencies

SWI-Prolog depends on zlib. To compile it to WebAssembly:

wget https://zlib.net/zlib-1.2.11.tar.gz -O "$HOME/zlib-1.2.11.tar.gz"
tar -xf "$HOME/zlib-1.2.11.tar.gz" -C "$HOME"
cd "$HOME/zlib-1.2.11"
emconfigure ./configure
emmake make

This will download and build zlib into the zlib-1.2.11 subdirectory in your home directory.

Build SWI-Prolog

git clone https://github.com/rla/swipl-devel.git "$HOME/swipl-devel"
cd "$HOME/swipl-devel"
git fetch
git checkout wasm
./prepare

This will ask:

Do you want me to run git submodule update --init? [Y/n]

As we are not yet building packages, say "n".

If it asks:

Could not find documentation.  What do you want to do?

Then say "3". We do not need documentation to build it.

After this we can run configure and compile:

cd "$HOME/swipl-devel/src"
LDFLAGS=-L"$HOME/zlib-1.2.11" \
  LIBS=-lzlib \
  CPPFLAGS=-I"$HOME/zlib-1.2.11" \
  COFLAGS=-O3 emconfigure ./configure \
    --disable-mt \
    --disable-gmp \
    --disable-custom-flags
emmake make

This will build the necessary 3 files in $HOME/swipl-devel/src. See "Distribution".

Distribution

Binary distribution (in the dist directory) contains the files:

  • swipl-web.wasm - binary distribution of SWI-Prolog executable.
  • swipl-web.dat - necessary files to initialize the runtime and the library.
  • swipl-web.js - JavaScript wrapper that loads the wasm code and prepares the virtual filesystem with the runtime initialization file and the library.

Usage

Please see "Foreign Language Interface" (FLI) in the SWI-Prolog manual. A very limited set of function findings into JavaScript can be seen in the demo. The bindings use cwrap from Emscripten.

General workflow:

  • Set up a stub Module object with noInitialRun: true and other options.
  • Set up FLI bindings in Module.onRuntimeInitialized.
  • Use the bindings to call PL_initialise.
  • Set up the location for standard library.
  • Use the FS API to write code files into the virtual filesystem.
  • Load the code files from SWI-Prolog side using consult/1 or a similar way.
  • Interact with SWI-Prolog through its FLI.

Demo

See example/index.html as a simple example. It can be found online at http://demos.rlaanemets.com/swi-prolog-wasm/example/. The commented code inside the demo provides the documentation.

To test it out locally, you need to serve the files through an HTTP server.

TODO

  • Provide full set of bindings?
  • A way to call JavaScript from SWI-Prolog.
  • Compile and add useful packages.
  • Provide a mechanism to load packs?
  • Easier way to turn Prolog terms into JS objects?
  • See where WebAssembly goes and what interfaces could be added (direct DOM access?).

License

SWI-Prolog is covered with the Simplified BSD license. See http://www.swi-prolog.org/license.html

zlib is covered with the zlib license. See https://zlib.net/zlib_license.html

You can’t perform that action at this time.