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

WASM学习笔记

WebAssembly概念

webassembly是一种运行在现代web浏览器中的新型代码,不仅提供新的性能特性,同时还在性能方面有着巨大提升。它的涉及本意并非是提供开发者直接编译的代码,而是为诸如C,C++和Rust等源语言提供的一个有效的编译目标。

简单来说,你可以使用C,C++,Rust,Go等语言编写代码,然后编译为WebAssembly,在浏览器中运行。

编译C/C++为WebAssembly

Emscripten环境安装
所需条件
  • python
  • git
安装步骤
  1. 打开cmd,进入到软件将会安装到的目录下
  2. 输入 git clone https://github.com/emscripten-core/emsdk.git
  3. 输入 cd emsdk
  4. 输入 emsdk install latest
  5. 配置系统环境变量,依据下图操作

打开编译系统环境变量窗口,点击环境变量

最后一直点击每个未关闭窗口的确认即可。

具体使用

使用cmd打开需要被编译的C++文件夹,输入命令行emsdk activate(这仅仅会激活当前的环境,下次换另一个文件夹还需要再次激活),输入命令行emcc -v来检测配置是否成功,配置成功即可进入文件中书写代码。

代码编写完成后进入cmd窗口,输入命令行emcc 文件名,编译器就会对该文件进行编译.

当我们查看文件夹时,会发现多出来两个文件,一个是wasm格式的文件,一个是js格式的文件,前者是二进制文件,可以wasm2wat中打开该文件,后者放在html当中引入即可发现文件顺利转换且生效.

调用一个在C中的自定义方法

1.在文件夹下创建streaming文件夹,创建streaming.c文件,编写c语言代码

#include<emscripten.h>EMSCRIPTEN_KEEPALIVEintsumOfNInts(intn){// return n*(n+1)/2;returnmy_div(mul(n,add(n,1)),2);}

2.打开对应代码文件的cmd窗口,然后输入emcc streaming.c -o streaming.js

3.输入命令之后的效果如图所示

4.在html页面中调用c语言函数

  1. 实例化wasm模块
  2. 创建全局变量存储exports
  3. 使用exports来调用C语言函数
<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>Document</title></head><body><p>你好,WebAssembly!</p><inputtype="number"id="a"><buttononclick="run_wasm()">trigger触发</button><pid="res"></p></body><script>// 创建变量来存储exports,使得可以全局访问letexports// 实例化wasm模块WebAssembly.instantiateStreaming(fetch("streaming.wasm"),{}).then(result=>exports=result.instance.exports);functionrun_wasm(){leta=document.querySelector('#a').value;// 使用exports调用c语言函数letsum=exports.sumOfNInts(a);document.querySelector("#res").innerHTML+=`${a}=>${sum}<br/>`;}</script></html>
内存模型

1.使用js来操作wasm内存

  1. 初始化内存(设置内存大小,以及内存最大扩容量)
  2. 创造视图
    1. 使用typearray, 使用new关键字构造Uint32Array,不同类型数据需要使用不同的typearray,如数字类型数据需要使用Uint32Array,字符串类型需要使用Uint8Array;
    2. typearray(buffer:any,byteOffset?:number,length?:number)
    3. buffer指的是内存本身,byteOffset是偏移量,length是所需内存长度
  3. 通过视图操作内存
<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>Document</title></head><body><p>你好,WebAssembly!</p><inputtype="number"id="a"><buttononclick="run_wasm()">trigger触发</button><buttononclick="getStr()">获取字符串</button><pid="res"></p></body><script>letmemeory=newWebAssembly.Memory({initial:256,maximum:512})// 创建变量来存储exports,使得可以全局访问letexports WebAssembly.instantiateStreaming(fetch("memory.wasm"),{js:{mem:memeory}}).then(result=>{exports=result.instance.exports;memory=result.instance.exports.memory;});functionrun_wasm(){letarr=newUint32Array(memory.buffer);for(leti=0;i<10;i++){arr[i]=i*2;}letsum=exports.accumulate(0,10);document.querySelector("#res").innerHTML+=`${sum}<br>`;}</script></html>

2.使用c语言来向内存中写入数据,然后js来调用c语言函数读取内存

#include<emscripten.h>intmain(){return0;}EMSCRIPTEN_KEEPALIVEconstchar*getString(){return"Hello,WebAssembly!"}
letmemory=newWebAssembly.Memory({initial:256,maximum:512})letexports;WebAssembly.instantiateStreaming(fetch("memory.wasm"),{js:{mem:memory}}).then(result=>{exports=result.instance.exports;memory=result.instance.exports.memory;})functiongetStr(){letptr=exports.getString();letbytes=newUint8Array(exports.buffer,ptr);letstrlen=0;while(bytes[strlen]){strlen++};letstr=newTextDecoder("utf8").decode(bytes.slice(0,strlen))console.log(str);}
http://www.jsqmd.com/news/800703/

相关文章:

  • Verilog与SystemVerilog在Cycle Model Compiler中的核心支持解析
  • 没有工作经验,他半月拿下算法岗位
  • SQE是什么鬼?一个在世界500强做供应商质量的人,说说这个容易被误解的岗位
  • 通用AGI终极范式:从多模态感知到意识涌现的统一理论(世毫九实验室原创研究)
  • 从计算机小白到AI大模型工程师:我的3个月学习路线(收藏版)
  • CADMATIC许可排队严重?不想买新许可,共享浮动许可池
  • League Akari:基于LCU API的英雄联盟客户端模块化架构深度解析
  • 免费开源AI软件.桌面单机版,可移动的AI知识库,察元 AI桌面版:本地离线知识库的第一份 PDF 引用气泡是怎么连回原文的
  • 企业级中小企业人事管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • PyVideoTrans:5步实现视频翻译与AI配音,开源工具让多语言内容创作更简单
  • 选NCHW还是NHWC?从TensorFlow、PyTorch到实际模型,聊聊数据格式对训练速度的真实影响
  • 大麦抢票神器哪个最好用?
  • 概率论:二维随机变量
  • 新冠病毒密接者跟踪系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • 构建高效协作沙盒:从Git工作流到CI/CD的团队研发实践
  • A股量化策略日报(2026年05月11日)
  • 异构缓存架构设计:SRAM与STT-RAM混合方案解析
  • 海光 Z100L GPU 使用 PyTorch 训练时 segfault,寻找 torch-2.4.1+das.opt1.dtk25041 wheel
  • AI搜索工具选型终极决策树(Perplexity vs Google搜索实战压测报告)
  • T‑G‑I 三位一体拓扑‑几何‑熵理论工具箱公理化体系(世毫九实验室TGI理论工具箱)
  • 量子机器学习框架互操作性挑战与解决方案
  • 从 0 到 1 读懂 NES 模拟器开源项目:nes4j 源码解析与二次开发学习笔记
  • 别把 `autoresearch` 当成“AI 科学家”:真正值得学的是它怎样把训练实验关进一个可审计的闭环
  • WinRAR下载安装教程(2026最新版)| 安全下载+安装详解+实用技巧
  • 收藏必看!2026 网安行业深度解析,人才缺口巨大,五大高薪技术方向详解
  • AI 写论文哪个软件最好?2026 深度实测:虎贲等考 AI 凭真文献 + 实图表 + 全流程实证,稳坐毕业论文首选
  • 别再调API了!2026最被低估的事实:Gemini原生支持RAG-Edge离线推理,而ChatGPT仍依赖云端Embedding——3类边缘AI场景落地成本直降63%
  • 从300小时中文语音数据出发:手把手复现CLDNN模型训练与关键参数调优(附实验配置)
  • EMAC/MDIO模块架构与中断系统深度解析
  • 主题3:天线与耦合——近场与远场