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

यहां एक वर्ग का एक सरल उदाहरण है जो a और b के मूल्यों की प्रतियों को संग्रहीत करता है, जो कि इसे कंस्ट्रक्टर में पास कर दिया जाता है। इसमें एक विध्वंसक और एक सम फ़ंक्शन है जो a और b का योग लौटाएगा।
लेकिन मध्यवर्ती प्रतिनिधित्व में कोई OOP नहीं है, और इससे भी अधिक VM स्तर पर।
यदि हम यह देखने के लिए थोड़ा और गहरा होते हैं कि MyClass वास्तव में क्या है, तो हम निम्नलिखित तस्वीर के बारे में देखेंगे:

बहुत बढ़िया। अनुवादक, सरल जोड़तोड़ और मंत्र के माध्यम से, हमारी संरचना को एक सरल सरणी में बदल देता है।
कक्षाओं के लिए गतिशील टाइपिंग
यह वर्गों के लिए तेजी से गतिशील प्रकार की सेटिंग और उनके साथ संबंधित कार्य के बारे में भी सोचने योग्य है, क्योंकि गतिशील टाइपिंग वाली भाषाओं में यह एक बहुत ही महत्वपूर्ण बिंदु है।
सबसे सरल और सबसे प्रभावी समाधान वर्ग घटकों की एक आभासी तालिका है। यानी अनुवादक में, आप सभी वर्ग परिभाषाओं के प्रसंस्करण को लागू कर सकते हैं और वर्ग चर नामों और विधियों की एक सूची बना सकते हैं। तदनुसार, जब से हमारी कक्षाओं को सरणियों के रूप में दर्शाया गया है - सूची से प्रत्येक नाम एक सूचकांक के लिए तुलनीय है। जैसा कि आप नामों की सूची भरते हैं - आप स्मृति के अधिक किफायती आवंटन के लिए, प्रत्येक वर्ग के लिए सरणी का आकार निर्दिष्ट कर सकते हैं।
मूल वर्ग के आवंटनकर्ता
वर्चुअल मेथड टेबल के साथ एक क्लास का उपयोग करने में सक्षम होने के लिए, बस मेमोरी को आवंटित करने के अलावा, आपको इस टेबल को पॉइंटर्स के साथ एंट्री पॉइंट से क्लास के तरीकों में भरना होगा।
एक सरल और काम करने का तरीका प्रत्येक वर्ग के लिए एक आवंटनकर्ता उत्पन्न करना है। यह एक सरल विधि है जो वर्ग संरचना की एक सरणी के लिए मेमोरी आवंटित करती है, इसे आंशिक रूप से भरती है, और कक्षा को एक पॉइंटर लौटाती है।
एलोकेटर्स तब कहा जाता है जब कक्षा का एक उदाहरण बनाया जाता है, अर्थात्। उपरोक्त उदाहरण में, कॉल 24 वीं पंक्ति पर किया जाएगा - "नया MyClass (10, 20)"। आवंटनकर्ता के बाद, आप क्लास के कंस्ट्रक्टर को कॉल कर सकते हैं। मैश में, कंस्ट्रक्टर को कहा जाता है यदि नए निर्माण में वर्ग नाम के बाद कोष्ठक (...) होते हैं।
आत्मनिरीक्षण
यह संभव है कि हर कोई इस परिभाषा से परिचित नहीं है, लेकिन कई लोग सामने आए हैं।
आत्मनिरीक्षण - कोड निष्पादन के दौरान किस काम के साथ वस्तु के प्रकार की परिभाषा। एक उदाहरण एक ही जावास्क्रिप्ट में टाइपोफ () है।
मैश में पूर्ण आत्मनिरीक्षण है, अर्थात्। सरल डेटा प्रकारों के लिए और कक्षाओं के लिए।
आगे की हलचल के बिना, यहाँ कुछ कोड उदाहरण हैं:

और वर्ग के लिए:

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