ざっくりAssemblyScript
kansaits#1で発表した資料
自己紹介
mrsekut.icon
丸末 皓太
/icons/scrapbox.icon mrsekut-p
/icons/github.icon @mrsekut
/icons/twitter.icon @mrsekut
/icons/wordpress.icon mrsekutの備忘録
フロントエンドとか、言語処理系とか
このScrapboxに書いてあること周辺が最近の興味のCore
しゃべること
WebAssemblyについて
AssemblyScriptについて
関連する良い感じのサイトの紹介
WebAssemblyを聞いたことある方🙋🏻‍♂️
ほぼ全員
AssemblyScriptを聞いたことある方🙋🏻‍♀️
2割位
WebAssembly.icon WebAssemblyとは
Webのためのバイナリフォーマット
主要ブラウザベンダーが協働で使用策定
Google, MicroSoft, Mozilla, Appleなど
↑この辺の人たちが共著の論文を発表した
速い
JS以外のコードでもブラウザ上で実行できる
(IEを除く)ほぼすべてのブラウザで実行可能 ref
WebAssemblyはなぜ生まれた👶🏻
JavaScriptが遅い
ファイルサイズがでかい
パースの時間がかかる
動的型付け
JS自体の最適化の難しい
これまでも解決する方法を模索していた
JIT compile、asm.js、PNaCl、ActiveXなど
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を書くには
AssemblyScriptを使う
AssemblyScript.icon AssemblyScriptとは
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)
https://gyazo.com/766acff3a10f98be5ba10d15b8788cbb
こんなコードになります (.wat)
https://gyazo.com/607e20bbbe2379c7a92bdcbb9c176e65
ブラウザで動かすためには
超シンプルなリポジトリを作った
mrsekut/simple-assemblyscript-sample
こんな感じで読み込む
instantiateStreaming()はmoduleのコンパイルとインスタンス化を行う
https://gyazo.com/22c6a550b54986b3ff1f62e04f88629a
AssemblyScriptの特徴
型が割と違う ref
WebAssemblyには2種類の型しかない
それに対応するために型が拡張されている ref
i8, f32, u64,voidなどなど
undefined, anyなどは使用できない
演算子overloadがある ref
@operator('+')デコレータを用いる
メモリアクセスができる
load()、store()を用いる
GCがある
incremental-tri-color-marking GC ref
gc.collect()を手動で呼び出す必要がある
参照カウントGC ref
AssemblyScriptの良いところ
(TSは既に知っているので)学習コストが低い
バックも、フロントも、高速化したいとこも、全部TSで書ける
@inlineなどの最適化を施すと速いらしい
コンパイル後の.wasmファイルが小さいらしい
AssemblyScriptの現状とこれから
ロードマップを参考
実装済み
ArrayやMapやSymbolはかなり充実している
まだ
ObjectやIteratorやPromiseは未実装のものが多い
AssemblyScriptのセルフホスト
最後に
良い感じのサイトをいくつか紹介します
公開されているDemo
Conway's Game of Life - AssemblyScript
らいふげーむ
Mandelbrot set - AssemblyScript
まんでるぶろしゅうごう
AssemblyScriptを始めるならここを読む
The Basics - The AssemblyScript Book
WebAssemblyの良い感じのツール
The WASM Explorer
高級言語とwat、wasmの比較
JavaScript vs WebAssembly easy benchmark
JSとwasmの速度比較
WebAssembly Studio
ブラウザ上でコーディングできる
C、Rust、AssemblyScriptをサポート
参考
Bringing the Web up to Speed with WebAssembly
Misreading Chat 22
おわり
ご清聴ありがとうございました
フィードバック頂けると嬉しいです🙇‍♂️
#発表したもの