पिछले उत्तरों पर और विस्तार ...
एक सामान्य संकलक परिप्रेक्ष्य और वीएम-विशिष्ट अनुकूलन की अवहेलना से:
सबसे पहले, हम लेक्सिकल विश्लेषण चरण से गुजरते हैं जहां हम कोड को टोकन करते हैं।
उदाहरण के अनुसार, निम्नलिखित टोकन का उत्पादन किया जा सकता है:
[]: ARRAY_INIT
[1]: ARRAY_INIT (NUMBER)
[1, foo]: ARRAY_INIT (NUMBER, IDENTIFIER)
new Array: NEW, IDENTIFIER
new Array(): NEW, IDENTIFIER, CALL
new Array(5): NEW, IDENTIFIER, CALL (NUMBER)
new Array(5,4): NEW, IDENTIFIER, CALL (NUMBER, NUMBER)
new Array(5, foo): NEW, IDENTIFIER, CALL (NUMBER, IDENTIFIER)
उम्मीद है कि यह आपको एक पर्याप्त दृश्य प्रदान करेगा ताकि आप समझ सकें कि कितना (या कम) प्रसंस्करण की आवश्यकता है।
उपरोक्त टोकन के आधार पर, हम एक तथ्य के रूप में जानते हैं कि ARRAY_INIT हमेशा एक सरणी का उत्पादन करेगा। इसलिए हम केवल एक सरणी बनाते हैं और उसे आबाद करते हैं। जहाँ तक अस्पष्टता है, लेक्सिकल विश्लेषण चरण ने पहले ही ARRAY_INIT को एक ऑब्जेक्ट प्रॉपर्टी एक्सेसर (जैसे obj[foo]
) या स्ट्रिंग्स / रेगेक्स शाब्दिक (जैसे "फू [] बार" या /] / /) के अंदर ब्रैकेट से अलग कर दिया है।
यह छोटा है, लेकिन हमारे पास और भी टोकन हैं new Array
। इसके अलावा, यह पूरी तरह से अभी तक स्पष्ट नहीं है कि हम केवल एक सरणी बनाना चाहते हैं। हम "नया" टोकन देखते हैं, लेकिन "नया" क्या? फिर हम IDENTIFIER टोकन देखते हैं जो दर्शाता है कि हम एक नया "ऐरे" चाहते हैं, लेकिन जावास्क्रिप्ट वीएम आमतौर पर "देशी वैश्विक वस्तुओं" के लिए एक आईडी टोकन और टोकन को अलग नहीं करता है। इसलिए ...
जब भी हम एक IDENTIFIER टोकन का सामना करते हैं, तो हमें गुंजाइश श्रृंखला को देखना होगा। जावास्क्रिप्ट वीएम में प्रत्येक निष्पादन संदर्भ के लिए एक "सक्रियण ऑब्जेक्ट" होता है जिसमें "तर्क" ऑब्जेक्ट, स्थानीय रूप से परिभाषित चर आदि शामिल हो सकते हैं। यदि हम इसे सक्रियण ऑब्जेक्ट में नहीं पा सकते हैं, तो हम गुंजाइश श्रृंखला की तलाश शुरू करते हैं जब तक हम वैश्विक दायरे तक नहीं पहुंच जाते। । अगर कुछ नहीं मिला, तो हम एक फेंक देते हैं ReferenceError
।
एक बार जब हम परिवर्तनशील घोषणा को स्थित कर लेते हैं, तो हम निर्माणकर्ता को आमंत्रित करते हैं। new Array
एक अंतर्निहित फ़ंक्शन कॉल है, और अंगूठे का नियम यह है कि फ़ंक्शन कॉल निष्पादन के दौरान धीमे होते हैं (इसलिए स्थैतिक C / C ++ कंपाइलर "फ़ंक्शन इनलाइनिंग" की अनुमति देते हैं - जो कि जेएस जेआईटी इंजन जैसे स्पाइडरमोंकी को ऑन-द-फ्लाई करना है)
Array
निर्माता ओवरलोड हो गया है। ऐरे कंस्ट्रक्टर को देशी कोड के रूप में लागू किया जाता है, इसलिए यह कुछ प्रदर्शन संवर्द्धन प्रदान करता है, लेकिन इसके लिए अभी भी तर्क की लंबाई की जांच करना और उसके अनुसार कार्य करना होगा। इसके अलावा, घटना में केवल एक तर्क की आपूर्ति की जाती है, हमें आगे तर्क के प्रकार की जांच करने की आवश्यकता है। नया ऐरे ("फू") पैदा करता है ["फू"] जहां नया ऐरे (1) पैदा करता है [अपरिभाषित]
तो यह सब आसान करने के लिए: सरणी शाब्दिक के साथ, VM जानता है कि हम एक सरणी चाहते हैं; इसके साथ new Array
, वीएम को अतिरिक्त सीपीयू चक्र का उपयोग करने की जरूरत है ताकि यह पता लगाया जा सके कि new Array
वास्तव में क्या करता है।