webassembly入门篇

news2024/11/26 6:01:16

背景

        随着职业的发展看到的东西也越来越多,webassembly也慢慢进入了视野。老哥铁柱公司做渲染用到webassembly、有幸参加掘金前端沙龙线下活动大佬们也在讲webassembly(大佬叫它wasm)等等,wasm有强于js的性能以及各种低级语言(go/c/rust)支持编译的特点。webassembly为后缀为.wasm的二进制文件它可以被js的WebAssembly api调用,对于前端出身的我来说可以预见的是webassembly很重要。

简介

        WebAssembly(缩写为Wasm)是一种基于堆栈的虚拟机的二进制指令格式。Wasm 被设计为编程语言的可移植编译目标,支持在网络上部署客户端和服务器应用程序。准确的来说wasm不是一种语言而是一个由go/c/rust等等编译出来的标准协议。wasm具有高效快速、安全的特点。

简单的案例

        主要语言毕竟是js,我考虑了两种语言go和rust来开发wasm。go和rust的性能差距不大go能做的rust也能做,因此在后续的学习中更多的是以go为主,毕竟go的上手难度比rust低得多而且有谷歌背书以及市场需求上也比rust高。

go

package main

func main() {
	println("adding two numbers:", add(2, 3)) // expecting 5
}

//export add
func add(x, y int) int

//export multiply
func Multiply(x, y int) int {
	return x * y
}

这里说一下,在go中“方法”大写开头是表示导出。

// go项目初始化
go mod init XXXX

go代码有了那么就要打包成.wasm文件。需要用到这个工具tinygo

// 打包命令
tinygo build -o XXXXX.wasm

项目目录如下: 

前端调用wasm计算

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vite App</title>
  </head>

  <body>
    <script src="./wasm_exec.js"></script>
    <script>
      const go = new Go(); // Defined in wasm_exec.js
      const WASM_URL = "wasm.wasm";
      var wasm;
      go.importObject.env = {
        add: function (x, y) {
          // 设置go代码执行环境中的方法
          return x + y;
        },
      };

      if ("instantiateStreaming" in WebAssembly) {
        WebAssembly.instantiateStreaming(fetch(WASM_URL), go.importObject).then(
          function (obj) {
            wasm = obj.instance;
            console.log(wasm.exports, wasm.exports.multiply(2, 4)); // 执行go中暴露的方法
            go.run(wasm); // 执行go函数中的main方法
          }
        );
      } else {
        fetch(WASM_URL)
          .then((resp) => resp.arrayBuffer())
          .then((bytes) =>
            WebAssembly.instantiate(bytes, go.importObject).then(function (
              obj
            ) {
              wasm = obj.instance;
              go.run(wasm);
            })
          );
      }
    </script>
  </body>
</html>

        对应的说明都在代码注释中了这里主要说下go编译的wasm文件前端要调用需要用到官方提供的一个wasm_exec.js脚本。wasm_exec.js

总结

        go开发wasm整体的流程还是比较清晰简单的,往后还会出一篇rust编译wasm的文档。后续就是好好学习go了。

我不管这个世上的人怎麽说我…我只想依照我的信念做事,绝不后悔,不管现在将来都一样!

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

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

相关文章

软件架构师 Debugging

软件架构师 Debugging 目录概述需求&#xff1a; 设计思路实现思路分析 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survi…

YOLOv8:官方项目训练

1. 基础解读 detect/train.py中有DetectionTrainer类&#xff0c;继承自BaseTrainer类&#xff0c;并实现了诸如get_dataloader, get_model等接口。 setup_model接口用于准备模型&#xff0c;首先会检查self.model是否是torch.nn.Module&#xff0c;即已经是导入的模型。如果不…

浅谈外贸独立站必须配置SSL证书的必要性

在互联网时代&#xff0c;外贸独立站已经成为了各行各业企业开拓海外市场的重要途径。而在网络安全问题日益凸显的当今&#xff0c;保护数据传输安全成为当今重要的议题。为了保护用户隐私和数据安全&#xff0c;配置SSL证书已经变得尤为重要。 SSL证书&#xff0c;即安全套接…

苍穹外卖集成 Apache POI Java实现Excel文件的读写下载

苍穹外卖 day12 Echats 营业台数据可视化整合_软工菜鸡的博客-CSDN博客 Apache POI - the Java API for Microsoft Documents Project News 16 September 2022 - POI 5.2.3 available The Apache POI team is pleased to announce the release of 5.2.3. Several dependencies …

VBA技术资料MF53:VBA_突出显示大于某值的单元格

【分享成果&#xff0c;随喜正能量】理解自己&#xff0c;成为自己。流水不腐&#xff0c;户枢不蠹。清楚自己的需求&#xff0c;把握自己的节奏&#xff0c;不迷茫&#xff0c;不徘徊&#xff0c;朝着自己认为对的方向一路向前。人这一生最重要的是做好两件事&#xff1a;做自…

激光焊接汽车尼龙塑料配件透光率测试仪

激光塑性成型技术是近年来塑性加工界出现的一种新技术。通常塑料主要是通过加热加压依赖模具成型。这对于单品种、大批量生产是有效的&#xff1b;而对于各种不同形状的塑料制件则需要昂贵的模具‚装置也较庞大。 高度聚焦的激光束垂直照射在待变形的板料上‚由于塑料直接吸收激…

渗透测试漏洞原理之---【业务安全】

文章目录 1、业务安全概述1.1业务安全现状1.1.1、业务逻辑漏洞1.1.2、黑客攻击目标 2、业务安全测试2.1、业务安全测试流程2.1.1、测试准备2.1.2、业务调研2.1.3、业务建模2.1.4、业务流程梳理2.1.5、业务风险点识别2.1.6 开展测试2.1.7 撰写报告 3、业务安全经典场景3.1、业务…

什么是高可用,如何实现高可用

公众号阿里技术(ID&#xff1a;ali_tech) 什么是高可用 无论是一个域&#xff0c;一个 BG&#xff0c;还是一个站点&#xff0c;虽然范围有大有小&#xff0c;对象有所不同&#xff0c;但其高可用的理念都是相通的&#xff0c;今天将自己对高可用的一点点思考以及总结的“nPRT …

海光异构智能计算专区上线飞桨AI Studio!

近日&#xff0c;海光异构智能计算专区正式上线飞桨AI Studio(星河社区)。专区内容来自官方发布和社区贡献&#xff0c;包含双方产品合作成果、行业解决方案、优秀项目展示等&#xff0c;致力于帮助开发者快速了解体验飞桨、为海光异构智能计算软硬协同优化带来更高性能提升。 …

数据结构与算法学习(day5)——队列算法

前言 本章我们学习队列。 本章的学习目标&#xff1a; &#xff08;1&#xff09;能够使用队列算法解决简单的实际问题。 &#xff08;2&#xff09;能够用结构体来优化队列算法&#xff0c;并实际应用中使用。 题目 先看题目&#xff0c;题目就是应用场景&#xff0c;先明白是…

AP5101C 高压线性恒流IC 宽电压6-100V LED汽车大灯照明 台灯LED矿灯 指示灯电源驱动

产品描述 AP5101C 是一款高压线性 LED 恒流芯片 &#xff0c; 外围简单 、 内置功率管 &#xff0c; 适用于6- 100V 输入的高精度降压 LED 恒流驱动芯片。电流2.0A。AP5101C 可实现内置MOS 做 2.0A,外置 MOS 可做 3.0A 的。AP5101C 内置温度保护功能 &#xff0c;温度保护点为…

Jenkins Jenkinsfile管理 Pipeline script from SCM

一、Jenkinsfile理解 Jenkins Pipeline 提供了一套可扩展的工具&#xff0c;用于将“简单到复杂”的交付流程实现为“持续交付即代码”。Jenkins Pipeline 的定义通常被写入到一个文本文件&#xff08;称为 Jenkinsfile &#xff09;中&#xff0c;该文件可以被放入项目的源代码…

「通信原理」格雷码的生成与破译

「通信原理」格雷码的生成与破译 格雷码&#xff0c;gray code&#xff0c;相邻两数之间只有一个bit发生了改变&#xff0c;因此相比于自然编码的二进制系统&#xff0c;格雷编码的更不容易出错。使用卡诺图化简布尔代数式的时候&#xff0c;也会用到格雷码。本文将介绍三种格…

AggregateFunction结合自定义触发器实现点击率计算

背景&#xff1a; 接上一篇文章&#xff0c;ProcessWindowFunction 结合自定义触发器会有状态过大的问题&#xff0c;本文就使用AggregateFunction结合自定义触发器来实现&#xff0c;这样就不会导致状态过大的问题了 AggregateFunction结合自定义触发器实现 flink对于每个窗…

前端使用elementui开发后台管理系统的常用功能(持续更新)

前言&#xff1a;本次的文章完全是自己开发中遇到的一些问题&#xff0c;经过不断的修改终于完成的一些功能&#xff0c;当个快捷的查看手册吧~ elementui开发后台管理系统常用功能 高级筛选的封装elementui的表格elementui的表格实现跨页多选回显elementui的表单elementui的日…

VIRTIO-BLK代码分析(3)数据流处理

VIRTIO-BLK整个过程数据流如下所示&#xff1a; IO请求发送过程 虚拟机中通过FIO等下发IO请求&#xff0c;IO请求通过VFS/filesystem&#xff0c;然后到BLOCK层&#xff0c;传递给virtio-blk驱动&#xff0c;virtio-blk驱动通过virtio_queue_rq()下发IO请求&#xff0c;并通过v…

视频过大如何压缩变小?想学的小伙伴不要错过机会

视频过大如何压缩变小&#xff1f;在当今社交媒体和直播平台的时代&#xff0c;视频内容的传播已经广泛而频繁&#xff0c;我们每天不仅刷视频打发无聊的时间&#xff0c;也会向一些自媒体平台分享自己拍摄的视频。如今人们对视频画质的要求不断提高&#xff0c;因此大多数下载…

武汉凯迪正大—断路器特性测试仪

一、凯迪正大高压开关测试仪产品概述 KDGK-F 断路器机械特性测试仪可用于各电压等级的真空、六氟化硫、少油、多油等电力系统高压开关的机械特性参数测试与测量。测量数据稳定&#xff0c;抗干扰性强&#xff0c;可在500KV等级及以下电站做实验&#xff0c;接线方便&#xff0…

知识图谱(2)词汇挖掘与实体识别

实体是指文本中的词汇或者短语&#xff08;比如"中药"&#xff09;&#xff0c;但不是所有词汇都是实体&#xff08;比如"新鲜的"&#xff09;&#xff0c;因此&#xff0c;从非结构化的文本构建知识图谱涉及两个基本步骤&#xff1a; 挖掘尽可能多的高质…

初次安装Pytorch过程

第一次安装Pytorch&#xff0c;刚开始安装的时候装错了CUDA的版本号 这里最高支持12.2.138&#xff0c; 但是我装了一个12.2.140的CUDA&#xff0c;导致不兼容我在测试时发现 import torch# if torch.cuda.is_available(): # print("GPU可用") # else: # p…