首页 > 编程语言 >WebAssembly 基础以及结合其他编程语言

WebAssembly 基础以及结合其他编程语言

时间:2024-10-13 20:45:18浏览次数:7  
标签:WebAssembly 编程语言 WA JavaScript 编译 结合 wasm main

0x00 WebAssembly 基础

详情参考《WebAssembly | MDN》

(1)概述

  • WebAssembly 简称 WASM 或 WA,是一种新的编码方式,可以在现代的 Web 浏览器中运行
  • 可以通过编译器,把多种编程语言(如 C/C++、C#、Go、Python、Rust、TypeScript 等)编写的代码转化为 WA,并在浏览器中使用
  • 特点:
    • 灵活度高:是一种低级的类汇编语言
    • 体积较小:具有紧凑的二进制格式
    • 性能提升:接近原生的性能运行
  • WA 可以与 JavaScript 共存,允许两者一起工作
  • WA 关键概念:
    • 模块:表示一个已经被浏览器编译为可执行机器码的 WA 二进制代码
    • 内存:一个可变长的 ArrayBuffer
    • 表格:一个可变长的类型化数组
    • 实例:一个模块及其在运行时使用的所有状态(包括内存、表格和一系列导入值)
  • 使用 WA 编写的相关应用:Figma

(2)加载与运行

  1. 通常,编译器将其他语言的代码编译成 .wasm 文件,以便在 WA 环境中使用

  2. 在浏览器环境中,可以通过 AJAX 导入外部文件,如导入 .wasm 文件

    fetch("main.wasm");
    
  3. JavaScript 中的 WebAssembly 对象是所有 WA 相关功能的命名空间,其中 WebAssembly.compile / WebAssembly.instantiateWebAssembly.compileStreaming / WebAssembly.instantiateStreaming 方法组合可以用于加载和运行 WA 代码

    fetch("main.wasm")
      .then((response) => response.arrayBuffer())
      .then((bytes) => WebAssembly.compile(bytes))
      .then((module) => {
        const instance = new WebAssembly.Instance(module);
        console.log(instance.exports);
      });
    

    WebAssembly.instantiateStreaming(fetch("main.wasm")).then(
      (results) => {
        const instance = results.instance;
        console.log(instance.exports);
      },
    );
    

(3)相关 JavaScript API

  • WebAssembly:所有 WA 相关功能的命名空间

a. 对象

  • WebAssembly.Module:包含已经由浏览器编译的无状态 WebAssembly 代码
  • WebAssembly.Global:一个全局变量实例,可以被 JavaScript 和 importable/exportable 访问
  • WebAssembly.Instance:有状态,是 WebAssembly.Module 的一个可执行实例
  • WebAssembly.Table:代表 WA 表格概念的 JavaScript 包装对象,具有类数组结构,存储了多个函数引用
  • WebAssembly.Tag:定义了一种 WA 异常的类型,该异常可以从 WA 代码抛出或抛出
  • WebAssembly.Exception:表示从 WA 抛出到 JavaScript 的运行时异常,或者从 JavaScript 抛出到 WA 异常处理程序的运行时异常
  • WebAssembly.LinkError:表示在模块实例化期间发生错误

b. 方法

  • WebAssembly.Memory():用于创建一个新的 Memory 内存对象
  • WebAssembly.CompileError():创建一个新的 WA 编译错误对象
  • WebAssembly.RuntimeError():创建一个新的 WA 运行时错误对象

0x01 结合 C/C++

  1. 使用 C 或 C++ 编写一段代码(以 C 为例)

    // filename: main.c
    #include<stdio.h>
    
    int main(){
      printf("Hello, WebAssembly!");
      return 0;
    }
    

    运行测试无误后继续

  2. 下载并安装用于编译 C/C++ 到 WA 的 Emscripten

    详细操作参考官方下载与安装文档:https://emscripten.org/docs/getting_started/downloads.html

  3. 使用命令 emcc main.c -s WASM=1 -o main.html 编译

    • emcc:Emscripten 提供的工具
    • main.c:基于 C 语言的代码
    • -s WASM=1:指定输出 WA
    • -o main.html:输出 main.wasm、main.js 和 main.html 文件,按需使用

0x02 结合 C#

  1. 使用 C# 编写一段代码

    // filename: main.cs
    public class Example
    {
      public static void Main()
      {
        System.Console.WriteLine("Hello, WebAssembly!");
      }
    }
    
  2. 安装 .NET Core SDK、mono

  3. 使用命令 mcs --out:main.dll -t:library main.cs 将 C# 代码编译为 DLL

  4. 使用命令 mono --runtime=mono --aot=llvm main.dll 将 DLL 编译为 WA

0x03 结合 Go

  1. 使用 Go 编写一段代码:

    // filename: main.go
    package main
    
    import "fmt"
    
    func main() {
      fmt.Println("Hello, WebAssembly!")
    }
    
  2. 使用命令 GOOS=js GOARCH=wasm go build -o main.wasm main.go 通过 GOCC 将 main.go 编译为 main.wasm

0x04 结合 Python

  • 可以通过 py2wasm 工具将 Python 编译为 WA,或使用 pyodide 直接在 JavaScript 中执行 Python

a. py2wasm

  1. 使用 Python 编写一段代码:

    # filename: main.py
    if __name__ == '__main__':
        print("Hello, WebAssembly!")
    
  2. 使用命令 pip install py2wasm 安装 py2wasm 工具

  3. 使用命令 py2wasm main.py -o main.wasm 将 main.py 编译为 main.wasm

b. pyodide

在 HTML 头中导入 pyodide.js 并编写 Python 代码

<!DOCTYPE html>
<html>
  <head>
    <script src="https://cdn.jsdelivr.net/pyodide/v0.26.0/full/pyodide.js"></script>
  </head>

  <body>
    <script>
      async function main() {
        let pyodide = await loadPyodide();
        await pyodide.loadPackage("numpy"); // 加载一个 Python 库
        let result = await pyodide.runPythonAsync(`
                import numpy as np
                np.sum([1, 2, 3, 4])
            `);
        console.log(result);
      }
      main();
    </script>
  </body>
</html>

如果在 NodeJS 环境中,可以使用命令 npm install pyodide 导入

0x05 结合 Rust

参考自《将 Rust 代码编译为 WASM | 博客园-_zhiqiu》

  1. 使用命令 cargo add wasm-bindgen 添加依赖项

  2. 使用命令 rustup target add wasm32-unknown-unknown 安装目标

  3. 使用 Rust 编写一段代码:

    // filename: main.rs
    use wasm_bindgen::prelude::*;
    
    // 使用 #[wasm_bindgen] 宏来导出函数到 JavaScript
    #[wasm_bindgen]
    pub fn greet(name: &str) -> String {
      format!("Hello, {}!", name)
    }
    
  4. 使用命令 cargo build --target wasm32-unknown-unknown --release 将 main.rs 编译为 main.wasm 等文件

  5. 使用命令 wasm-bindgen --out-dir ./out --target web target/wasm32-unknown-unknown/release/lib_wasm.wasm 生成 JavaScript 绑定文件,并设置输出目录为 ./out

0x06 结合 TypeScript

  • AssemblyScript 简称 AS,可以将 TypeScript 的严格变体编译为 WA
  • 具体操作方法参考 AS 官方文档

-End-

标签:WebAssembly,编程语言,WA,JavaScript,编译,结合,wasm,main
From: https://www.cnblogs.com/SRIGT/p/18462925

相关文章

  • 2024 年 04 月编程语言排行榜,PHP 排名创新低?
    编程语言的流行度总是变化莫测,每个月的排行榜都揭示着新的趋势。2024年4月的编程语言排行榜揭示了一个引人关注的现象:PHP的排名再次下滑,创下了历史新低。这种变化对于PHP开发者和整个技术社区来说,意味着什么呢?PHP一度是Web开发的王者,但如今为何地位岌岌可危?其他语言又是如何崛......
  • 基于牛顿拉夫逊算法优化长短期记忆网络结合注意力机制(NRBO-LSTM-Attention)(多输入多
    文章目录效果一览文章概述部分源码参考资料效果一览文章概述基于牛顿拉夫逊算法优化长短期记忆网络结合注意力机制(NRBO-LSTM-Attention)(多输入多输出)(多输入多输出)MATLAB完整源码和数据纯手工制作,代码质量极高,注释清晰,excel数据,方便替换1.data为数据集,10个......
  • 2024 年 04 月编程语言排行榜,PHP 排名创新低?
    ​ 编程语言的流行度总是变化莫测,每个月的排行榜都揭示着新的趋势。2024年4月的编程语言排行榜揭示了一个引人关注的现象:PHP的排名再次下滑,创下了历史新低。这种变化对于PHP开发者和整个技术社区来说,意味着什么呢?PHP一度是Web开发的王者,但如今为何地位岌岌可危?其他语言又是如何......
  • 使用Entity Framework Core(EF Core)进行开发时,结合仓库模式和工作单元模式,服务层以及控
    仓储(Repository)仓储模式封装对数据源的访问逻辑,包括CRUD操作。以下是一个简单的仓储接口和实现示例:publicinterfaceIRepositorywhereT:class{Task<IEnumerable>GetAllAsync();TaskGetByIdAsync(intid);TaskAddAsync(Tentity);TaskUpdateAsync(Tentity);Tas......
  • YOLOv11改进 | 独家创新- 注意力篇 | YOLOv11引入GAM和LinearAttention结合之LGAM注意
    1.LGAM介绍     LGAM(LinearGlobalAttentionModule)和GAM(GlobalAttentionModule)是两种用于图像特征提取的注意力机制。它们在设计上有一些显著的差异,这使得LGAM在某些方面比GAM更具优势。     LGAM的设计与改进:    (1).线性注意力机制的引......
  • 双指针维护可交换结合贡献区间价值的正攻法
    对于一类区间价值V(l,r)=a[l]opta[l+1]opt...opta[r]当我们维护双指针同时需要维护内部区间的价值时,如果操作可交换结合并且可消去(存在y,xopty=0),l右移时直接去掉a[l]的价值即可;如果不可消去但可重复贡献(xoptx=x),可以使用ST表计算区间贡献;如果只满足结合律,我......
  • 如何用ChatGPT结合前人智慧,模仿撰写出既原创又专业的学术论文?
    大家好,感谢关注。我是七哥,一个在高校里不务正业,折腾学术科研AI实操的学术人。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥(yida985)交流,多多交流,相互成就,共同进步,为大家带来最酷最有效的智能AI学术科研写作攻略。在学术研究的过程中,独立撰写论文是每位学者必须面对的......
  • 结合HCI和空口理解BLE AUDIO CIS
    背景CIS,coordinateisochronosstream,是BLEAUDIO单播形式的数据流,在前面文章https://blog.csdn.net/Jzj1234555/article/details/142416588?spm=1001.2014.3001.5502我们了解了BLEAUDIO从连接到建立CIS的大概流程,但CIS到底是什么样的形式,如何在空中传播,里面的细节我们......
  • 更强的RAG:向量数据库和知识图谱的结合
    传统RAG的局限性经典的RAG架构以向量数据库(VectorDB)为核心来检索语义相似性上下文,让大语言模型(LLM)不需要重新训练就能够获取最新的知识,其工作流如下图所示:这一架构目前广泛应用于各类AI业务场景中,例如问答机器人、智能客服、私域知识库检索等等。虽然RAG通过知识增强一......
  • Java中常见的异常分类,结合Spring的事务巩固复习
    Java异常的继承关系是通过类继承的方式构建的一个层次结构。以下是对Java异常继承关系的详细图解说明:异常类的顶层Throwable:所有异常和错误的超类。Throwable的子类Error:通常是指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败等,这种错误无法恢复或不可能捕获,将......