当前位置: 首页 > news >正文

什么是WebAssembly?怎么使用?

一、简述

        WebAssembly,也称为Wasm,是基于堆栈的虚拟机的二进制指令格式。它被设计为一个可移植的目标,用于编译C、C++和Rust等高级编程语言,允许代码以接近本机速度在web浏览器中运行。WebAssembly于2015年由包括谷歌、微软、Mozilla和苹果在内的所有主要浏览器供应商首次宣布,作为web开发的新标准。

        对WebAssembly的需求源于JavaScript的局限性,JavaScript是用于web开发的传统语言。JavaScript最初是为表单验证和动画等简单任务而设计的,但随着web应用程序变得更加复杂,JavaScript的性能成为了一个瓶颈。很明显,需要一种更有效的解决方案来在浏览器中运行计算密集型应用程序。

        WebAssembly的创建是为了解决这个问题,它提供了一种在浏览器中运行用C、C++和Rust等语言编写的代码的方法。这些语言以其性能和低级控制而闻名,使其成为游戏、视频编辑和科学模拟等任务的理想选择。通过将这些语言编译为WebAssembly,开发人员可以在浏览器中运行代码的同时利用其性能优势。

二、主要用途

WebAssembly是一种低级编程语言,可以在现代 Web 浏览器中运行,并且可以与 JavaScript 一起使用。它的主要用途包括:

  1. 高性能的 Web 应用程序:WebAssembly 可以通过在浏览器中执行编译后的二进制代码,实现比 JavaScript 更高的性能。这使得开发者能够在 Web 上构建更加复杂和性能要求较高的应用程序,比如游戏、计算密集型应用程序等。

  2. 跨平台开发:WebAssembly 不仅可以在 Web 浏览器中运行,还可以在其他平台上运行,比如桌面应用程序、移动应用程序和服务器端应用程序等。这意味着开发者可以使用相同的代码库来构建跨平台的应用程序。

  3. 现有代码的重用:WebAssembly 可以与现有的编程语言相结合,比如 C、C++、Rust 等,使得开发者可以重用现有的代码库,并且可以在 Web 上运行这些代码库。

  4. 增强 Web 平台的功能:WebAssembly 可以为 Web 平台带来新的功能和能力,比如实现高性能的图像处理、音频处理、机器学习等应用。

WebAssembly代码可以从各种源语言生成,包括C、C++、Rust,甚至JavaScript。代码通常会提前编译为.wasm文件,然后可以在浏览器中加载和执行。WebAssembly模块也可以在运行时动态加载,从而在将代码交付给浏览器的方式上具有更大的灵活性。

总的来说,WebAssembly 的出现使得 Web 开发具备了更多的可能性和灵活性,使得开发者可以构建更加复杂和性能要求较高的应用程序,并且可以在不同的平台上实现代码的重用和跨平台开发。

三、编写hello world程序

首先,让我们获取emsdk,这是Emscripten的工具,用于获取编译器以及您需要的所有工具和东西。要做到这一点,很容易使用git从github获取:

git clone https://github.com/emscripten-core/emsdk.git
cd emsdk

接下来,我们可以使用emsdk来获取Emscripten的最新稳定版本:
 

./emsdk install latest
./emsdk activate latest
source ./emsdk_env.sh

打开一个文本编辑器,将hello world程序另存为hello.c:

// hello.c
#include <stdio.h>int main() {printf("hello, world!\n");return 0;
}

然后编译它

emcc hello.c -o hello.js

这会生成hello.js和hello.asm。wasm文件包含编译后的代码,而JS是加载和运行它的代码。默认情况下,Emscripten输出支持在Web和Node.JS上运行:

node hello.js

这将打印hello world。

我们还可以告诉emcc优化代码(这对代码大小非常重要),并生成HTML,例如:

emcc hello.c -O3 -o hello.html

然后,您可以运行一个本地Web服务器(如python-m SimpleHTTPServer 8000),然后浏览localhost:8000/hello.html,我们可以看到输出hello world。

http://www.lryc.cn/news/509006.html

相关文章:

  • v3s点RGB屏 40pin 800x480,不一样的点屏,不通过chosen。
  • 某科技局国产服务器PVE虚拟化技术文档
  • 中科岩创边坡自动化监测解决方案
  • GPT-O3:简单介绍
  • cudnn版本gpu架构
  • 数据库安全-redisCouchdb
  • ubuntu22.04安装PaddleX3
  • Flutter 实现全局悬浮按钮学习
  • 14-C语言多文件编程
  • 基于Springboot的在线问卷调查系统【附源码】
  • Redis热点数据管理全解析:从MySQL同步到高效缓存的完整解决方案
  • 【图书介绍】】几本Linux C\C++编程图书
  • MFC/C++学习系列之简单记录7
  • 使用GPT进行SCI论文润色常用语句
  • Redis密码设置与访问限制(网络安全)
  • php的线程安全与非线程安全版本的区别
  • 标贝科技受邀出席2024ADD数据应用场景大会 共议数据要素发展新契机
  • electron-vite打包后图标不生效问题
  • systemverilog中的unique if
  • 【MySQL篇】事务的认识以及四大特性
  • Windows 11 安装 Dify 完整指南 非docker环境
  • 电子电气架构 --- 什么是EPS?
  • 12寸半导体厂等保安全的设计思路
  • 【Chrome Extension】一、CSDN计时扩展设计
  • C语言——数据在内存中的存储
  • Python(二)str、list、tuple、dict、set
  • 如何在谷歌浏览器中设置邮件客户端
  • Robot Framework搭建自动化测试框架
  • Linux——字符设备驱动控制LED
  • 云边端架构的优势是什么?面临哪些挑战?