WebAssembly - WASM:初学者的指南
你好啊,未来的编程超级巨星!我很高兴能成为你进入WebAssembly世界的导游,简称WASM。别担心你之前从未写过一行代码——我们将从最基础的知识开始,一起逐步学习。所以,拿起你最喜欢的饮料,坐舒适些,让我们开始吧!
WebAssembly是什么?
WebAssembly就像是一种网页浏览器理解的秘密语言。它旨在让网页应用程序运行得更快、更高效。想象你在网站上尝试玩一个复杂的视频游戏。没有WebAssembly,游戏可能会很慢,操作起来也很笨拙。但有了WebAssembly,游戏可以运行得非常流畅,几乎就像你在游戏机上玩一样!
简短的历史
WebAssembly诞生于让网页应用程序更加强大的愿望。它首次在2015年宣布,到2017年,所有主流网页浏览器都支持它。这在技术领域是相当快的——就像你最喜欢的社会媒体应用更新新功能一样迅速!
栈机模型
现在,让我们来谈谈一些听起来有点技术性的东西,但实际上当你分解它时非常简单:栈机模型。这是WebAssembly工作核心。
什么是栈?
想象一个盘子堆。你只能从堆的顶部添加或移除盘子。在计算机术语中,我们称向栈中添加为“推入”,从栈中移除为“弹出”。
WebAssembly如何使用栈
WebAssembly使用这种栈的概念来执行操作。它就像一个效率极高的厨师在厨房里,总是知道下一个要用哪个食材(或者在我们的例子中是数字)。
让我们看一个简单的例子:
(module
(func $add (param $a i32) (param $b i32) (result i32)
local.get $a
local.get $b
i32.add)
(export "add" (func $add))
)
别慌!我知道这现在看起来像外星语言,但让我们分解一下:
-
(module)
: 这就像说“这是一本新的食谱书”。 -
(func $add ...)
: 我们正在定义一个名为"add"的新函数(或食谱)。 -
(param $a i32) (param $b i32)
: 我们的函数需要两个食材(参数),都是32位整数。 -
(result i32)
: 结果也将是一个32位整数。 -
local.get $a
: 把第一个数字放在我们盘子堆的顶部。 -
local.get $b
: 把第二个数字放在第一个数字的上面。 -
i32.add
: 把顶部的两个数字相加,并用结果替换它们。
所以,如果我们用5和3调用这个函数,我们的栈看起来会像这样:
- 从一个空的栈开始:
[]
- 执行
local.get $a
后:[5]
- 执行
local.get $b
后:[5, 3]
- 执行
i32.add
后:[8]
就这样!我们用WebAssembly的栈机模型加了两数。
为什么使用WebAssembly?
你可能想知道,“这看起来很复杂。为什么不用JavaScript?”好问题!WebAssembly有一些超能力,使它变得特别:
- 速度:对于某些任务,WebAssembly可以比JavaScript运行得更快。
- 效率:它使用更少的内存和处理能力。
- 语言灵活性:你可以用像C++或Rust这样的语言编写代码,然后将其转换为WebAssembly。
想象你正在建造一座沙堡。JavaScript就像是用手建造——它灵活且易于开始。WebAssembly就像有一套专用工具——它可能需要更多的设置,但你可以建造更复杂、更坚固的城堡!
你的第一个WebAssembly程序
让我们写一个简单的程序来加两个数。我们将使用一种叫做WAT(WebAssembly文本格式)的语言,这是WebAssembly的一种人类可读的版本。
(module
(func $add (param $left i32) (param $right i32) (result i32)
local.get $left
local.get $right
i32.add)
(export "add" (func $add))
)
这可能看起来很熟悉——它和我们的前一个例子非常相似!这是它做什么的:
- 定义一个模块(我们的程序)。
- 创建一个名为
$add
的函数,它接受两个32位整数并返回一个。 - 获取第一个数字(
$left
)并将其放在栈上。 - 获取第二个数字(
$right
)并将其放在第一个数字的上面。 - 在栈上添加两个数字。
- 导出这个函数,以便我们可以在JavaScript中使用它。
要在网页中使用它,我们需要一些JavaScript:
fetch('add.wasm')
.then(response => response.arrayBuffer())
.then(bytes => WebAssembly.instantiate(bytes))
.then(results => {
const add = results.instance.exports.add;
console.log(add(5, 3)); // 输出:8
});
这段代码加载我们的WebAssembly模块,创建它的一个实例,然后调用我们的add
函数,传入数字5和3。
结论
恭喜你!你已经迈出了进入WebAssembly世界的第一步。我们介绍了WebAssembly是什么,它如何使用栈机模型,甚至写了我们的第一个WebAssembly程序。
记住,学习编码就像学习一门新语言或乐器——它需要练习和耐心。如果一切不是马上就能理解,不要气馁。继续尝试,继续学习,不久之后,你将用WebAssembly构建惊人的东西!
在我们的下一课中,我们将更深入地探讨更复杂的WebAssembly概念,并开始构建一些非常酷的项目。在此之前,祝你编程愉快!
Credits: Image by storyset