我第一次涉足 WebAssembly 的经验教训

💡 原文中文,约10100字,阅读约需24分钟。
📝

内容提要

作者分享了使用WebAssembly(WASM)开发水排序游戏的经验。最初,他用SDL2创建了桌面游戏,后希望在手机上运行,因此重写为JavaScript并探索WASM。文章介绍了WASM的基本概念、模块结构、编译过程及其与WASI的结合,强调了开发中的挑战和调试困难。最终,游戏成功在浏览器中运行,并提供了相关代码示例。

🎯

关键要点

  • 作者分享了使用WebAssembly开发水排序游戏的经验。
  • 最初使用SDL2创建桌面游戏,后重写为JavaScript并探索WASM。
  • 介绍了WASM的基本概念、模块结构、编译过程及其与WASI的结合。
  • 强调了开发中的挑战和调试困难。
  • 游戏成功在浏览器中运行,并提供了相关代码示例。
  • WASM定义了哈佛架构的抽象堆栈机和相关格式,只有四种类型:i32、i64、f32和f64。
  • WASM模块包含代码、类型、全局、导入表、导出表等部分。
  • WASM运行时加载模块并执行入口点,进行类型检查。
  • WASM编译器将高级语言转换为低级WASM,Clang是主要讨论的编译器。
  • WASM链接器确定模块形状并链接函数。
  • 语言运行时可能会映射到标准化的导入集,WASI定义了一系列类似POSIX的函数。
  • WASM二进制工具包(WABT)用于检查WASM模块。
  • 学习WASM时,相关信息难以获取,重要技术细节散落各处。
  • 示例程序展示了如何使用Clang编译WASM。
  • 水排序游戏没有导入任何函数,仅导出了三个函数。
  • 调试WASM程序非常困难,建议在更适合的平台上开发后再移植到WASM。
  • WASI使得开发更容易,提供了基本的类型定义和fd_write函数。
  • WASI的文件操作API复杂,涉及预打开目录和虚拟文件系统。
  • 使用clang编译时可以通过选项调整堆栈位置,避免堆栈溢出问题。
  • 提供了u-config的WASM移植示例,支持WASI的WASM运行时中运行。

延伸问答

WebAssembly(WASM)是什么?

WebAssembly是一种规范,定义了哈佛架构的抽象堆栈机和相关格式,支持四种基本类型:i32、i64、f32和f64。

作者为什么选择使用WASM开发游戏?

作者希望将最初使用SDL2创建的桌面游戏移植到手机上,因此选择了WASM以实现浏览器运行。

WASM模块的组成部分有哪些?

WASM模块包含代码、类型、全局、导入表、导出表等部分,导出表列出了模块的入口点。

在开发WASM程序时遇到的主要挑战是什么?

调试WASM程序非常困难,且相关信息难以获取,重要技术细节散落各处。

WASI在WASM开发中有什么作用?

WASI提供了一系列类似POSIX的函数,简化了WASM应用程序的开发,尤其是在文件操作方面。

如何使用Clang编译WASM程序?

使用Clang编译WASM程序时,可以通过指定目标为wasm32并使用相关编译选项来生成WASM格式的对象文件。

➡️

继续阅读