blob: 3d135838e906936f0099171a79c62b1fd7555a8a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
@require: class-slydifi/theme/akasaka
@require: code-printer/code-design
@require: code-printer/code-printer
@require: code-printer/code-syntax
@require: code-printer/code-theme
@require: figbox/figbox
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 =
'<
+file-printer?:(config-of plain-syntax)(path);
>
open FigBox
in
document '<
+set-config(|
SlydifiThemeAkasaka.default-config with
color-emph = Color.black;
|);
+make-title(|
title = {
|PHP コードを隔離された環境で
|安全に動かす
|(on WebAssembly)
|};
author = {|nsfisis (いまむら)|};
date = {|第157回PHP勉強会@東京|};
|);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+frame{自己紹介}<
+fig-center(vconcat [
gap 75pt;
hconcat [
textbox{nsfisis (いまむら)};
gap 20pt;
include-image 50pt `assets/me.jpeg`;
];
gap 20pt;
textbox{\@ デジタルサーカス株式会社};
]);
>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+frame{任意コードを安全に実行したい}<
+p{任意の (危険かもしれない) コードを実行したい}
>
+frame{任意コードを安全に実行したい}<
+p{任意の (危険かもしれない) コードを実行したい}
+p{}
+p{WebAssembly による隔離}
>
+frame{WebAssembly とは}<
+p{ポータブルな仮想マシンのコード (別名 Wasm)}
+p{}
+p{元々はブラウザにおける処理の高速化を目的として制定されたが、さまざまなプラットフォームに活躍の場を広げつつある}
+p{}
+p{プラットフォームに依存しない、言語に依存しない、外から隔離された実行環境}
>
+frame{先行研究}<
+p{PHP の処理系を WebAssembly にコンパイル}
+p{}
+p{PHPerKaigi 2023: 「PHPをブラウザで動かす技術」}
+p{Zenn: 「WebAssemblyを使ったPHPのリアルタイムPlaygroundを作りました。」}
+p{WordPress Playground}
>
+frame{WebAssembly にビルドする}<
+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{まとめ}<
+listing{
* Emscripten を使って、PHP の処理系を WebAssembly にコンパイルできる
* WebAssembly を使って、環境を隔離できる
* Git リポジトリ: https://github.com/nsfisis/tiny-php.wasm
** Docker があれば構築可能
}
>
>
|