使用AssemblyScript 构建 WebAssembly 应用

简介: WebAssembly,也称为 Wasm,是为 Web 创建的二进制格式。它允许通过从常规 JavaScript 访问的相同 Web API 访问浏览器功能。

WebAssembly,也称为 Wasm,是为 Web 创建的二进制格式。它允许通过从常规 JavaScript 访问的相同 Web API 访问浏览器功能。WebAssembly 的最大亮点之一是效率和速度,在不po浏览器的权限安全策略,以接近原生的性能速度安全地运行。

尽管具有 Web 特性,但 WebAssembly 也可以在非 Web 模式下运行,例如服务器、物联网设备、移动/桌面应用程序,考虑到某些 Web 功能将不可用。

目前四种主要浏览器(Firefox、Chrome、Safari 和 Edge)都支持 WebAssembly,关于WebAssembly的介绍、优势等信息可以查阅《再次认识 WebAssembly》和《快速认识 WebAssembly》,本文主要内容是构建一个应用。

编写 AssemblyScript

AssemblyScript 代码看起来类似于 TypeScript。如果不熟悉它,请不要担心,基本上熟悉JavaScript也能看懂 TypeScript。

通过以下示例了解相应的区别:

这是一个不可移植的 AssemblyScript 代码,使用 TypeScript 并非 100% 准确:

let someFloat: f32 = 1.5
let someInt: i32 = <i32>someFloat

在 TypeScript 中,所有数字类型都是数字的别名,因此这些数字类型之间没有区别。

使用 AssemblyScript 编译器生成的可移植 TypeScript 代码将是:

let someFloat: f32 = 1.5
let someInt: i32 = i32(someFloat)

使用常规 typescript 编译器编译代码后,结果将是:

var someFloat = 1.5
var someInt = someFloat | 0

可以通过两种不同的方式编写 AssemblyScript:

  • 标准库
  • 低级 WebAssembly

这些方法并不相互排斥,可以根据需要将它们混合使用。

标准库

AssemblyScript 提供了一个类似于 JavaScript 的标准库,类似于 JavaScript 使用的标准库。

// It takes in two 32-bit integer values
// And returns a 32-bit integer value.
export function addInteger(a: i32, b: i32): i32 {
  return a + b;
}

低级 WebAssembly

在某些情况下,需要编写低级的WebAssembly。WebAssembly中前面函数的摘录如下所示:

(func $assembly/index/addInteger (param $0 i32) (param $1 i32) (result i32)
  local.get $0
  local.get $1
  i32.add
 )

应该避免使用非严格的 TypeScript 代码,因为并非所有代码都是有效的 AssemblyScript 代码。阅读有关 TypeScript 严格模式的更多信息

编写第一个AssemblyScript

开始之前需要确保机器上安装了 Node.js 最新的 LTS 版本,可以从 nodejs.org 获取。使用旧版本的 Node.js 会导致使用 AssemblyScript 编译器出错。第一个简单的 AssemblyScript,可以参阅《再次认识 WebAssembly》。

创建基于浏览器的钟摆

好吧,在浏览器中绘制钟摆并不是非常需要使用 Wasm,但主要目的是来了解如何使用 Wasm 来依赖于动画和绘制钟摆所需的数学计算:

Wasm 代码将负责钟摆的位置计算,有两个主要函数:

init 函数

export function init(
    startPositionX: f64,
    amplitude: u32,
    w: u32,
    h: u32
): void {
    angle = 0;
    var needed = (<i32>((w * h * sizeof<i32>() + 0xffff) & ~0xffff)) >>> 16;
    var actual = memory.size();
    if (needed > actual) memory.grow(needed - actual);
    pendulum = new Pendulum(startPositionX, amplitude);
}

该函数通过将变量存储在名为 Pendulum 的类对象中来负责变量的初始化;这个函数的另一个职责是负责内存分配;它使用配置的画布宽度和高度来计算所需的内存。如果没有正确分配内存, Wasm 可能会失败,更多内存管理可以点击这里阅读

move 函数

export function move(): void {
    angle += 10;
    if (angle == 360 || angle > 360) {
        angle = 0;
    }
    pendulum.nextPosition =
        pendulum.initialPosition +
        pendulum.amplitude * Math.sin((angle * Math.PI) / 180);
}

move 函数重新计算 Pendulumx 方向上的下一个位置,使用钟摆公式来计算位置。在 GitHub 上查看源代码

调试 WebAssembly

可以从支持的浏览器调试 WebAssembly 代码,下面来介绍如何使用 Chrome 进行调试。

  1. 确保正在运行带有调试目标的 asc 编译器,确保启用源映射,它将帮助从浏览器中更清晰地调试代码。
  2. 确保启用了 WebAssembly 调试( Chrome 开发人员工具设置->实验下的选项)

image.png

  1. 启用后,重新加载浏览器;只需从关闭设置窗口后出现的消息中单击 Reload DevTools
  2. 现在可以在代码中添加断点并检查它!

image.png

总结

这篇文章只是冰山一角, AssemblyScript 是一个文档齐全的项目,具有高级示例和令人兴奋的实现

坚信这个项目可以通过使用 TypeScript 的变体来缩小 Wasm 采用的差距,并打开大门以激发更多使用 Wasm 的兴趣。希望博文能帮助提高自己尝试 WebAssembly 的兴趣。


相关文章
|
8月前
|
内存技术
关于 Qwen-Omni 模型的音频输出格式转换
Qwen-Omni 官方文档声称音频输出为 WAV 格式,但实际上为 PCM 格式。通过将每个 chunk 的 base64 编码音频数据解码并拼接,可生成 24kHz、16位、单声道的 PCM 文件。使用 FFMPEG 可将其转换为其他格式,如 MP3。示例代码展示了如何解码并转换音频文件。
|
12月前
|
机器学习/深度学习 前端开发 JavaScript
WebAssembly:让前端性能突破极限的秘密武器
WebAssembly(简称 WASM)作为前端开发的性能加速器,能够让代码像 C++ 一样在浏览器中高速运行,突破了 JavaScript 的性能瓶颈。本文详细介绍了 WebAssembly 的概念、工作原理以及其在前端性能提升中的关键作用。通过与 JavaScript 的配合,WASM 让复杂运算如图像处理、3D 渲染、机器学习等在浏览器中流畅运行。文章还探讨了如何逐步集成 WASM,展示其在网页游戏、高计算任务中的实际应用。WebAssembly 为前端开发者提供了新的可能性,是提升网页性能、优化用户体验的关键工具。
5203 2
WebAssembly:让前端性能突破极限的秘密武器
|
11月前
|
人工智能 数据可视化 vr&ar
操作系统的哲学:从命令行到图形界面的演变
【10月更文挑战第22天】 本文探讨了操作系统用户界面(UI)的发展,特别是从早期的命令行界面(CLI)到现代图形用户界面(GUI)的转变。通过分析这一转变背后的技术、社会和心理因素,我们不仅能够理解操作系统设计的演变,还能够洞察人类与技术互动方式的根本变化。文章采用总分总结构,先概述操作系统UI的历史发展,然后详细分析CLI和GUI的特点及其对用户的影响,最后总结这一转变对人类生活和技术发展的深远意义。
271 3
|
JSON Kubernetes Go
IDEA使用Kubernetes插件编写YAML
IDEA使用Kubernetes插件编写YAML
455 0
IDEA使用Kubernetes插件编写YAML
|
Rust C++
Rust那些事之Borrow VS AsRef​
【4月更文挑战第3天】Rust中的Borrow和AsRef是相似的trait,都提供了一个方法来获取引用。Borrow需要借用值的Hash、Eq和Ord与拥有值相等,适合结构体的单字段借用;而AsRef无此限制,有默认实现,可接受引用或值。当需要特殊trait一致性时(如HashMap的键值比较),使用Borrow;当仅需简单引用转换时,使用AsRef。
228 0
|
JSON JavaScript 前端开发
仿造问卷星--开发一套调查问卷设计工具(1/3)--完整流程
仿造问卷星--开发一套调查问卷设计工具(1/3)--完整流程
257 0
|
Rust JavaScript 前端开发
WebAssembly 入门
本文讲解了 WebAssembly 的入门知识,包括理论以及一些实践过程
13031 8
|
机器学习/深度学习 数据采集 搜索推荐
机器学习在生物信息学中的应用
机器学习在生物信息学中的应用正迅速改变着生物学研究的面貌。通过在基因组学、蛋白质结构预测、药物研发、癌症诊断等领域的应用,机器学习为生物信息学带来了新的机遇和挑战。然而,我们也要认识到在处理数据质量、可解释性和数据隐私等方面可能面临的困难。未来,随着技术的不断进步,机器学习将在生物信息学领域持续发挥重要作用,为生命科学研究带来更多的创新和突破。
1006 1
|
开发框架 关系型数据库 MySQL
体检中心信息管理系统的设计与实现(论文+源码)_kaic
对于当代社会的人来说,生病是每一个人都避不开的话题。随着生活负担和工作压 力的加重,越来越多的人健康状态逐渐下滑。 随着人们对自己的健康问题越来越重视, 每年都会有许多人进行定期体检关注自己的健康状态。而我国是一个人口大国,人口基 数较大,虽然全国各地都开设有许多体检中心。但随着体检人数的增多,体检中心的患 者数量会急剧增加,并且患者的体检需要时间,给体检中心的日常运营带来了较大负担。 因此,体检中心每天都十分忙碌,当患者生病需要健康检查时,到体检中心还需要排队 挂号, 十分浪费时间。 为了减少患者的等待时间,方便患者在体检中心预约挂号,本次选题为体检中心信 息管理系统设计与实现,将通过设计一