প্রকাশিত: জানুয়ারী 29, 2025
ওয়েব অ্যাসেম্বলি আবর্জনা সংগ্রহ (WasmGC)
প্রোগ্রামিং ভাষা দুই ধরনের আছে: আবর্জনা-সংগৃহীত প্রোগ্রামিং ভাষা এবং প্রোগ্রামিং ভাষা যার জন্য ম্যানুয়াল মেমরি ব্যবস্থাপনা প্রয়োজন। পূর্বের উদাহরণ, আরও অনেকের মধ্যে, কোটলিন, পিএইচপি, বা জাভা। পরেরটির উদাহরণ হল C, C++ বা মরিচা। একটি সাধারণ নিয়ম হিসাবে, উচ্চ-স্তরের প্রোগ্রামিং ভাষাগুলিতে একটি আদর্শ বৈশিষ্ট্য হিসাবে আবর্জনা সংগ্রহের সম্ভাবনা বেশি।
সরলীকৃত ভাষায়, আবর্জনা সংগ্রহ হল মেমরি পুনরুদ্ধার করার প্রচেষ্টা যা প্রোগ্রাম দ্বারা বরাদ্দ করা হয়েছিল, কিন্তু এটি আর উল্লেখ করা হয় না। এই ধরনের স্মৃতিকে আবর্জনা বলা হয়। আবর্জনা সংগ্রহ বাস্তবায়নের জন্য অনেক কৌশল আছে। বোঝার সবচেয়ে সহজ একটি হল রেফারেন্স গণনা যেখানে উদ্দেশ্যটি মেমরিতে থাকা বস্তুর রেফারেন্সের সংখ্যা গণনা করা।
এটি শুরুর মতো মনে হতে পারে, তবে প্রোগ্রামিং ভাষাগুলি অন্যান্য প্রোগ্রামিং ভাষায় প্রয়োগ করা হয়। উদাহরণস্বরূপ, পিএইচপি রানটাইম প্রাথমিকভাবে সি-তে প্রয়োগ করা হয়। ডেভেলপাররা যদি পিএইচপি-তে ওয়াসম-এর মতো একটি ভাষা কম্পাইল করতে চান, তাহলে তাদের সাধারণত ভাষার পার্সার, লাইব্রেরি সমর্থন, আবর্জনা সংগ্রহ এবং অন্যান্য গুরুত্বপূর্ণ উপাদানগুলির মতো সমস্ত অংশ কম্পাইল করতে হবে।
হোস্ট ল্যাঙ্গুয়েজ জাভাস্ক্রিপ্টের প্রেক্ষাপটে ওয়াসম ব্রাউজারে চলে। ক্রোমে, JavaScript এবং Wasm V8 এ চালানো হয়, গুগলের ওপেন সোর্স জাভাস্ক্রিপ্ট ইঞ্জিন। এবং, V8 এর ইতিমধ্যেই একটি আবর্জনা সংগ্রহকারী রয়েছে। এর অর্থ হল ডেভেলপাররা, উদাহরণস্বরূপ, Wasm-এ কম্পাইল করা PHP ব্যবহার করে, পোর্টেড ল্যাঙ্গুয়েজ (PHP) এর একটি গারবেজ কালেক্টর ইমপ্লিমেন্টেশন শিপিং করে সেই ব্রাউজারে যেখানে ইতিমধ্যেই একটি আবর্জনা সংগ্রাহক রয়েছে, যা শুনতে যতটা অপব্যয়। এখানেই WasmGC আসে।
WasmGC সম্পর্কে আরও জানতে, Chrome-এ এখন ডিফল্টরূপে সক্রিয় WebAssembly Garbage Collection (WasmGC) পড়ুন এবং আপনি যদি সত্যিই গভীরে যেতে চান, V8 ব্লগ পোস্টটি দেখুন WebAssembly-এ কার্যকরীভাবে আবর্জনা সংগ্রহ করা প্রোগ্রামিং ভাষা আনার একটি নতুন উপায়
Wasm টেইল কল অপ্টিমাইজেশান
একটি কল টেইল পজিশনে বলা হয় যদি এটি বর্তমান ফাংশন থেকে ফিরে আসার আগে কার্যকর করা শেষ নির্দেশ। কম্পাইলাররা কলার ফ্রেমটি বাতিল করে এবং একটি লাফ দিয়ে কলটি প্রতিস্থাপন করে এই জাতীয় কলগুলিকে অপ্টিমাইজ করতে পারে। এটি পুনরাবৃত্ত ফাংশন জন্য বিশেষভাবে দরকারী. উদাহরণস্বরূপ, এই C ফাংশনটি নিন যা একটি লিঙ্কযুক্ত তালিকার উপাদানগুলিকে যোগ করে:
int sum(List* list, int acc) {
if (list == nullptr) return acc;
return sum(list->next, acc + list->val);
}
একটি নিয়মিত কলের সাথে, এটি O(n) স্ট্যাকের স্থান ব্যবহার করে: তালিকার প্রতিটি উপাদান কল স্ট্যাকে একটি নতুন ফ্রেম যুক্ত করে। একটি দীর্ঘ যথেষ্ট তালিকা সহ, এটি খুব দ্রুত স্ট্যাক উপচে যেতে পারে। কলটিকে একটি লাফ দিয়ে প্রতিস্থাপন করে, টেল কল অপ্টিমাইজেশন কার্যকরভাবে এই পুনরাবৃত্ত ফাংশনটিকে একটি লুপে পরিণত করে যা O(1) স্ট্যাক স্পেস ব্যবহার করে:
int sum(List* list, int acc) {
while (list != nullptr) {
acc = acc + list->val;
list = list->next;
}
return acc;
}
এই অপ্টিমাইজেশনটি কার্যকরী ভাষার জন্য বিশেষভাবে গুরুত্বপূর্ণ। তারা পুনরাবৃত্ত ফাংশনগুলির উপর খুব বেশি নির্ভর করে এবং হাসকেলের মতো খাঁটিগুলি এমনকি লুপ নিয়ন্ত্রণ কাঠামো সরবরাহ করে না। যেকোনো ধরনের কাস্টম পুনরাবৃত্তি সাধারণত এক বা অন্য উপায়ে পুনরাবৃত্তি ব্যবহার করে। টেইল কল অপ্টিমাইজেশান ব্যতীত, এটি খুব দ্রুত যে কোনও নন-তুচ্ছ প্রোগ্রামের জন্য একটি স্ট্যাক ওভারফ্লোতে চলে যাবে, যা অন্যথায় দ্রুত স্ট্যাকের স্থান ফুরিয়ে যাবে।
প্রাথমিকভাবে, WebAssembly এই ধরনের টেইল কল অপ্টিমাইজেশনের অনুমতি দেয়নি, কিন্তু এটি টেল কল এক্সটেনশন প্রস্তাবের সাথে পরিবর্তিত হয়েছে। আরও গভীরে যেতে, V8 ব্লগে WebAssembly tail calls নিবন্ধটি পড়ুন।
উপসংহার
এখন WasmGC এবং টেইল কল অপ্টিমাইজেশান বেসলাইন নতুনভাবে উপলব্ধ হওয়ায়, আরও অ্যাপ এই বৈশিষ্ট্যগুলিকে আরও ভাল পারফরম্যান্সের জন্য ব্যবহার করতে পারে, যেমন, Google শীটগুলি Google শীট গণনা কর্মীকে WasmGC-তে পোর্ট করার মাধ্যমে করেছে৷