WebAssembly 入门课
于航
PayPal 高级软件工程师
10751 人已学习
新⼈⾸单¥29
登录后,你可以任选4讲全文学习
课程目录
已完结/共 23 讲
结束语 (1讲)
WebAssembly 入门课
15
15
1.0x
00:00/00:00
登录|注册

03 | WebAssembly 是一门新的编程语言吗?

你好,我是于航。
“WebAssembly(缩写为 Wasm)是一种基于堆栈式虚拟机的二进制指令集。Wasm 被设计成为一种编程语言的可移植编译目标,并且可以通过将其部署在 Web 平台上,以便为客户端及服务端应用程序提供服务”。这是 Wasm 官网给出的一段,对 “Wasm 是什么?” 这个问题的解答。
其实,在开设这门课程之前,我曾在国内的各类博客和资讯网站上查阅过很多有关 Wasm 的相关资料。发现大多数文章都会声称 “Wasm 是一种新型的编程语言”。但事实真的是这样的吗?希望本篇文章的内容,能够给你心中的这个问题一个更加明确的答案。要想了解 Wasm 究竟是什么,我们还要先从“堆栈机模型”开始说起。

堆栈机模型

堆栈机,全称为“堆栈结构机器”,即英文的 “Stack Machine”。堆栈机本身是一种常见的计算模型。换句话说,基于堆栈机模型实现的计算机,无论是虚拟机还是实体计算机,都会使用“栈”这种结构来实现数据的存储和交换过程。栈是一种“后进先出(LIFO)”的数据结构,即最后被放入栈容器中的数据可以被最先取出。
接下来,我们将尝试模拟堆栈机的实际运行流程。在这个过程中,我们会使用到一些简单的指令,比如 “push”,“pop” 与 “add” 等等。这里你可以把它们想象成一种汇编指令。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

WebAssembly(Wasm)是一种基于堆栈式虚拟机的二进制指令集,被设计成为一种编程语言的可移植编译目标。本文从堆栈机模型、寄存器机和累加器机模型的角度探讨了WebAssembly的运行原理。通过对比这三种计算模型,读者可以更好地理解WebAssembly的特点和运行机制。文章还介绍了ISA与V-ISA的区别,以及Wasm作为一种V-ISA指令集的设计原因。最后,通过展示一段标准的Wasm指令,读者可以对Wasm的执行方式有了更深入的了解。总的来说,Wasm是一种基于堆栈机模型设计的V-ISA指令集,具有助记符形式和二进制字节码形式,适用于高级编程语言的最终编译目标。文章以此为基础,引出了对WebAssembly的认识和定位的讨论。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《WebAssembly 入门课》
新⼈⾸单¥29
立即购买
登录 后留言

全部留言(13)

  • 最新
  • 精选
  • IV0id
    我觉得应该是20啊,命令执行每一行命令之后stack状态如图 i32.const 1 | 1 i32.const 1 | 1,1 i32.eq | 1 i32.const 10 | 1,10 i32.const 10 | 1,10,10 i32.add | 1,20 i32.mul | 20

    作者回复: 很棒!

    2020-09-09
    5
    25
  • wasm 就是一种可以在虚拟机上执行的字节码。 对于 JS 引擎 v8 , SpiderMonkey, JavascriptCore 是不是都支持直接执行 wasm 字节码了?

    作者回复: 是的哈,从目前的实现来看,为了保证 JS 与 Wasm 的互操作性,浏览器基本都是在现有的 JS 引擎基础之上来增加对 Wasm 字节码的支持的。而 Chrome,Firefox 以及 Safari 也都已经支持 Wasm 的 MVP 标准了。

    2020-09-10
    2
    6
  • 军秋
    和汇编的区别是wasm最终是字节码,汇编的最终是机器码。字节码最后会被浏览器转成机器码吗?

    作者回复: 会的,但某些情况下也可能会直接解释执行这些字节码。这个依照具体 JIT 引擎的设计实现来看。

    2020-09-23
    3
  • 大土豆
    说个最能让大家快速理解的说法,就是Java虚拟机,执行的是字节码,不管是什么jvm语言,Java,kotlin等,最后生成字节码就行,字节码就是WASM

    作者回复: 最后一句可以反过来哈,Wasm 是一种字节码格式。

    2020-09-09
    3
  • 请教老师,如果想实现wasm的目的,能否直接使用jvm,而不是另外开发一套V-ISA.

    作者回复: 实际上,从技术角度来看,Java 字节码和 Wasm 都可以被归类为同一种技术实现。即平台 Independency(写中文被判断成敏感词,无语),并且需要由宿主(虚拟机)执行。但由于两者发展的目的,以及所处时代不同,所以与它们配套的工具和基础设施本质上也有一些区别。比如 Wasm 最开始出现在 Web 上,并且在 Web 有一定的应用范畴。但 Java 由于之前 Java Applet 的淘汰,导致 Oracle 也没有在 Web 端恢复 Java 生态的打算。更进一步来看,Wasm 也支持更多源语言。并且 Wasm 字节码和 Java 字节码在设计上也有着很大区别。但最重要的一点是,当两个技术的形态比较类似时,大多数情况下,哪个会被应用的更加广泛实际上完全取决于社区整体的状态,而非技术本身。

    2022-01-10
    2
  • pedro
    最后的结果应该是 110,错了请指正。 这节可以说完全道出了 webassembly 的本质,它并不是一种新的编程语言,因为你只需要编写其他的语言,例如 c++ 和 rust 从而生成对应的字节码。 对于栈模型的语言太多了,例如 Java,寄存器模型有 lua,请问一下老师累加器模型的编程语言有哪些了?

    作者回复: 答案是 20,具体执行过程可以参考另一位同学画的栈图哈。累加器机模型实际上是一种十分古老的计算机模型,放在这里讲其实是考虑到内容的完整性。实际上,据我所知没有使用累加器机模型设计的虚拟机字节码(语言)。而比如像 “MOS 6502” 这类早期的硬件微处理器,实际上是采用了累加器模型这种结构来进行设计的。

    2020-09-09
    2
    2
  • Geek_175b82
    这是不是类似于Java 的.class字节码文件?

    作者回复: 对的,可以这样类比。

    2020-10-17
    1
  • 严敏
    请问WASM中对在浏览器中对socker支持的如何

    作者回复: WASM 作为一套新的字节码,本身并不提供对 socket 这类宿主功能的支持。相对的,这部分功能由 WebAssembly System Interface 来抽象和定义,可以看看这里:https://github.com/WebAssembly/wasi-sockets

    2023-03-11归属地:浙江
  • only
    有一点不明白,是浏览器集成了wasm的虚拟机还是操作系统集成了wasm虚拟机?

    作者回复: Wasm 本质上是一套抽象的字节码格式,它不对应于任何物理体系,因此如何去执行这些字节码,标准中并没有规定。所以你能够看到现在有很多各种各样的独立虚拟机引擎(比如 WAVM、wasmtime 等)都可以去执行这些字节码。当然,浏览器在 V8 引擎里也构建了一套可以执行 Wasm 的虚拟机,使得它们可以与 JS 环境交互,来完成 Web 应用的相关功能需求。

    2022-05-04
  • sheeeeep
    我的答案 1,1 1 1,10,10 1,110 110

    作者回复: 可以再想想哦。

    2020-09-09
    2
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部