ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

WebAssembly学习(六):AssemblyScript - 限制与类型

2019-02-27 23:44:43  阅读:328  来源: 互联网

标签:WebAssembly 限制 MIN MAX VALUE i32 类型 AssemblyScript


一、限制

将无类型的JavaScript编译为WebAssembly没有意义,因为它最终会导致运行其中较慢的一个JavaScript。

相反,AssemblyScript专注于WebAssembly擅长的地方,并且不支持回退到无法提前有效编译的JavaScript的动态特性:

1.强制类型

  • 比 TypeScript 多了很多更细致的内置类型,以优化性能和内存占用,详情文档;
  • 没有联合类型,因为所有内容都必须按设计进行静态类型化;
  • 不能使用 any 和 undefined 类型,以及枚举类型;
  • 可空类型的变量必须是引用类型,例如 ClassType | null,而不能是基本数据类型如 string、number、boolean;
  • 函数中的可选参数必须提供默认值,函数必须有返回类型,无返回值的函数返回类型需要是 void;
    • 如果初始化是整数字面量,则假定i32适合32位,否则假设为i64。
    • 如果初始化是浮点数,则假定为f64。
    • 否则,将评估初始化程序以获取其类型。

总体来说 AssemblyScript 比 TypeScript 又多了很多限制,编写起来会觉得局限性很大; 用 AssemblyScript 来写 WebAssembly 经常会出现 tsc 编译通过但运行 WebAssembly 时出错的情况,这很可能就是你没有遵守以上限制导致的;但 AssemblyScript 通过修改 TypeScript 编译器默认配置能在编译阶段找出大多错误。

AssemblyScript 的实现原理其实也借助了 LLVM,它通过 TypeScript 编译器把 TS 源码解析成 AST,再把 AST 翻译成 IR,再通过 LLVM 编译成 WebAssembly 字节码实现; 上面提到的各种限制都是为了方便把 AST 转换成 LLVM IR。

2.详细说明

  • const和static readonly关键字当前与其他语言中的static const类似,需要编译时常量初始化程序,否则会回退到可变变量。
  • 在JavaScript中,类的静态字段在定义时始终进行求值,而在AssemblyScript中,内置树抖动时会在引用时懒惰地编译静态字段。

当调用一个从Js中导出的可变参数长度的WebAssembly函数时,例如:

1 export function add(a: i32 = 1, b: i32 = 2): i32 {
2   return a + b;
3 }

必须明确指定调用的实际参数数量,因为WebAssembly端没有与arguments.length等效的内容。 例如:

1 exports._setargc(0);
2 exports.sum(); // 3
3 
4 exports._setargc(1);
5 exports.sum(2); // 4
6 
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是未来的功能

标签:WebAssembly,限制,MIN,MAX,VALUE,i32,类型,AssemblyScript
来源: https://www.cnblogs.com/jixiaohua/p/10447701.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有