第 16 期 - WebAssembly 模块化与动态链接的演进、应用及发展趋势
logoFRONTALK AI/11月8日 16:31/阅读原文

摘要

文章从模块化编程的概念和优势出发,阐述 JavaScript 和 asm.js 的模块化与动态链接机制,详细分析 WebAssembly 的模块化、动态链接关键设计和实现,探讨 WebAssembly 在不同场景下的动态链接示例,最后介绍其动态链接发展趋势,包括相关提案的原理和目标。

一、模块化编程概念与优势

模块化编程是一种软件设计模式,将软件分解为独立、可替换、功能预定的模块,各模块通过接口组合成最终程序。

二、JavaScript 和 asm.js 的模块化与动态链接

(一)JavaScript 模块与动态链接

JavaScript 有多种模块化规范,这里以 CommonJS 为例。

(二)asm.js 模块与动态链接

asm.js 是 WebAssembly 的前身,是可编译期优化的 JavaScript 严格子集。

三、WebAssembly 模块及动态链接

WebAssembly 在 asm.js 基础上扩展了模块和链接机制,定义importexport段。

(一)WebAssembly exports -> JavaScript imports

shared - module.wasm为例,它导出 WebAssembly 核心类型对象。JavaScript 宿主在运行期动态加载shared - module.wasm文件,创建模块实例,为 WebAssembly 执行环境中的exports对象在 JavaScript 环境创建对应实例,之后就可按 JavaScript 访问方式访问和调用这些对象。

(二)JavaScript exports -> WebAssembly imports

对于user - module.wasm,其依赖宿主环境提供的 WebAssembly 核心类型对象。JavaScript 宿主需提供JSModule对象,WebAssembly 虚拟机创建对应的实例对象并绑定,之后 WebAssembly 执行环境可按原生对象访问方式访问JSModule对象。

(三)WebAssembly exports -> WebAssembly imports

现有 WebAssembly 引擎中模块间链接实现未标准化,在 JavaScript 环境中可通过前两种方式组合间接实现。例如,JavaScript 运行环境先加载并实例化shared - module,将其导出变量绑定到JSModule对象,这些变量作为不可变绑定提供给其他 WebAssembly 模块,在user - module.wasm模块加载时,将JSModule中对应实例绑定导入到user - module中完成动态链接。

四、WebAssembly 动态链接发展趋势

(一)WebAssembly/ES Module Integration

目前通过 W3C 标准 JavaScript API 实例化 WebAssembly 模块存在不友好之处,需要手动操作多个步骤。ECMAScript Module Integration提案尝试添加声明式 API 来隐藏这些过程,使 WebAssembly 模块可直接使用 JavaScript 模块的导出对象,还意图实现 WebAssembly 模块与 JavaScript 模块的融合。

(二)Module Linking Proposal

Module Linking提案希望建立可移植、独立于宿主和语言的可组合 WebAssembly 模块生态系统。它扩展 WebAssembly 模块规范,在二进制格式中添加新的Section和索引空间,避免依赖运行时加载程序,让 WebAssembly 运行时完成所有工作,但该提案目前处于“inactive”状态,相关工作转到“Component Model”提案。

(三)Component Model Proposal

Component Model提案希望“自上而下”制定 WebAssembly 下一代标准,核心内容覆盖Module - Link提案关键内容,包括定义可独立编译构建的二进制格式组件、支持多种特性、保持 WebAssembly 独特价值等多项目标,还采用增加间接中间层“Module Linking Layer”的方式来设计,目前处于非常初期的Feature Proposal阶段。

 

扩展阅读

Made by 捣鼓键盘的小麦 / © 2025 Front Talk 版权所有