ДоступСн Emscripten 4.0, компилятор ΠΈΠ· C/C++ Π² WebAssembly

ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ выпуск инструмСнтария Emscripten 4.0, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° C/C++ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… языках, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ фронтэнды Π½Π° Π±Π°Π·Π΅ LLVM, Π² ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ WebAssembly. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с JavaScript-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ, запуска Π² web-Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅, использования Π² Node.js ΠΈΠ»ΠΈ создания обособлСнных ΠΌΠ½ΠΎΠ³ΠΎΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, запускаСмых ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ wasm runtime. Код ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° распространяСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ MIT. Π’ компиляторС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π½Π°Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° LLVM, Π° для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ WebAssembly ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ задСйствована Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Binaryen.

Основной Ρ†Π΅Π»ΡŒΡŽ Emscripten заявлСно созданиС инструмСнта, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π² Web ΠΊΠΎΠ΄ нСзависимо ΠΎΡ‚ языка программирования, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ этот ΠΊΠΎΠ΄ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ написан. Π’ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… прилоТСниях ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π²Ρ‹Π·ΠΎΠ²Ρ‹ стандартных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ C ΠΈ Π‘++ (libc, libcxx), Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ C++, ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π½Π° Π±Π°Π·Π΅ pthreads, API POSIX ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Π΄ΠΈΠΉΠ½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ API для ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с Web API ΠΈ ΠΊΠΎΠ΄ΠΎΠΌ Π½Π° JavaScript.

Emscripten ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Ρ€Π°Π½ΡΠ»ΡΡ†ΠΈΡŽ Π²Ρ‹Π²ΠΎΠ΄Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ SDL2 Ρ‡Π΅Ρ€Π΅Π· Canvas, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ OpenGL ΠΈ EGL Ρ‡Π΅Ρ€Π΅Π· API WebGL, Ρ‡Ρ‚ΠΎ позволяСт ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π² WebAssembly графичСскиС прилоТСния ΠΈ ΠΈΠ³Ρ€Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, имССтся ΠΏΠΎΡ€Ρ‚ Ρ‚ΡƒΠ»ΠΊΠΈΡ‚Π° Qt, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Π΅ Π΄Π²ΠΈΠΆΠΊΠΈ Unreal Engine ΠΈ Unit, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄Π²ΠΈΠΆΠΎΠΊ симуляции физичСских процСссов Bullet).

Помимо компиляции ΠΊΠΎΠ΄Π° Π½Π° C/C++ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ для запуска Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин для языков Lua, C#, Python, Ruby ΠΈ Perl. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ фронтэндов ΠΊ LLVM, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΡ‚ Clang, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, фронтэндов для языков, ΠΊΠ°ΠΊ Swift, Rust, D ΠΈ Fortran.

ΠŸΡ€ΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ Π½ΠΎΠΌΠ΅Ρ€Π° вСрсии 4.0 связано с внСсСниСм ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π½Π°Ρ€ΡƒΡˆΠ°ΡŽΡ‰ΠΈΡ… ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ABI (ΠΏΡ€ΠΈ пСрСсборкС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² Emscripten 4.0 потрСбуСтся пСрСсборка ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, собранных ΠΏΡ€ΠΎΡˆΠ»Ρ‹ΠΌΠΈ вСрсиями Emscripten). ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ измСнСния Π² Emscripten 4.0:

  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° опция «-sWASM_LEAGCY_EXCEPTIONS» для Π²Ρ‹Π±ΠΎΡ€Π° ΠΌΠ΅ΠΆΠ΄Ρƒ старым ΠΈ Π½ΠΎΠ²Ρ‹ΠΌ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°ΠΌΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ старый ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ всС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ возмоТности WebAssembly для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½ΠΎΠ²Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.
  • ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ compiler-rt, libcxx, libcxxabi ΠΈ libunwind ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Ρ‹ Π΄ΠΎ Π²Π΅Ρ‚ΠΊΠΈ LLVM 19.
  • Минимально поддСрТиваСмая Π² сборках вСрсия Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° Safari (настройка MIN_SAFARI_VERSION) ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½Π° с 14.1 Π΄ΠΎ 15.0, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ нСсколько Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Ρ… возмоТностСй WebAssembly:
    • Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ использованиС Π½ΠΎΠ²Ρ‹Ρ… инструкций для прСобразования Ρ‚ΠΈΠΏΠ° float Π² int (nontrapping-fptoint), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ вмСсто Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ минимально ΠΈΠ»ΠΈ максимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для SIMD).
    • Π’ΠΊΠ»ΡŽΡ‡Π΅Π½Π° опция WASM_BIGINT, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ для ΠΎΠ±ΠΌΠ΅Π½Π° цСлочислСнными 64-разрядными значСниями ΠΌΠ΅ΠΆΠ΄Ρƒ WebAssembly ΠΈ ΠΊΠΎΠ΄ΠΎΠΌ Π½Π° JavaScript примСняСтся Ρ‚ΠΈΠΏ BigInt.
    • Π’ΠΊΠ»ΡŽΡ‡Π΅Π½Π° опция BULK_MEMORY, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π‘ΠΈ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ memcpy ΠΈ memset ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ WebAssembly-инструкции memory.copy ΠΈ memory.fill.
  • Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ PATH.basename() ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π° нормализация ΠΏΡƒΡ‚Π΅ΠΉ (PATH.normalize()), Ρ‚.Π΅. Π²Ρ‹Π·ΠΎΠ² ‘PATH.basename(«a/.»)’ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Π΅Ρ€Π½Ρ‘Ρ‚ «.» вмСсто «a», Π° ‘PATH.basename(«a/b/..»)’ Π²Π΅Ρ€Π½Ρ‘Ρ‚ «..» вмСсто «a».
  • ΠŸΡ€ΠΈ использовании ΠΎΠΏΡ†ΠΈΠΈ «-sMODULARIZE» factory-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ экзСмпляры WebAssembly-ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² для JavaScript, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ «async» ΠΏΡ€ΠΈ компиляции Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ WASM_ASYNC_COMPILATION, примСняСмом ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ указания JavaScript-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΡ†ΠΈΡŽ «-lfoo.js». Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠΏΡ†ΠΈΠΈ «—js-library» поиск Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ выполняСтся Π²ΠΎ всСх путях, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΡ†ΠΈΡŽ «-L».
  • ΠŸΡ€ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ΅ Π² ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ (-O0 ΠΈΠ»ΠΈ -sASSERTIONS) ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ задСйствован ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ malloc со Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌΠΈ assert-ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°ΠΌΠΈ, Π²Ρ‹ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΌΠΈ Ρ‚Π°ΠΊΠΈΠ΅ ошибки, ΠΊΠ°ΠΊ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ free().

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru