d使用ldc生成wasm
原文
对如下D代码(wasm.d)
生成.wasm
文件:
extern(C): // 禁止D混杂
double add(double a, double b) { return a + b; }// 要求的入口点
void _start() {}
构建wasm.wasm
命令:
ldc2 -mtriple=wasm32-unknown-unknown-wasm -betterC wasm.d
如用dub
:
dub build --compiler=ldc2 --arch=wasm32-unknown-unknown-wasm
在超文本页面中测试
js
加载并调用wasm
,a.html
内容:
<html><head><script>const request = new XMLHttpRequest();request.open("GET", "wasm.wasm");request.responseType = "arraybuffer";request.onload = () => {console.log("response received");const bytes = request.response;const importObject = {};WebAssembly.instantiate(bytes, importObject).then(result => {console.log("instantiated");const { exports } = result.instance;// 调用`d`的`加`函数.const r = exports.add(42, -2.5);console.log("r = " + r);});};request.send();console.log("request sent");</script></head><body>Test page</body>
</html>
fetch()
不适用本地文件
.打开它,在控制台
会看见:
request sent
response received
instantiated
r = 39.5
调用外部函数
extern(C): // 禁止混杂// 从默认`"env"`导入模块名导入`"callback"`函数
void callback(double a, double b, double c);double add(double a, double b)
{const c = a + b;callback(a, b, c);return c;
}void _start() {}
加上-L-allow-undefined
标志.否则lld
由于未定义
回调而拒绝链接
.
js中实现回调
,并在importObject.env
中指定:
const callback = (a, b, c) => {console.log(`callback from D: ${a} + ${b} = ${c}`);
};
// ...const importObject = {env: { callback }};
现在输出:
request sent
response received
instantiated
callback from D: 42 + -2.5 = 39.5
r = 39.5
要从其他
模块导入
函数或重命名
导入函数
,我们使用LDC
的@llvmAttr
.
import ldc.attributes;extern(C): // // 从`"math"`模块导入`"add"`函数,并重命名为`"add_numbers"`.
@llvmAttr("wasm-import-module", "math") @llvmAttr("wasm-import-name", "add") {int add_numbers(int a, int b);
}// 导出`"hello"`函数
export int hello(int a, int b, int c)
{int s1 = add_numbers(a, b);int s2 = add_numbers(s1, c);return s2;
}void _start() {}
其他LLVM的wasm功能
如下列出LDC
版本LLVM
支持的WASM
功能,如SIMD
或异常
处理.
ldc2 -mtriple=wasm32-unknown-unknown-wasm -mattr=help
d使用ldc生成wasm相关推荐
- 腾讯视频cKey9.1的生成分析和实现
腾讯视频cKey9.1的生成分析和实现 说明: 这文章并不是对算法的分析,而仅仅是为了实现cKey9.1(因为有Nodejs了,所以就不需要担心JS脚本的运行). 而其中的算法就是取自于腾讯视频的9. ...
- wasm和javascript
你是前端吗?你知道WebAssembly吗? 我是前端,很早以前就关注并使用这个技术了. 2015年的时候,还搞过技术分享,那时候还不叫wasm, 那时候确切点说称之为经过llvm编译高度优化过的as ...
- php wasm,wasm总结
环境安装可以参考: WebAssembly 环境配置 也可以使用docker: docker run -it --rm -v $(pwd):/home/src trzeci/emscripten sh ...
- 基于wasm的探索与研究(一)
WebAssembly初探 本次分享的文章是基于WebAssembly的探索与研究.最近需要做一个与加密相关的项目,想将后端的加密方案直接放到前端使用,好处是加密方案代码只用维护一套,且后端方案更贴近 ...
- 基于wasm的探索与研究(三)
wasmer运行时 上一篇文章分享了基于wasm的openssl实践,讲述了openssl的MD5算法如何在浏览器中执行.在探索过程中发现了openssl是可以通过wasm编译后直接run,并且有自己 ...
- wasm 访问html元素,[wasm] Hello WebAssembly
1. 背景 WebAssembly是一种运行在现代网络浏览器中的新型代码并且提供新的性能特性和效果. 它设计的目的不是为了手写代码而是为诸如C.C++和Rust等低级源语言提供一个高效的编译目标. W ...
- 基于FFmpeg和Wasm的Web端视频截帧方案
作者 | 小萱 导读 基于实际业务需求,介绍了自定义Wasm截帧方案的实现原理和实现方案.解决传统的基于canvas的截帧方案所存在的问题,更高效灵活的实现截帧能力. 全文10103字,预计阅读时间2 ...
- WebAssembly 初探
WebAssembly 初探 1.什么是 WebAssembly WebAssembly是一种新的编码方式,可以在现代的网络浏览器中运行 - 它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原 ...
- 【JSConf EU 2018】WebAssembly 的手工艺术
在今年欧洲的JSConf上Emil Bay进行了一场题为<Hand-Crafting WebAssembly>的演讲.Emil表示:"现在已经有很多关于WebAssembly(W ...
最新文章
- 震惊!我发现了一个CSDN的文章编辑BUG,即使保存草稿也让我一天的努力白费!
- 做爱做的事,做有快感的事
- 词云(WordCloud)参数详情
- python封装工具类多个项目使用_【arcpy项目实战】将多个点两两生成的最短路径pyhon代码封装入script中...
- c程序语言习题解答对编程有帮助吗,给C语言编程初学者的10个学习建议,助你学习事半功倍,不要错过...
- 远程桌面服务器office版本,在启用远程桌面服务的计算机上部署 Office 2010
- Scala的控制结构
- 精品软件 推荐 DiskGenius专业版 磁盘管理软件 4.7 注册版本分享
- zabbix监控Linux系统服务
- Unity3D基础24:LineRenderer特效
- 服装进销存软件排名前十名,最新门店进销存测评现已出排行榜
- 批处理删除文件文件夹相关指令
- 【GOF】三种工厂模式~
- 阿尔伯塔大学计算机科学的申请条件,阿尔伯塔大学计算机科学硕士专业
- CPU、GPU、TPU、NPU等到底是什么
- 高通平台开发系列讲解(外设篇)QCA6696启动过程
- OceanBase分区
- 通过gcloud创建Google Kubernetes Engine(GKE)并通过kubectl访问
- php e all e notic,PHP error_reporting(E_ALL ^ E_NOTICE)一些资料整理
- 2021年日历记事备忘录(A4可打印版)