aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/webassembly/text_format_to_wasm/index.html
blob: 671c2a0b71a96497be8f56b482ae25f00547ea13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
---
title: 将WebAssembly文本格式转换为wasm
slug: WebAssembly/Text_format_to_wasm
tags:
  - WebAssembly
  - wabt
  - wasm
  - wast2wasm
  - 文本格式
  - 汇编
  - 转换
translation_of: WebAssembly/Text_format_to_wasm
---
<div>{{WebAssemblySidebar}}</div>

<p class="summary">WebAssembly 有一个基于S-表达式的文本表示形式,设计为在文本编辑器,浏览器开发人员工具等中暴露的一个中间形式。本文解释了它是如何工作的一些内容以及如何使用可用的工具把文本格式文件转换为.wasm汇编格式文件。</p>

<div class="note">
<p>注:文本格式文件通常被保存为.wat扩展名;有时.wast也被使用,它是说文件包含了额外的测试命令(断言等)并且它们不需要转换到.wasm中。</p>
</div>

<h2 id="初识文本格式">初识文本格式</h2>

<p>让我们看一个简单的例子——下面的程序从一个叫做imports的模块中导入了一个叫做imported_func的函数并且导出了一个叫做exported_func的函数:</p>

<pre>(module
  (func $i (import "<code>imports</code>" "<code>imported_func</code>") (param i32))
  (func (export "exported_func")
    i32.const 42
    call $i
  )
)</pre>

<p>WebAssembly函数exported_func是被导出供我们的环境(比如,使用了WebAssembly模块的网络应用)使用。当被调用的时,它进而调用了一个被导入的叫做imported_func的函数并且向该函数传递了一个值(42)作为参数。</p>

<h2 id="把.wat文本文件转换为.wasm二进制文件">把.wat文本文件转换为.wasm二进制文件</h2>

<p>让我们尝试一下把前面提到的wat文本表示的例子转换为wasm汇编格式。</p>

<ol>
 <li>首先,把前面的清单内容复制到一个文本文件中;命名为simple.wat。</li>
 <li>在使用它之前,我们需要把这个文本表示汇编为浏览器能够识别的汇编语言。为了达到这个目的,我们可以使用wabt工具,该工具包括了在WebAssembly文本表示和wasm之间进行相互转化的编译器以及其他一些功能。访问 <a href="https://github.com/webassembly/wabt">https://github.com/webassembly/wabt</a>——按照该页面的指令来安装好工具。</li>
 <li>当你安装好工具之后,将/wabt/out目录添加到你的系统路径。</li>
 <li>下一步,执行wat2wasm程序,把输入文件的路径传递给它,紧跟一个-o参数,然后是输出文件的路径:
  <pre class="brush: bash">wat2wasm simple.wat -o simple.wasm</pre>
 </li>
</ol>

<p>该命令会把wasm输出到一个叫做simple.wasm的文件,该文件包含了.wasm汇编代码。</p>

<div class="note">
<p><strong></strong>:你可以使用wasm2wat工具把汇编代码转换为文本表示;例如,wasm2wat simple.wasm -o text.wat。</p>
</div>

<h2 id="查看汇编输出">查看汇编输出</h2>

<p>因为输出文件是基于汇编的,所以,它不能在常规的文本编辑器中查看。尽管如此,你可以使用wat2wasm工具的-v选项来查看。试试这个:</p>

<pre class="brush: bash">wat2wasm simple.wat -v</pre>

<p>这会在终端产生一个如下所示的输出:</p>

<p><img alt="several strings of binary with textual descriptions beside them. For example: 0000008: 01 ; section code " src="https://mdn.mozillademos.org/files/14653/assembly-output.png" style="display: block; margin: 0px auto;"></p>

<h2 id="另见">另见</h2>

<ul>
 <li><a href="https://developer.mozilla.org/en-US/docs/WebAssembly/Understanding_the_text_format">理解WebAssembly文本格式</a>——详细解释文本格式语法。</li>
 <li><a href="https://developer.mozilla.org/en-US/docs/WebAssembly/C_to_wasm">从C/C++编译为WebAssembly</a>——诸如Binaryen/Emscripten的工具不但把你的代码编译为wasm而且创建必要的用来在一个JavaScript上下文中运行模块的API代码。关于如何使用它们,可以探究更多内容。</li>
 <li>使用WebAssembly的JavaScript API——如果你想探究关于WebAssembly API代码是如何工作的更多内容,可以阅读这篇文章。</li>
 <li><a href="https://github.com/WebAssembly/design/blob/master/TextFormat.md">文本格式</a>——在WebAssembly的GitHub仓库上面关于文本格式的更多解释。</li>
</ul>