From 8101ba079b8b358a015f4de9acbfc85d89c335da Mon Sep 17 00:00:00 2001 From: nsfisis Date: Wed, 25 Oct 2023 17:34:54 +0900 Subject: 作成 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - files/1 | 3 ++ files/2 | 3 ++ files/3 | 12 +++++++ files/4 | 2 ++ files/5 | 9 +++++ files/6 | 9 +++++ files/php-wasm.c | 8 +++++ slide.pdf | Bin 0 -> 220650 bytes slide.saty | 106 +++++++++++++++++++++++++++++++++++++++++++++++++------ 10 files changed, 142 insertions(+), 11 deletions(-) create mode 100644 files/1 create mode 100644 files/2 create mode 100644 files/3 create mode 100644 files/4 create mode 100644 files/5 create mode 100644 files/6 create mode 100644 files/php-wasm.c create mode 100644 slide.pdf diff --git a/.gitignore b/.gitignore index 3a108ac..19780ee 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ -/slide.pdf /slide.satysfi-aux diff --git a/files/1 b/files/1 new file mode 100644 index 0000000..3139084 --- /dev/null +++ b/files/1 @@ -0,0 +1,3 @@ +$ ./buildconf +$ ./configure +$ make diff --git a/files/2 b/files/2 new file mode 100644 index 0000000..efc4a65 --- /dev/null +++ b/files/2 @@ -0,0 +1,3 @@ +$ ./buildconf +$ emconfigure ./configure +$ emmake make diff --git a/files/3 b/files/3 new file mode 100644 index 0000000..2488b0c --- /dev/null +++ b/files/3 @@ -0,0 +1,12 @@ +$ emconfigure configure \ + --disable-all \ + --disable-mbregex \ + --disable-fiber-asm \ + --disable-cli \ + --disable-cgi \ + --disable-phpdbg \ + --without-iconv \ + --without-libxml \ + --without-pcre-jit \ + --without-pdo-sqlite \ + --without-sqlite3 diff --git a/files/4 b/files/4 new file mode 100644 index 0000000..e534707 --- /dev/null +++ b/files/4 @@ -0,0 +1,2 @@ +$ EMCC_CFLAGS='-s ERROR_ON_UNDEFINED_SYMBOLS=0' \ + emmake make diff --git a/files/5 b/files/5 new file mode 100644 index 0000000..a8cfe55 --- /dev/null +++ b/files/5 @@ -0,0 +1,9 @@ +$ emcc \ + -s ERROR_ON_UNDEFINED_SYMBOLS=0 \ + -s ENVIRONMENT=node \ + -s INITIAL_MEMORY=16777216 \ + -s EXPORT_ES6=1 \ + -s INVOKE_RUN=0 \ + -s MODULARIZE=1 \ + -o php-wasm.js \ + php-wasm.o libphp.a diff --git a/files/6 b/files/6 new file mode 100644 index 0000000..27a5416 --- /dev/null +++ b/files/6 @@ -0,0 +1,9 @@ +import PHPWasm from './php-wasm.js' + +const { ccall } = await PHPWasm(); +const result = ccall( + 'php_wasm_run', + 'number', ['string'], + [`echo "Hello, World!";`], +); +console.log(`exit code: ${result}`); diff --git a/files/php-wasm.c b/files/php-wasm.c new file mode 100644 index 0000000..c124af0 --- /dev/null +++ b/files/php-wasm.c @@ -0,0 +1,8 @@ +#include +#include + +int EMSCRIPTEN_KEEPALIVE php_wasm_run(const char* code) { + zend_result result = + zend_eval_string_ex(code, NULL, "php.wasm code", 1); + return result == SUCCESS ? 0 : 1; +} diff --git a/slide.pdf b/slide.pdf new file mode 100644 index 0000000..dde12ea Binary files /dev/null and b/slide.pdf differ diff --git a/slide.saty b/slide.saty index 43e5b59..3d13583 100644 --- a/slide.saty +++ b/slide.saty @@ -5,12 +5,34 @@ @require: code-printer/code-theme @require: figbox/figbox -let-block +code-block-php source = +let plain-syntax = + let void-rule = CodePrinter.syntax-rule-fun (fun _ -> None) in + CodePrinter.make-syntax (| + line-comment = void-rule; + block-comment = void-rule; + string = void-rule; + keywords = []; + identifier = void-rule; + others = []; + |) + +let config-of s = + CodePrinter.make-config s CodeTheme.iceberg-light + |> CodePrinter.set-number-fun CodeDesign.number-fun-null + +let-block +file-printer-js path = + '< + +file-printer?:(config-of CodeSyntax.javascript)(path); + > + +let-block +file-printer-c path = + '< + +file-printer?:(config-of CodeSyntax.c)(path); + > + +let-block +file-printer path = '< - +code-printer?:( - CodePrinter.make-config CodeSyntax.php CodeTheme.iceberg-light - |> CodePrinter.set-number-fun CodeDesign.number-fun-null - )(source); + +file-printer?:(config-of plain-syntax)(path); > open FigBox @@ -50,23 +72,87 @@ document '< %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +frame{任意コードを安全に実行したい}< - +p{TODO} + +p{任意の (危険かもしれない) コードを実行したい} + > + + +frame{任意コードを安全に実行したい}< + +p{任意の (危険かもしれない) コードを実行したい} + +p{} + +p{WebAssembly による隔離} > +frame{WebAssembly とは}< - +p{TODO} + +p{ポータブルな仮想マシンのコード (別名 Wasm)} + +p{} + +p{元々はブラウザにおける処理の高速化を目的として制定されたが、さまざまなプラットフォームに活躍の場を広げつつある} + +p{} + +p{プラットフォームに依存しない、言語に依存しない、外から隔離された実行環境} > +frame{先行研究}< - +p{TODO} + +p{PHP の処理系を WebAssembly にコンパイル} + +p{} + +p{PHPerKaigi 2023: 「PHPをブラウザで動かす技術」} + +p{Zenn: 「WebAssemblyを使ったPHPのリアルタイムPlaygroundを作りました。」} + +p{WordPress Playground} > +frame{WebAssembly にビルドする}< - +p{TODO} + +p{C言語でエントリポイントを書く} + + +file-printer-c(`files/php-wasm.c`); + > + + +frame{Emscripten}< + +p{C 等から WebAssembly へのコンパイルに使用するツールチェイン} + +p{} + +p{LLVM を利用し、C や C++ などから WebAssembly のコードを生成する} + > + + +frame{WebAssembly にビルドする}< + +file-printer(`files/1`); + +p{} + +p{PHP の通常のビルド手順} + > + + +frame{WebAssembly にビルドする}< + +file-printer(`files/2`); + +p{} + +p{configure の代わりに emconfigure} + +p{make の代わりに emmake} + > + + +frame{ビルドを楽にするために}< + +file-printer(`files/3`); + +p{なるべく disable/without して、ビルド対象を減らす} + > + + +frame{ビルドを楽にするために}< + +file-printer(`files/4`); + +p{} + +p{\code(`ERROR_ON_UNDEFINED_SYMBOLS`); を 0 にして、未定義のシンボルがあってもエラーにならないように} + > + + +frame{WebAssembly にビルドする}< + +file-printer(`files/5`); + +p{} + +p{\code(`ENVIRONMENT`); で動かす環境を指定、\code(`INITIAL_MEMORY`); で確保するメモリを指定、等} + +p{\code(`php-wasm.wasm`); と \code(`php-wasm.js`); が生成される} + > + + +frame{使ってみる}< + +file-printer-js(`files/6`); + +p{} + +p{\code(`ccall`); に、関数名、返り値の型、仮引数の型、実引数を渡して呼び出す} > +frame{まとめ}< - +p{TODO} + +listing{ + * Emscripten を使って、PHP の処理系を WebAssembly にコンパイルできる + * WebAssembly を使って、環境を隔離できる + * Git リポジトリ: https://github.com/nsfisis/tiny-php.wasm + ** Docker があれば構築可能 + } > > -- cgit v1.2.3-70-g09d2