ざっくりAssemblyScript
mrsekut.icon
丸末 皓太
フロントエンドとか、言語処理系とか
この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)
https://gyazo.com/766acff3a10f98be5ba10d15b8788cbb
こんなコードになります (.wat)
https://gyazo.com/607e20bbbe2379c7a92bdcbb9c176e65
ブラウザで動かすためには
超シンプルなリポジトリを作った
こんな感じで読み込む
instantiateStreaming()はmoduleのコンパイルとインスタンス化を行う
https://gyazo.com/22c6a550b54986b3ff1f62e04f88629a
i8, f32, u64,voidなどなど
undefined, anyなどは使用できない
@operator('+')デコレータを用いる
メモリアクセスができる
load()、store()を用いる
gc.collect()を手動で呼び出す必要がある
(TSは既に知っているので)学習コストが低い
バックも、フロントも、高速化したいとこも、全部TSで書ける
実装済み
ArrayやMapやSymbolはかなり充実している
まだ
ObjectやIteratorやPromiseは未実装のものが多い
最後に
良い感じのサイトをいくつか紹介します
公開されているDemo
らいふげーむ
まんでるぶろしゅうごう
AssemblyScriptを始めるならここを読む
高級言語とwat、wasmの比較
JSとwasmの速度比較
ブラウザ上でコーディングできる
C、Rust、AssemblyScriptをサポート
参考
おわり
ご清聴ありがとうございました
フィードバック頂けると嬉しいです🙇♂️