हुड के नीचे जावास्क्रिप्ट

Nov 28 2022
विषय-सूची इस लेख में, हम जावास्क्रिप्ट के आंतरिक कार्य और यह वास्तव में कैसे चलता है, के बारे में जानेंगे। विवरणों को समझकर, आप अपने कोड के व्यवहार को समझेंगे और इसलिए आप बेहतर ऐप्स लिख सकते हैं।

विषयसूची

  • थ्रेड और कॉल स्टैक
  • निष्पादन प्रसंग
  • इवेंट लूप और एसिंक्रोनस जावास्क्रिप्ट
  • मेमोरी स्टोरेज और कचरा संग्रह
  • JIT (जस्ट इन टाइम) संकलन
  • सारांश

इस लेख में, हम जावास्क्रिप्ट के आंतरिक कार्य और यह वास्तव में कैसे चलता है, इसके बारे में जानेंगे। विवरणों को समझकर, आप अपने कोड के व्यवहार को समझेंगे और इसलिए आप बेहतर ऐप्स लिख सकते हैं।

जावास्क्रिप्ट को इस प्रकार वर्णित किया गया है:

नॉन-ब्लॉकिंग इवेंट लूप के साथ सिंगल-थ्रेडेड, गारबेज-कलेक्टेड, इंटरप्रेटेड या जस्ट इन टाइम कंपाइल प्रोग्रामिंग लैंग्वेज।

आइए इन प्रमुख शब्दों में से प्रत्येक को अनपैक करें।

थ्रेड और कॉल स्टैक:

जावास्क्रिप्ट इंजन एक एकल-थ्रेडेड दुभाषिया है जिसमें एक हीप और एक कॉल स्टैक होता है जिसका उपयोग प्रोग्राम को निष्पादित करने के लिए किया जाता है। कॉल स्टैक एक डेटा संरचना है जो फ़ंक्शन इनवोकेशन (कॉल) को अस्थायी रूप से स्टोर और प्रबंधित करने के लिए लास्ट इन, फ़र्स्ट आउट (LIFO) सिद्धांत का उपयोग करता है
। इसका मतलब यह है कि स्टैक में धकेला जाने वाला अंतिम फ़ंक्शन फ़ंक्शन के वापस आने पर सबसे पहले पॉप आउट होता है। चूंकि कॉल स्टैक सिंगल है, फ़ंक्शन (ओं) का निष्पादन एक समय में ऊपर से नीचे तक किया जाता है। इसका मतलब है कि कॉल स्टैक सिंक्रोनस है।

अब, चूंकि यह सिंक्रोनस है, आप सोचेंगे कि जावास्क्रिप्ट एसिंक्रोनस कॉल को कैसे हैंडल कर सकता है?
खैर, इवेंट लूप जावास्क्रिप्ट की अतुल्यकालिक प्रोग्रामिंग के पीछे का रहस्य है।
लेकिन जावास्क्रिप्ट के भीतर एसिंक्स कॉल की अवधारणा को समझाने से पहले और सिंगल-थ्रेडेड भाषा के साथ यह कैसे संभव है, आइए पहले समझें कि कोड कैसे निष्पादित किया जाता है।

निष्पादन संदर्भ (ईसी):

निष्पादन संदर्भ को पर्यावरण के रूप में परिभाषित किया गया है जिसमें जावास्क्रिप्ट कोड निष्पादित किया गया है।
निष्पादन प्रसंग का निर्माण दो चरणों में होता है:

1. मेमोरी क्रिएशन फेज:

  • ग्लोबल ऑब्जेक्ट बनाना (जिसे ब्राउज़र में विंडो ऑब्जेक्ट और NodeJS में ग्लोबल ऑब्जेक्ट कहा जाता है)।
  • "यह" वस्तु बनाना और इसे वैश्विक वस्तु से जोड़ना।
  • चर और कार्यों के संदर्भों को संग्रहीत करने के लिए मेमोरी हीप की स्थापना (एक हीप एक बड़ा, ज्यादातर असंरचित, मेमोरी का क्षेत्र है)।
  • उत्थापन को लागू करके वैश्विक निष्पादन संदर्भ में कार्यों और चरों को संग्रहीत करना ।

अब जब हम कोड निष्पादन के पीछे के चरणों को जानते हैं, तो चलिए वापस आते हैं

इवेंट लूप:

सबसे पहले, आइए इस आरेख को देखकर शुरू करें:

जेएस में इवेंट लूप

हमारे पास इंजन है जिसमें दो मुख्य घटक होते हैं:
* मेमोरी हीप - यह वह जगह है जहाँ मेमोरी आवंटन होता है।
* कॉल स्टैक - यह वह जगह है जहां आपके स्टैक फ्रेम आपके कोड के निष्पादन के रूप में होते हैं।

हमारे पास वेब एपीआई हैं जो ऐसे धागे हैं जिन्हें आप एक्सेस नहीं कर सकते हैं, आप उन्हें केवल कॉल कर सकते हैं। वे ब्राउज़र के टुकड़े हैं जिनमें समवर्ती किक होती है, जैसे DOM, AJAX, सेटटाइमआउट, और बहुत कुछ।

अंत में, कॉलबैक कतार है जो संसाधित होने वाली घटनाओं की एक सूची है। प्रत्येक घटना में एक संबद्ध कार्य होता है जिसे इसे संभालने के लिए बुलाया जाता है।

तो यहां इवेंट लूप का काम क्या है?
इवेंट लूप का एक सरल काम है - कॉल स्टैक और कॉलबैक कतार की निगरानी करना। यदि कॉल स्टैक खाली है, तो इवेंट लूप कतार से पहली घटना लेगा और इसे कॉल स्टैक पर धकेल देगा, जो इसे प्रभावी ढंग से चलाता है।
इस तरह के पुनरावृत्ति को इवेंट लूप में टिक कहा जाता है। प्रत्येक घटना सिर्फ एक फ़ंक्शन कॉलबैक है।

मेमोरी स्टोरेज और कचरा संग्रह:

कचरा संग्रह की आवश्यकता को समझने के लिए, हमें सबसे पहले मेमोरी लाइफ साइकिल को समझना चाहिए जो कि किसी भी प्रोग्रामिंग भाषा के लिए काफी हद तक समान है, इसके 3 प्रमुख चरण हैं।
1. मेमोरी आवंटित करें।
2. आवंटित स्मृति का उपयोग या तो पढ़ने या लिखने या दोनों के लिए करें।
3. आवंटित मेमोरी को तब जारी करें जब इसकी आवश्यकता नहीं है।

जब हम आवंटित मेमोरी को रिलीज़ करने का प्रयास करते हैं, तो अधिकांश मेमोरी प्रबंधन समस्याएँ उत्पन्न होती हैं। उत्पन्न होने वाली मुख्य चिंता अप्रयुक्त स्मृति संसाधनों का निर्धारण है।
निम्न-स्तरीय भाषाओं के मामले में जहां डेवलपर को मैन्युअल रूप से यह तय करना पड़ता है कि कब मेमोरी की आवश्यकता नहीं है, उच्च-स्तरीय भाषाएं जैसे जावास्क्रिप्ट कचरा संग्रह (जीसी) के रूप में ज्ञात स्मृति प्रबंधन के एक स्वचालित रूप का उपयोग करती हैं।
जीसी करने के लिए जावास्क्रिप्ट दो प्रसिद्ध रणनीतियों का उपयोग करता है: संदर्भ-गिनती तकनीक और मार्क-एंड-स्वीप एल्गोरिदम।
यहां एमडीएन से दोनों एल्गोरिदम और उनके काम करने के तरीके के बारे में विस्तृत विवरण दिया गया है।

JIT (जस्ट इन टाइम) संकलन:

चलिए जावास्क्रिप्ट परिभाषा पर वापस आते हैं: यह कहता है "इंटरप्रिटेड, जेआईटी-कंपाइल प्रोग्रामिंग लैंग्वेज", तो इसका क्या मतलब है? सामान्य रूप से एक कंपाइलर और एक दुभाषिया के बीच के अंतर से शुरू करने के बारे में कैसे?

सादृश्य के रूप में, दो अलग-अलग भाषाओं वाले दो लोगों के बारे में सोचें जो संवाद करना चाहते हैं। संकलन करना रुकने और भाषा सीखने के लिए पूरा समय लेने जैसा है, और व्याख्या करना प्रत्येक वाक्य की व्याख्या करने के लिए वहां किसी के होने जैसा होगा।

इसलिए संकलित भाषाओं में धीमा लेखन-समय और तेज़ रन-टाइम होता है और व्याख्या की गई भाषाओं में विपरीत होता है।

तकनीकी शर्तों के साथ बोलना: संकलन निष्पादन से पहले प्रोग्राम सोर्स कोड को मशीन-पठनीय बाइनरी कोड में कवर करने की एक प्रक्रिया है, और एक कंपाइलर पूरे प्रोग्राम को एक ही बार में ले लेता है।

दूसरी ओर, एक दुभाषिया एक प्रोग्राम है, जो मशीन-पठनीय प्रारूप में पूर्व-संकलित होने की आवश्यकता के बिना प्रोग्राम निर्देशों को निष्पादित करता है, और यह एक समय में कोड की एक पंक्ति लेता है।

और यहाँ JIT संकलन भूमिका आती है जो व्याख्या किए गए कार्यक्रमों के प्रदर्शन में सुधार कर रही है। पूरे कोड को एक बार में मशीन कोड में बदल दिया जाता है और फिर तुरंत निष्पादित किया जाता है ।

जेआईटी कंपाइलर के अंदर, हमारे पास मॉनिटर (उर्फ प्रोफाइलर) नामक एक नया घटक है। वह मॉनीटर कोड को देखता है क्योंकि यह चलता है और

  • कोड के गर्म या गर्म घटकों की पहचान करें जैसे: दोहराव कोड।
  • रन-टाइम के दौरान उन घटकों को मशीन कोड में ट्रांसफ़ॉर्म करें।
  • उत्पन्न मशीन कोड का अनुकूलन करें।
  • कोड के पिछले कार्यान्वयन को हॉट स्वैप करें।

अब जब हम मूल अवधारणाओं को समझ गए हैं, तो चलिए एक मिनट लेते हैं और कोड को निष्पादित करते समय जेएस इंजन द्वारा पालन किए जाने वाले चरणों को संक्षेप में प्रस्तुत करते हैं:

छवि स्रोत: ट्रैवर्सी मीडिया चैनल
  1. जेएस इंजन जेएस कोड लेता है जो मानव-पठनीय सिंटैक्स में लिखा गया है और इसे मशीन कोड में बदल देता है।
  2. इंजन लाइन द्वारा कोड लाइन के माध्यम से जाने के लिए एक पार्सर का उपयोग करता है और जांचें कि सिंटैक्स सही है या नहीं। यदि कोई त्रुटि है, तो कोड निष्पादित करना बंद कर देगा और एक त्रुटि फेंक दी जाएगी।
  3. यदि सभी चेक पास हो जाते हैं, तो पार्सर एक ट्री डेटा स्ट्रक्चर बनाता है जिसे एब्सट्रैक्ट सिंटैक्स ट्री (एएसटी) कहा जाता है।
  4. एएसटी एक डेटा संरचना है जो पेड़ जैसी संरचना में कोड का प्रतिनिधित्व करती है। एएसटी से कोड को मशीन कोड में बदलना आसान है।
  5. दुभाषिया तब एएसटी लेने के लिए आगे बढ़ता है और इसे आईआर में बदल देता है, जो मशीन कोड का एक सार है और जेएस कोड और मशीन कोड के बीच एक मध्यस्थ है। IR भी अनुकूलन करने की अनुमति देता है और अधिक मोबाइल है।
  6. JIT कंपाइलर तब उत्पन्न IR को लेता है और कोड को संकलित करके, मक्खी पर प्रतिक्रिया प्राप्त करके और उस प्रतिक्रिया का उपयोग करके संकलन प्रक्रिया को बेहतर बनाने के लिए इसे मशीन कोड में बदल देता है।

पढ़ने के लिए धन्यवाद :)

आप मुझे ट्विटर और लिंक्डइन पर फॉलो कर सकते हैं ।