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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现