WebAssembly (Wasm) — це технологія, яка дає можливість запускати програми у браузері (та не тільки) із продуктивністю, наближеною до нативної. Проте розробники зазвичай не пишуть код безпосередньо на Wasm, натомість використовуються інші мови, які компілюються у WebAssembly-бінарники. Деякі з них краще пристосовані до цього процесу.
Info World пропонує шість мов програмування, які можна використовувати для розгортання на Wasm, а також нюанси їхнього застосування.
Rust
Rust — одна з найкращих мов для роботи з WebAssembly. Наявний код на Rust майже не потребує змін для компіляції у Wasm. Основна увага приділяється налаштуванню цільової платформи та параметрів компіляції. Інструменти Rust автоматично генерують JavaScript-обгортки, що дає можливість легко інтегрувати модулі Wasm у вебсторінки.
Модулі Rust доволі компактні: навіть «Hello, world» важить лише кілька кілобайтів. Розробники Rust опублікували повний посібник із використання Wasm, включно з оптимізацією розміру бінарників і підключенням до наявних бібліотек (crate).
C / C++
Ці мови були серед перших, що компілювались у Wasm, оскільки їхня низькорівнева природа добре відповідає інструкційному набору Wasm. Одним із перших інструментів став Emscripten — повноцінний тулчейн для компіляції С/С++ у Wasm. Він підтримує SIMD, мережу, виключення, асинхронність, pthread тощо — хоча складність портування залежить від функції.
Починаючи з Clang 8, компіляція C/C++ у Wasm можлива без додаткових інструментів. Проте Emscripten, який побудований на базі LLVM (як і Clang), залишається найбільш зручним рішенням для розробників.
Go (Golang)
Go додала підтримку WebAssembly ще у версії 1.11 (2018). Підтримка досить стабільна, хоча має обмеження.
Зміни в коді мінімальні, потрібно лише задати змінні середовища GOOS=js
і GOARCH=wasm
. JavaScript-обгортку доведеться створювати вручну, але це просто. Взаємодія з DOM реалізована через syscall/js
, але для складних проєктів варто шукати сторонні бібліотеки.
Серед мінусів — великі розміри бінарників. Навіть простий приклад може важити до 2 МБ через Go runtime. Можна використовувати TinyGo, який суттєво зменшує обсяг, але підтримує лише підмножину мови.
JavaScript
Здавалося б, JavaScript уже ідеально працює в браузері, тож навіщо компілювати його у Wasm? Але така можливість існує, наприклад, через Javy від Bytecode Alliance. Цей інструмент не компілює код напряму, а виконує JavaScript у середовищі, реалізованому на WebAssembly. Такий підхід забезпечує динамічне лінкування, завдяки чому розміри бінарників залишаються відносно невеликими.
Python
Підтримка Python у Wasm теж можлива, але поки що недосконала та громіздка. Основна проблема — Python потребує повного runtime і стандартної бібліотеки, без яких складно щось зробити.
Популярне рішення — Pyodide, порт CPython на WebAssembly за допомогою Emscripten. Наприклад, PyScript дозволяє запускати Python-програми прямо на вебсторінках. Є двостороння взаємодія з DOM через JavaScript.
Втім, у Pyodide багато обмежень:
• підтримуються лише чисті Python-пакети з PyPI (без C-розширень);
• NumPy та подібні — лише через ручне портування;
• сам runtime — це окремий великий Wasm-файл, що завантажується щоразу.
Читайте також на ProIT, із чого почати вивчення коду.
Підписуйтеся на ProIT у Telegram, щоб не пропустити жодної публікації!