Кратко как я понял:
Программу на 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.
Кратко как я понял (вариант 2):
- Написали C++ код, дальше использует например Emscripten – это набор инструментов, который берет ваш C++ код и компилирует его в файл *.wasm
(Для Rust (похож на С++) есть встроенная поддержка компиляции в Wasm, и вы используете утилиты типа wasm-pack.)
в результате полученый файл .wasm — это бинарный код и он содержит инструкции WebAssembly. - файл *.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, чтобы его можно было запустить в среде браузера.