ওয়েভ এসেম্বলি – জাভাস্ক্রিপ্টের এক নতুন অধ্যায়

১৯৯৫ সালে যাত্রা শুরু করা জাভাস্ক্রিপ্ট ছিল অনেক ধীর গতির। ইন্টারপ্রিটেশন প্রোগ্রামিং ভাষার সীমাবদ্ধতা ও নিজস্ব অপটিমাইজেশনের অভাব নিয়ে জাভাস্ক্রিপ্ট চলেছে এক যুগেরও বেশি। অবশেষে শুরু হয় বিভিন্ন ব্রাউজারের সাথে পারফরমেন্স যুদ্ধ। যার ফলস্বরূপ ২০০৮ সালে এক নতুন জাভাস্ক্রিপ্টের যুগের সূচনা হয় যার মূলে ছিলো JIT অর্থাৎ জাস্ট-ইন-টাইম কম্পাইলার। এই JIT সংযোগের ফলে জাভাস্ক্রিপ্ট গতি পায় প্রায় দশগুন। যার ফলশ্রুতিতে জাভাস্ক্রিপ্ট ব্রাউজারের সীমানা পাড়িয়ে সার্ভারসাইড প্রোগ্রামিং ভাষা যেমন Node.js হিসেবে ব্যবহার শুরু হয়। ২০১৭ সাল থেকে ব্রাউজারগুলো নতুন একটি ওয়েব স্ট্যান্ডার্ড যুক্ত করা শুরু করেছে যার নাম ওয়েব এসেম্বলি (WebAssembly) যা কিনা আরেকটি নতুন যুগের সূচনা।

ওয়েব এসেম্বলি কি?

এতদিন পর্যন্ত ব্রাউজারগুলোতে শুধুমাত্র জাভাস্ক্রিপ্ট দিয়ে লেখা প্রোগ্রামগুলোই রান করা যেতো। অন্য প্রোগ্রামিং ভাষায় যেমন C/C++ এ লিখা কোনো লাইব্রেরী বা মডিউল আমরা ব্রাউজারগুলোতে ব্যবহার করতে পারতাম না। যদিও asm.js এর কল্যাণে আমরা বিভিন্ন C/C++ লাইব্রেরী ব্রাউজার এনভায়রনমেন্ট-এ ব্যবহার করেছি কিন্তু asm.js মূলত জাভাস্ক্রিপ্টের একটি সাবসেট এবং এর পারফরমেন্স কখনও ন্যাটিভ লাংগুয়েজের কাছাকাছি হবে না। ওয়েব এসেম্বলির ক্ষেত্রে পারফরমেন্সের সমস্যা থাকবে না। যাই হোক, ওয়েব এসেম্বলির মাধ্যমে আমরা বিভিন্ন প্রোগ্রামিং ভাষা যেমন C/C++ এ লেখা কোড ওয়েভ ব্রাউজারগুলোতে জাভাস্ক্রিপ্টের সাথে রান করাতে পারবো।

ওয়েব এসেম্বলির কম্পাইলার

ওয়েব এসেম্বলির ফাইলের এক্সটেনশন হচ্ছে wasm (WebAssembly এর সংক্ষেপ ) এবং wasm ফাইলে মূলত অনেকটা এসেম্বলি ভাষার মতো বাইনারি নির্দেশ থাকে। অন্য প্রোগ্রামিং ভাষায় লিখা কোডকে ব্রাউজারগুলোতে রান করাতে হলে প্রথমে wasm-এ কম্পাইল করে নিতে হবে। বিভিন্ন প্রোগ্রামিং ভাষার কোডকে wasm কম্পাইল করার জন্যে বিভিন্ন কম্পাইলার আছে যেমন, C/C++ ভাষার জন্যে Emscripten অথবা Binaryen, Haskell ভাষার জন্যে asterius ইত্যাদি। এখন পর্যন্ত সি/সি ++, লুয়া, পাইথন, রাস্ট (Rust), Esoteric প্রভৃতি ভাষার জন্যে কম্পাইলার আছে। বিভিন্ন প্রোগ্রামিং ভাষার জন্যে নতুন নতুন কম্পাইলার যোগ হচ্ছে।

ওয়েব এসেম্বলি কিভাবে ব্যবহার করতে হয়?

wasm ফাইল রান করার জন্যে জাভাস্ক্রিপ্টের মতো প্রথমে একে লোড করতে হয় কিন্তু বর্তমানে ব্রাউজারগুলোতে wasm ফাইল লোড করার জন্যে সরাসরি কোনো html ট্যাগ যেমন <script src=”xyz.wasm” type=”text/wasm”></script> নেই। যেহেতু ওয়েব এসেম্বলি বর্তমানে প্রাথমিক পর্যায়ে আছে তাই আশা করা যায় ভবিষ্যতে wasm ফাইল লোড করার প্রক্রিয়া সহজতর হবে। যাই হোক, বর্তমানে wasm ফাইলকে রেসপন্স টাইপ ArrayBuffer হিসেবে ajax রিকুয়েস্টের মাধ্যমে সার্ভার থেকে লোড করে নিতে হয়। সেই ArrayBuffer কে জাভাস্ক্রিপ্টের নির্দিস্ট API ব্যবহার করে ওয়েব-এসেম্বলির একটি মডিউল (WebAssembly module) তৈরি করতে হয়। এখন সেই মডিউলের মাধ্যমে নেটিভ ল্যাঙ্গুয়েজের API-গুলা ব্যবহার করা যায়।

তবে ব্যপার হচ্ছে সাধারণত কম্পাইলারগুলো যেমন, Emscripten প্রয়োজনীয় গ্লু / লিঙ্কিং কোড জেনারেট করে দেয়, তাই wasm ফাইল লোড করা এবং ওয়েব-এসেম্বলি মডিউল তৈরির ঝামেলায় যেতে হয় না। প্রত্যেকটি কম্পাইলারই নেটিভ ফাংশনগুলো ব্যবহার করার জন্যে কিছু ফাংশন প্রোভাইড করে যেমন Emscripten এর cwrap অথবা ccall ফাংশন। ধরা যাক, আমরা নিচের সি ল্যাঙ্গুয়েজ -এ লেখা sum ফাংশন ওয়েব এসেম্বলির মাধ্যমে ব্যবহার করতে চাই।

#include <stdio.h>;

int sum(int num1, int num2) {
  int num3;
  num3 = num1 + num2;
  return (num3);
}

এখন Emscripten -এর নিচের কমান্ডটি রান করালে প্রয়োজনীয় জাভাস্ক্রিপ্ট কোড তৈরি করে hello.html ফাইলে script ট্যাগ সংযুক্ত করে দিবে।

emcc hello.c -o hello.html -s WASM=1 -s EXPORTED_FUNCTIONS='["_sum"]' -s EXTRA_EXPORTED_RUNTIME_METHODS='["cwrap"]'

কমান্ডের ব্যাখ্যা

১। যেহেতু Emscripten – asm.js এবং ওয়েব-এসেম্বলি উভয়ের কম্পাইলার হিসেবে ব্যবহার করা যায়, তাই ওয়েব-এসেম্বলিতে কম্পাইল করতে WASM=1 দিতে হয়।

২। সাধারণত Emscripten প্রোগ্রামের মেইন ফাংশনকেই কল করে এবং অপ্রয়োজনীয় কোড গুলো ফেলে দেয়। যেহেতু এই প্রোগ্রামে কোন মেইন ফাংশন নাই এবং sum ফাংশনটি কোথাও ব্যবহার হচ্ছে না তাই Emscripten এটিকে ফেলে দিবে। কিন্তু আমরা যদি EXPORTED_FUNCTIONS লিস্টে ফাংশনের নাম বলে দেই, তাহলে সেগুলো ফেলবে না।

৩। সর্বশেষে Emscripten এর cwrap ফাংশনটি আমাদের লাগবে যাতে নেটিভ sum ফাংশনটি জাভাস্ক্রিপ্টের মাধ্যমে কল করতে পারি, তাই এটিকে EXTRA_EXPORTED_RUNTIME_METHODS লিস্টে দিতে হয়েছে।

শেষ কথা

ওয়েব-এসেম্বলির পারফরমেন্স asm.js এর তুলনায় অনেক ভালো এবং ভালো হওয়াটাই স্বাভাবিক। এখনও অনেক কিছু পরিবর্তন হচ্ছে এবং ভবিষ্যতে আরো অনেক ইম্প্রুভমেন্ট হবে। আশাকরি ভবিষ্যতে wasm মডিউলের একটি প্লাটফর্ম হবে যেখান থেকে, যে কেউ তার প্রয়োজনীয় মডিউলটি নামিয়ে ব্যবহার করতে পারবে অথবা শেয়ার করে দিতে পারবে তার নিজের মডিউলটি।