Sign inSign up

ysugimoto/webassembly-lua

By ysugimoto

•Updated over 4 years ago

Write and compile as WebAssembly program by lua script.

Image
0

1.6K

ysugimoto/webassembly-lua repository overview

⁠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 prefer to use prebuilt docker image on docker image⁠.

⁠How to use

⁠Write lua script

Here is example Hello World script:

function hello_world()
  return 'Hello, WebAssembly Lua!'
end

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

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

Then, you need to rememeber 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. Format is following:

dependencies:
  - luaposix

functions:
  hello_something:
    return : string
    args:
      - string

entry_file: hello_world.lua

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.
⁠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. If build successfully, you can see a hello_world.[html,js,wasm]in your directory. The output file is named byentry_file` in definition.yml.

⁠Run WebAssembly program

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.

⁠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

Tag summary

Content type

Image

Digest

Size

651.5 MB

Last updated

over 4 years ago

docker pull ysugimoto/webassembly-lua