b;
必须明确指定调用的实际参数数量,因为WebAssembly端没有与arguments.length等效的内容。 例如:
1 exports._setargc(0);
2 exports.sum(); // 3
4 exports._setargc(1);
5 exports.sum(2); // 4
7 exports._setargc(2);
8 exports.sum(2, 3); // 5
与在JS中使用各种数值的数字类型不同,AssemblyScript将它们拆分为更精确的整数和浮点类型,这些类型直接映射到WebAssembly类型。
1.原生类型
i32/u32 一个32位有符号/无符号整数。
i64/u64 一个64位有符号/无符号整数。
f32 一个32为浮点数。
f64 一个64位浮点数。
2.模拟类型
i8/u8 一个8字节的有符号/无符号整数。
i16/u16 一个16字节的有符号/无符号整数。
bool 一个1字节无符号整数。
注意:模拟类型被隐式符号扩展,分别被屏蔽以处理溢出。 在进行大量数学运算时,建议在计算中使用原生类型,然后将值存储回模拟类型,上面的"位"即byte,字节。
3.针对特定类型
isize/usize 当目标是32位WebAssembly时,一个32位有符号/无符号整数;当目标是64位WebAssembly时,一个64位有符号/无符号整数。在其他语言中相当于void*, size_t等。
注意,使用目标特定类型可能需要也可能不需要显式强制类型,具体取决于目标。
注意,WASM64是未来的功能🦄,现在在任何地方都不受支持。
4.特殊类型
void 表示函数无返回值。
5.范围限制
为方便起见,以下范围限制作为全局常量出现:
ConstantValue
i8.MIN_VALUE: i8
i8.MAX_VALUE: i8
i16.MIN_VALUE: i16
-32768
i16.MAX_VALUE: i16
32767
i32.MIN_VALUE: i32
-2147483648
i32.MAX_VALUE: i32
2147483647
i64.MIN_VALUE: i64
-9223372036854775808
i64.MAX_VALUE: i64
9223372036854775807
isize.MIN_VALUE: isize
target specific: either i32.MIN_VALUE
or i64.MIN_VALUE
isize.MAX_VALUE: isize
target specific: either i32.MAX_VALUE
or i64.MAX_VALUE
u8.MIN_VALUE: u8
u8.MAX_VALUE: u8
u16.MIN_VALUE: u16
u16.MAX_VALUE: u16
65535
u32.MIN_VALUE: u32
u32.MAX_VALUE: u32
4294967295
u64.MIN_VALUE: u64
u64.MAX_VALUE: u64
18446744073709551615
usize.MIN_VALUE: usize
usize.MAX_VALUE: usize
target specific: either u32.MAX_VALUE
or u64.MAX_VALUE
bool.MIN_VALUE: bool
bool.MAX_VALUE: bool
f32.MIN_VALUE: f32
-3.40282347e+38
f32.MAX_VALUE: f32
3.40282347e+38
f32.MIN_SAFE_INTEGER: f32
-16777215
f32.MAX_SAFE_INTEGER: f32
16777215
f32.EPSILON: f32
1.19209290e-07
f64.MIN_VALUE: f64
-1.7976931348623157e+308
f64.MAX_VALUE: f64
1.7976931348623157e+308
f64.MIN_SAFE_INTEGER: f64
-9007199254740991
f64.MAX_SAFE_INTEGER: f64
9007199254740991
f64.EPSILON: f64
2.2204460492503131e-16
1 var i8val : i8 = -128; // 0x80
2 var u8val : u8 = i8val; // becomes 128 (0x80)
3 var i16val : i16 = i8val; // becomes -128 through sign-extension (0xFF80)
4 var u16val : u16 = i8val; // becomes 65408 through masking (0xFF80)
5 var f32val : f32 = i8val; // becomes -128.0
7.可比性
可以在可分配性中概述的相同规则下执行比较不同类型的两个值而无需显式转换
1.如果比较是绝对的 (==
, !=
)
2.如果比较是相对的 (>
, <
, >=
, <=
) 并且两种类型都具有相同的签名
因为WebAssembly对签名和未签名的比较具有不同的操作。 比较使用较大的类型并返回一个bool。
8.除法和余数
划分或取出除以不同类型的两个值的余数,可以在可转让性中概述的相同规则下进行显式转换。
如果两种类型都具有相同的签名
因为WebAssembly对有符号和无符号除法和余数有不同的操作。 结果是更大的类型。
9.位运算
位运算(<<,>>)的结果是左类型,右类型隐式转换为左类型,如果左类型是有符号的,则执行算术移位;如果左类型是无符号,则执行逻辑移位。
无符号右移(>>>)的结果是左类型(保留了符号),右类型隐式转换为左类型,但始终执行逻辑移位。
如果左类型是浮点数,则会发出错误。
WebAssembly基本概念到此结束,虽然有很多不理解的东西,但还是先记录在此,慢慢学习。
参考原文:
https://github.com/AssemblyScript/assemblyscript/wiki/Types
WebAssembly 现状与实战