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
posted @   zjh6  阅读(24)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示