ざっくりAssemblyScript
丸末 皓太
フロントエンドとか、言語処理系とか
このScrapboxに書いてあること周辺が最近の興味のCore
しゃべること
関連する良い感じのサイトの紹介
ほぼ全員
2割位
Webのためのバイナリフォーマット
主要ブラウザベンダーが協働で使用策定
速い
JS以外のコードでもブラウザ上で実行できる
(
IEを除く)ほぼすべてのブラウザで実行可能
ref
WebAssemblyはなぜ生まれた👶🏻
JavaScriptが遅い
ファイルサイズがでかい
パースの時間がかかる
動的型付け
JS自体の最適化の難しい
これまでも解決する方法を模索していた
WebAssemblyはなぜ速いか
.wasm
バイナリファイルを配布
サイズが小さい
パース時間がない
静的な型付け
すべての命令が型を持つ
最適化ができる
V8 v7.5からはコンパイル済みのモジュールをキャッシュ
再訪問したページでは再コンパイルしない
Rust, Go, Kotlin
内部のコンパイラで生成可能
C, C++, Swift, Nim, asm.js
外部の機構を用いる
C#, Python, PHP, Haskell
TypeScript ⬅⬅⬅⬅
etc.
TypeScriptでWebAssemblyを書くには
TypeScriptのサブセット言語
ちょっと機能が制限されてる版
コンパイルすると .wasm
が生成される
$ 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
はテキスト形式
.wasm
はバイナリ形式
実際にはこれを読み込む
こんなコードが ( .ts
)
こんなコードになります ( .wat
)
ブラウザで動かすためには
超シンプルなリポジトリを作った
こんな感じで読み込む
instantiateStreaming()
はmoduleのコンパイルとインスタンス化を行う
i8
, f32
, u64
, void
などなど
undefined
, any
などは使用できない
@operator('+')
デコレータを用いる
メモリアクセスができる
load()
、 store()
を用いる
gc.collect()
を手動で呼び出す必要がある
(TSは既に知っているので)学習コストが低い
バックも、フロントも、高速化したいとこも、全部TSで書ける
コンパイル後の
.wasm
ファイルが小さい
らしい
実装済み
ArrayやMapやSymbolはかなり充実している
まだ
ObjectやIteratorやPromiseは未実装のものが多い
最後に
良い感じのサイトをいくつか紹介します
公開されているDemo
らいふげーむ
まんでるぶろしゅうごう
AssemblyScriptを始めるならここを読む
高級言語とwat、wasmの比較
JSとwasmの速度比較
ブラウザ上でコーディングできる
C、Rust、AssemblyScriptをサポート
参考
おわり
ご清聴ありがとうございました
フィードバック頂けると嬉しいです🙇♂️