summaryrefslogtreecommitdiffhomepage
path: root/slide.saty
blob: c12235c317d4f8a1e74b3cb4ee839501aeb05156 (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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
@require: option
@require: class-slydifi/theme/akasaka
@require: figbox/figbox

let ex-big-textbox ?:size-opt it =
  let size = Option.from 48pt size-opt in
    FigBox.textbox?:(set-font-size size) it

let big-textbox ?:size-opt it =
  let size = Option.from 32pt size-opt in
    FigBox.textbox?:(set-font-size size) it

let mid-textbox ?:size-opt it =
  let size = Option.from 24pt size-opt in
    FigBox.textbox?:(set-font-size size) it

open FigBox
in

document '<
  +set-config(|
    SlydifiThemeAkasaka.default-config with
    color-emph = Color.black;
  |);

  +make-title(|
    title = {
      |WebAssembly を理解する
      |〜VM の作成を通して〜
      |};
    author = {|nsfisis (いまむら)|};
    date = {|PHPerKaigi 2024|};
  |);

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  +frame{自己紹介}<
    +fig-center(vconcat [
      gap 75pt;
      hconcat [
        big-textbox{nsfisis (いまむら)};
        gap 20pt;
        include-image 50pt `assets/me.jpeg`;
      ];
      gap 20pt;
      big-textbox{\@ デジタルサーカス株式会社};
      gap 60pt;
      big-textbox?:(24pt){今年のコードゴルフ企画のシステム開発・運用};
    ]);
  >

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  +section{|WebAssemblyの概要|}<

  +frame{WebAssemblyとは}<
    +fig-center(vconcat [
      gap 75pt;
      big-textbox{WebAssembly (Wasm)};
      gap 20pt;
      mid-textbox{ブラウザなどで実行できる};
      gap 10pt;
      mid-textbox{ポータブルな仮想命令セット};
    ]);
  >

  +frame{WebAssemblyの出自}<
    +fig-center(vconcat [
      gap 75pt;
      mid-textbox{元々のモチベーション: ブラウザ上での高速な処理};
      gap 20pt;
      mid-textbox{動的な JavaScript だと限界がある};
      gap 30pt;
      mid-textbox{間にいくつかの技術が生まれたり消えたりし、};
      gap 10pt;
      mid-textbox{最終的に WebAssembly が策定された};
    ]);
  >

  +frame{Emscripten}<
    +fig-center(vconcat [
      gap 60pt;
      big-textbox{Emscripten};
      gap 40pt;
      mid-textbox{C/C++ のソースコードを Wasm に変換};
      gap 20pt;
      mid-textbox{C/C++ で書かれた膨大な資産を};
      gap 10pt;
      mid-textbox{ブラウザの上で動かせる};
    ]);
  >

  +frame{Wasmの活用例}<
    +fig-center(vconcat [
      gap 50pt;
      mid-textbox{PHPの処理系はCで書かれている};
      gap 40pt;
      mid-textbox{Emscripten を使って Wasm に変換できる};
      gap 40pt;
      mid-textbox{Wasm に変換するとブラウザ上で動かせる};
      gap 40pt;
      mid-textbox{例: PHP Playground、コードゴルフ企画};
    ]);
  >

  +frame{WebAssemblyの特徴}<
    +fig-center(vconcat [
      gap 50pt;
      big-textbox{ポータブル};
      gap 20pt;
      big-textbox{速い};
      gap 20pt;
      big-textbox{安全};
      gap 40pt;
      mid-textbox{これらの特徴はどのように実現されているのか};
      gap 20pt;
      mid-textbox{処理系を自作して理解しよう};
    ]);
  >

  >

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  +section{|作成したものの紹介|}<

  +frame{完成したもの}<
    +fig-center(vconcat [
      gap 30pt;
      include-image 700pt `assets/screenshot.jpeg`;
    ]);
  >

  +frame{完成したもの}<
    +fig-center(vconcat [
      gap 40pt;
      mid-textbox{今回作った Wasm 処理系};
      gap 30pt;
      mid-textbox{の上に、Wasmに変換されたPHP処理系};
      gap 30pt;
      mid-textbox{の上に、\code(`echo "Hello, World!\n";`);};
    ]);
  >

  +frame{完成したもの}<
    +fig-center(vconcat [
      gap 40pt;
      mid-textbox{普通のPHP処理系};
      gap 30pt;
      mid-textbox{の上に、今回作った Wasm 処理系};
      gap 30pt;
      mid-textbox{の上に、Wasmに変換されたPHP処理系};
      gap 30pt;
      mid-textbox{の上に、\code(`echo "Hello, World!\n";`);};
    ]);
  >

  +frame{完成したもの}<
    +fig-center(vconcat [
      gap 40pt;
      mid-textbox{普通のPHP処理系};
      gap 30pt;
      mid-textbox{の上に、今回作った Wasm 処理系};
      gap 30pt;
      mid-textbox{の上に、Wasmに変換されたPHP処理系};
      gap 30pt;
      mid-textbox{の上に、\code(`echo "Hello, World!\n";`);};
      gap 50pt;
      mid-textbox{多段になりすぎて実行に30秒かかる};
    ]);
  >

  >

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  +section{|Wasmの処理系を作る|}<

  +frame{仕様書}<
    +fig-center(vconcat [
      gap 40pt;
      big-textbox{成長途中の規格};
      gap 20pt;
      big-textbox{バージョンがいろいろある};
      gap 50pt;
      mid-textbox{バージョン1};
      gap 20pt;
      mid-textbox{バージョン2};
      gap 20pt;
      mid-textbox{WasmGC};
    ]);
  >

  +frame{仕様書の構成}<
    +fig-center(vconcat [
      gap 60pt;
      big-textbox{Structure};
      gap 20pt;
      big-textbox{Validation};
      gap 20pt;
      big-textbox{Execution};
      gap 20pt;
      big-textbox{Binary Format};
      gap 20pt;
      big-textbox{Text Format};
    ]);
  >

  +frame{Binary Format と Text Format}<
    +fig-center(vconcat [
      gap 40pt;
      mid-textbox{バイナリ形式のプログラム表現と、};
      gap 20pt;
      mid-textbox{テキスト形式のプログラム表現の2種類がある};
      gap 40pt;
      mid-textbox{同じ意味のプログラムを別々の書き方で表せる};
      gap 20pt;
      mid-textbox{両形式は、相互に変換可能};
      gap 40pt;
      mid-textbox{どちらか一方だけ実装してやればよい};
    ]);
  >

  +frame{どの順に読むべきか?}<
    +fig-center(vconcat [
      gap 60pt;
      big-textbox{Structure};
      gap 20pt;
      big-textbox{Validation};
      gap 20pt;
      big-textbox{Execution};
      gap 20pt;
      big-textbox{Binary Format};
      gap 20pt;
      big-textbox{Text Format};
    ]);
  >

  +frame{どの順に読むべきか?}<
    +fig-center(vconcat [
      gap 60pt;
      big-textbox{Structure (1)};
      gap 20pt;
      big-textbox{Validation (4)};
      gap 20pt;
      big-textbox{Execution (3)};
      gap 20pt;
      big-textbox{Binary Format (2)};
      gap 20pt;
      big-textbox{Text Format (2)};
    ]);
  >

  +frame{Structure}<
    +fig-center(vconcat [
      gap 75pt;
      mid-textbox{Wasmのプログラムを表すデータ構造を定義};
      gap 20pt;
      mid-textbox{命令セットの定義、各種プリミティブ型の定義など};
      gap 40pt;
      mid-textbox{これを読みながら、データ型を定義していく};
    ]);
  >

  +frame{Binary Format / Text Format}<
    +fig-center(vconcat [
      gap 75pt;
      mid-textbox{Wasmのプログラムがどのような};
      gap 10pt;
      mid-textbox{バイナリ/ソースコードで表されるかを定義};
      gap 20pt;
      mid-textbox{Structure で定義されたデータ構造へと変換していく};
      gap 50pt;
      mid-textbox{Binary Format のほうが楽そう?};
    ]);
  >

  +frame{Execution}<
    +fig-center(vconcat [
      gap 75pt;
      mid-textbox{Wasmをどう実行するか (VM本体)};
      gap 40pt;
      mid-textbox{仕様書を忠実に翻訳するだけでは実装できない};
      gap 20pt;
      mid-textbox{Structured Control Flow/Label周りが厄介};
    ]);
  >

  +frame{Structured Control Flow の扱い}<
    +fig-center(vconcat [
      gap 70pt;
      mid-textbox{仕様書の記述をそのまま実装するのは困難};
      gap 50pt;
      mid-textbox{(A) block/loop/ifを直列に展開};
      gap 20pt;
      mid-textbox{(B) 今回の方法};
    ]);
  >

  +frame{Structured Control Flow の扱い: br 命令}<
    +fig-center(vconcat [
      gap 50pt;
      big-textbox{br命令};
      gap 40pt;
      mid-textbox{block 命令中では break相当};
      gap 20pt;
      mid-textbox{loop 命令中では continue相当};
      gap 40pt;
      mid-textbox{continuationの話は無視していい};
    ]);
  >

  +frame{Structured Control Flow の扱い: br 命令}<
    +fig-center(vconcat [
      gap 50pt;
      big-textbox{br命令};
      gap 40pt;
      mid-textbox{仕様書にあるbr命令の処理の内容は};
      gap 20pt;
      mid-textbox{br命令を実行する箇所ではなく};
      gap 20pt;
      mid-textbox{呼び出し元となるblockとloopに書く};
    ]);
  >

  +frame{Validation}<
    +fig-center(vconcat [
      gap 50pt;
      mid-textbox{Wasm のプログラムが正しいかどうか};
      gap 10pt;
      mid-textbox{実行前に検証する};
      gap 20pt;
      mid-textbox{Wasm の安全性を担保している処理の一つ};
    ]);
  >

  +frame{Validation}<
    +fig-center(vconcat [
      gap 50pt;
      mid-textbox{Wasm のプログラムが正しいかどうか};
      gap 10pt;
      mid-textbox{実行前に検証する};
      gap 20pt;
      mid-textbox{Wasm の安全性を担保している処理の一つ};
      gap 40pt;
      mid-textbox{やらなくていい};
      gap 20pt;
      mid-textbox{世にある Wasm のプログラムは};
      gap 10pt;
      mid-textbox{Validation が通るものばかり};
    ]);
  >

  +frame{外界とのやりとり}<
    +fig-center(vconcat [
      gap 50pt;
      mid-textbox{Wasm自体の仕様には};
      gap 10pt;
      mid-textbox{外の世界とやりとりする手段がない};
      gap 20pt;
      mid-textbox{例: 入出力、ファイル操作、ネットワークアクセス等};
      gap 20pt;
      mid-textbox{必要に応じて明示的にインポートする};
      gap 40pt;
      mid-textbox{これによって安全性が高まっている}
    ]);
  >

  +frame{まとめ}<
    +fig-center(vconcat [
      gap 50pt;
      big-textbox{1. データ構造を定義};
      gap 20pt;
      big-textbox{2. Binary format のデコーダを実装};
      gap 20pt;
      big-textbox{3. VMを実装};
      gap 20pt;
      big-textbox{4. 外界とのインターフェースを実装};
      gap 20pt;
      big-textbox{5. 頑張る};
    ]);
  >

  >

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  +section{|注目が集まるわけ|}<

  +frame{WebAssemblyの特徴}<
    +fig-center(vconcat [
      gap 60pt;
      ex-big-textbox{ポータブル};
      gap 20pt;
      ex-big-textbox{速い};
      gap 20pt;
      ex-big-textbox{安全};
    ]);
  >

  +frame{WebAssemblyの特徴: ポータブル}<
    +fig-center(vconcat [
      gap 60pt;
      mid-textbox{Wasm自体の仕様には};
      gap 10pt;
      mid-textbox{外の世界とやりとりする手段がない};
      gap 20pt;
      mid-textbox{特定の環境に依存しない};
      gap 20pt;
      mid-textbox{環境依存の処理はWasmの外でおこなう};
    ]);
  >

  +frame{WebAssemblyの特徴: ポータブル}<
    +fig-center(vconcat [
      gap 75pt;
      mid-textbox{Webに依存しない};
      gap 20pt;
      mid-textbox{JavaScriptやDOM等の技術から独立している};
      gap 50pt;
      mid-textbox{ブラウザの外でも動く};
    ]);
  >

  +frame{WebAssemblyの特徴: 速い}<
    +fig-center(vconcat [
      gap 75pt;
      mid-textbox{バイナリ形式: パースが速い};
      gap 30pt;
      mid-textbox{十分に低レベルな命令セット};
    ]);
  >

  +frame{WebAssemblyの特徴: 安全}<
    +fig-center(vconcat [
      gap 75pt;
      mid-textbox{検証しやすい (validation)};
      gap 20pt;
      mid-textbox{外界とのやりとりが明示的};
      gap 20pt;
      mid-textbox{サンドボックス化が容易};
    ]);
  >

  +frame{活用事例}<
    +fig-center(vconcat [
      gap 60pt;
      mid-textbox{ブラウザ上での高速な処理};
      gap 20pt;
      mid-textbox{C/C++のソフトウェアをブラウザへ移植};
      gap 20pt;
      mid-textbox{ソフトウェアのプラグイン};
      gap 20pt;
      mid-textbox{コンテナ};
      gap 20pt;
      mid-textbox{エッジコンピューティング};
    ]);
  >

  >

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  +section{|言語処理系を作る|}<

  +frame{なぜ作るのか?}<
    +fig-center(vconcat [
      gap 50pt;
      big-textbox{車輪の再発明};
      gap 40pt;
      big-textbox{世に優れたWasmの処理系はごまんとある};
    ]);
  >

  +frame{なぜ作るのか?}<
    +fig-center(vconcat [
      gap 75pt;
      ex-big-textbox{なぜ?};
    ]);
  >

  +frame{なぜ作るのか?}<
    +fig-center(vconcat [
      gap 75pt;
      ex-big-textbox{なぜ?};
      gap 60pt;
      ex-big-textbox{楽しい};
    ]);
  >

  +frame{言語処理系の面白さ}<
    +fig-center(vconcat [
      gap 80pt;
      mid-textbox{あるとき突然すべてが上手く動くようになる};
      gap 40pt;
      mid-textbox{自分の理解を遥かに超えたものがなぜか動く};
    ]);
  >

  >

>