WebAssembly—“求求你别更新了,学不动了”

使用 Rust 和 wasm-pack 开发 WebAssembly 应用 是一种运行在现代 Web 浏览器中的新型二进制指令格式。它是一种低级别的字节码,可以被多种语言编译,并在浏览器中高效运行。要将 Rust 代码编译为 WebAssembly 并与 JavaScript 集成,wasm-pack是不可或缺的工具。环境配置:安装了 Rust、wasm-pack,以及 Node.js 和 npm,为开发奠定了基础。创建 Rust 项目:使用cargo创建了一个新的库项目,并编写了简单的 Rust 函数。编译为 WebAssembly:通过。 阅读详情

本篇文章参考以下博文

前言

  最近在学习 Deno 的时候,发现原生支持 WebAssembly 类型 ,第一眼接触的时候有点陌生,查了一下资料后浑身冷汗。

  简单来说,这东西可以让 C,C++ 的开发或者一些其他语言的开发,编写的代码运行在浏览器上,完事运行效率还比 JavaScript 高,而且更轻量级。据说执行速度比 JS 高 10倍 !
在这里插入图片描述
  各位前端开发,为了不丢饭碗,含着泪也要学。

一、知己知彼

  首先我们得要了解一下 JavaScript 本身的运行机制,当把编写的代码放到浏览器上的时候,我们希望浏览器可以按照代码里面的描述,操作计算机完成相关功能,由于计算机并不认识 JavaScript 所以这个时候 JS引擎 站了出来,我们熟悉的 V8 就是这样一名翻译官。

  接下来一个问题就是,该怎么翻译?

  一般来说,发言者说一句,翻译官就解释一句,有条不紊的进行,直到完成所有。这种模式就是 解释器 (及时生效)。

  另一方式是翻译书籍,翻译官会把整本书都翻译过来之后,再进行发布,这种模式就是 编译器 ,你看到的东西,已经全部翻译好了(执行前翻译)。

  每种方式都有优缺点。

1.1 解释器

  解释器很快的获取代码并且执行。我们不需要执行代码的时候知道全部的编译步骤。因此,解释器与 JavaScript 有着天然的契合。 web 开发者能够立即得到反馈很重要。

  这也是浏览器最开始使用 JavaScript 解释器的原因之一。

  但是使用解释器的弊端是当您运行相同的代码的时候。比如,当执行了一个循环。然后就会一遍又一遍的做同样的事情。

1.2 编译器

  编译器则有相反的效果。在程序开始的时候,它可能需要稍微多一点的时间来了解整个编译的步骤。但是当运行一个循环的时候他会更快,因为他不需要重复的去翻译每一次循环里的代码。

1.3 浏览器

  浏览器为了提高性能,引入了编译器,不同的浏览器实现起来稍有不同,但是基本目的是相同的。他们给 JavaScript 引擎添加了一个新的部分,称为监视器(也称为分析器)。该监视器在 JavaScript 运行时监控代码,并记录代码片段运行的次数以及使用了那些数据类型。

  如果相同的代码行运行了几次,这段代码被标记为 “ warm ”。如果运行次数比较多,就被标记为 “ hot ”。被标记为 “ warm ” 的代码被扔给基础编译器,只能提升一点点的速度。被标记为 “ hot ” 的代码被扔给优化编译器,速度提升的更多。

1.4 性能比较

1.4.1 解析

   JavaScript 源码一旦被下载到浏览器,源将被解析为抽象语法树( AST )。

  通常浏览器解析源码是懒惰的,浏览器首先会解析他们真正需要的东西,没有及时被调用的函数只会被创建成存根。

  在这个过程中, AST 被转换为该 JS 引擎的中间表示(称为字节码)。

  相反, WebAssembly 不需要被转换,因为它已经是字节码了。它仅仅需要被解码并确定没有任何错误。

1.4.2 编译 + 优化

  如前所述, JavaScript 是在执行代码期间编译的。因为 JavaScript 是动态类型语言,相同的代码在多次执行中都有可能都因为代码里含有不同的类型数据被重新编译。这样会消耗时间。

  相反, WebAssembly 与机器代码更接近。例如,类型是程序的一部分。这是速度更快的一个原因:

  • 编译器不需要在运行代码时花费时间去观察代码中的数据类型,在开始编译时做优化。
  • 编译器不需要去每次执行相同代码中数据类型是否一样。
1.4.3 垃圾回收

  在 JavaScript 中,开发者不需要担心内存中无用变量的回收。 JS引擎 使用一个叫垃圾回收器的东西来自动进行垃圾回收处理。

  这对于控制性能可能并不是一件好事。你并不能控制垃圾回收时机,所以它可能在非常重要的时间去工作,从而影响性能。

  现在, WebAssembly 根本不支持垃圾回收。内存是手动管理的(就像 C/C++ )。虽然这些可能让开发者编程更困难,但它的确提升了性能。

二、WebAssembly 如何工作

  要了解 WebAssembly 如何工作,需要先了解计算机是如何解析和理解交流内容的,计算机可以分为三部分功能:

  • 负责思考的部分是算术逻辑单元( ALU )。
  • 短期储存由寄存器( Registers )提供。
  • 随机存储器(或 RAM )来提供长期储存能力
    在这里插入图片描述

  机器码中的语句被称为指令。

  当一条指令进入计算机时会发生什么?它被拆分成了多个的部分并有特殊的含义。

  被拆分成的多个部分分别进入不同的计算机单元进行处理,这也是拆分指令所依赖的方式。

  例如,这个计算机从机器码中取出 4-10 位,并将它们发送到 ALU 。 ALU 进行计算,它根据 0 和 1 的位置来确定是否需要将两个数相加。

  这个块被称为“操作码”,因为它告诉 ALU 执行什么操作。
在这里插入图片描述

  那么这个计算机会拿后面的两个块来确定他们所要操作的数。这两个块对应的是寄存器的地址。
在这里插入图片描述

  请注意添加在机器码上面的标注( ADD R1 R2 ),这使我们更容易了解发生了什么。这就是汇编。它被称为符号机器码。这样人类也能看懂机器码的含义。

  可以看到,这个机器的汇编和机器码之间有非常直接的关系。每种机器内部有不同的结构,所以每种机器都有自己独有的汇编语言。

  所以我们并不只有一个翻译的目标。

  相反,我们的目标是不同类型的机器码。就像人类说不同的语言一样,机器也有不同的语言。

  我们希望能够将这些任何一种高级编程语言转换为任何一种汇编语言。这样做的一个方法是创建一大堆不同的翻译器,可以从任意一种语言转换成任意一种汇编语言。
在这里插入图片描述

  这样做的效率非常低。为了解决这个问题,大多数编译器会在高级语言和汇编语言之间多加一层。编译器将把高级语言翻译成一种更低级的语言,但比机器码的等级高。这就是中间代码( IR )。
在这里插入图片描述

  意思就是编译器可以将任何一种高级语言转换成一种中间语言。然后,编译器的另外的部分将中间语言编译成目标机器的汇编代码。

  编译器的“前端”将高级编程语言转换为 IR 。编译器的“后端”将 IR 转换成目标机器的汇编代码。

三、WebAssembly 适合在哪里使用?

  当你的代码运行在用户的机器的 web 平台上的时候,你不知道你的代码将会运行在那种机器结构上。

  所以 WebAssembly 和别的汇编语言是有一些不同的。所以他是一个概念机上的机器语言,不是在一个真正存在的物理机上运行的机器语言。

  正因如此, WebAssembly 指令有时候被称为虚拟指令。它比 JavaScript 代码更快更直接的转换成机器代码,但它们不直接和特定硬件的特定机器代码对应。

  在浏览器下载 WebAssembly 后,使 WebAssembly 的迅速转换成目标机器的汇编代码。
在这里插入图片描述

  如果想在页面里上添加 WebAssembly ,需要将代码编译成 .wasm 文件。

  当前对 WebAssembly 支持最多的编译器工具链称是 LLVM 。有许多不同的“前端”和“后端”可以插入到 LLVM 中。

四、在 JavaScript 中加载一个 .wasm 组件

   .wasm 文件是 WebAssembly 组件,它可以被 JavaScript 加载。到目前为止,加载过程有点复杂。

function fetchAndInstantiate(url, importObject) {
  return fetch(url).then(response =>
    response.arrayBuffer()
  ).then(bytes =>
    WebAssembly.instantiate(bytes, importObject)
  ).then(results =>
    results.instance
  );
}

  后面会慢慢优化到模块管理工具(如 Webpack )或加载器(如 SystemJS )相结合

  注意: WebAssembly 模块和 JS 模块之间存在重大差异。目前 WebAssembly 中的函数只能使用 WebAssembly 类型(整数或浮点数)作为参数或返回值。对于任何更复杂的数据类型(如字符串),必须使用 WebAssembly 模块的内存。

总结

  看到这里可能大家对于 WebAssembly 还是没有一个具象的认识,或者大家关心的只是这玩意会不会取代 JS ?

  大家不用担心这些,这两者是可以共存的,比如 JS 就可以引入 WebAssembly 来处理一些比如动画等较为消耗性能的模块。虽然 WebAssembly 可以把让其他语言代替 JS 进行工作,但是 JS 配套的生态,快速生成页面的能力,能甩 WebAssembly 好几条街。

  作为一名开发,入行那天我已经做好终身学习的准备了,当每天都能看到不同世界的时候,我会更好奇这个世界。

  




WebAssembly编译之(2)-Ubuntu搭建WASM编译环境 Ubuntu下搭建WebAssembly编译环境 阅读详情

相关推荐

【FPGA】AD9653设计和调试总结

基于FPGA的AD9653设计,设计思路,注意事项

weixin_41246509的博客 7591

2018年第29周-快速地在老项目中使用vue的经验

原有项目使用vue的痛点 前端技术的发展可谓日新月异,更有甚者,在deno开源项目的issue中发“求不要更新了,老子学不动了”,这新闻传遍中国的技术圈子,有人说这是中国人的耻辱。这里我就不评论好坏。但可见,前端发展的速度非常惊人。 但“存在即合理”,黑格尔的这句话,在技术领域更加是。能够发展的技术,一定更人们带来便利。扩大解决问题的范围...

weixin_34418883的博客 510

【simulink模型】独立悬架振动模型,七自由度整车simulink模型

车辆悬架系统的设计对提升车辆行驶平顺性和操纵稳定性具有重要意义。本文构建了独立悬架的振动仿真模型以及七自由度整车动力学模型,基于 Simulink 平台实现对模型的动态响应仿真。通过对比不同工况下的车辆振动响应,验证了模型的准确性与实用性。研究结果为车辆悬架系统的优化设计提供了有力支持。

2401_84610415的博客 1583

再见,前端!别更新了,我是学不动了

01.前端饱和了? 随便打开一个招聘网站,以“前端”为关键字进行搜索,都会看到很多的招聘信息,而且薪资都很高。 据国内权威数据统计,未来五年,我国信息化人才总需求量高达 1500万—2000 万人。其中“网络工程”“ Web 前端”等人才的缺口最为突出。 目前不仅大型互联网公司,还是中小型公司和创业公司都急需专业的 Web 前端工程师。据统计,我国对于 Web 前端工程师人员的缺口已达到 10万以上。 可是,网上却一直充斥着“前端饱和了”、“前端热度降低了”、“前端工作没有那么好找了”,其实提出这样问题

jinmu520的博客 1361

PyBioMed学习

PyProtein。

weixin_63016274的博客 1401

TSMaster二次开发实战:如何用Python搞定CAN/CANFD事件回调(附完整代码)

本文详细介绍了如何利用Python进行TSMaster二次开发,实现CAN/CANFD事件回调功能。通过实战代码演示,讲解了预发送与后处理回调的核心区别、注册流程、资源管理及性能优化技巧,帮助工程师高效构建自动化测试与数据监控应用。

star的博客 668

WebAssembly 基本了解

现代浏览器朝着第二操作系统一路狂奔,网页在线 PS、3D 地图、音视频编解码、游戏引擎等等应用,都在浏览器实现了,这都是基于 WebAssembly。WebAssem应不应该卷起来?

wade3po的博客 7358

异步FIFO的隐形陷阱:复位信号同步化实战解析

本文深入解析异步FIFO设计中复位信号同步化的隐形陷阱,重点分析赛灵思xpm_fifo_async原语在FPGA应用中的常见问题。通过实战代码和系统集成方案,提供复位同步化的最佳实践,帮助工程师避免跨时钟域通信故障,提升系统可靠性。

keras9composer的博客 245

什么是WebAssembly(Wasm)?

文章目录WebAssembly是什么?WebAssembly和JavaScript WebAssembly是什么? WASM是什么?带你了解WebAssembly的前世今生 参考URL: http://www.mabiji.com/webassembly/wasm.html WebAssembly是什么?WebAssembly即WASM, WebAssembly是一种新的编码格式并且可以在浏览器中运行,WASM可以与JavaScript并存,WASM更类似一种低级的汇编语言。 WebAssembly(又名w

西京刀客 4万+

ChatGPT启蒙之旅:弟弟妹妹的关键概念入门

本文主要介绍了ChatGPT启蒙之旅:弟弟妹妹的关键概念探险,希望能对初学大模型的同学们有所帮助。 文章目录 1. 背景 2. GPT是个什么样的人? 3. GPT使用的核心思维 4. GPT使用的场景介绍

herosunly的博客 16万+

站在评审的角度写国自然基金本子,搭配这5条AI提示词,帮你一键提升本子中标率

多数同仁的选题失败,不是因为你的idea不好,而是你的逻辑没有立起来,你必须让评审看到,你是怎么从问题走向方法的。请你按照“同行做到哪、瓶颈卡在哪、我该怎么破”的逻辑,将我的创新点进行重构:【粘贴你原始的创新点描述】,要求:表达需结构化、可量化、可验证,突出对比后的实质性突破。与其等着评审指出问题,等着本子被拒,不如让AI提前模拟评审,帮你从可行性、创新性、国家价值、团队能力四个维度给你打分,并指出项目的致命破绽,提示词这样设计。创新点如果写不好,本子往往也会被拒,而评审一般喜欢的创新点都是有固定结构的。

智能AI让学术科研更容易 1239

WebAssembly 完全入门:了解 wasm 的前世今身

首先我们给它下个定义。WebAssembly 或者 wasm 是一个可移植、体积小、加载快并且兼容 Web 的全新格式。

FeelTouch Labs 2837

大模型选型实战:为OpenClaw匹配最优“大脑”的全维度考量

大模型不是越贵越好,也不是参数越高越好,适合自己的使用场景才是最好的。按照我的方法,先明确自己的需求,再选对应的模型,配置多模型自动路由,既能保证体验,又能最大限度降低成本。我自己用这套配置用了半年多,不管是写文章、写代码还是处理复杂问题,都完全够用,成本也很低,大家可以参考一下。如果不知道选什么模型,可以在评论区说一下你的使用场景。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 343

Flutter WebAssembly (Wasm) 支持 - 实用指南Flutter WebAssembly (Wasm) 支持 - 实用指南

是一种低级的二进制格式,旨在成为高级语言(如 Dart)在 Web 平台上的编译目标。它能提供接近原生的执行性能。Flutter 和 Dart在构建 Web 应用时,支持将应用编译为格式。这标志着 Flutter Web 应用在性能上的一次重大飞跃。核心优势性能提升: Wasm 代码执行效率远高于 JavaScript,尤其适用于计算密集型操作。启动优化: 可以带来更快的应用启动速度。多线程渲染: 利用高级浏览器特性,实现多线程渲染,减少卡顿 (Jank)。升级 Flutter。

代码小疯子 1411

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

什么是WebAssembly(WASM)

WebAssembly 是一种由 W3C 组织制定的、可在现代浏览器和虚拟机中运行的高性能二进制指令格式,专为跨平台、快速、安全的执行环境设计。

keyboard专栏 1280

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

WebAssembly,WASM,WASI,WAMR了解

wamr是什么

weixin_51757593的博客 2260

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

BFE WebAssembly插件开发:如何在BFE中运行WASM模块

BFE作为百度开源的现代化七层负载均衡系统,其WebAssembly插件功能为开发者提供了强大的扩展能力。通过BFE WebAssembly插件开发,您可以轻松地将自定义业务逻辑嵌入到流量处理流程中,实现灵活高效的流量控制。 ## 🚀 BFE WebAssembly插件架构解析 BFE的WebAssembly插件系统采用模块化设计,主要由以下几个核心组件构成: **插件引擎**:负责WAS

gitblog_00038的博客 1311

如何在Wasm3中实现WebAssembly动态加载:完整指南

WebAssembly(Wasm)作为一种高性能的二进制指令格式,正在改变跨平台应用的开发方式。Wasm3作为一款轻量级、高性能的WebAssembly解释器,支持在多种环境中运行Wasm模块。本文将详细介绍如何在Wasm3中实现WebAssembly模块的动态加载与运行时更新,帮助开发者构建更灵活、可扩展的应用。 ## Wasm3动态加载的核心优势 动态加载WebAssembly模块是现代应

gitblog_00852的博客 727

Wasm3与平台IO:嵌入式设备中WebAssembly的硬件交互

嵌入式开发中,传统固件更新需重新编译整个项目并通过专用工具烧录,过程繁琐且风险高。Wasm3作为轻量级WebAssembly(Wasm)解释器,结合PlatformIO(嵌入式开发平台)可实现动态加载Wasm模块,降低更新成本。本文以Arduino平台为例,介绍Wasm3与PlatformIO的集成方法及硬件交互场景。 ## 环境配置 ### PlatformIO项目配置 PlatformI...

gitblog_00062的博客 751

Wasm3与Nginx:在Web服务器中嵌入WebAssembly模块

WebAssembly(Wasm)技术正迅速改变软件部署模式,而Wasm3作为轻量级高效的WebAssembly解释器,为资源受限环境提供了强大的WASM运行能力。本文将探讨如何在Nginx服务器中集成Wasm3运行时,实现WebAssembly模块的高性能嵌入执行,从而扩展服务器功能并提升安全性。 ## 技术架构概述 Wasm3与Nginx的集成架构基于"宿主-模块"模型,Nginx作为宿主...

gitblog_00125的博客 878

探索WebAssembly的无限可能:Awesome Wasm项目推荐

在现代Web开发的世界中,WebAssembly(简称Wasm)已经成为一个革命性的技术。它允许开发者使用C、C++、Rust等语言编写的代码在浏览器中运行,极大地扩展了Web应用的功能和性能。**Awesome Wasm**项目是一个精心策划的资源集合,旨在为开发者提供关于WebAssembly生态系统的全面指南。无论你是WebAssembly的新手还是经验丰富的开发者,这个项目都能为你提供丰富...

gitblog_00073的博客 787

Rustup与WebAssembly:一键配置WASM开发环境的终极指南

还在为配置WebAssembly开发环境而头疼吗?一文解决所有Rust到WASM的编译难题!读完本文你将掌握: - ✅ Rustup配置WASM目标的完整流程 - ✅ 新旧WASM目标名称的正确使用 - ✅ 项目级WASM环境配置的最佳实践 - ✅ 常见问题排查与解决方案 ## 为什么需要Rustup管理WASM环境? WebAssembly(WASM)让Rust代码能在浏览器中运行,但配置

gitblog_01085的博客 1156

wasm-pack 实战指南:Rust 到 WebAssembly 的一站式构建、测试与发布工作流

`wasm-pack` 是 Rust 生态中面向 WebAssembly 的一站式工作流工具,它把"编译 Rust crate 为 wasm、生成 JavaScript 绑定、产出可发布的 npm 包"整合成一条命令。本文基于当前仓库的 [README.md](https://link.gitcode.com/i/55e0bd4481c8cd319ff5810f9e19965c) 及其配套文档与源

gitblog_00112的博客 842

TypeScriptCompiler WebAssembly支持:在浏览器中运行TypeScript编译的WASM模块终极指南

TypeScriptCompiler(基于LLVM的TypeScript原生编译器)为开发者提供了强大的WebAssembly(WASM)支持,让你能够将TypeScript代码直接编译为WASM模块并在浏览器中运行。这种创新的编译技术打破了传统TypeScript必须依赖JavaScript运行时的限制,为Web开发带来了全新的可能性。 ## 🚀 什么是TypeScriptCompiler

gitblog_00493的博客 1064

如何恢复 Windows 远程桌面多用户连接:RDPWrap.ini 配置指南

Windows 更新会替换 termsrv.dll,多用户远程桌面随之失效,家庭版默认也只能一人连接。RDPWrap.ini 是 RDP Wrapper 的配套配置集合,按版本提供补丁参数,把配置换掉即可恢复 Windows 远程桌面多用户连接。 ## RDP Wrapper 和 rdpwrap.ini 是什么关系 RDP Wrapper 是一个给 termsrv.dll 打补丁、解除单用户限

gitblog_01196的博客 668
上一篇: ES6API无法识别解决方法
下一篇: 作死学习—Deno
不见浅诗~
博客等级 码龄7年 506粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值