Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

24 Commits

Repository files navigation

webassembly-lua

Write and compile as WebAssembly program by lua script.

Note: this project is still under development. We have to do more improvement

Requirements

To avoid to polute your environment, we strongly prefer to use prebuilt docker image on docker hub.

How to use

Write lua script

Here is example Hello World script:

functionhello_world()
return'Hello, WebAssembly Lua!'end

Make sure the function declares as global in order to access from C program. And, also you can specify some function arguments like:

functionhello_something(something):
return ('Hello, %s!'):format(something)
end

Then, you need to remember what type of argument should be supplied and what type of value will return (supports string or int for now).

Write definitions in definition.yml

The definition.yml is configuration for generate / compile WebAssembly binary. See following:

dependencies:
- luaposixfunctions:
hello_something:
return : stringargs:
- stringentry_file: hello_world.luaoutput_file: hello_world.html

Describes each fields:

FieldTypeDefaultdescription
dependenciesarray-program dependencies. the list of modules will be installed via luarocks.
functionsobject-Function definitions. The key is function name which will be exported on WASM.
functions[name].returnstring-Define function return type.
functions[name].argsarray-Defined function argument type list.
entry_filestrringmain.luathe file name of program entry.
output_filestrring-the file name of output files.

Compile as WebAssembly program

On docker image, the image has emcc-lua command:

$ docker pull ysugimoto/webassembly-lua
$ docker run --rm -v $PWD:/src ysugimoto/webassembly-lua emcc-lua

The 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.

Run WebAssembly program

Open created or write HTML to run compiled WebAssembly program like:

<!doctype html><html><head><metacharset="UTF-8"><title>WebAssembly Lua</title></head><body><scriptsrc="./hello_world.js"></script><script>Module.onRuntimeInitialized=()=>{// call your function through the Module.cwrap()consthelloSomething=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.

Features

  • 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)

TODOs

  • 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)

Author

Yoshiaki Sugimoto

License

MIT

About

Write and compile WebAssembly code with Lua

Topics

Resources

Stars

152 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages