पब्लिश किया गया: 29 जनवरी, 2025
WebAssembly गार्बेज कलेक्शन (WasmGC)
प्रोग्रामिंग लैंग्वेज दो तरह की होती हैं: ग़ैर-ज़रूरी डेटा को इकट्ठा करने वाली प्रोग्रामिंग लैंग्वेज और ऐसी प्रोग्रामिंग लैंग्वेज जिनके लिए मैन्युअल मेमोरी मैनेजमेंट की ज़रूरत होती है. Kotlin, PHP या Java, इनमें से कोई भी भाषा, पहले कैटगरी में आती है. C, C++, या Rust, इसके उदाहरण हैं. आम तौर पर, हाई-लेवल प्रोग्रामिंग भाषाओं में, स्टैंडर्ड सुविधा के तौर पर, ग़ैर-ज़रूरी डेटा हटाने की सुविधा होती है.
आसान शब्दों में, गै़रबेज कलेक्शन का मतलब है, प्रोग्राम के लिए जो मेमोरी ऐलोकेट की गई थी उसे वापस पाना. हालांकि, अब इसका इस्तेमाल नहीं किया जा रहा है. ऐसी मेमोरी को ग़ैर-ज़रूरी मेमोरी कहा जाता है. गै़रबेज कलेक्शन को लागू करने के कई तरीके हैं. रेफ़रंस काउंटिंग को समझना सबसे आसान है. इसमें, मेमोरी में मौजूद ऑब्जेक्ट के रेफ़रंस की संख्या की गिनती की जाती है.
ऐसा लग सकता है कि प्रोग्रामिंग भाषाएं, प्रोग्रामिंग की शुरुआत में ही बन गई थीं. हालांकि, प्रोग्रामिंग भाषाओं को दूसरी प्रोग्रामिंग भाषाओं में लागू किया जाता है. उदाहरण के लिए, PHP रनटाइम मुख्य रूप से C में लागू किया जाता है. अगर डेवलपर को PHP जैसी किसी भाषा को Wasm में कंपाइल करना है, तो उन्हें आम तौर पर भाषा के पार्स करने वाले टूल, लाइब्रेरी के साथ काम करने की सुविधा, ग़ैर-ज़रूरी डेटा हटाने की सुविधा, और अन्य ज़रूरी कॉम्पोनेंट जैसे सभी हिस्सों को कंपाइल करना होगा.
Wasm, ब्राउज़र में होस्ट भाषा JavaScript के संदर्भ में चलता है. Chrome में, JavaScript और Wasm को V8 में चलाया जाता है. यह Google का ओपन सोर्स JavaScript इंजन है. साथ ही, V8 में पहले से ही एक कचरा कलेक्टर मौजूद है. इसका मतलब है कि डेवलपर, Wasm में कंपाइल की गई PHP का इस्तेमाल करते हैं. इस वजह से, वे ब्राउज़र में पोर्ट की गई भाषा (PHP) के लिए, गैर-ज़रूरी डेटा हटाने वाले टूल को शिप करते हैं. हालांकि, ब्राउज़र में पहले से ही गैर-ज़रूरी डेटा हटाने वाला टूल मौजूद होता है. ऐसे में, WasmGC की मदद ली जा सकती है.
WasmGC के बारे में ज़्यादा जानने के लिए, WebAssembly गै़रबेज कलेक्शन (WasmGC) अब Chrome में डिफ़ॉल्ट रूप से चालू है लेख पढ़ें. अगर आपको इस बारे में ज़्यादा जानकारी चाहिए, तो 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;
}
फ़ंक्शनल भाषाओं के लिए, यह ऑप्टिमाइज़ेशन खास तौर पर ज़रूरी है. ये भाषाएं, बार-बार लागू होने वाले फ़ंक्शन पर काफ़ी निर्भर करती हैं. Haskell जैसी भाषाएं, लूप कंट्रोल स्ट्रक्चर भी उपलब्ध नहीं कराती हैं. आम तौर पर, कस्टम तरीके से बार-बार दोहराए जाने वाले किसी भी फ़ंक्शन में, किसी न किसी तरह से बार-बार दोहराए जाने की सुविधा का इस्तेमाल किया जाता है. टेल कॉल ऑप्टिमाइज़ेशन के बिना, यह किसी भी सामान्य प्रोग्राम के लिए बहुत तेज़ी से स्टैक ओवरफ़्लो में चला जाएगा. ऐसा न होने पर, स्टैक स्पेस जल्दी खत्म हो जाएगा.
शुरुआत में, WebAssembly में इस तरह के टेल कॉल ऑप्टिमाइज़ेशन की अनुमति नहीं थी. हालांकि, टेल कॉल एक्सटेंशन के प्रस्ताव के साथ यह बदल गया. ज़्यादा जानकारी के लिए, V8 ब्लॉग पर WebAssembly टेल कॉल लेख पढ़ें.
मीटिंग में सामने आए नतीजे
WasmGC और टेल कॉल ऑप्टिमाइज़ेशन अब बेसलाइन के तौर पर उपलब्ध हैं. इससे ज़्यादा ऐप्लिकेशन, बेहतर परफ़ॉर्मेंस के लिए इन सुविधाओं का इस्तेमाल कर सकते हैं. उदाहरण के लिए, Google Sheets ने Google Sheets के कैलकुलेशन वर्कर्स को WasmGC पर पोर्ट करके ऐसा किया है.