aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2023-10-25 17:34:54 +0900
committernsfisis <nsfisis@gmail.com>2023-10-25 17:57:23 +0900
commit8101ba079b8b358a015f4de9acbfc85d89c335da (patch)
treefdc57aedf9323c3a0d5e03979b530eca338a7a4c
parent69c4159c6464937031e046eae3fc74045fe9fae0 (diff)
downloadphpstudy-157-slides-main.tar.gz
phpstudy-157-slides-main.tar.zst
phpstudy-157-slides-main.zip
作成HEADmain
-rw-r--r--.gitignore1
-rw-r--r--files/13
-rw-r--r--files/23
-rw-r--r--files/312
-rw-r--r--files/42
-rw-r--r--files/59
-rw-r--r--files/69
-rw-r--r--files/php-wasm.c8
-rw-r--r--slide.pdfbin0 -> 220650 bytes
-rw-r--r--slide.saty106
10 files changed, 142 insertions, 11 deletions
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 <emscripten.h>
+#include <Zend/zend_execute.h>
+
+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
--- /dev/null
+++ b/slide.pdf
Binary files 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 があれば構築可能
+ }
>
>