WebAssembly原理与核心技术
上QQ阅读APP看书,第一时间看更新

1.3 准备工作

本书不仅是一本介绍Wasm工作原理的技术书,也是一本教读者实现Wasm的“造轮子”指导书。所以在正式介绍和动手开发Wasm之前,有必要做一些准备工作。

1.下载本书源代码

请从https://github.com/zxh0/wasmgo-book下载本书源代码。

本书主要涉及4种编程语言:Go、WAT、Rust和JavaScript。Go语言是本书实现Wasm所使用的语言,源代码在code/go目录下,每章一个目录。以第2章为例,实现代码的根目录是code/go/ch02/wasm.go/,里面是完整的Go项目,可以直接编译,或者用GoLand等IDE打开。用WAT编写的Wasm示例代码统一放在code/wat目录下,以ch+章号为前缀,例如code/wat/ch05_param.wat。Rust示例代码在code/rust/examples目录下,这是一个独立的Cargo项目,进入目录后,可以直接用cargo命令编译。只有第1章有少量HTML/JavaScript代码,放在code/js目录下。下面是随书源代码的总体目录结构。


wasmgo-book/code/
    go/chXX/wasm.go/
    wat/chXX_YYY.wat
    rust/examples/
    js/

2.安装Go

本书没有使用协程、通道、反射等Go语言高级特性,因此只要了解Go语言的基本语法即可读懂本书代码。由于本书Go项目依赖Go 1.11(2018年8月发布)引入并在Go 1.14(2020年2月发布)稳定的模块系统,所以推荐读者安装Go 1.14或更高版本。我们可以执行下面的命令确认Go安装无误。


$ cd wasmgo-book/code/go/ch01/wasm.go/
$ go run wasm.go/cmd/wasmgo
Hello, WebAssembly!

本书出现的命令均采用UNIX命令行形式,使用的编程语言均是跨平台的,所以这些命令在其他操作系统上的运行效果都差不多。如果读者使用的是Windows操作系统,需要对路径分隔符等做适当调整。

3.安装Rust

本书只有少数几个例子是用Rust语言编写的,即使完全不懂Rust语言也不影响阅读。建议读者使用rustup安装Rust最新版本,然后安装wasm32(这里的“32”指32比特地址)编译目标。


$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ rustup target add wasm32-unknown-unknown

读者可以执行下面的命令确认Rust安装无误。


$ cd wasmgo-book/code/rust/examples
$ cargo build --target wasm32-unknown-unknown --release
$ ls -l target/wasm32-unknown-unknown/release/*.wasm

4.安装WABT

WABT是一个Wasm二进制工具箱(WebAssembly Binary Toolkit),提供了很多处理Wasm二进制格式的工具,包括WAT汇编器wat2wasm、反汇编器wasm2wat、Wasm二进制格式查看工具wasm-objdump、二进制格式验证工具wasm-validate等。本书主要使用了wasm-objdump、wat2wasm和wasm2wat这3个工具。读者可以复制WABT项目,然后按照说明在本地编译这个工具箱,使用macOS系统的读者也可以通过Homebrew直接安装编译好的WABT最新版本。执行下面的命令确认WABT安装无误。


$ cd wasmgo-book/code/wat
$ wat2wasm ch05_param.wat
$ wasm-objdump -h ch05_param.wasm # 打印段头信息
$ wasm-objdump -x ch05_param.wasm # 打印详细信息
$ wasm-objdump -d ch05_param.wasm # 反编译字节码