ProIT: медіа для профі в IT
2 хв

6 мов для WebAssembly: переваги, обмеження, інструменти

author avatar ProIT NEWS

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, щоб не пропустити жодної публікації!

Приєднатися до company logo
Продовжуючи, ти погоджуєшся з умовами Публічної оферти та Політикою конфіденційності.