【问题标题】:What is the difference between Emscripten and Clang in terms of WebAssembly compilationEmscripten 和 Clang 在 WebAssembly 编译方面有什么区别
【发布时间】:2021-02-17 18:56:27
【问题描述】:

我知道 clang(通过使用 target=wasm32)和 emscripten 都可以将 C 代码编译成 webassembly,但它们有何不同?

看起来他们都使用 LLVM 作为后端。其实我也不太明白llvm和clang的关系...

我已经阅读 WebAssembly 有一段时间了,但是我对它缺乏底层的理解。非常感谢您的宝贵时间!!

【问题讨论】:

    标签: clang llvm webassembly emscripten wasi


    【解决方案1】:

    clang 是一个基于 llvm 技术的编译器,因此您经常听到 clang 和 llvm 可以互换使用。 clang 只是 llvm 项目的一个组件。

    emscripten 是一个编译器,它使用 clang 完成实际编译到 WebAssembly 的大部分繁重工作,但在此之上还添加了许多特性和功能,主要与与 JavaScript 和 Web 的无缝集成以及 POSIX 的仿真和其他标准。

    emscripten 在内部使用 --target=wasm32-unknown-emscripten 运行 clang,这与常规的 --target=wasm32 有一些非常小的差异。

    如果您使用-v 运行 emscripten,它将在后台打印完整的 clang 命令行。

    【讨论】:

    • 非常感谢!如果我理解正确的话。 Emscripten 可以生成胶水代码,以便我们可以轻松地使用 WASM。我可以继续问:在胶水代码中,我们有一些 JS API,例如 WebAssembly.instantiate 来在解释 JS 胶水代码时将 wasm 编译为机器码。但在其他一些运行时,例如 wasmtime 和 Lucet,它们可以运行独立的 WASM。那些运行时中是否还有胶水代码,只是通过简单地为我们提供 cli 来使用而对我们隐藏。如果是的话,wasmtiem 和 lucet 用什么语言(我猜是 C/rust)粘合代码?
    • 像 wasmtime 和 Lucet 这样的运行时并没有单独的胶水代码,它们只是暴露了 WASI 的平台功能和其他一些 API。今天,他们在你能做的事情上受到了更多的限制。例如你不可能拿视频游戏之类的东西在 wasmtime 上运行,而 emscripten 的设计考虑到了这一点。
    • wasmtime中的系统调用API是用rust实现的。
    • 谢谢!!我现在很困惑。看起来 wasm 是从 LLVM IR 生成的,使用 Emscripten 或 clang,我们可以将该 IR 编译成 wasm。但是我们用什么来从 wasm 生成机器码呢?我还听说LLVM是用来从WASM生成机器码的,比如(js API WebAssembly.instantiate()是不是用clang来把wasm编译成机器码?)还有一个东西叫Cranelift,你知道它是做什么用的吗? ?从 wasm 生成机器代码还是从高级语言生成 wasm?抱歉给我添乱了,也许我应该开一个新问题。
    • WebAssembly 运行时负责将 WebAssembly 字节码编译为机器码(或解释它)。在网络中,这是由 V8 或 spidermonkey 或浏览器中的任何其他引擎完成的。在 Web 中,这是由 Cranelift 或 wasmer 等运行时完成的。
    猜你喜欢
    • 2015-10-08
    • 2017-02-11
    • 2012-12-01
    • 1970-01-01
    • 2020-08-23
    • 2011-07-15
    • 2014-08-10
    • 2011-04-21
    • 2018-08-05
    相关资源
    最近更新 更多