Write and compile as WebAssembly program by lua script.
Note: this project is still under development. We have to do more improvement
- emscripten
- lua (prefer to use latest version)
- Python 3.6.5+
To avoid to polute your environment, we strongly prefer to use prebuilt docker image on docker hub.
Here is example Hello World script:
function hello_world()
return 'Hello, WebAssembly Lua!'
endMake sure the function declares as global in order to access from C program. And, also you can specify some function arguments like:
function hello_something(something):
return ('Hello, %s!'):format(something)
endThen, you need to remember what type of argument should be supplied and what type of value will return (supports string or int for now).
The definition.yml is configuration for generate / compile WebAssembly binary. See following:
dependencies:
- luaposix
functions:
hello_something:
return : string
args:
- string
entry_file: hello_world.lua
output_file: hello_world.htmlDescribes each fields:
| Field | Type | Default | description |
|---|---|---|---|
| dependencies | array | - | program dependencies. the list of modules will be installed via luarocks. |
| functions | object | - | Function definitions. The key is function name which will be exported on WASM. |
| functions[name].return | string | - | Define function return type. |
| functions[name].args | array | - | Defined function argument type list. |
| entry_file | strring | main.lua | the file name of program entry. |
| output_file | strring | - | the file name of output files. |
On docker image, the image has emcc-lua command:
$ docker pull ysugimoto/webassembly-lua
$ docker run --rm -v $PWD:/src ysugimoto/webassembly-lua emcc-luaThe emcc-lua finds definition.yml in current working directory (in this case, $PWD) and start to build.
After built successfully, you can see a hello_world.[html,js,wasm] in your directory. The output file is named by entry_file in definition.yml.
Open created or write HTML to run compiled WebAssembly program like:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>WebAssembly Lua</title>
</head>
<body>
<script src="./hello_world.js"></script>
<script>
Module.onRuntimeInitialized = () => {
// call your function through the Module.cwrap()
const helloSomething = Module.cwrap('hello_something', 'string', ['string']);
console.log(helloSomething('WebAssembly Lua'));
};
</script>
</body>
</html>And run local server in your favorite way (e.g python -m http.server) and access to http://localhost:8000/hello_world.html (port may need), then you can see Hello, WebAssembly Lua! message in your browser console.
- Compile single lua script to WebAssembly binary
- Support for return type of string and int
- Support to call function with any arguments
- Enable to bundle some libraries (e.g. hosted on luarocks, or Independent C libraries)
- Support to require other lua modules which you defined as other file, installed via luarocks
- Support to apply function arguments as detected types
- Works with more complicated script. Now we can work on simple script.
- Support some structured return type which can use in JavaScript (Array, Object -- especially JSON --)
- Try to compile various libraries (Now we tried to bundle
luaposix, it's fine to work)
Yoshiaki Sugimoto
MIT