В чем разница между Emscripten и Clang с точки зрения компиляции WebAssembly

#clang #llvm #webassembly #emscripten #wasi

#clang #llvm #webassembly #emscripten #васи

Вопрос:

Я знаю, что оба clang (с использованием target= wasm32) и emscripten могут компилировать код C в webassembly, но чем они отличаются?

Похоже, что они оба используют LLVM в качестве серверной части. На самом деле, я даже не совсем понимаю связь между llvm и clang…

Я некоторое время читал WebAssembly, но мне не хватает понимания этого на низком уровне. Большое вам спасибо за ваше время!!

Ответ №1:

clang — это компилятор, построенный на технологии llvm, поэтому вы часто слышите, что clang и llvm используются взаимозаменяемо. clang — это всего лишь один компонент проекта llvm.

emscripten — это компилятор, который использует clang для большей части тяжелой работы по фактической компиляции в WebAssembly, но также добавляет множество функций и функциональных возможностей, в основном связанных с бесшовной интеграцией с JavaScript и web и эмуляцией POSIX и других стандартов.

emscripten запускает clang внутри, --target=wasm32-unknown-emscripten который имеет некоторые очень незначительные отличия от обычного --target=wasm32 .

Если вы запустите emscripten с -v ним, он выведет полную командную строку clang, которую он использует под капотом.

Комментарии:

1. Большое вам спасибо! Если я вас правильно понял. Emscripten может генерировать что-то в виде склеивающего кода, чтобы мы могли легко работать с WASM. Могу ли я продолжать спрашивать: в коде glue у нас есть некоторый JS API, такой как WebAssembly.instantiate для компиляции wasm в машинный код во время интерпретации кода JS glue. Но в некоторых других средах выполнения, таких как wasmtime и Lucet, они могут запускать автономный WASM. Есть ли еще склеенный код в этих средах выполнения, просто скрытый от нас, просто предоставляя нам cli для использования. Если да, то на каких языках (C / rust и gusee) склеивается код в wasmtiem и lucet, написанный с помощью?

2. Среды выполнения, такие как wasmtime и Lucet, не имеют, скажем, кода клея, они просто раскрывают возможности платформы WASI и, возможно, нескольких других API. Сегодня они гораздо более ограничены в том, что вы можете сделать. например, вы не можете взять что-то вроде видеоигры и запустить ее в wasmtime, тогда как emscripten разработан с учетом этого.

3. API системных вызовов в wasmtime реализованы в rust.

4. Спасибо!! Теперь я очень смущен. Похоже, что wasm генерируется из LLVM IR, и используя Emscripten или clang, мы можем скомпилировать этот IR в wasm. Но что мы используем для генерации машинного кода из wasm? Я также слышал, что LLVM используется, например, для генерации машинного кода из WASM (использует ли js API WebAssembly.instantiate() clang для компиляции wasm в машинный код?) Есть еще одна вещь, называемая Cranelift, вы знаете, для чего она используется? генерация машинного кода из wasm или генерация wasm из языка высокого уровня? Извините за беспорядок, возможно, мне следует открыть новую проблему.

5. Среда выполнения webassembly отвечает за компиляцию байт-кода webassembly в машинный код (или его интерпретацию). В Сети это делается с помощью V8 или spidermonkey или любого другого движка в вашем браузере. В Интернете это делается с помощью сред выполнения, таких как Cranelift или wasmer.