🌙

自分でLuaをビルドしてブラウザ上で動かす

に公開

ふと、自分でluaをビルドしてブラウザ上で動かしてみたくなり、やってみたら意外と簡単にできたので記録しておきます。

必要なコンパイラのinstall

https://emscripten.org/docs/getting_started/downloads.html
上のurlにアクセスして必要なemscriptenのコンパイラをinstallします。

luaのソースコードの取得

https://github.com/lua/lua

luaのソースコードを取得します

git clone https://github.com/lua/lua.git

makefileの書き換え

コンパイラ、アーカイバをemscriptenのものに置き換えます。

makefile
diff --git a/makefile b/makefile
index 8506e93c..1ca942fd 100644
--- a/makefile
+++ b/makefile
@@ -76,9 +76,9 @@ MYLDFLAGS= $(LOCAL) -Wl,-E
 MYLIBS= -ldl
 
 
-CC= gcc
-CFLAGS= -Wall -O2 $(MYCFLAGS) -fno-stack-protector -fno-common -march=native
-AR= ar rc
+CC= emcc
+CFLAGS= -Wall -O2 $(MYCFLAGS) -fno-stack-protector -fno-common
+AR= emar rc
 RANLIB= ranlib
 RM= rm -f

makeしてビルドします。

make

うまくいくと、ソースごとのオブジェクトファイル、アーカイブファイルliblua.alua.wasmなどが生成されます

簡単なファイルで試してみる

luaはbuildの容易さからか、埋め込みスクリプトによく利用されます(nvim, aviutl, ヤマハルーター等々)。

ネット上にも情報が多く、大抵の場合「c言語 lua 埋め込み」などと検索すればたくさんサンプルになりそうなプログラムが出てきます。

僕は、下のようなプログラムをブラウザで動かしてみました。

sample.c
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

int main(int argc, char *argv[]){
  printf("start lua program...\n");
  lua_State *L = luaL_newstate();
  luaL_openlibs(L);
  luaL_dostring(L,
"print(\"hello world\")"
"function add(a, b)\n"
"return (a+b)\n"
"end\n"
"function gcd(a, b)\n"
  "if b == 0 then\n"
    "return math.abs(a)\n"
  "else\n"
    "return gcd(b, a % b)\n"
  "end\n"
"end\n"
"print(add(1,2))\n"
"print(gcd(36, 60))\n"
);

  lua_close(L);
  return 0;
}

以下のコマンドで、コンパイル&&リンクすると同じディレクトリにa.out.js a.out.wasmができます。

emcc sample.c liblua.a

簡単なhtmlを書き

index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Lua</title>
</head>
<body>
  <script src="a.out.js"></script>
</body>
</html>

サーバーを起動し

python3 -m http.server

http://0.0.0.0:8000/にアクセスしてデベロッパーコンソールを開くと、、、

うまくいってそうです!!

動作時のバージョン

luaやemccのバージョンによっては再現できない可能性もあるので、僕が試した時点でのバージョンを残しておきます。

$ emcc --version
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 3.1.73 (ac676d5e437525d15df5fd46bc2c208ec6d376a3)
Copyright (C) 2014 the Emscripten authors (see AUTHORS.txt)
This is free and open source software under the MIT license.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ emar --version
LLVM (http://llvm.org/):
  LLVM version 20.0.0git
  Optimized build.
$ git branch -v
* master f7115674 Check string indices when loading binary chunk

感想

ストレスなくビルドから実行までできました。

色々おもしろいことができそうです。

Discussion