初识WebAssembly

news2024/12/22 20:40:28

WebAssembly是一种新型的低级字节码格式,它可以在现代的浏览器中运行,同时也支持其它的平台,例如Node.js、Web Worker等。WebAssembly的目标是在Web平台上提供一种高效、安全、可移植的运行时环境,可以被用于执行任意类型的二进制程序,从而扩展Web平台的应用领域。WebAssembly已经成为了Web开发领域的前沿技术之一。

WebAssembly的背景和原理

WebAssembly是一种全新的二进制格式,它是一种低级的字节码,可以在各种平台上运行。WebAssembly的目标是在Web平台上提供一种高效、安全、可移植的运行时环境,可以被用于执行任意类型的二进制程序。WebAssembly的诞生得益于JavaScript性能的瓶颈,JavaScript在执行复杂计算时,由于解释器的限制,往往会存在性能问题。而WebAssembly通过一系列的优化,可以在保证安全的前提下,提供比JavaScript更高效的执行性能。

WebAssembly的工作原理是将高级编程语言(如C、C++、Rust等)编译为WebAssembly字节码,再通过WebAssembly的解释器或者即时编译器,将字节码转换为机器码,最终在浏览器上执行。

WebAssembly 的优点有:

  • 高效性:浏览器运行时只需要加载编译成的字节码,以浏览器可以识别的二进制格式传输

  • 加载快:由于文件体积小,再加上无需解释运行,WebAssembly 能够更快的加载实例化,减少运行等待时间

  • 可移植性:可以将webassembly移植到其他平台。这意味着,如果用编译为webAssembly的语言编写软件,就能够在.NET上运行它。它允许我们重用Web上现有的JavaScript基础结构

  • 安全性:可以放hash和签名等,同时在 Wasm 运行时中运行的代码是内存沙盒和功能受限的,这意味着它仅限于执行明确允许执行的操作

WebAssembly与JavaScript的对比

WebAssembly和JavaScript在实现上存在一些差异,以下是它们在一些方面的对比:

  • 性能:由于WebAssembly是一种低级字节码,可以直接被机器执行,因此在执行性能上要优于JavaScript。

  • 内存管理:WebAssembly使用线性内存模型,所有的内存分配都是在一块连续的内存区域中进行,因此可以更加高效地管理内存。

  • 编程语言:JavaScript只支持JavaScript编程语言,而WebAssembly可以支持多种编程语言,例如C、C++、Rust等。

  • 生态系统:JavaScript拥有非常庞大的生态系统,支持各种第三方库和框架,而WebAssembly的生态系统尚在发展中,相对比较小。

下图是JavaScript的运行过程和时间2fb375dc4fb7692be1f4824373bb4e4e.png

下图是WebAssembly的运行过程和时间

061070c53cc8698fc79544ae9e32c6f6.png
18865413-f8895902e45a5b34

与JavaScript相比,WebAssembly简化了运行流程,所以提高了效率和时间

WebAssembly的应用场景

WebAssembly的应用场景非常广泛,以下是一些常见的应用场景:

  • 游戏:WebAssembly可以用于在浏览器中运行复杂的游戏,实现比较高效的游戏渲染。

  • 图形处理:WebAssembly可以用于在浏览器中进行图像处理、视频处理等复杂的图形处理任务。

  • 数据分析:WebAssembly可以用于在浏览器中进行大规模数据分析,提高数据分析的性能。

  • 应用迁移:WebAssembly可以用于将现有的桌面应用迁移到Web平台上,实现跨平台的应用。

  • 库的移植:WebAssembly可以用于将现有的库移植到Web平台上,使得这些库可以在浏览器中运行。

以下是一个简单的WebAssembly应用场景示例,演示如何在浏览器为了更好地说明WebAssembly的应用场景,我会提供一个实际的示例。假设我们想要通过浏览器实现一个图片处理的应用,我们可以使用WebAssembly来实现一些图像处理算法,以提高应用的性能。

以下是一个使用WebAssembly实现图像处理的示例代码:

// 加载WebAssembly模块
fetch('image-processor.wasm')
  .then(response => response.arrayBuffer())
  .then(bytes => WebAssembly.instantiate(bytes))
  .then(results => {
    // 调用WebAssembly模块中的函数
    const { applyFilter } = results.instance.exports;
    const canvas = document.getElementById('canvas');
    const context = canvas.getContext('2d');
    const image = new Image();

    // 加载图片
    image.src = 'example.jpg';
    image.onload = function() {
      canvas.width = image.width;
      canvas.height = image.height;
      context.drawImage(image, 0, 0);

      // 应用滤镜
      applyFilter(canvas.width, canvas.height, context.getImageData(0, 0, canvas.width, canvas.height).data);

      // 在canvas上显示处理后的图片
      context.putImageData(context.getImageData(0, 0, canvas.width, canvas.height), 0, 0);
    };
  });

在这个示例中,我们使用了一个名为image-processor.wasm的WebAssembly模块,其中包含了一个名为applyFilter的函数,用于应用图像滤镜。我们通过调用WebAssembly.instantiate函数加载WebAssembly模块,并调用其中的applyFilter函数来实现图像处理。

需要注意的是,这个示例中的WebAssembly模块是使用C++编写的,并且需要将其编译成WebAssembly格式。具体的编译方式可以参考Emscripten官方文档。

总体来说,WebAssembly在图像处理、游戏开发、数据分析等领域都有广泛的应用,可以帮助开发者在浏览器中实现更高效的算法和更复杂的应用。

如何在Web中使用WebAssembly

注意:WebAssembly是不能操作DOM元素的,所以只能和javascript一起使用

  1. 使用C++写一个方法

int fib(int n)
{
   if (n <= 1)
      return n;
   return fib(n-1) + fib(n-2);
}
  1. 编译为wasm文件 - index.wasm

  2. 创建项目-目录e7c15bbf4ca26e80807f5822aab74b45.png

  3. 使用index.wasm,创建实例

// index.js
function loadWebAssembly(fileName) {
  return fetch(fileName)
    .then(response => response.arrayBuffer())
    .then(buffer => WebAssembly.compile(buffer))
    .then(module => {return new WebAssembly.Instance(module) });
};   


loadWebAssembly('index.wasm')
  .then(instance => {
  fibc = instance.exports._Z3fibi;  // index.wasm被编译后的方法变量名

    console.log('Call your functions !');
  });

接下来就可以运行项目了

注意:不能直接运行index.html,因为这样就不会加载WASM模块,可以用Visual Studio Code的Live Server或者Xampp拉起本地主机上的项目目录。

WebAssembly的未来发展方向

通过web汇编,我们可以开发接近于原生性能的应用,所以可以实现游戏。图形处理、数据分析等任务。因此有大量编码的程序都有机会需要用到WebAssembly。

WebAssembly已经成为了官方标准,是继HTML、CSS和JavaScript之后的第四种Web语言。WebAssembly正在蓬勃发展中,相信在未来一定会有一席之地。

- END -

关于奇舞团

奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。

5eb9a6132f24d03df90989dc57af84dd.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/494174.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT实现leetcode 刷题和变型

leetcode 刷题和变型 作为一个程序员&#xff0c;Leetcode 是一个非常重要的网站。它不仅可以帮助程序员提高算法和数据结构的能力&#xff0c;还能帮助我们准备技术面试。但是&#xff0c;刷 Leetcode 也需要花费大量的时间和精力来解决各种难题。那么&#xff0c;有没有什么…

达成事务条件的实现原理

事务存在的意义&#xff1a;保证系统中的数据&#xff0c;都是符合预期的&#xff1b;相互关联的数据之间&#xff0c;不会产生矛盾 达成事务的条件 原子性&#xff1a;一个操作&#xff0c;要么同时成功、要么同时失败 隔离性&#xff1a;各业务&#xff0c;读写相互独立 持…

arm 源码编译kernel 对比image zimage uimage vmlinux

一 源码编译kernel 下载交叉编译工具链 下载cc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz &#xff0c;这是官网的。使用下面命令下载。 585 wget https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/gcc-linaro-4.9…

每天一道算法练习题--Day22 第一章 --算法专题 --- ----------最大公约数

关于最大公约数有专门的研究。 而在 LeetCode 中虽然没有直接让你求解最大公约数的题目。但是却有一些间接需要你求解最大公约数的题目。 如何求最大公约数&#xff1f; 定义法 def GCD(a: int, b: int) -> int:smaller min(a, b)while smaller:if a % smaller 0 and b …

一个集团企业,如何从0到1构建信息化系统?

当今时代&#xff0c;信息技术已经成为企业发展不可或缺的一部分&#xff0c;特别是对于一个大型集团公司来说&#xff0c;如何构建一个高效的信息化系统对于其业务发展至关重要。 我们想要构建一个优质高效的信息化系统&#xff0c;首先需要了解现在大的趋势是怎样的。 目前…

【Linux】Linux安装Java环境(OpenJDK)

文章目录 第一步&#xff1a;第二步&#xff0c;选择合适的版本安装&#xff1a;第四步&#xff0c;配置环境变量 linux环境为CentOS7.8 版本。 今天教大家怎么在CentOs环境中安装Java的开发环境。 在安装java之前我们先来了解一下YUM Yum&#xff08;全称为 Yellow dog Updat…

【JavaEE初阶】简单了解wait和notify方法~

目录 &#x1f31f;1、wait() &#x1f31f;2、notify() &#x1f31f;1、wait() &#xff08;1&#xff09;wait()方法与notify()方法都是Object类中的方法。 &#xff08;2&#xff09;wait()是让线程等待一段时间&#xff0c;死等——>状态WAITING:没有时间限制的等待.…

C++ | 语句的基础知识(夯实基础)

本文概要 本篇文章主要介绍数据结构中C的语句内容&#xff0c;适合有零基础的同学&#xff0c;文中描述和代码示例很详细&#xff0c;干货满满&#xff0c;感兴趣的小伙伴快来一起学习吧&#xff01; &#x1f31f;&#x1f31f;&#x1f31f;个人简介&#x1f31f;&#x1f…

CentOS 7.x 安装 ZooKeeper 并实现集群搭建

0. 集群结构 服务器IPhostname节点说明192.168.31.101master主节点192.168.31.102slave1从节点192.168.31.103 slave2 从节点 下面的安装与配置操作需要在三台服务器上都执行一遍。 1. 安装JDK ZooKeeper要求运行在 JDK 环境上&#xff0c;JDK安装教程可参考 CentOS 7.x 安装…

从点赞到数字货币:揭秘Diem币与Facebook的联系

大家都知道Facebook是一个全球知名的社交媒体平台&#xff0c;但你是否听说过与Facebook有关的数字货币Diem币呢&#xff1f;或许你会想&#xff0c;从点赞到数字货币&#xff0c;这是怎么回事&#xff1f;别着急&#xff0c;让我们一起揭秘Diem币与Facebook的联系。 首先&…

IP一键呼叫语音对讲怎么样?

IP一键呼叫语音对讲怎么样&#xff1f; IP一键呼叫语音对讲&#xff0c;让您的生活更加便利和安全&#xff01; 无需复杂设置&#xff0c;轻松实现远程通话&#xff0c;随时随地与家人朋友沟通交流。APP端可实时监控家庭动态&#xff0c;保证家庭安全。 一键呼叫语音功能&am…

微信小程序——自定义组件

自定义组件 一、组件的创建二、组件的引用1、全局引用2、局部引用 三、全局引用和局部引用 一、组件的创建 第一步&#xff1a;在项目的根目录下创建文件夹components。 第二步&#xff1a;在components文件夹下创建文件夹card。 第三步&#xff1a;选中文件夹card 右键 选中…

openwrt广告屏蔽大师修复补丁luci-app-adbyby plus + lite

openwrt广告屏蔽大师修复补丁 目前使用方式然而有规则无法下载的通病所以可以手工拷贝随便哪里来的规则最后提示 补丁位置 &#xff1a; 地址 http://pan.ezdial.cn/nasone/a 备用&#xff1a;https://bak.ezdial.cn:8000/bakone/a 因什么值得买&#xff0c;在反复审核本文&…

如何在 AlmaLinux 8 上安装和使用 Docker

Docker 是面向开发人员和系统管理员的强大平台&#xff0c;可简化在软件容器内部署应用程序的过程。 容器允许您将应用程序及其所有部分(代码、运行时、系统工具、系统库——通常位于 /usr/bin 或 /usr/lib 中的任何内容)打包&#xff0c;以便它可以在任何 Linux 机器上一致地运…

Linux性能参数调优

内核的shmall和shmmax参数 SHMMAX配置了最大的内存segment的大小&#xff1a;这个设置的比SGA_MAX_SIZE大比较好。 SHMMIN最小的内存segment的大小 SHMMNI整个系统的内存segment的总个数 SHMSEG每个进程可以使用的内存segment的最大个数 配置信号灯&#xff08; semphore …

微软 New Bing, Chat AI 绘图火力全开

嗯&#xff0c;今天的主角是&#xff0c; Microsoft New Bing! 在 Edge 里面&#xff0c;访问 www.bing.com&#xff0c;登录 Microsoft 账户&#xff0c;点击 CHAT, 就可以体验 Bing Chatbot. 这次, New Bing 无需加入 waitlist, 即可全面体验 ChatGPT DALL-E 的绘图功能 关键…

1、防刷限流实现1

1、本章诉求 限流的需求出现在许多常见的场景中&#xff1a; 秒杀活动&#xff0c;有人使用软件恶意刷单抢货&#xff0c;需要限流防止机器参与活动某api被各式各样系统广泛调用&#xff0c;严重消耗网络、内存等资源&#xff0c;需要合理限流 2、流程设计 3、方案实现 3.1…

【致敬未来的攻城狮计划】— 连续打卡第二十二天:RA2E1的RTC时钟日历

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

XXL-JOB中间件【实现分布式任务调度】

目录 1&#xff1a;XXL-JOB介绍 2&#xff1a;搭建XXL-JOB 2.1&#xff1a;调度中心 2.2&#xff1a;执行器 2.3&#xff1a;执行任务 3&#xff1a;分片广播 1&#xff1a;XXL-JOB介绍 XXL-JOB是一个轻量级分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学…

港科夜闻|广东省委常委、副省长王曦到访香港科技大学

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、广东省委常委、副省长王曦到访香港科技大学。在香港科大校长、粤港澳大湾区院士联盟理事会主席叶玉如教授陪同下&#xff0c;王曦常委率代表团参观国家级科研设施和了解学校发展情况&#xff0c;并与在港中国科学院院士座…