WebAssembly (WASM) শুরু হয়েছিল ব্রাউজারে C++ চালানোর একটি উপায় হিসেবে। 2026 সালে, এটি সর্বত্র চলে - ব্রাউজার, সার্ভার, এজ নেটওয়ার্ক, এমবেডেড ডিভাইস - এবং ওয়েবে সবচেয়ে চাহিদাপূর্ণ কিছু অ্যাপ্লিকেশন চালায়। Figma-র রেন্ডারিং ইঞ্জিন, ওয়েবে Adobe Photoshop, Google Meet-এর ভিডিও প্রসেসিং, এবং Cloudflare-এর এজ কম্পিউট প্ল্যাটফর্ম সবই WebAssembly-তে চলে।
Chrome Platform Status অনুযায়ী 2026 সালের শুরুতে WASM সমস্ত Chrome পেজ লোডের প্রায় 5.5%, যা আগের বছরে 4.5% থেকে বেড়েছে। WASM 3.0 W3C স্ট্যান্ডার্ড হওয়া এবং WASI 1.0-এর দিকে পরিপক্ব হওয়ার সাথে সাথে, ইকোসিস্টেম একটি টার্নিং পয়েন্টে পৌঁছেছে।
এই গাইড WebAssembly দিয়ে তৈরি শুরু করতে আপনার যা কিছু জানা দরকার তা কভার করে।
WebAssembly কী?
WebAssembly হল একটি বাইনারি ইন্সট্রাকশন ফরম্যাট যা একটি compilation target হিসেবে ডিজাইন করা হয়েছে। আপনি একটি উচ্চ-স্তরের ভাষায় (Rust, C, C++, Go, Kotlin) কোড লেখেন, এটি .wasm-এ কম্পাইল করেন, এবং WASM রানটাইম আছে এমন যেকোনো পরিবেশে এটি চালান - ব্রাউজার, Node.js, Cloudflare Workers, Wasmtime, বা Wasmer।
এটি কীভাবে কাজ করে
WASM হল একটি stack-based virtual machine। ফাংশনগুলি একটি operand stack-এ মান push এবং pop করে। হোস্ট রানটাইম (Chrome-এ V8, Firefox-এ SpiderMonkey) WASM বাইটকোডকে নেটিভ মেশিন কোডে JIT-কম্পাইল করে, যে কারণে পারফরম্যান্স নেটিভের কাছাকাছি।
মূল বৈশিষ্ট্য:
- Sandboxed execution: WASM মডিউল শুধুমাত্র সেই রিসোর্সগুলো অ্যাক্সেস করতে পারে যা হোস্ট স্পষ্টভাবে প্রদান করে। অনুমতি ছাড়া কোনো ফাইলসিস্টেম, কোনো নেটওয়ার্ক, কোনো OS অ্যাক্সেস নেই। এটি নেটিভ কোড থেকে মৌলিকভাবে আলাদা।
- Linear memory: WASM এবং হোস্টের মধ্যে শেয়ার করা একটি একক সংলগ্ন
ArrayBuffer। জটিল ডেটা (strings, structs) মেমোরিতে লিখে এবং পয়েন্টার শেয়ার করে পাস করা হয়। - Type-limited: WASM নেটিভভাবে শুধুমাত্র চারটি টাইপ সাপোর্ট করে:
i32,i64,f32,f64। বাকি সব কিছুর (strings, arrays, objects) জন্য linear memory বা Component Model-এর মাধ্যমে এনকোডিং প্রয়োজন। - Portable: একই
.wasmবাইনারি WASM রানটাইম আছে এমন যেকোনো প্ল্যাটফর্মে পুনরায় কম্পাইলেশন ছাড়াই চলে।
WASM বনাম JavaScript
WASM JavaScript-কে প্রতিস্থাপন করে না। এটি এর পরিপূরক।
| দিক | JavaScript | WebAssembly |
|---|---|---|
| Parsing | রানটাইমে Parse + compile | প্রি-কম্পাইল্ড বাইনারি, শুধু decode |
| Execution speed | JIT-অপটিমাইজড, পরিবর্তনশীল | নেটিভের কাছাকাছি, সুসংগত |
| Startup | ছোট স্ক্রিপ্টের জন্য দ্রুত | দ্রুত decode, পূর্বানুমানযোগ্য |
| DOM access | সরাসরি | পরোক্ষ (JS গ্লু-এর মাধ্যমে) |
| Best for | UI, DOM manipulation, event handling | CPU-নিবিড় গণনা |
| Garbage collection | বিল্ট-ইন | WasmGC (নতুন), বা ম্যানুয়াল |
UI এবং DOM কাজের জন্য JavaScript ব্যবহার করুন। ভারী গণনার জন্য WASM ব্যবহার করুন: ইমেজ প্রসেসিং, ভিডিও এনকোডিং, ফিজিক্স সিমুলেশন, ক্রিপ্টোগ্রাফি, ডেটা পার্সিং।
WASM 3.0: নতুন কী আছে
WebAssembly 3.0 সেপ্টেম্বর 2025-এ W3C স্ট্যান্ডার্ড হয়ে ওঠে, বছরের পর বছর ধরে ডেভেলপমেন্টে থাকা নয়টি ফিচারকে স্ট্যান্ডার্ডাইজ করে।
| ফিচার | এটি কী সক্ষম করে |
|---|---|
| WasmGC | WASM-এ নেটিভ garbage collection। ম্যানেজড ভাষাগুলি (Java, Kotlin, Dart) তাদের নিজস্ব GC রানটাইম শিপ না করেই WASM-এ কম্পাইল হতে পারে। Chrome 119+, Firefox 120+, Safari 18.2+-এ সাপোর্টেড। |
| Exception Handling | WASM-এ নেটিভ try/catch। আগে, exceptions-এর জন্য JavaScript-এ ব্যয়বহুল roundtrips প্রয়োজন ছিল। |
| Tail Calls | স্ট্যাক ওভারফ্লো ছাড়া দক্ষ recursion সক্ষম করে। ফাংশনাল ভাষাগুলির জন্য গুরুত্বপূর্ণ। |
| Relaxed SIMD | সমান্তরাল ডেটা প্রসেসিংয়ের জন্য 128-বিট ভেক্টর ইন্সট্রাকশন। হার্ডওয়্যার-নির্দিষ্ট অপটিমাইজেশন সক্ষম করে। |
| Memory64 | 4GB linear memory সীমা ভাঙে। বড় আকারের ডেটা প্রসেসিংয়ের জন্য প্রয়োজনীয়। |
| Multi-memory | একটি মডিউলে একাধিক স্বতন্ত্র মেমোরি অঞ্চল। |
সবচেয়ে প্রভাবশালী হল WasmGC। এর আগে, Java বা Kotlin-কে WASM-এ কম্পাইল করার অর্থ ছিল বাইনারির অংশ হিসেবে একটি সম্পূর্ণ garbage collector শিপ করা, যা ফাইল সাইজ বাড়িয়ে দিত। এখন ব্রাউজারের নিজস্ব GC WASM মডিউলের জন্য মেমোরি ম্যানেজমেন্ট সামলায়, ঠিক যেমন এটি JavaScript-এর জন্য করে।
WASI: ব্রাউজারের বাইরে WebAssembly
ব্রাউজারে WASM শক্তিশালী, কিন্তু WASI (WebAssembly System Interface) হল যা WASM-কে একটি সার্বজনীন রানটাইম করে তোলে। WASI সিস্টেম রিসোর্সের জন্য স্ট্যান্ডার্ডাইজড ইন্টারফেস প্রদান করে - ফাইল, নেটওয়ার্কিং, ক্লক, র্যান্ডম নম্বর - যা WASM মডিউলকে ব্রাউজারের বাইরে চলতে দেয়।
WASI Preview 2 (বর্তমান স্থিতিশীল রিলিজ) এই ইন্টারফেসগুলি সংজ্ঞায়িত করে:
wasi:filesystem- capability handles-এর মাধ্যমে ফাইল অপারেশন (ঐতিহ্যবাহী file descriptors নয়)wasi:sockets- TCP/UDP নেটওয়ার্কিংwasi:http- HTTP request/response হ্যান্ডলিংwasi:clocks- wall clock, monotonic clockwasi:random- ক্রিপ্টোগ্রাফিক র্যান্ডমনেসwasi:cli- কমান্ড-লাইন আর্গুমেন্ট, এনভায়রনমেন্ট ভেরিয়েবল, stdio
মূল নীতি হল capability-based security: একটি WASM মডিউল ফাইলসিস্টেম অ্যাক্সেস করতে পারে না যদি না হোস্ট স্পষ্টভাবে একটি নির্দিষ্ট ডিরেক্টরির জন্য হ্যান্ডেল প্রদান করে। এটি WASI-কে নেটিভ executables চালানোর চেয়ে মৌলিকভাবে বেশি নিরাপদ করে তোলে।
WASI 1.0-এর পথ
WASI 0.3.0 (async/concurrency primitives যোগ করা) 2026 সালে প্রত্যাশিত, এরপর WASI 1.0 আসবে। প্রধান সংযোজন হল zero-copy streaming I/O সহ language-integrated async।
Component Model
কোর WASM মডিউল শুধুমাত্র সংখ্যা বিনিময় করতে পারে। Component Model WASM-এর উপরে একটি সমৃদ্ধ type system এবং composability স্তর যোগ করে এই সীমাবদ্ধতা সমাধান করে।
WIT (WebAssembly Interface Types)
WIT একটি Interface Definition Language যা components-কে তাদের imports এবং exports সমৃদ্ধ টাইপ দিয়ে ঘোষণা করতে দেয় - strings, records, lists, variants, enums - শুধু i32 এবং f64 নয়।
// calculator.wit package myorg:calculator@1.0.0; interface operations { record calculation { expression: string, result: f64, timestamp: u64, } add: func(a: f64, b: f64) -> f64; multiply: func(a: f64, b: f64) -> f64; history: func() -> list<calculation>; } world calculator { export operations; }
wit-bindgen-এর মতো টুলচেইন WIT ফাইল থেকে ভাষা-নির্দিষ্ট বাইন্ডিং তৈরি করে। একটি Rust component এবং একটি Python component WIT চুক্তির মাধ্যমে strings, records, এবং lists বিনিময় করতে পারে কোনো পক্ষই অন্য পক্ষের implementation ভাষা না জেনে।
Rust দিয়ে আপনার প্রথম WASM মডিউল তৈরি করা
Rust-এ সবচেয়ে পরিপক্ব WASM টুলিং আছে। আসুন একটি ব্যবহারিক উদাহরণ তৈরি করি: একটি ইমেজ প্রসেসিং মডিউল যা ব্রাউজারে চলে।
সেটআপ
# Install the WASM target for Rust rustup target add wasm32-unknown-unknown # Install wasm-pack (builds Rust to WASM + generates JS bindings) cargo install wasm-pack # Create a new library project cargo new --lib image-processor cd image-processor
Cargo.toml কনফিগার করুন
[package] name = "image-processor" version = "0.1.0" edition = "2021" [lib] crate-type = ["cdylib"] [dependencies] wasm-bindgen = "0.2"
Rust কোড লিখুন
// src/lib.rs use wasm_bindgen::prelude::*; /// Convert an image buffer to grayscale. /// Input: RGBA pixel data as a flat u8 array (4 bytes per pixel). /// Output: Modified in place for zero-copy performance. #[wasm_bindgen] pub fn grayscale(pixels: &mut [u8]) { for chunk in pixels.chunks_exact_mut(4) { let r = chunk[0] as f32; let g = chunk[1] as f32; let b = chunk[2] as f32; // ITU-R BT.709 luminance coefficients let gray = (0.2126 * r + 0.7152 * g + 0.0722 * b) as u8; chunk[0] = gray; chunk[1] = gray; chunk[2] = gray; // chunk[3] is alpha, leave unchanged } } /// Adjust brightness of an image. /// factor > 1.0 brightens, < 1.0 darkens. #[wasm_bindgen] pub fn adjust_brightness(pixels: &mut [u8], factor: f32) { for chunk in pixels.chunks_exact_mut(4) { chunk[0] = ((chunk[0] as f32 * factor).min(255.0)) as u8; chunk[1] = ((chunk[1] as f32 * factor).min(255.0)) as u8; chunk[2] = ((chunk[2] as f32 * factor).min(255.0)) as u8; } } /// Invert all colors in the image. #[wasm_bindgen] pub fn invert(pixels: &mut [u8]) { for chunk in pixels.chunks_exact_mut(4) { chunk[0] = 255 - chunk[0]; chunk[1] = 255 - chunk[1]; chunk[2] = 255 - chunk[2]; } } /// Calculate the average brightness of an image (0-255). #[wasm_bindgen] pub fn average_brightness(pixels: &[u8]) -> f32 { let mut total: f64 = 0.0; let pixel_count = pixels.len() / 4; for chunk in pixels.chunks_exact(4) { let luminance = 0.2126 * chunk[0] as f64 + 0.7152 * chunk[1] as f64 + 0.0722 * chunk[2] as f64; total += luminance; } (total / pixel_count as f64) as f32 }
বিল্ড
wasm-pack build --target web
এটি একটি pkg/ ডিরেক্টরি তৈরি করে যাতে আছে:
image_processor_bg.wasm- কম্পাইল করা WASM বাইনারিimage_processor.js- TypeScript definitions সহ JavaScript গ্লু কোডpackage.json- npm-এ প্রকাশ করার জন্য প্রস্তুত
JavaScript-এ ব্যবহার করুন
<!DOCTYPE html> <html> <head><title>WASM Image Processor</title></head> <body> <canvas id="canvas" width="800" height="600"></canvas> <button onclick="applyGrayscale()">Grayscale</button> <button onclick="applyBrightness()">Brighten</button> <button onclick="applyInvert()">Invert</button> <script type="module"> import init, { grayscale, adjust_brightness, invert } from "./pkg/image_processor.js"; let ctx; let imageData; async function setup() { await init(); const canvas = document.getElementById("canvas"); ctx = canvas.getContext("2d"); // Load an image onto the canvas const img = new Image(); img.onload = () => { ctx.drawImage(img, 0, 0); imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); }; img.src = "photo.jpg"; } window.applyGrayscale = () => { grayscale(imageData.data); ctx.putImageData(imageData, 0, 0); }; window.applyBrightness = () => { adjust_brightness(imageData.data, 1.3); ctx.putImageData(imageData, 0, 0); }; window.applyInvert = () => { invert(imageData.data); ctx.putImageData(imageData, 0, 0); }; setup(); </script> </body> </html>
মূল অন্তর্দৃষ্টি: imageData.data একটি Uint8ClampedArray যা একটি ArrayBuffer দ্বারা সমর্থিত। WASM-এ পাস করা হলে, এটি একই মেমোরি শেয়ার করে - কোনো কপি নেই। Rust ফাংশন পিক্সেলগুলি in place পরিবর্তন করে, এবং JavaScript পক্ষ তাৎক্ষণিকভাবে পরিবর্তনগুলি দেখে।
নিম্ন স্তর: ম্যানুয়াল WASM Instantiation
আপনি যদি wasm-bindgen ব্যবহার করতে না চান, তাহলে সরাসরি WASM মডিউল instantiate করতে পারেন:
const response = await fetch("calculator.wasm"); const { instance } = await WebAssembly.instantiateStreaming(response, { env: { // Functions the WASM module can call log_result: (value) => console.log("Result:", value), }, }); // Call exported functions const { add, multiply } = instance.exports; console.log(add(5, 3)); // 8 console.log(multiply(4, 7)); // 28
এটি তখন উপযোগী যখন আপনি ন্যূনতম ওভারহেড চান এবং সমৃদ্ধ type interop-এর প্রয়োজন নেই।
পারফরম্যান্স: WASM বনাম JavaScript
বাস্তব বেঞ্চমার্ক CPU-নিবিড় কাজের জন্য উল্লেখযোগ্য স্পিডআপ দেখায়:
| কাজ | JavaScript | WASM | স্পিডআপ |
|---|---|---|---|
| 4K ইমেজ প্রসেসিং | 180ms | 8ms (SIMD সহ) | 22x |
| ইমেজ resize (4K) | 250ms | 45ms | 5.5x |
| ফিজিক্স সিমুলেশন (10K entities) | ফ্রেম ড্রপ | স্মুথ 60fps | ~10x |
| JSON পার্সিং (বড় payload) | 12ms | 3ms | 4x |
| ক্রিপ্টোগ্রাফিক হ্যাশিং | 45ms | 6ms | 7.5x |
WASM নেটিভ কোডের প্রায় 95% গতিতে চলে। সবচেয়ে বড় লাভ আসে:
- পূর্বানুমানযোগ্য পারফরম্যান্স (কোনো JIT warmup নেই, কোনো GC pauses নেই)
- সমান্তরাল ডেটা প্রসেসিংয়ের জন্য SIMD instructions
- garbage collector হস্তক্ষেপ ছাড়া direct memory access
যেখানে WASM দ্রুত নয়: DOM manipulation, ছোট গণনা, I/O-bound কাজ। এগুলির জন্য JavaScript ইতিমধ্যে অপটিমাইজড।
প্রোডাকশন ব্যবহারের কেস
Figma: রিয়েল-টাইম ভেক্টর রেন্ডারিং
Figma-র কোর রেন্ডারিং ইঞ্জিন হল C++ যা WASM-এ কম্পাইল করা হয়েছে। প্রতিটি shape, gradient, এবং effect WASM-এ গণনা করা হয় এবং একটি Canvas element-এ আঁকা হয়। এটি Figma-কে ব্রাউজারে হাজার হাজার layers সহ জটিল ডিজাইন 60fps-এ হ্যান্ডেল করতে দেয় - এমন পারফরম্যান্স যা শুদ্ধ JavaScript-এ অসম্ভব হতো।
ওয়েবে Adobe Photoshop
Adobe Rust ব্যবহার করে মূল Photoshop ফিল্টার এবং টুলগুলি WASM-এ পোর্ট করেছে। তাদের বেঞ্চমার্ক WASM SIMD দিয়ে 22ms-এ 4K ইমেজ প্রসেসিং দেখায় বনাম JavaScript-এ 180ms - 8x উন্নতি যা রিয়েল-টাইম ফিল্টার প্রিভিউ সম্ভব করে।
Cloudflare Workers
Cloudflare 330+ এজ লোকেশনে V8 isolates-এ WASM মডিউল চালায়। Cold starts হল 1-5ms (container-based serverless-এর জন্য 100-500ms-এর তুলনায়)। ফেব্রুয়ারি 2026-এ, তারা WASM ব্যবহার করে তাদের এজ নেটওয়ার্কে Llama-3-8b inference ডিপ্লয় করেছে।
Google Meet
Google Meet-এ ব্যাকগ্রাউন্ড ব্লার এবং ভার্চুয়াল ব্যাকগ্রাউন্ড রিয়েল-টাইম ভিডিও প্রসেসিংয়ের জন্য SIMD সহ WASM ব্যবহার করে। WASM মডিউল প্রতিটি ভিডিও ফ্রেম যথেষ্ট দ্রুত প্রসেস করে 30fps-এ স্মুথ ভিডিও বজায় রাখতে।
ব্রাউজার সাপোর্ট (2026)
| ফিচার | Chrome | Firefox | Safari | Edge |
|---|---|---|---|---|
| Core WASM | সম্পূর্ণ | সম্পূর্ণ | সম্পূর্ণ | সম্পূর্ণ |
| Threads | হ্যাঁ | হ্যাঁ | হ্যাঁ | হ্যাঁ |
| SIMD (128-bit) | হ্যাঁ | হ্যাঁ | হ্যাঁ | হ্যাঁ |
| WasmGC | 119+ | 120+ | 18.2+ | হ্যাঁ |
| Exception Handling | হ্যাঁ | হ্যাঁ | হ্যাঁ | হ্যাঁ |
| Memory64 | হ্যাঁ | হ্যাঁ | আংশিক | হ্যাঁ |
সমস্ত প্রধান ব্রাউজার সম্পূর্ণভাবে WASM সাপোর্ট করে। নতুন ফিচারগুলি (WasmGC, Exception Handling) ব্যাপক প্রাপ্যতায় পৌঁছেছে।
টুলিং রেফারেন্স
| টুল | উদ্দেশ্য | ইনস্টল |
|---|---|---|
| wasm-pack | Rust-কে WASM-এ বিল্ড করুন, npm প্যাকেজ তৈরি করুন | cargo install wasm-pack |
| wasm-bindgen | Rust/JS interop bindings (wasm-pack দ্বারা ব্যবহৃত) | Cargo.toml-এ Dependency |
| wasm-opt | বাইনারি সাইজ অপটিমাইজেশন (50%+ হ্রাস) | Binaryen-এর অংশ: brew install binaryen |
| wit-bindgen | WIT ফাইল থেকে bindings তৈরি করুন | cargo install wit-bindgen-cli |
| Wasmtime | সার্ভার-সাইড WASM রানটাইম (রেফারেন্স WASI implementation) | brew install wasmtime |
| Wasmer | WASI সাপোর্ট সহ বিকল্প WASM রানটাইম | curl https://get.wasmer.io -sSfL | sh |
| wasm-feature-detect | রানটাইম ব্রাউজার ফিচার ডিটেকশন | npm install wasm-feature-detect |
বাইনারি সাইজ অপটিমাইজেশন
WASM বাইনারি বড় হতে পারে। এগুলি ছোট করার উপায়:
# Cargo.toml [profile.release] opt-level = "z" # Optimize for size lto = true # Link-time optimization codegen-units = 1 # Better optimization, slower compile strip = true # Strip debug symbols
# Build in release mode wasm-pack build --release --target web # Further optimize with wasm-opt wasm-opt -Oz pkg/image_processor_bg.wasm -o pkg/image_processor_bg.wasm
একটি সাধারণ Rust WASM মডিউল এই অপটিমাইজেশনগুলির সাথে 500KB থেকে 50KB-র নিচে নেমে আসে।
শুরু করার রোডম্যাপ
উপসংহার
WebAssembly আর পরীক্ষামূলক নয়। এটি একটি প্রোডাকশন প্রযুক্তি যা ওয়েবে সবচেয়ে চাহিদাপূর্ণ কিছু অ্যাপ্লিকেশন ব্যবহার করে। নেটিভের কাছাকাছি পারফরম্যান্স, sandboxed নিরাপত্তা, এবং সার্বজনীন পোর্টেবিলিটি - অন্য কোনো compilation target আপনাকে এই তিনটিই দেয় না।
আপনাকে WASM-এ আপনার পুরো অ্যাপ্লিকেশন পুনরায় লিখতে হবে না। একটি একক CPU-নিবিড় ফাংশন দিয়ে শুরু করুন - একটি ইমেজ ফিল্টার, একটি ডেটা পার্সার, একটি ফিজিক্স ক্যালকুলেশন - এটি WASM-এ কম্পাইল করুন, এবং JavaScript থেকে কল করুন। পার্থক্য পরিমাপ করুন। তারপর সিদ্ধান্ত নিন WASM আর কোথায় সাহায্য করতে পারে।
টুলিং পরিপক্ব, ব্রাউজার সাপোর্ট সার্বজনীন, এবং ইকোসিস্টেম বাড়ছে। আপনি যদি Rust লেখেন, আপনি ইতিমধ্যে ব্রাউজার থেকে একটি কমান্ড দূরে।
শুরু করার চেকলিস্ট:
- Rust এবং wasm-pack ইনস্টল করা হয়েছে
- প্রথম WASM মডিউল তৈরি এবং ব্রাউজারে চলছে
- JavaScript interop কাজ করছে (JS থেকে WASM কল করা)
- সাইজ অপটিমাইজেশন সহ release build প্রয়োগ করা হয়েছে
- শুদ্ধ JavaScript সমতুল্যের বিপরীতে পারফরম্যান্স বেঞ্চমার্ক করা হয়েছে
- সার্ভার-সাইড ব্যবহারের কেসের জন্য Wasmtime দিয়ে WASI অন্বেষণ করা হয়েছে