Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/stefano/wasm-forth
A Forth implementation compiling to WebAssembly.
https://github.com/stefano/wasm-forth
compiler forth forth-94 interpreter wasm webassembly
Last synced: about 1 month ago
JSON representation
A Forth implementation compiling to WebAssembly.
- Host: GitHub
- URL: https://github.com/stefano/wasm-forth
- Owner: stefano
- License: gpl-3.0
- Created: 2017-12-26T13:02:49.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2019-05-05T14:42:15.000Z (over 5 years ago)
- Last Synced: 2024-08-01T13:35:16.048Z (4 months ago)
- Topics: compiler, forth, forth-94, interpreter, wasm, webassembly
- Language: Python
- Size: 61.5 KB
- Stars: 143
- Watchers: 6
- Forks: 5
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-ccamel - stefano/wasm-forth - A Forth implementation compiling to WebAssembly. (Python)
README
WASM Forth
==========A Forth implementation compiling to WebAssembly.
It includes an ANS Forth standard environment containing all the CORE words.
The system has a fixed amount of memory available, currently 128 MB.Interaction with Javascript at the moment is limited to textual input (using `WasmForth.source`)
and output (through the `write` configuration parameter passed to `WasmForth.boot`).Using the included (optional) virtual DOM library it's possible to
write interactive web apps. See the code in `examples/todomvc/` for an
example TODO list web app fully implemented in Forth.Installation
============$ npm install wasm-forth
Usage
=====The following code instantiates the interpreter and runs a program that prints "Hello, World!" to the console:
import * as WasmForth from 'wasm-forth';
import wasmURL from 'wasm-forth/dist/kernel.wasm';
import coreURL from 'wasm-forth/dist/core.f';
import vdomURL from 'wasm-forth/dist/vdom.f';WasmForth.boot({
wasmURL,
sources: [coreURL, vdomURL],
write: (text) => {
console.log(text);
}
}).then(() => {
WasmForth.source(': HELLO S" Hello, World!" TYPE ; HELLO\n');
});`WasmForth.boot({ ... })` initializes the system and returns a Promise. Once resolved, it's possible to
interpret forth code by passing it to `WasmForth.source(string)`. Note that the string passed must end with a newline.`WasmForth.boot` accepts a configuration object with 3 required parameters:
- `wasmURL`: URL where to fetch the "kernel.wasm" included in the NPM package.
- `sources`: a list of URLs where to fetch the forth "core.f" included in the NPM package.
- `write`: a function that will be called when the forth code needs to output text.If you're using webpack, you can use the file-loader (https://github.com/webpack-contrib/file-loader)
plugin to distribute `kernel.wasm`, `core.f` and `vdom.f`.You can also use this library without a module bundler by loading it in a tag.
See https://github.com/stefano/wasm-forth/tree/master/examples/webpack for an example usage with webpack,
and https://github.com/stefano/wasm-forth/tree/master/examples/script for an example usage as a <script> tag.See https://github.com/stefano/wasm-forth/tree/master/examples/todomvc for an example of a full web app that interacts with the DOM.
Building from source
====================To build the forth kernel distribution and the interactive environment (see below), you will
first need to install binaryen (https://github.com/WebAssembly/binaryen)
and ensure that `libbinaryen.so` is in the library path (LD_LIBRARY_PATH).Then build the kernel (Python 3.6 is required):
$ python3.6 -m venv env
$ source env/bin/activate
$ python setup.py build_ext -L path/to/binaryen/lib/
$ python setup.py develop
$ python kernel
$ npm install
$ npm run build # or 'npm run watch'Interactive Environment
=======================This repository also contains a REPL static page (see the `repl` directory).
To serve it locally, follow the instructions above and then run the following command:$ python kernel --demo-repl
The REPL will be served at http://localhost:8080/