generated at
ざっくりAssemblyScript
kansaits#1で発表した資料


mrsekut
丸末 皓太
フロントエンドとか、言語処理系とか
このScrapboxに書いてあること周辺が最近の興味のCore


しゃべること
WebAssemblyについて
AssemblyScriptについて
関連する良い感じのサイトの紹介


WebAssemblyを聞いたことある方🙋🏻‍♂️
ほぼ全員


AssemblyScriptを聞いたことある方🙋🏻‍♀️
2割位


Webのためのバイナリフォーマット
主要ブラウザベンダーが協働で使用策定
↑この辺の人たちが共著の論文を発表した
速い
JS以外のコードでもブラウザ上で実行できる
(IEを除く)ほぼすべてのブラウザで実行可能 ref


WebAssemblyはなぜ生まれた👶🏻
JavaScriptが遅い
ファイルサイズがでかい
パースの時間がかかる
動的型付け
JS自体の最適化の難しい
これまでも解決する方法を模索していた


WebAssemblyはなぜ速いか
.wasm バイナリファイルを配布
サイズが小さい
パース時間がない
静的な型付け
すべての命令が型を持つ
最適化ができる
V8 v7.5からはコンパイル済みのモジュールをキャッシュ
再訪問したページでは再コンパイルしない


WebAssemblyに変換できる言語
多くの言語が対応し始めている ref
Rust, Go, Kotlin
内部のコンパイラで生成可能
C, C++, Swift, Nim, asm.js
Emscriptenを使う
LLVMを使ってる言語はこれでいける
外部の機構を用いる
C#, Python, PHP, Haskell
TypeScript ⬅⬅⬅⬅
etc.


TypeScriptでWebAssemblyを書くには


TypeScriptのサブセット言語
ちょっと機能が制限されてる版
コンパイルすると .wasm が生成される


楽ちん環境構築 ref
$ npm init
$ npm install --save-dev AssemblyScript/assemblyscript
$ npx asinit .
dir構成やpackage.jsonがAS用に更新される
$ npm run asbuild
AS→wasmに変換


コンパイルのノリ
$ npm run asbuild .ts から .wat .wasm が生成される
.wat はテキスト形式
可読性の高いS式アセンブリ言語
これを読めば読めるようになる
.wasm はバイナリ形式
実際にはこれを読み込む


こんなコードが ( .ts )


こんなコードになります ( .wat )


ブラウザで動かすためには
超シンプルなリポジトリを作った


こんな感じで読み込む
instantiateStreaming() はmoduleのコンパイルとインスタンス化を行う


型が割と違う ref
WebAssemblyには2種類の型しかない
それに対応するために型が拡張されている ref
i8 , f32 , u64 , void などなど
undefined , any などは使用できない
@operator('+') デコレータを用いる
メモリアクセスができる
load() store() を用いる
GCがある
gc.collect() を手動で呼び出す必要がある


AssemblyScriptの良いところ
(TSは既に知っているので)学習コストが低い
バックも、フロントも、高速化したいとこも、全部TSで書ける
@inline などの最適化を施すと速いらしい
コンパイル後の .wasm ファイルが小さいらしい


AssemblyScriptの現状とこれから
実装済み
ArrayやMapやSymbolはかなり充実している
まだ
ObjectやIteratorやPromiseは未実装のものが多い
AssemblyScriptのセルフホスト


最後に
良い感じのサイトをいくつか紹介します


公開されているDemo
らいふげーむ
まんでるぶろしゅうごう


AssemblyScriptを始めるならここを読む


WebAssemblyの良い感じのツール
高級言語とwat、wasmの比較
JSとwasmの速度比較
ブラウザ上でコーディングできる
C、Rust、AssemblyScriptをサポート


参考


おわり
ご清聴ありがとうございました
フィードバック頂けると嬉しいです🙇‍♂️