2011-07-06 5 views
10

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

class X { 
    void f(const X&) {} 
}; 

प्रकार एक-दूसरे के साथ लगभग असीमित जटिल संबंध हो सकते हैं। तो, एक कंपाइलर प्रक्रिया के रूप में, आप कैसे सुनिश्चित करते हैं कि वे ठीक से एकत्र किए गए हैं?

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

+1

आप किस वस्तु से चिंतित हैं, बिल्कुल? टोकन? एएसटी नोड्स? यह सांख्यिकीय रूप से टाइप की गई, "जटिल" (?) भाषाओं से कैसे संबंधित है? –

+0

आम समाधान आपके कंपाइलर को कई पास जोड़ना है। यह करने का यह सबसे आसान तरीका है। पहला पास बस इन नामों को हल करता है और उन्हें लिंक करता है, और फिर अगले पास में इसका उपयोग किया जा सकता है। भाषा के आधार पर, आपको सबकुछ सही तरीके से उपलब्ध कराने के लिए कई पास की आवश्यकता हो सकती है। – tp1

+0

@ कोनराड: एक प्रकार का आंतरिक प्रतिनिधित्व, शायद टाइप नाम की श्रेणी की तरह कुछ होगा। @ tp1: यह प्रतीकों को पार्स करने और हल करने के लिए है .. उन प्रतीकों के स्मृति की प्रबंधन नहीं करना जो उनके प्रतीक हैं। – Puppy

उत्तर

1

मेमोरी प्रबंधन आसान है, बस प्रत्येक घोषणा प्रकार के लिए कुछ तालिका प्रकार-नाम -> टाइप-डिस्क्रिप्टर है। नामों को विशिष्ट रूप से नाम से पहचाना जाता है, इससे कोई फर्क नहीं पड़ता कि घोंसले कितना जटिल है। यहां तक ​​कि एक पुनरावर्ती प्रकार भी अभी भी एक ही प्रकार है। चूंकि टीपी 1 सही तरीके से कहता है, आप आमतौर पर सभी रिक्त स्थान भरने के लिए एकाधिक पास करते हैं। उदाहरण के लिए, आप जांच सकते हैं कि पहले प्रकार में एक प्रकार का नाम ज्ञात है और फिर सभी लिंक की गणना करें, बाद में, आप इस प्रकार की गणना करें।

ध्यान रखें कि सी जैसी भाषाओं में वास्तव में जटिल प्रकार की प्रणाली नहीं है - भले ही उनके पास पॉइंटर्स (जो पुनरावर्ती प्रकारों की अनुमति दें) हों, वहां बहुत अधिक प्रकार की गणना नहीं चल रही है।

+0

मेरी भाषा में तो वैश्विक नामस्थान में कई प्रकार के नाम और कोई स्थान नहीं होगा। – Puppy

+0

@DeadMG: आप बस एक अद्वितीय नाम उत्पन्न कर सकते हैं उदा। '# AnonStruct15'। अनाम प्रकार को किसी भी नाम से संदर्भित करने का कोई तरीका नहीं है, इसलिए यह सुरक्षित होना चाहिए। – kennytm

+0

@DeadMG अगर आपके पास void main() { List<string> MyList = new List<string>() है, तो "MyList" चर एक आंतरिक अज्ञात प्रकार है, शायद स्वचालित जेनरेट आईडी के साथ। आपके कंपाइलर द्वारा। – umlcat

1

मुझे लगता है कि आप अलग वस्तुओं का उपयोग कर घोषणाओं और परिभाषाओं का प्रतिनिधित्व करने के द्वारा निर्भरता ग्राफ से चक्र निकाल सकते हैं।

  • समारोह परिभाषाओं प्रकार पर निर्भर परिभाषाओं और समारोह घोषणाओं
  • प्रकार परिभाषाओं समारोह पर निर्भर करते हैं और टाइप : एक प्रकार प्रणाली सी ++ के समान मानते हुए, इसके बाद आपको एक पदानुक्रमित निर्भरता होगा घोषणा (और परिभाषा निहित प्रकारों के)
  • फ़ंक्शन घोषणाओंघोषणाओं

प्रकार पर निर्भर अपने उदाहरण में, निर्भरता ग्राफ f_def -> X_def -> f_decl -> X_decl है।

ग्राफ़ में कोई चक्र नहीं होने के साथ, आप सरल संदर्भ गणना का उपयोग करके ऑब्जेक्ट्स प्रबंधित कर सकते हैं।

+0

समस्या दूसरी पंक्ति है। टाइप परिभाषाएं टाइप परिभाषाओं पर निर्भर करती हैं। 'कक्षा एक्स {std :: वेक्टर my_x_vector; }; ' – Puppy

+0

@DeadMG: क्या यह' एक्स' की परिभाषा या 'एक्स' की घोषणा पर निर्भर करता है? –

+0

यदि टेम्पलेट तत्काल को 'एक्स' की परिभाषा की आवश्यकता है, तो कोड खराब हो गया है, क्योंकि उस बिंदु पर' एक्स' अधूरा है। 'वेक्टर' को केवल 'एक्स' की घोषणा की आवश्यकता है, इसलिए कोई समस्या नहीं है। –

संबंधित मुद्दे