尝试 WebAssembly
wasm 为浏览器应用开辟了一个全新的领域。意义非凡,并不是一句两句说的清的,今天正好有点空做些实验。
1. emsdk 的安装
Emscripten 可以直接将 C/C++ 编译为 wasm,让用 C 写的代码可以在浏览器中运行,还是看不见代码那种 :)
没有过多纠结他怎么打包的,反正直接从 github 上下了最新的源码包过来就可以用了:
download emsdk-master.zip
unzip emsdk-master.zip
cd emsdk-master
( emsdk-master update )
emsdk install latest
emsdk activate latest
然后添加 emsdk 的环境变量,我这里直接追加在了 ~/.bashrc 的最后:
. (前面解压的路径)/emsdk-master/emsdk_env.sh
或者你可以把 env.sh 里面的内容直接拷贝到 .bashrc 里面去。
------
到此 emsdk 安装完成。
------
如果中间出什么问题,估计是你系统的编译工具啥的安装不完整导致的:
sudo apt update
sudo apt install python2.7 nodejs build-essential cmake git-core default-jre
2. hello_world.html
是的,emsdk 支持直接把你的 C 代码编译成一个 html 文件。主要是因为 wasm 没法直接在浏览器运行,需要 js 将其载入,再调用啥的。直接使用官方的编译为 *.html 的方法,可以降低入门门槛。
使用的 C 代码:
#include <stdio.h>
int main(int argc, char ** argv) {
printf("Hello, world!\n");
}
编译指令:
emcc hello.c -o hello.html
因为这里没法直接点解 hello.html 来运行 wasm,所以,需要起个 web 服务器。所幸是 emsdk 还带了个服务器:
emrun --no_browser --port .
或者你也可以直接使用 python3 的 web 服务器:
python3 -m http.server
然后,在你的浏览器里面就可以看到这结果了。

2. 自己写加载器
官方的这个 html 真的是有点丑,我们也可以自己写个加载器,将 wasm 中的函数加载过来。
测试的 C 函数:
int fib(int n) {
int i;
int t;
int a = ;
int b = ;
for(i = ; i < n; i++) {
t = a + b;
a = b;
b = t;
}
return b;
}
将其编译为 wasm 模块(别问我为什么,官方说的,我也没研究为啥):
emcc fib.c -Os -s WASM= -s SIDE_MODULE= -o fib.wasm
然后我们就可以自己写个网页来加载它了:
<html>
<body>
<script>
fetch('fib.wasm').then(response =>
response.arrayBuffer()
).then(bytes =>
WebAssembly.instantiate(bytes, {imports: {}})
).then(results => {
window.fib = results.instance.exports.fib;
});
</script>
</body>
</html>
开启 web 服务器,然后打开浏览器试试看。
因为上面的代码只是引入 wasm 中的函数到 javascript,所以我们要执行这个函数需要打开调试 console:

尝试 WebAssembly的更多相关文章
- 翻译:WebAssembly简介:我们为什么要关心这个技术?
原文: https://tomassetti.me/introduction-to-webassembly/ WebAssembly简介:我们为什么要关心这个技术? 在对抗js的伟大战斗中有 ...
- F#周报2019年第11期
新闻 Bolero:WebAssembly中的F# 尝试WebAssembly里的F# JetBrains的fsharp-support 2019.1 ML.NET 0.11发布 Outreachy内 ...
- WebAssembly学习(二):Windows10下WebAssembly C/C++编译环境的搭建与Hello World尝试
首先,不论是在Windows.Linux还是Mac上,Webassembly的编译都是主要依赖于Emscripten SDK这个工具的.但是,在这里必须要吐槽一下,不论是WebAssembly官网.W ...
- WebAssembly:随风潜入夜
What? WebAssembly 是一种二进制格式的类汇编代码,可以被浏览器加载和并进一步编译成可执行的机器码,从而在客户端运行.它还可以作为高级语言的编译目标,理论上任何语言都可以编译为 WebA ...
- JavaScript与WebAssembly进行比较
本文由云+社区发表 作者:QQ音乐前端团队 在识别和描述核心元素的过程中,我们分享了构建SessionStack时使用的一些经验法则,这是一个轻量级但健壮且高性能的JavaScript应用程序,以帮助 ...
- 用c# 开发html5的尝试,试用bridge.net
Javascript交叉编译方案很多了,工业级品质的也不是没有,但前两年我从事html5 3d引擎开发时,做过一圈评估,没有可用的. 作为一个c#爱好者,我自然是很希望能最大限度的利用c#的生产力,之 ...
- 如何生成WebAssembly文件?
许多3D游戏都是用C/C++语言写的,如果能将C/C++语言编译成JavaScript代码,它们不就能在浏览器里运行了吗?Emscripten的底层是LLVM编译器,Emscripten可以将c/c+ ...
- webassembly
为什么需要 WebAssembly 自从 JavaScript 诞生起到现在已经变成最流行的编程语言,这背后正是 Web 的发展所推动的.Web 应用变得更多更复杂,但这也渐渐暴露出了 JavaScr ...
- WebAssembly 上手
安装 Mac 上最便捷的安装方式当然是通过 Homebrew: $ brew install emscripten 安装好之后讲道理就已经自动配置好一切,然后 emcc 命令便可用了. 下面看非 Ho ...
随机推荐
- NSQ端口关系以及注意事项
0.相关参考文章: 官网:https://nsq.io/ <golang实战-nsq集群入门与坑> <nsq系统架构> <NSQ消息队列> 1.启动命令 ①nsql ...
- OSI、TCP/IP
计算机网络分层的目的:支持异构网络系统的互联互通 7层OSI参考模型是法定标准(国际标准化组织ISO提出) 4层TCP/IP参考模型是事实标准 OSI参考模型 应用层.表示层.会话层.传输层.网络层. ...
- MySQL的rpm安装教程
Linux 上安装 MySQL Linux平台上推荐使用RPM包来安装Mysql,MySQL AB提供了以下RPM包的下载地址: MySQL - MySQL服务器.你需要该选项,除非你只想连接运行在另 ...
- 【IntelliJ IDEA新手入门】IDEA如何快速搭建Java开发环境
作为IntelliJ IDEA mac新手,IDEA如何快速搭建Java开发环境呢? 今天小编就给大家带来了IntelliJ IDEA mac使用教程,想知道IDEA如何快速搭建Java开发环境?那就 ...
- 20180610模拟赛T4——木棍
有\(N\)根木棍,每根的长度\(L\)和重量\(W\)已知.这些木棍将被一台机器一根一根地加工.机器需要一些启动时间来做准备工作,启动时间与木棍被加工的具体情况有关.启动时间遵循以下规则: 加工第一 ...
- JS 中的 new 操作符
按照javascript语言精粹中所说,如果在一个函数前面带上new来调用该函数,那么将创建一个隐藏连接到该函数的prototype成员的新对象,同时this将被绑定到那个新对象上.这个话很抽象,我想 ...
- 小学四则运算口算练习app---No.5
今天主要设置答案页面,主要是出题页面和答案页面之间的传参问题以及答案页面的展示问题!这里运用数组讲出的题目包装成一个String类型数目(包括等号和使用者的作答) 讲正确答案单独包装成一个数组,以及相 ...
- 【java】oracle好用,但java运行缺失右括号
可能原因SQL拼接有空格被省略导致sql粘连. 解决办法,扩大拼接或者缩小拼接范围.
- SpringBoot如何切换Redis默认库
一些闲扯的话 我们清楚,Redis 尽管提供了 16 个索引库,但是每个数据库之间是隔离互不共享的,客户端默认连接使用的是 0 号数据库 . 注意:上方情况是基于单机 Redis 的,在集群模式下是没 ...
- spring学习3
spring整合JDBC spring提供了很多模板整合Dao技术 spring中提供了一个可以操作数据库的对象.对象封装了jdbc技术. JDBCTemplate => JDBC模板对象 ...