《WebAssembly 权威指南》(7)WebAssembly 表

4e6ad10a3ad2ea804b92467c6fe3f843.gif

本文是《WebAssembly 权威指南》系列文章第 7 篇,系列文章列表:

译者注:这篇文章是《WebAssembly 权威指南》一书的第七章,介绍了 WebAssembly 的表(table)的概念和用法。表是一种存储函数指针的数据结构,可以让模块间动态地调用彼此的函数。文章分析了表的类型、元素、导入和导出等特性,并给出了几个使用表的示例代码,包括 C/C++ 和 JavaScript 的互操作。文章最后讨论了表的局限性和未来发展方向。

人们经常在餐桌上分享自己的想法和故事。与他人一起吃饭比自己一个人吃饭更有趣。如果你把一群来自各行各业的人聚集在一起,可能有谈不完的话题。没有人可以面面俱到。有的人可能分享相同故事的某些方面。其他人可能有他们自己的版本。然而必须有一定的礼仪、克制,并愿意接受其他参与者提供的东西。那些行为不端、喋喋不休或相互踩线的客人会毁了大家的晚餐。

表是 WebAssembly 成为一个现代软件系统的一个特点,其功能依赖将由额外的模块来满足。与静态链接库相比,它提供了相当于动态共享库的能力。不是每个模块都需要具有所有功能才能工作。这将使效率低的可怕。相反,它是根据一些其他模块在运行时满足需求的承诺来编写的。这在 C 和 C++ 世界中被称为动态链接。很明显,餐桌论只是对表(Table)这个词的玩味,就像在吃饭时需要礼仪一样,库之间的分享也需要规范。让我们更仔细地探讨这个想法,然后看看 WebAssembly 是如何支持的。

静态链接与动态链接

任何在 Twitter 上关注我的人都知道我妻子是一个多么了不起的厨师。她来自一个伟大的厨师家庭,有机会向很多大师学习。人们经常看到我发布的关于她制烹饪的帖子,并向我索取食谱。这通常不像发送一个链接那么容易,因为她经常把来自多个来源的想法结合起来,然后把自己的想法放在上面。

在我们家,她可以依靠她所积累的食谱库。她可以说,"用那本书里的酱汁做这个。用另一本书中描述的技术准备牛肉。在牛肉达到你想要的熟度后,加入这些我认为会让它变得更好的额外成分"。

在我们家,她可以参考已知来源的步骤和配料表,并以她的额外步骤修正过程。但是当她想把菜谱交给别人时,她不能默认人们有这些书。在这种情况下,她将不得不把她的来源中的食谱复制到完整的食谱文件中。这时,所有的步骤和成分都会被定义在一个地方,食谱就可以发给别人了。

这基本上就是静态链接和动态链接的区别。一个典型的程序需要读写文件的内容,打开窗口,收集用户的输入,或在网络上发送消息。这些都是很常见的任务,它们通常可以作为操作系统提供的库中的功能。当你希望使用其中的一个函数时,你会告诉链接器允许运行时链接。否则,它将抱怨缺少符号参考。

在运行时,操作系统将搜索其配置路径,告诉它在哪里可以找到这些共享库。在启动程序之前,它将把库中的功能映射到一个可以动态链接到其余代码的内存位置。 这样做有很多原因。首先是效率问题。比方说,你有一个名为 a () 的函数被十几个其他程序引用。通过静态链接,每个可执行程序都有自己的副本。程序占用了更多的磁盘空间。它们在运行时的内存足迹也会变大。这不将浪费磁盘和内存空间。

如果动态库被加载到一个共享的内存空间,那么我们的磁盘上只需要一个文件副本。根据你的操作系统的复杂性,内存中可能也只需要一个副本。

动态链接库通常有自己的发布周期。如果你正在使用一个可执行程序的系统库,你可能会更新操作系统并得到一个带有安全补丁的新版本的库。只要编号机制正常,并且是向后兼容的,就可以通过使用打了补丁的版本来加强你的应用程序的安全性,而不需要做任何其他事情。

请看例 7-1,这是一个独立的函数,没有 main () 函数。它的目的是作为一个库来使用。我们可以把它编译成一个静态库,但现在我们只需创建目标代码,并将我们的 main () 程序与之链接。注意, 这个函数也依赖于 printf (),所以它必须导入 s

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值