当前位置: 首页 > 工具软件 > asm.js > 使用案例 >

编写asm.js代码

从劲
2023-12-01

asm.js代码的结构

这是一个简单的示例。

//(1)asm.js関数宣言
	function asm(stdin, foreign, heap){//引数は最大3つ
		"use asm";//(2)use asm宣言
		//(3)インポート宣言
		var imul = stdin.Math.imul;
		var fround = stdin.Math.fround;
		var callOuter = foreign.callOuter;
		//(4)共有変数宣言
		var a = 0;
		var b = 0.0;
		var c = fround(0);
		var array = new stdin.Uint8Array(heap);
		//(5)関数定義
		function hoge(){
			callOuter();
		}
		//(6)外部への公開
		return {hoge: hoge};
	}
	//(7)asm.jsモジュールの呼び出し
	let asmmod = asm(self, {callOuter: function(){}}, new ArrayBuffer(0x10000));
	asmmod.hoge();

1 asm.js函数声明
asm.js函数与常规函数定义相同,该函数生成一个asm.js模块,函数名称可以是任何名称,并且可以作为匿名函数立即执行。参数名称没有限制,可以根据处理情况适当省略。

2使用asm声明如果在
开头"use asm";指定,则整个函数将解释为asm.js代码。

3 导入声明
此处列出了要使用的内置函数(Math.xxx)和要调用的外部函数。

4 共享变量声明
此处列出您要共同使用的变量,请注意,无法使用运算符进行初始化。

5函数定义
我们将编写一个函数进行处理。

6公开到外部
以关联数组格式收集要公开的函数并返回。

7调用
asm.js模块调用定义asm.js模块的函数时,将返回在上面的(6)中生成的函数集。

从外观上看,asm.js代码与常规函数声明没有区别,可以在script元素中的任何位置编写,但是必须严格遵守其配置。

由于此功能,存在一个缺点,即很难在代码中找到编译错误。

asm.js函数的参数含义
定义为asm.js函数的函数最多包含三个参数,使用asm.js模块时,请根据需要传递参数,其作用如下。

第一个参数“ stdin”
传递使用asm.js模块的上下文,该上下文表示脚本执行环境,通常一个变量self与此等效。一个变量self通常具有一个窗口对象集。但是,在使用worker时,情况并非总是如此,因此self,我们传入参数而不是window 。

第二个参数,“ foreign”
当你想调用从asm.js模块的外部处理,并将该功能的对象格式。Asm.js模块存在可调用的函数大的限制内,foreign干预您可以调用任何函数,当然,也可以传递使用asm.js模块创建的函数。

第三个参数“ heap”
在asm.js模块内部使用的内存区域作为ArrayBuffer对象传递。在asm.js模块内部,无法保护额外的内存,无法生成数组。应传递适当大小的ArrayBuffer对象,请注意,可以指定的ArrayBuffer对象的大小有限制,最小单位为0x10000(64kB),并且指定的大小为2的幂。

请不要将类似于上下文对象的对象作为第一个参数传递,尽管它在JavaScript语法上是正确的,但是asm.js可能无法链接,并且回退执行可能会像普通的JavaScript代码一样发生。

"use asm"声明

如果在函数定义的开头进行"use asm";描述,则JavaScript解释器会将其解释为asm.js代码并尝试进行预编译;如果在第一行之外进行描述,则会发生编译错误,并且该函数会回退。

即使可以使用asm.js编译的代码"use asm";无效,也可以像JavaScript一样正确。在汇编asm.js代码时"use asm";,请在有效和无效之间切换,并检查性能上有多少差异请。

声明在asm.js模块中使用的函数。主要将必要的函数从该函数的第一个和第二个参数指定的对象复制到变量中。可以从第一个参数复制的函数存在对一个极限,stdin.Math则必须是数值在属于功能(的一部分)。应当注意,asm.js模块不能访问该功能的变量的范围之外,因此,全局变量,如窗口对象不能直接引用,不能导入某些数学函数,也可以使用var而不是声明const。

经常导入的数学函数
两个数学函数具有特殊作用:

stdin.Math.fround
用于声明float类型的变量(单精度浮点数)。
stdin.Math.imul
它用于乘以int类型,不能用*运算符乘以int变量。
其他stdin.Math.floor类型通常用于类型转换,因此,在为asm.js代码创建模板时,最好导入这些函数。

共享变量/常量声明
定义内部共享的变量(var)和常量(const)注意,只能为变量初始化指定数字文字,并且不能指定使用运算符和控制语法的复杂值。仅在共享变量声明部分允许生成类型数组(ArrayBufferView),如果需要详细的初始化处理,则定义一个单独的初始化函数。

{
function asm(stdin, foreign, heap){
“use asm”;
var fround = stdin.Math.fround;
//int
var i = 0;
const h = 0x0f;
//double
var d = 0.0;
const e = -9.64;
//float
var f = fround(0);
const values = new stdin.Uint8Array(heap);//コンストラクタをstdinから取得する
return {};
}
}

下面这种是不可以的

var a = 1 + 1;
//制御構文が含まれている
var a;
if(true){
	a = 10;
}
//ArrayBufferViewの生成にオフセットパラメータが含まれている
var values = new stdin.Uint8Array(heap, 10);
//オブジェクトの定義は出来ない
var arr = [];
var obj = {};
	function asm(stdin, foreign, heap){
		"use asm";
		var fround = stdin.Math.fround;
		//int
		var i = 0;
		const h = 0x0f;
		//double
		var d = 0.0;
		const e = -9.64;
		//float
		var f = fround(0);
		const values = new stdin.Uint8Array(heap);//コンストラクタをstdinから取得する
		
		return {};
	}

可用的ArrayBufferView是[Int / Uint] [8/16/32] Array或Float [32/64] Array。无法指定Uint8ClampedArray和DataView对象。

{
	function asm(stdin, foreign, heap){
		"use asm";
		var values0 = new stdin.Int8Array(heap);
		var values1 = new stdin.Uint8Array(heap);
		var values2 = new stdin.Int16Array(heap);
		var values3 = new stdin.Uint16Array(heap);
		var values4 = new stdin.Int32Array(heap);
		var values5 = new stdin.Uint32Array(heap);
		var values6 = new stdin.Float32Array(heap);
		var values7 = new stdin.Float64Array(heap);
		return {};
	}
}
 类似资料: