WebAssembly 学习笔记

WASM

概述

wasm最初是为了在浏览器获得接近原生的性能体验
支持将其他语言实现的程序编译到wasm字节码,引入到浏览器由JS交互调用。
后又有了脱离JS的wasm运行时,可以直接运行wasm。
从而促成了wasm跨平台分发的能力。
但由于运行时的安全沙箱限制,其应用范围受限。

应用场景

  • 替换JS来实现高性能要求的功能模块(如md5计算)
  • 将已有的成熟项目迁移到浏览器环境运行(如ffmpeg)
  • 轻量级容器化技术

emscripten

是一个c/c++编译工具,可以编译到wasm

source ./emsdk_env.sh
# 查看emcc
emcc -v

对以下c程序编译

#include <stdio.h>

int main() {
  printf("Hello, world!\n");
  return 0;
}
emcc hello.c -o hello.wasm

根据-o指定不同后缀,编译出的结果供浏览器,node,其他运行时等使用。

  • emcc xx.c -o xx.html 浏览器
  • emcc xx.c -o xx.js node
  • emcc xx.c -o xx.wasm 其他运行时如wasmtime
HTML服务器

可以查看生成的HTML

python -m http.server 8080
nodejs
node xx.js
wasmtime

是一个wasm运行时

cd ~/.wasmtime/bin
./wasmtime xx.wasm
cmake

配合cmake使用,需要指定编译工具

set(CMAKE_C_COMPILER "/emsdk-main/upstream/emscripten/emcc")
set(CMAKE_CXX_COMPILER "/emsdk-main/upstream/emscripten/em++")
set(CMAKE_EXECUTABLE_SUFFIX ".wasm")

存在的问题

主要问题是安全沙箱环境的限制。其次,还有调试工具不完善等。

功能不完全

  • 不能直接访问硬件设备
  • 不能随意访问本地文件系统
  • 不支持基于本地窗口系统(Windows GDI/Linux X11)的图形库
  • 其他:进程管理(fork exec)/网络(sys/socket netdb)/内存/线程(pthread)等

References

  • https://juejin.cn/post/7259182371974266936
  • emscripten
  • wasmtime
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值