webassembly学习-modules

一、模块

模块这个概念在不同的语言中有不同的定义,但基本上都差不多,比如在这里定义为“The distributable, loadable, and executable unit of code in WebAssembly is called a module.”可以分发、加载、执行的单元。从应用上看,模块相对于动态库可能会更灵活一些,不过话说回来,还是得看具体的应用场景。
WASM的动态链接就是以模块为基础进行的,如果简单的理解成动态库也不是不可以。模块可以实例化,实例化以后就可以运行并控制不同的状态访问。同时,多个模块间还可以共享状态,这个就比较有意思了,因为一般在动态库设计中,一般是不倾向于这种设计,虽然也可以实现,但问题不少。

二、主要字段

1、import
其导入是非常觉的一种标识符,无论是在任何语言中,不可能一个模块包打天下,所以就需要导入其它模块的函数、变量、内存等。这其中,函数是第一位的。在WASM中,还有全局操作符、线性内存和表和导入。所有的导入都有两个隐含的属性即导出名称和模块名称。导入可以更好的让模块间配合工作,不过在Webassembly中,并没有定义导入名称的解释方式,所以在Web和主机等情况下,它们的细节略有不同。
2、export
有导入就有导出,这个是成对的,不然,你导入啥东西。导出一般要有三个字段即名称、类型和索引空间类型。

3、start
这个类似于硬件中的boot,需要定义一个起始点来发动整个模块,但这个Start函数不能有参数和返回值,它即可以是导入也可以是导出,但是只能有一个。start 函数将在模块加载之后和对模块函数的任何调用完成之前调用。

4、global
这个就好理解了,就是全局变量,包括值类型,可变类型和表达式。

5、memory
这个可以理解成堆的一块内存,它是线性的。

6、data
这个类似于一个数组,它和memory的不同可能不是特别强烈。可能知道编译过程中对内存处理的分节就好理解,因为其中有一个.data段。

7、table
表格可以理解成函数的数组指针。也就是说表可以用来索引函数进行引用。
8、elements
元素默认值是标记值,它包含一个元素段数组(可能为空)。其实可以理解成上面所谓的内存等的内部的值或者表达式。
9、function and code
其实这个类似于编译器处理函数,既要有函数签名又要有相关的代码段(函数体)。

三、索引空间

在模块中,除了有上述的功能字段还有索引空间,它由运算符和部分静态索引组成。其主要有以下几种:
1、the function index space
函数索引空间索引用于所有导入的和内部定义的函数定义,根据模块中的定义顺序(由二进制编码定义)分配单调递增的索引。因此,索引空间从0开始,函数导入(如果有)后跟模块中定义的函数。
函数索引空间用于Calls(调用者),识别直接调用的被调用者;具体的元素;Exports(导出),从而确定哪些函数向外输出;启动函数,用于标识实例完全初始化时调用哪个函数。

2、the global index space
全局索引空间索引所有导入的和内部定义的全局定义,根据模块中的定义顺序(由二进制编码定义)分配单调递增的索引。因此,索引空间从零开始,全局导入(如果有),然后是模块中定义的全局变量。
全局索引空间用于全局变量访问操作符,识别要读/写的全局变量;数据段,将数据段的偏移量(在线性内存中)定义为全局变量的值。

3、the linear memory index space
线性内存索引空间索引所有导入的和内部定义的线性内存定义,根据模块中的定义顺序(由二进制编码定义)分配单调递增的索引。因此,索引空间从零开始,内存导入(如果有),然后是模块中定义的内存。线性内存索引空间仅由 数据部分使用。在 MVP 中,最多有一个线性内存,所以这个索引空间只是一个占位符,用于当可以有 多个线性内存时。

4、the table index space
表索引空间索引所有导入的和内部定义的表定义,根据模块中的定义顺序(由二进制编码定义)分配单调递增的索引。因此,索引空间从零开始,表导入(如果有),后跟模块中定义的表。表索引空间仅由元素部分使用。在 MVP 中,最多有一个表,所以这个索引空间只是一个占位符,用于当可以有 多个表时。

其实所谓空间也好理解,就是为了更高层次划分区间。既可以用来识别不同的标识符,又可以方便界定各种函数变量的范围,一举多得。

四、总结

其实接触的语言或者开发工具越多,越会发现,其中整体的思想是相通的,目的都是为了使开发更容易简便,当然,这是相对来说的。不过在外面表面上,大有不同,主要原因在于,其针对的应用场景有所不同。就比如c\c++和Java,有没有虚拟机,有没有GC就是设计此门语言开始的初衷,目的指向非常明确。但后来Java的应用场景扩大到现在的情况,就不是开始想法所能控制的。
与时俱进,善于打破思想上的牢笼,善于自我批评和自我反省,敢于走出舒适区,敢于迎接新的挑战,勤奋努力,勇于实践,就是胜利。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值