Перейти к содержимому

Что такое WebAssembly и файл с расширением .wasm ?

Программу на C++ компилятором Emscripten (для языка Rust используем встроенная поддержка компиляции в *.wasm) -> компилируем в файл *.wasm в нем содержаться инструкции WebAssembly, что дает возможность запускать в браузере выполнение этих инструкции непосредственно сразу внутри процессора гаджета что ускоряет сложные вычисления которые на языке JS выполнялись бы очень долго. А язык JS является клеем между браузером и инструкциями WebAssembly которые содержаться в файле *.wasm.

Вопрос: Тесть получается что *.wasm это как байт код Java машины ?

Ответ от Gmini:

В целом, ваше понимание очень близко к истине!


WebAssembly (WASM) и байт-код Java

Вы абсолютно правы в своей аналогии. WebAssembly (WASM) действительно очень похож на байт-код Java-машины.

Вот почему:

  • Портативность: Как и байт-код Java, который может выполняться на любой платформе, где есть JVM (Java Virtual Machine), WASM-код может выполняться в любом браузере или среде, поддерживающей WebAssembly. Это делает его платформонезависимым.
  • Низкоуровневость и производительность: Оба являются низкоуровневым представлением кода, оптимизированным для быстрого выполнения. Они не предназначены для написания человеком напрямую (хотя это возможно), а являются целью компиляции для языков более высокого уровня (C++, Rust, Go, Java, C# и т.д.).
  • Исполнение: Вместо того чтобы быть интерпретированным, как обычный JavaScript, WASM-код компилируется «на лету» (JIT — Just-In-Time) в машинный код процессора, что обеспечивает производительность, близкую к нативной. Это ключевое отличие от традиционного JavaScript, который исторически был интерпретируемым, хотя современные JS-движки также используют JIT-компиляцию.
  • «Песочница» (Sandboxing): Как и JVM, WASM-среда работает в «песочнице», обеспечивая безопасность. Код WASM не имеет прямого доступа к файловой системе или другим системным ресурсам без явного разрешения через JavaScript.

Дополнения к вашему пониманию:

  • Emscripten действительно является ключевым инструментом для компиляции C/C++ в WASM (и JavaScript в качестве «клея»).
  • Для Rust компиляция в WASM встроена в инструментарий языка, что делает этот процесс очень удобным.
  • Вы очень точно подметили, что JavaScript служит «клеем». Он инициализирует WASM-модули, передает данные между JavaScript и WASM, и вызывает функции, определенные в WASM. Это позволяет WASM сосредоточиться на интенсивных вычислениях, а JavaScript — на управлении DOM, сетевых запросах и общем взаимодействии с браузером.

Таким образом, если провести параллель, то WASM — это аналог байт-кода, а движок WebAssembly в браузере (или вне его, например, с WASI — WebAssembly System Interface) — это аналог виртуальной машины, такой как JVM.


  1. Написали C++ код, дальше использует например Emscripten – это набор инструментов, который берет ваш C++ код и компилирует его в файл *.wasm
    (Для Rust (похож на С++) есть встроенная поддержка компиляции в Wasm, и вы используете утилиты типа wasm-pack.)
    в результате полученый файл .wasm — это бинарный код и он содержит инструкции WebAssembly.
  2. файл *.wasm как и другие файлы mp3, json и т.д. можно использовать в проекте HTML, JS, CSS и этот *.wasm файл.
    После загрузки браузерный движок WebAssembly берет этот .wasm файл и быстро компилирует его в машинный код, который напрямую понимает процессор вашего компьютера.

JavaScript играет роль «клея»: он используется для загрузки .wasm модуля, для передачи данных между JavaScript и WebAssembly, и для вызова функций, определенных в вашем WebAssembly коде. Например, вы можете из JavaScript вызвать функцию calculateSomething() из вашего Wasm модуля.

Вопрос: Если я верно понимаю, то функцию calculateSomething() это функция которую я могу написать на языке C++ или Rust и она будет что-то делать что делать нужно очень быстро ? 

Ответ:

Ваше понимание абсолютно верное!


Подтверждение вашего понимания WebAssembly

Вы совершенно точно ухватили суть WebAssembly. Да, функция calculateSomething() — это именно та функция, которую вы пишете на C++ или Rust, и именно она будет выполнять те ресурсоемкие вычисления, которым нужна высокая скорость.

Вот почему:

  • WASM для тяжелых задач: WebAssembly разработан специально для выполнения вычислительно сложных операций, которые могут замедлить JavaScript. Это могут быть, например, обработка изображений, видео, сложные математические расчеты, игры, эмуляция систем или криптография.
  • Вызовы между языками: JavaScript выступает в роли оркестратора. Он загружает WASM-модуль, а затем может вызывать функции, определенные в этом модуле (например, вашу calculateSomething()), передавать им данные и получать результаты обратно. Это позволяет разделить приложение: JavaScript управляет интерфейсом и логикой высокого уровня, а WASM выполняет «грязную» работу.
  • Производительность близкая к нативной: Когда браузерный движок WebAssembly берет ваш .wasm файл, он компилирует его в машинный код. Это означает, что calculateSomething() будет выполняться на процессоре вашего устройства практически с той же скоростью, что и нативное приложение, написанное на C++ или Rust.

Так что, да, вы можете написать на C++ или Rust любую сложную логику, которую нужно ускорить, скомпилировать её в WASM, и затем использовать JavaScript для её вызова и интеграции в ваш веб-проект.


Аналогия для лучшего понимания:

Представьте, что браузер — это театр, а JavaScript — это актер, который умеет говорить на языке театра (т.е. на JavaScript). Wasm же — это как «ноты» или «сценарий», написанные на универсальном языке музыки/театра. Композиторы (программисты на C++/Rust) пишут свои произведения (программы) на своих языках, а затем используют специальную программу (компилятор Wasm), чтобы перевести их в эти универсальные ноты/сценарий (Wasm). Затем театр (браузер) может взять эти ноты/сценарий и с помощью своих музыкантов/актеров (движка Wasm) исполнить их очень быстро. JavaScript в этом случае может быть дирижером, который говорит «начать играть эту мелодию».

Компиляция в WebAssembly/JavaScript: Для использования SQLite в браузере (где нет прямого доступа к файловой системе или нативным библиотекам C), SQLite компилируется в WebAssembly (WASM) или старый JavaScript (asm.js) с использованием инструментов вроде Emscripten. Примером такой библиотеки является sql.js. В этом случае, оригинальный код на C «переводится» в JavaScript/WebAssembly, чтобы его можно было запустить в среде браузера.