AssemblyScript
TypeScriptのサブセット
std
は標準ライブラリだね
読もうね

$ npm init
$ npm install --save-dev AssemblyScript/assemblyscript
$ npx asinit .
package.jsonがAS用に更新される
$ npm run asbuild
AS→wasmに変換
これで、 assembly/index.ts
ファイルが生成された
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
にコンパイルする
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
)
)
こっからどうやって実行するんや?

demoサイト
TypeScriptじゃないところ
区別するために、ASには型が拡張されている
i8
, i32
, u64
, usize
, f32
, void
などなど
これらはTSのnumberを用いた型エイリアス
ref関数の戻り値型は付けないといけないことが多い
使用できない型
undefined
, any
など
||
や
&&
が左右辺値ではなく、論理値になってる
#要出典 @operator('+')
のようなデコレータを用いることで演算子のオーバーロードができる
@inline
デコレータ
関数に @inline
を付けるとインライン展開され、関数の呼び出しコストを削減できる
一方で、
.wasm
のサイズが肥大化するらしい
ref
GCがある
gc.collect()
を手動で呼び出す必要がある
ロードマップ
ASコンパイラをASコンパイラを使ってwasmにする
最適化
サイズの比較
みどく
参考
記事自体は詳しいが、古いのでリンクが死んでる