WebAssembly 基础以及结合其他编程语言
0x00 WebAssembly 基础
(1)概述
- WebAssembly 简称 WASM 或 WA,是一种新的编码方式,可以在现代的 Web 浏览器中运行
- 可以通过编译器,把多种编程语言(如 C/C++、C#、Go、Python、Rust、TypeScript 等)编写的代码转化为 WA,并在浏览器中使用
- 特点:
- 灵活度高:是一种低级的类汇编语言
- 体积较小:具有紧凑的二进制格式
- 性能提升:接近原生的性能运行
- WA 可以与 JavaScript 共存,允许两者一起工作
- WA 关键概念:
- 模块:表示一个已经被浏览器编译为可执行机器码的 WA 二进制代码
- 内存:一个可变长的
ArrayBuffer - 表格:一个可变长的类型化数组
- 实例:一个模块及其在运行时使用的所有状态(包括内存、表格和一系列导入值)
- 使用 WA 编写的相关应用:Figma 等
(2)加载与运行
通常,编译器将其他语言的代码编译成 .wasm 文件,以便在 WA 环境中使用
在浏览器环境中,可以通过 AJAX 导入外部文件,如导入 .wasm 文件
fetch("main.wasm");
JavaScript 中的
WebAssembly对象是所有 WA 相关功能的命名空间,其中WebAssembly.compile/WebAssembly.instantiate或WebAssembly.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++
使用 C 或 C++ 编写一段代码(以 C 为例)
// filename: main.c
#include<stdio.h> int main(){
printf("Hello, WebAssembly!");
return 0;
}
运行测试无误后继续
下载并安装用于编译 C/C++ 到 WA 的 Emscripten
详细操作参考官方下载与安装文档:https://emscripten.org/docs/getting_started/downloads.html
使用命令
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#
使用 C# 编写一段代码
// filename: main.cs
public class Example
{
public static void Main()
{
System.Console.WriteLine("Hello, WebAssembly!");
}
}
安装 .NET Core SDK、mono
使用命令
mcs --out:main.dll -t:library main.cs将 C# 代码编译为 DLL使用命令
mono --runtime=mono --aot=llvm main.dll将 DLL 编译为 WA
0x03 结合 Go
使用 Go 编写一段代码:
// filename: main.go
package main import "fmt" func main() {
fmt.Println("Hello, WebAssembly!")
}
使用命令
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
使用 Python 编写一段代码:
# filename: main.py
if __name__ == '__main__':
print("Hello, WebAssembly!")
使用命令
pip install py2wasm安装 py2wasm 工具使用命令
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
使用命令
cargo add wasm-bindgen添加依赖项使用命令
rustup target add wasm32-unknown-unknown安装目标使用 Rust 编写一段代码:
// filename: main.rs
use wasm_bindgen::prelude::*; // 使用 #[wasm_bindgen] 宏来导出函数到 JavaScript
#[wasm_bindgen]
pub fn greet(name: &str) -> String {
format!("Hello, {}!", name)
}
使用命令
cargo build --target wasm32-unknown-unknown --release将 main.rs 编译为 main.wasm 等文件使用命令
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 基础以及结合其他编程语言的更多相关文章
- WebAssembly,可以作为任何编程语言的编译目标,使应用程序可以运行在浏览器或其它代理中——浏览器里运行其他语言的程序?
Mozilla.谷歌.微软和苹果已经决定开发一种面向Web的二进制格式.该格式名为WebAssembly,可以作为任何编程语言的编译目标,使应用程序可以运行在浏览器或其它代理中. 几年前,我们在Inf ...
- day002 计算机基础之 操作系统和编程语言的分类
      今天主要针对计算机基础中的操作系统和编程语言的分类进行了讲解. 操作系统   ...
- Python编程基础(一)编程语言是什么?编译型语言和解释型语言的区别|Python是什么?
编程语言是什么? 其实,程序指的就是一系列指令,用来告诉计算机做什么,而编写程序的关键在于,我们需要用计算机可以理解的语言来提供这些指令. 虽然借助 Siri(Apple).Google Now(An ...
- Python基础:一、编程语言分类
编程语言主要从以下几个角度进行分类: 编译型和解释型 静态语言和动态语言 强类型语言和弱类型语言 编译型语言和解释型语言 编译和解释的区别是什么? 编译器是把源程序的每一条语句都编译成机器语言,并保存 ...
- JavaScript基础
JavaScript基础 JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处 ...
- OC基础--简介
OC简介: 1986年,BradCox(布莱德·考克斯)在第一个纯面向对象语言Smalltalk基础上写成了Objective-C语言. 1985年,被赶出苹果公司的Steve Jobs成立了NeXT ...
- Oracle基础 PL-SQL编程基础(1) 变量和常量
一.什么是PL-SQL PL-SQL是结合了Oracle过程语言和结构化查询语言(SQL)的一种扩展语言.具体来说,PL-SQL就是在普通的SQL语句的基础上增加了编程语言的特点,将数据操作和查询语句 ...
- Objective-C基础笔记一
这里开始了我OC旅程 花了8天的时间粗略的学习了新知识Objective-C(简称OC),虽然只是学习了其中的基础部分,但经过这一周的学习也算是入门了.对面向对象的封装.继承.多态以及其中所包含的方法 ...
- 准备踏入IT编程的学子们,你们第一门编程语言选谁? Are You Ready? Go!
Are You Ready? Go! ——第一门编程语言选谁? 金旭亮 说明: 这篇文章是专门针对大学低年级学生(和其他软件开发初学者)写的,如果你己经是研究生或本科高年级学生,请将这篇文章转发给你的 ...
- Vim入门基础
公司新员工学习有用到,Vim官网的手册又太大而全,而网上各方资料要么不全面,要么不够基础.在网上搜集各方资料,按照自己的框架整理一份Vim入门基础教程,分享出来.特点是偏向基础,但对入门者来说足够全面 ...
随机推荐
- 【Java-GUI】11 Swing06 JTable
静态数据表格的样子: package cn.dzz; import javax.swing.*; import java.awt.*; public class JTable { JFrame jFr ...
- 再探 游戏 《 2048 》 —— AI方法—— 缘起、缘灭(1) —— Firefox浏览器下自动运行游戏篇
四年前曾经写过一过博客: 对 游戏 < 2048 > 的一些思考 虽然过去几年了,但是这个游戏一直没有搞懂该怎么使用AI算法来进行求解,这里再次对这个问题进行一些探索. ========= ...
- 哈希基础知识学习-python版
哈希 哈希表 根据key直接进行访问的无序数据结构,复杂度为O(1) 哈希表的实现---字典 初始化 d1 = dict() 查找 #使用中括号[]进行查找,括号内为特定的键, 键-值 dic = { ...
- 代码随想录Day11
150. 逆波兰表达式求值 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式. 请你计算该表达式.返回一个表示表达式值的整数. 注意: 有效的算符为 '+'.'-'.' ...
- RabbitMq 初学五大模式 通俗易懂 超详细 【包含案例】
RabbitMQ五种工作模式 HelloWorld 简单模式 WorkQueues 工作队列模式 Publish/Subscribe 发布/订阅模式 Routing 路由模式 Topic 通配符模式 ...
- SMU Spring 2023 Contest Round 5(2023 (ICPC) Jiangxi Provincial Contest -- Official Contest)
题目链接 Problem A. Drill Wood to Make Fire S * V >= n即可 #include<bits/stdc++.h> #define int lo ...
- Python 潮流周刊#65:CSV 有点糟糕(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- That's not my Neighbor 之 Chester 问题答案
Q: What is the meaning of life, the universe and everything else? A: 42 参见:生命.宇宙以及任何事情的终极答案 Q: What ...
- 使用命令行 Windows 修改文件权限
修改文件访问权限的命令行工具是 icacls,其使用语法是这样的: icacls <file> # 查看文件的访问权限 icacls <file> /grant <SID ...
- Docker学习11-Docker常规方式安装软件
本文咱们将通过按照Tomcat.按照MySQL.安装Redis这三个实战安装,来熟悉在docker中怎么安装软件,咱们使用端口映射,及数据卷的使用场景 安装的总体步骤: 1:搜索镜像: 2:拉取镜像: ...