浏览器内执行的工具质量往往参差不齐。WebAssembly 旨在通过暴露 低级功能 而不是规定应该构建哪些工具来支持真正优秀的工具。这使得
- 将现有且熟悉的工具移植到 WebAssembly;
-
构建特别适合 WebAssembly 的新工具。
WebAssembly 开发应该是自托管的,不只是一个小技巧,而是一个开发人员积极寻求的愉快平台,因为他们想要和需要的工具可以正常使用。开发人员对工具有很高的期望,满足这些期望意味着 WebAssembly 具有构建面向非开发人员的丰富应用程序所需的功能。
我们期望支持的工具包括
- 编辑器
- 像 vim 和 emacs 这样的编辑器应该可以正常使用。
- 编译器和语言虚拟机
- 可以针对 WebAssembly 的语言(C/C++、Rust、Go、C#)的编译器应该能够在 WebAssembly 本身运行,并生成一个可以执行的 WebAssembly 模块。
- 像 bash、Python、Ruby 这样的语言的虚拟机应该可以工作。
- 使用即时编译器的虚拟机(JavaScript VM、luajit、pypy)应该能够支持 WebAssembly 的新即时后端。
- 调试器
- 基本浏览器集成可以通过源映射支持来完成。
- 像 C++ 这样的语言的完全集成需要更多关于调试信息格式的标准化工作,以及中断程序、检查其状态、修改其状态的权限。
- 调试信息最好按需提供,而不是内置到 WebAssembly 模块中。
- 针对 非内存安全 语言的清理器:asan、tsan、msan、ubsan。高效支持清理器可能需要改进
- 陷阱支持;
- 影子堆栈技术(通常通过
mmap
的 MAP_FIXED
实现)。
- 针对开发人员自己代码的可选 安全 增强:针对 WebAssembly 的开发人员可能希望他们自己的代码比 WebAssembly 实现为了保护用户而要求的更进一步地沙盒化。
- 分析器
- 进程转储:局部变量、调用堆栈、堆、全局变量、线程列表。
- JavaScript+WebAssembly 大小优化工具:大型 WebAssembly+JavaScript 混合应用程序、调用 JavaScript 库以与 Web 平台其余部分通信的 WebAssembly,需要工具来执行跨 API 边界的死代码剥离和全局优化。
在很多情况下,工具将是纯 WebAssembly,没有 WebAssembly 的任何工具特定支持。对于调试来说这是不可能的,但对于清理器来说应该是完全可能的。