AssemblyScript
https://gyazo.com/b13c92de43532f47ca72066b2fbc66a3
TypeScriptのサブセット
stdは標準ライブラリだね
読もうねmrsekut.icon
$ npm init
$ npm install --save-dev AssemblyScript/assemblyscript
$ npx asinit .
package.jsonがAS用に更新される
$ npm run asbuild
AS→wasmに変換
これで、assembly/index.tsファイルが生成された
code:ts
// The entry file of your WebAssembly module.
export function add(a: i32, b: i32): i32 {
return a + b;
}
arrowで書いたら動かなくなった
/buildの中にはuntouched.wasmとoptimized.wasmが含まれる
デバッグ時は前者で確認して、デプロイするときは後者を使えばいい ref build to WebAssembly
$ npm run asbuild
.tsを.wasmにコンパイルする
code:wasm
(module
(type $FUNCSIG$iii (func (param i32 i32) (result i32)))
(type $FUNCSIG$v (func))
(memory $0 0)
(table $0 1 funcref)
(elem (i32.const 0) $null)
(export "memory" (memory $0))
(export "table" (table $0))
(export "add" (func $assembly/index/add))
(func $assembly/index/add (; 0 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0
local.get $1
i32.add
)
(func $null (; 1 ;) (type $FUNCSIG$v)
nop
)
)
こっからどうやって実行するんや? mrsekut.icon
demoサイト
TypeScriptじゃないところ
区別するために、ASには型が拡張されている
i8, i32, u64, usize, f32, voidなどなど
これらはTSのnumberを用いた型エイリアス ref 関数の戻り値型は付けないといけないことが多い
使用できない型
undefined, anyなど
||や&&が左右辺値ではなく、論理値になってる #要出典 @operator('+')のようなデコレータを用いることで演算子のオーバーロードができる
@inlineデコレータ
関数に@inlineを付けるとインライン展開され、関数の呼び出しコストを削減できる
一方で、.wasmのサイズが肥大化するらしい ref GCがある
gc.collect()を手動で呼び出す必要がある
https://gyazo.com/3c88227661a2272432da259f84692f0f
ロードマップ
ASコンパイラをASコンパイラを使ってwasmにする
最適化
サイズの比較
みどく
参考
記事自体は詳しいが、古いのでリンクが死んでる