変数
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); |