JS/C与曲折CC和WASM

问题描述 投票:0回答:1
zig cc

(即

clang

)在ZIG版本上编译为WASM 0.13.0-DEV.351+64EF45EB0,使用macos Sequoia 15.0.1(aarch64)上的clang 16.0.0(aarch64)。

这是我迄今为止写的代码:

resource.c

#include <stdlib.h> void print_test(void); // the function I want to use const unsigned char heap[4096]; int __attribute__((export_name("memstart"))) memstart() { return (int)&heap; } int __attribute__((export_name("return5"))) return5(int p) { return 5 * p; } int __attribute__((export_name("entryAt"))) entryAt(int p) { print_test(); return heap[p]; }

Index.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>For Stephen</title>
    </head>

    <body>
        <input id="input" type="number" placeholder="int param..."></input>
        <input id="bytes" placeholder="bytes..."></input>
        <pre id="output">output goes gere</pre>
        <button id="button_r5">Return 5</button>
        <button id="button_nth">Get nth byte</button>
        <canvas id="my_canvas"></canvas>
        <script>
            const c = {};
            const encoder = new TextEncoder();
            const decoder = new TextDecoder();

            const importObject = {
                "env": {
                    "print_test": () => console.log("test print")
                }
            };

            WebAssembly.instantiateStreaming(fetch("resource.wasm", importObject))
            .then(result => {
                const {memory, memstart, return5, entryAt} = result.instance.exports;
                console.log(memstart);
                c.buffer  = new Uint8Array(memory.buffer, memstart());
                c.return5 = return5;
                c.entryAt = entryAt;
            });

            const button_r5  = document.getElementById("button_r5");
            const button_nth = document.getElementById("button_nth");
            const input  = document.getElementById("input");
            const bytes  = document.getElementById("bytes");
            const output = document.getElementById("output");

            button_r5.addEventListener("click", ()=>{
                output.textContent = c.return5(input.value);
            });

            button_nth.addEventListener("click", ()=>{
                c.buffer.set(encoder.encode(bytes.value));
                output.textContent = c.entryAt(input.value);
            });
        </script>
    </body>

</html>

构建命令

zig cc -target wasm32-freestanding -g resource.c -lc -Wl,--no-entry -o resource.wasm

	
您可以使用一些属性从JavaScript导入功能,这将取决于编译器。

使用Emscripten,您可以设置使用

EM_IMPORT(NAME)
。相当于
__attribute__((import_module("env"), import_name(#NAME)))

source-code
)。
考虑Zig还使用LLVM,您也可以使用相同的属性:
javascript c webassembly zig
1个回答
0
投票
__attribute__((import_module("env"), import_name("print_test"))) void print_test();

,如果它不起作用(也许它不使用Zig编译器),您可能还有其他口味:

void print_test() __attribute__((
    __import_module__("env"),
    __import_name__("print_test")
));

__attribute__((__import_name__("print_test"))) void print_test();

基于其他语言/编译器,例如

swiftwasm

.net-nativellvm
(全部基于LLVM)。
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.