WebAssembly Garbage Collection (WasmGC) এখন Chrome-এ ডিফল্টরূপে সক্ষম করা হয়েছে

প্রোগ্রামিং ভাষা দুই ধরনের আছে: আবর্জনা-সংগৃহীত প্রোগ্রামিং ভাষা এবং প্রোগ্রামিং ভাষা যার জন্য ম্যানুয়াল মেমরি ব্যবস্থাপনা প্রয়োজন। পূর্বের উদাহরণ, আরও অনেকের মধ্যে, কোটলিন, পিএইচপি, বা জাভা। পরেরটির উদাহরণ হল C, C++ বা মরিচা। একটি সাধারণ নিয়ম হিসাবে, উচ্চ-স্তরের প্রোগ্রামিং ভাষাগুলিতে একটি আদর্শ বৈশিষ্ট্য হিসাবে আবর্জনা সংগ্রহের সম্ভাবনা বেশি। এই ব্লগ পোস্টে, ফোকাস এই ধরনের আবর্জনা-সংগৃহীত প্রোগ্রামিং ভাষা এবং কিভাবে WebAssembly (Wasm) এ কম্পাইল করা যায় তার উপর। কিন্তু আবর্জনা সংগ্রহ (প্রায়শই জিসি হিসাবে উল্লেখ করা হয়) কি দিয়ে শুরু করা যায়?

ব্রাউজার সমর্থন

  • ক্রোম: 119।
  • প্রান্ত: 119।
  • ফায়ারফক্স: 120।
  • সাফারি: 18.2।

আবর্জনা সংগ্রহ

সরলীকৃত ভাষায়, আবর্জনা সংগ্রহের ধারণা হল মেমরি পুনরুদ্ধার করার প্রচেষ্টা যা প্রোগ্রাম দ্বারা বরাদ্দ করা হয়েছিল, কিন্তু এটি আর উল্লেখ করা হয় না। এই ধরনের স্মৃতিকে আবর্জনা বলা হয়। আবর্জনা সংগ্রহ বাস্তবায়নের জন্য অনেক কৌশল আছে। তাদের মধ্যে একটি হল রেফারেন্স গণনা যেখানে উদ্দেশ্যটি মেমরিতে থাকা বস্তুর রেফারেন্সের সংখ্যা গণনা করা। যখন কোনো বস্তুর আর কোনো রেফারেন্স না থাকে, তখন এটিকে আর ব্যবহার করা হয় না বলে চিহ্নিত করা যেতে পারে এবং এভাবে আবর্জনা সংগ্রহের জন্য প্রস্তুত। PHP- এর আবর্জনা সংগ্রাহক রেফারেন্স কাউন্টিং ব্যবহার করে এবং Xdebug এক্সটেনশনের xdebug_debug_zval() ফাংশন ব্যবহার করে আপনাকে এর হুডের নিচে উঁকি দিতে দেয়। নিম্নলিখিত PHP প্রোগ্রাম বিবেচনা করুন.

<?php
  $a= (string) rand();
  $c = $b = $a;
  $b = 42;
  unset($c);
  $a = null;
?>

প্রোগ্রামটি একটি স্ট্রিং-এ কাস্ট করা একটি র্যান্ডম নম্বর বরাদ্দ করে একটি নতুন ভেরিয়েবল a বলা হয়। এটি তখন দুটি নতুন ভেরিয়েবল তৈরি করে, b এবং c , এবং তাদের a এর মান নির্ধারণ করে। এর পরে, এটি 42 নম্বরে b পুনরায় বরাদ্দ করে এবং তারপর c আনসেট করে। অবশেষে, এটি a এর মান null এ সেট করে। xdebug_debug_zval() দিয়ে প্রোগ্রামের প্রতিটি ধাপ টীকা করে, আপনি কর্মক্ষেত্রে আবর্জনা সংগ্রহকারীর রেফারেন্স কাউন্টার দেখতে পাবেন।

<?php
  $a= (string) rand();
  $c = $b = $a;
  xdebug_debug_zval('a');
  $b = 42;
  xdebug_debug_zval('a');
  unset($c);
  xdebug_debug_zval('a');
  $a = null;
  xdebug_debug_zval('a');
?>

উপরের উদাহরণটি নিম্নলিখিত লগগুলিকে আউটপুট করবে, যেখানে আপনি দেখতে পাচ্ছেন যে কীভাবে প্রতিটি ধাপের পরে ভেরিয়েবলের মানের রেফারেন্সের সংখ্যা a যায়, যা কোড ক্রম অনুসারে বোঝা যায়। (আপনার র্যান্ডম নম্বর অবশ্যই ভিন্ন হবে।)

a:
(refcount=3, is_ref=0)string '419796578' (length=9)
a:
(refcount=2, is_ref=0)string '419796578' (length=9)
a:
(refcount=1, is_ref=0)string '419796578' (length=9)
a:
(refcount=0, is_ref=0)null

আবর্জনা সংগ্রহের সাথে অন্যান্য চ্যালেঞ্জ রয়েছে, যেমন চক্র সনাক্তকরণ , কিন্তু এই নিবন্ধের জন্য, রেফারেন্স গণনা সম্পর্কে প্রাথমিক স্তরের বোঝার যথেষ্ট।

প্রোগ্রামিং ভাষা অন্যান্য প্রোগ্রামিং ভাষায় প্রয়োগ করা হয়

এটি শুরুর মতো মনে হতে পারে, তবে প্রোগ্রামিং ভাষাগুলি অন্যান্য প্রোগ্রামিং ভাষায় প্রয়োগ করা হয়। উদাহরণস্বরূপ, পিএইচপি রানটাইম প্রাথমিকভাবে সি-তে প্রয়োগ করা হয়। আপনি গিটহাব-এ পিএইচপি সোর্স কোডটি দেখতে পারেন। PHP-এর আবর্জনা সংগ্রহের কোড মূলত zend_gc.c ফাইলে অবস্থিত। বেশিরভাগ বিকাশকারী তাদের অপারেটিং সিস্টেমের প্যাকেজ ম্যানেজারের মাধ্যমে PHP ইনস্টল করবে। কিন্তু ডেভেলপাররাও সোর্স কোড থেকে পিএইচপি তৈরি করতে পারে। উদাহরণস্বরূপ, একটি লিনাক্স পরিবেশে, ./buildconf && ./configure && make পদক্ষেপগুলি লিনাক্স রানটাইমের জন্য পিএইচপি তৈরি করবে। কিন্তু এর মানে হল যে পিএইচপি রানটাইম অন্য রানটাইমের জন্য কম্পাইল করা যেতে পারে, যেমন আপনি অনুমান করেছেন, ওয়াসম।

Wasm রানটাইমে ভাষা পোর্ট করার ঐতিহ্যগত পদ্ধতি

PHP যে প্ল্যাটফর্ম থেকে স্বাধীনভাবে চলছে, পিএইচপি স্ক্রিপ্টগুলি একই বাইটকোডে সংকলিত হয় এবং জেন্ড ইঞ্জিন দ্বারা চালিত হয়। জেন্ড ইঞ্জিন হল পিএইচপি স্ক্রিপ্টিং ভাষার জন্য একটি কম্পাইলার এবং রানটাইম পরিবেশ। এটি জেন্ড ভার্চুয়াল মেশিন (ভিএম) নিয়ে গঠিত, যা জেন্ড কম্পাইলার এবং জেন্ড এক্সিকিউটর দ্বারা গঠিত। পিএইচপি-র মতো ভাষাগুলি যেগুলি সি-এর মতো অন্যান্য উচ্চ-স্তরের ভাষাগুলিতে প্রয়োগ করা হয় সেগুলিতে সাধারণত অপ্টিমাইজেশন থাকে যা নির্দিষ্ট আর্কিটেকচারকে লক্ষ্য করে, যেমন ইন্টেল বা এআরএম, এবং প্রতিটি আর্কিটেকচারের জন্য আলাদা ব্যাকএন্ড প্রয়োজন। এই প্রসঙ্গে, ওয়াসম একটি নতুন স্থাপত্যের প্রতিনিধিত্ব করে। যদি VM-এর আর্কিটেকচার-নির্দিষ্ট কোড থাকে, যেমন জাস্ট-ইন-টাইম (JIT) বা আগ-অফ-টাইম (AOT) সংকলন, তাহলে ডেভেলপার নতুন আর্কিটেকচারের জন্য JIT/AOT-এর জন্য একটি ব্যাকএন্ডও প্রয়োগ করে। এই পদ্ধতিটি অনেক বোধগম্য করে কারণ প্রায়শই কোডবেসের মূল অংশটি প্রতিটি নতুন আর্কিটেকচারের জন্য পুনরায় সংকলন করা যেতে পারে।

Wasm কতটা নিম্ন-স্তরের, সেখানেও একই পদ্ধতির চেষ্টা করা স্বাভাবিক: মূল VM কোডটিকে এর পার্সার, লাইব্রেরি সমর্থন, আবর্জনা সংগ্রহ এবং Wasm-এ অপ্টিমাইজার দিয়ে পুনরায় কম্পাইল করুন এবং প্রয়োজনে Wasm-এর জন্য একটি JIT বা AOT ব্যাকএন্ড প্রয়োগ করুন। এটি Wasm MVP থেকে সম্ভব হয়েছে, এবং এটি অনেক ক্ষেত্রে অনুশীলনে ভাল কাজ করে। আসলে, ওয়াসম-এ কম্পাইল করা পিএইচপিই ওয়ার্ডপ্রেস প্লেগ্রাউন্ডকে শক্তি দেয়। ওয়ার্ডপ্রেস প্লেগ্রাউন্ড এবং WebAssembly সহ ব্রাউজার ওয়ার্ডপ্রেস অভিজ্ঞতা তৈরি করুন নিবন্ধে প্রকল্পটি সম্পর্কে আরও জানুন।

যাইহোক, হোস্ট ল্যাঙ্গুয়েজ জাভাস্ক্রিপ্টের প্রেক্ষাপটে ব্রাউজারে পিএইচপি ওয়াসম চলে। ক্রোমে, JavaScript এবং Wasm V8 এ চালিত হয় , Google এর ওপেন সোর্স জাভাস্ক্রিপ্ট ইঞ্জিন যা ECMA-262- এ উল্লেখিত ECMAScript প্রয়োগ করে। এবং, V8 এর ইতিমধ্যেই একটি আবর্জনা সংগ্রহকারী রয়েছে । এর অর্থ হল ডেভেলপাররা, উদাহরণস্বরূপ, Wasm-এ কম্পাইল করা PHP ব্যবহার করে, পোর্টেড ল্যাঙ্গুয়েজ (PHP) এর একটি গারবেজ কালেক্টর ইমপ্লিমেন্টেশন শিপিং করে সেই ব্রাউজারে যেখানে ইতিমধ্যেই একটি আবর্জনা সংগ্রাহক রয়েছে, যা শুনতে যতটা অপব্যয়। এখানেই WasmGC আসে।

Wasm মডিউলগুলিকে Wasm-এর রৈখিক মেমরির উপরে তাদের নিজস্ব GC তৈরি করতে দেওয়ার পুরানো পদ্ধতির অন্য সমস্যা হল যে তখন Wasm-এর নিজস্ব আবর্জনা সংগ্রাহক এবং সংকলিত-টু-Wasm ভাষার অন্তর্নির্মিত-টপ আবর্জনা সংগ্রহকারীর মধ্যে কোনও মিথস্ক্রিয়া নেই, যা মেমরি লিক এবং অদক্ষ সংগ্রহের প্রচেষ্টার মতো সমস্যা সৃষ্টি করে। Wasm মডিউলগুলিকে বিদ্যমান বিল্ট-ইন GC পুনরায় ব্যবহার করতে দেওয়া এই সমস্যাগুলি এড়িয়ে যায়।

WasmGC এর সাথে নতুন রানটাইমে প্রোগ্রামিং ভাষা পোর্টিং

WasmGC হল WebAssembly কমিউনিটি গ্রুপের একটি প্রস্তাব । বর্তমান Wasm MVP বাস্তবায়ন শুধুমাত্র সংখ্যার সাথে ডিল করতে সক্ষম, অর্থাৎ পূর্ণসংখ্যা এবং ফ্লোট, লিনিয়ার মেমরিতে, এবং রেফারেন্স প্রকারের প্রস্তাব পাঠানোর সাথে, Wasm অতিরিক্ত রেফারেন্সগুলিকে ধরে রাখতে পারে। WasmGC এখন স্ট্রাকট এবং অ্যারে হিপ প্রকার যোগ করে, যার অর্থ নন-লিনিয়ার মেমরি বরাদ্দকরণের জন্য সমর্থন। প্রতিটি WasmGC অবজেক্টের একটি নির্দিষ্ট ধরন এবং কাঠামো রয়েছে, যা VM-এর পক্ষে জাভাস্ক্রিপ্টের মতো গতিশীল ভাষাগুলির অপ্টিমাইজেশনের ঝুঁকি ছাড়াই তাদের ক্ষেত্রগুলিতে অ্যাক্সেস করার জন্য দক্ষ কোড তৈরি করা সহজ করে তোলে। এই প্রস্তাবটি এর ফলে WebAssembly-এ উচ্চ-স্তরের পরিচালিত ভাষাগুলির জন্য দক্ষ সমর্থন যোগ করে, কাঠামো এবং অ্যারে হিপ প্রকারের মাধ্যমে যা Wasmকে লক্ষ্য করে ভাষা সংকলককে হোস্ট VM-এ একটি আবর্জনা সংগ্রহকারীর সাথে একীভূত করতে সক্ষম করে। সরলীকৃত পরিভাষায়, এর অর্থ হল WasmGC-এর সাথে, Wasm-এ একটি প্রোগ্রামিং ভাষা পোর্ট করার অর্থ হল প্রোগ্রামিং ভাষার আবর্জনা সংগ্রাহককে আর পোর্টের অংশ হতে হবে না, পরিবর্তে বিদ্যমান আবর্জনা সংগ্রহকারী ব্যবহার করা যেতে পারে।

এই উন্নতির বাস্তব-বিশ্বের প্রভাব যাচাই করার জন্য, Chrome এর Wasm টিম C , Rust , এবং Java থেকে ফ্যানকুচ বেঞ্চমার্কের (যা ডেটা স্ট্রাকচারগুলি কাজ করার সময় বরাদ্দ করে) এর সংস্করণগুলি সংকলন করেছে। বিভিন্ন কম্পাইলার ফ্ল্যাগের উপর নির্ভর করে সি এবং রাস্ট বাইনারিগুলি 6.1 K থেকে 9.6 K পর্যন্ত হতে পারে, যখন জাভা সংস্করণটি শুধুমাত্র 2.3 K- তে অনেক ছোট! C এবং Rust একটি আবর্জনা সংগ্রাহক অন্তর্ভুক্ত করে না, কিন্তু তারা এখনও মেমরি পরিচালনা করার জন্য malloc/free বান্ডিল করে, এবং জাভা এখানে ছোট হওয়ার কারণ হল এটিকে কোনো মেমরি ম্যানেজমেন্ট কোড বান্ডিল করার প্রয়োজন নেই। এটি শুধুমাত্র একটি নির্দিষ্ট উদাহরণ, কিন্তু এটি দেখায় যে WasmGC বাইনারিগুলির খুব ছোট হওয়ার সম্ভাবনা রয়েছে এবং এটি আকারের জন্য অপ্টিমাইজ করার কোনও উল্লেখযোগ্য কাজের আগেও।

একটি WasmGC-পোর্টেড প্রোগ্রামিং ভাষা কর্মে দেখা

কোটলিন ওয়াসম

WasmGC-এর বদৌলতে Wasm-এ পোর্ট করা প্রথম প্রোগ্রামিং ভাষাগুলির মধ্যে একটি হল Kotlin/Wasm আকারে কোটলিন । কোটলিন টিমের সোর্স কোড সৌজন্যে ডেমোটি নিম্নলিখিত তালিকায় দেখানো হয়েছে।

import kotlinx.browser.document
import kotlinx.dom.appendText
import org.w3c.dom.HTMLDivElement

fun main() {
    (document.getElementById("warning") as HTMLDivElement).style.display = "none"
    document.body?.appendText("Hello, ${greet()}!")
}

fun greet() = "world"

এখন আপনি ভাবছেন বিন্দু কি, যেহেতু উপরের কোটলিন কোডটি মূলত জাভাস্ক্রিপ্ট ওএম এপিআই নিয়ে গঠিত যা Kotlin এ রূপান্তরিত হয় । এটি কম্পোজ মাল্টিপ্ল্যাটফর্মের সংমিশ্রণে আরও বোধগম্য হতে শুরু করে, যা ডেভেলপারদের তাদের Android Kotlin অ্যাপগুলির জন্য ইতিমধ্যেই তৈরি করা UI এর উপর তৈরি করতে দেয়৷ Kotlin/Wasm ইমেজ ভিউয়ার ডেমো দিয়ে এটির একটি প্রাথমিক অনুসন্ধান দেখুন এবং এর সোর্স কোড অন্বেষণ করুন, একইভাবে Kotlin টিমের সৌজন্যে।

ডার্ট এবং ফ্লাটার

Google-এর ডার্ট এবং ফ্লাটার দলগুলিও WasmGC-এর জন্য সমর্থন প্রস্তুত করছে৷ ডার্ট-টু-ওয়াসম সংকলনের কাজ প্রায় সম্পূর্ণ, এবং দলটি WebAssembly-এ সংকলিত ফ্লাটার ওয়েব অ্যাপ্লিকেশনগুলি সরবরাহ করার জন্য টুলিং সমর্থনে কাজ করছে। আপনি ফ্লটার ডকুমেন্টেশনে কাজের বর্তমান অবস্থা সম্পর্কে পড়তে পারেন। নিম্নলিখিত ডেমো হল ফ্লটার ওয়াসমজিসি প্রিভিউ

WasmGC সম্পর্কে আরও জানুন

এই ব্লগ পোস্টটি সবেমাত্র পৃষ্ঠকে স্ক্র্যাচ করেছে এবং বেশিরভাগই WasmGC-এর একটি উচ্চ-স্তরের ওভারভিউ প্রদান করেছে। বৈশিষ্ট্য সম্পর্কে আরও জানতে, এই লিঙ্কগুলি দেখুন:

স্বীকৃতি

এই নিবন্ধটি Matthias Liedtke , Adam Klein , Joshua Bell , Alon Zakai , Jakob Kummerow , Clemens Backes , Emanuel Ziegler , এবং Rachel Andrew দ্বারা পর্যালোচনা করা হয়েছে।