変数
asm.jsに対応した関数を用意し、その関数がasm.js対応であると宣言することで、
高速化の恩恵を受けられるようになります。
この関数は外部から呼び出す形で使います。また、外部の関数を呼び出すこともできます。
したがってasm.jsの周辺には、次の変数が存在することになります。
| 種類 | 内容 |
| 関数グローバルの変数 | int,double,float,特定のデータ配列,ライブラリ関数,外部関数 |
| 関数の引数 | int,double,float |
| 関数内部の変数 | int,double,float |
| 関数の戻り値 | double,signed,float,void |
変数の型
変数は次のいずれかの型を持ちます。
本来はint,float,doubleのみを扱いたいのですが、
Javascriptとの互換性を保つための型がいくつか追加されています。
追加された型を元の型に戻すためには、次に説明する型変換を利用します。
| 型 | 暗黙の変換が可能な型 | 内容 |
| fixnum | signed,unsigned,int,intish | 0〜0xffffffffの定数です。数値に応じて変換されます。 |
| signed | int,intish | 32ビット符号つきであると確定している数です。 |
| unsigned | int,intish | 32ビット符号なしであると確定している数です。 |
| int | intish | 符号は不明ですが、32ビットであると確定している数です。 |
| intish | なし | 32ビット整数表現できる可能性は高いものの、オーバーフローが起こりうる数です。 |
| double | double? | double(64ビット浮動小数値)であることが確定しているです。 |
| double? | なし | doubleの可能性は高いものの、undefinedの可能性がある数です。配列アクセスで発生します。 |
| float | float?,floatish | float(32ビット浮動小数値)であることが確定しているです。 |
| float? | floatish | floatの可能性は高いものの、undefinedの可能性がある数です。配列アクセスで発生します。 |
| floatish | なし | float表現できる可能性は高いものの、オーバーフローが起こりうる数です。 |
関数内部の変数の型指定
関数内部の変数は、次の表に示す式を初期化時に与えることにより、
型を指定して初期化する必要があります。
asm.jsでは、関数中で変数の型を変えることはできません。
| 初期化時に与える値 | 変数の型 |
| ピリオドつきの数値 | double |
| - 0x80000000 〜 +0xffffffffの数値 | int |
| fround(ピリオドつきの数値) | float |
これ以外の値で初期化すると、asm.jsに対応していないスクリプトとして扱われます。
変数の型変換
intishやdouble?など、Javascriptとの互換性のために生まれた型をそのまま使うと、
Javascriptとしては正しく動作しますが、asm.js対応のスクリプトとして扱えなくなります。
asm.js対応のスクリプトでは、次の方法により、型を明示的に変換する必要があります。
以下に、型を明示的に変換する方法を表にまとめました。
fround()はライブラリ関数Math.fround()です。
| 変換前の型 | 変換後の型 | 変換式 |
| 任意 | signed | x = x|0; |
| 任意 | int | x = x|0; (signedと同じです) |
| 任意 | double | x = +x; |
| 任意 | float | x = fround(x); |