পূর্ববর্তী উত্তরগুলিতে আরও প্রসারণ করা হচ্ছে ...
একটি সাধারণ সংকলক দৃষ্টিকোণ থেকে এবং ভিএম-নির্দিষ্ট অপ্টিমাইজেশন উপেক্ষা:
প্রথমত, আমরা সংক্ষিপ্ত বিশ্লেষণের পর্যায়ে যাব যেখানে আমরা কোডটিকে টোকনাইজ করি।
উদাহরণস্বরূপ, নিম্নলিখিত টোকেন উত্পাদিত হতে পারে:
[]: 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 সর্বদা একটি অ্যারে উত্পাদন করে। অতএব আমরা কেবল একটি অ্যারে তৈরি করি এবং এটি পপুলেট করি। অস্পষ্টতা হিসাবে, লেজিকাল অ্যানালাইসিস স্টেজ ইতিমধ্যে একটি বস্তুর সম্পত্তি অ্যাক্সেসর (উদাহরণস্বরূপ obj[foo]) বা স্ট্রিং / রেজেক্স লিটারেলের ভিতরে বন্ধনীগুলি (যেমন "foo [] বার" বা / [] /) থেকে আরআরএআইপিআইটি পৃথক করেছে eg
এটি মিনিস্কুল, তবে আমাদের আরও টোকেনও রয়েছে new Array। তদতিরিক্ত, এটি এখনও সম্পূর্ণ পরিষ্কার নয় যে আমরা কেবল একটি অ্যারে তৈরি করতে চাই। আমরা "নতুন" টোকেন দেখি, তবে "নতুন" কী? তারপরে আমরা আইডেন্টিফায়ার টোকনটি দেখি যা সূচিত করে যে আমরা একটি নতুন "অ্যারে" চাই, তবে জাভাস্ক্রিপ্ট ভিএম এর সাধারণত "স্থানীয় গ্লোবাল অবজেক্টস" এর জন্য কোনও পরিচয়দাতা টোকেন এবং টোকেন আলাদা করে না। অতএব ...
প্রতিবার আমরা একটি পরিচয়দাতা টোকেনের মুখোমুখি হয়ে গেলে আমাদের স্কোপ চেইনটি সন্ধান করতে হবে। জাভাস্ক্রিপ্ট ভিএমএস প্রতিটি সম্পাদন প্রসঙ্গে একটি "অ্যাক্টিভেশন অবজেক্ট" ধারণ করে যার মধ্যে "আর্গুমেন্ট" অবজেক্ট, স্থানীয়ভাবে সংজ্ঞায়িত ভেরিয়েবল ইত্যাদি থাকতে পারে। যদি আমরা এটি অ্যাক্টিভেশন অবজেক্টে খুঁজে না পাই তবে আমরা স্কোপ চেইনটি সন্ধান করতে শুরু করি যতক্ষণ না আমরা গ্লোবাল স্কোপে পৌঁছায় we । যদি কিছু না পাওয়া যায় তবে আমরা একটি নিক্ষেপ করি ReferenceError।
একবার আমরা ভেরিয়েবল ডিক্লেয়ারেশনটি সন্ধান করার পরে আমরা কনস্ট্রাক্টরকে অনুরোধ করব। new Arrayএকটি অন্তর্নিহিত ফাংশন কল, এবং থাম্বের নিয়মটি হ'ল ফাংশন কলগুলি কার্যকর করার সময় ধীর হয় (সুতরাং স্থির সি / সি ++ সংকলকগুলি "ফাংশন ইনলাইনিং" - যা স্পাইডারমনকি-এর মতো জেএস জেআইটি ইঞ্জিনগুলি অন-দ্য ফ্লাই করতে হবে)
Arrayকন্সট্রাকটর ওভারলোড করা হয়। অ্যারে কনস্ট্রাক্টর স্থানীয় কোড হিসাবে প্রয়োগ করা হয় সুতরাং এটি কিছু কার্যকারিতা বর্ধন করে তবে এটি এখনও আর্গুমেন্টের দৈর্ঘ্যের জন্য পরীক্ষা করে তদনুযায়ী কাজ করতে হবে। তদ্ব্যতীত, ইভেন্টে কেবল একটি যুক্তি সরবরাহ করা হয়, আমাদের তর্কটির ধরণ আরও পরীক্ষা করতে হবে। নতুন অ্যারে ("foo") ["foo"] উত্পাদন করে যেখানে নতুন অ্যারে (1) উত্পাদন করে [অপরিবর্তিত]
সুতরাং এগুলি সব সরল করার জন্য: অ্যারে আক্ষরিক সাথে, ভিএম জানে আমরা একটি অ্যারে চাই; এর সাথে new Array, ভিএমকে অতিরিক্ত সিপিইউ চক্র ব্যবহার করতে হবে যা new Array প্রকৃতপক্ষে কী তা নির্ধারণ করে।