2013-04-26 3 views
5

मेरी कक्षा परियोजना के लिए, मुझे एक (सरल) योजना संकलक लागू करना है।योजना/लिस्प कार्यान्वयन में कचरा कलेक्टर का उपयोग नहीं कर रहा है

इस बिंदु पर मैं समझ रहा हूं कि मैं विभिन्न सुविधाओं को कैसे कार्यान्वित करता हूं।

क्यों सामान्य योजना कार्यान्वयन एक जटिल जीसी से परेशान है? यदि कोड वास्तव में कार्यात्मक है (कोई दुष्प्रभाव नहीं है) तो वर्तमान में निष्पादित फ़ंक्शन आवंटित स्मृति पर नहीं हो सकता है। कभी! (जब तक यह एक रिसाव न हो!)

इसलिए, क्यों न केवल C, यानी स्टैक आवंटन की तरह सबसे आवश्यक भाषाओं का पालन न करें। हर बार एक नया शब्दावली संदर्भ दर्ज किया जाता है (यानी (define (foo ..) या (letrec ...), स्टैक पर परिवर्तनीय संग्रहण आवंटित करें और फिर संदर्भ समाप्त हो जाने के बाद बस स्टैक पॉइंटर समायोजित करें।

चूंकि योजना में malloc() नहीं है और केवल पूर्वनिर्धारित प्रकारों के आवंटन की अनुमति देता है, एक साधारण कार्यान्वयन पूलिंग या जोन आवंटक का उपयोग कर सकता है, इसलिए "ढेर" कभी भी खंड नहीं होना चाहिए।

मुझे बंद करने के लिए लागू नहीं करना है, लेकिन मुझे लगता है कि बाध्य मानों को एक अलग स्टैक पर कॉपी करके एक ही नस में भी किया जा सकता है जिसका उपयोग बंद राज्यों को विशेष रूप से ट्रैक करने के लिए किया जाता है।

विचार?

+3

लेकिन कोड वास्तव में कार्यात्मक नहीं है, जो ऑपरेशन 'सेट!', 'सेट-कार!' और 'सेट-सीडीआर!' जैसे राज्य को एक मानक योजना कार्यान्वयन का हिस्सा हैं। यदि आपका (सरल) स्कीम कंपाइलर उन परिचालनों की अनुमति नहीं देता है और आपको बंद करने की आवश्यकता नहीं है, तो एक आसान जीसी रणनीति संभव हो सकती है –

+5

एक साधारण उदाहरण के बारे में सोचें: एक फ़ंक्शन एक सूची देता है, जो दूसरे में पारित होता है फ़ंक्शन जो मूल सूची के प्रत्येक दूसरे तत्व से बना एक नई सूची बनाता है। आपके क्षेत्र विश्लेषण का अनुमान कैसे लगाया जाएगा, मूल सूची तत्वों का कौन सा हिस्सा दूसरे फ़ंक्शन को समाप्त करने के लिए आवश्यक नहीं है? यहां तक ​​कि सबसे बुनियादी लैम्ब्डा कैलकुस के लिए क्षेत्रों का अनुमान लगाने का बिल्कुल कोई तरीका नहीं है। –

+0

एक 'सरल' (आपका शब्द, मेरा नहीं) लागू करने के मुद्दे योजना संकलक एक योजना रनटाइम के कचरा कलेक्टर को लागू करने के मुद्दों से बहुत दूर हैं। पहले 'सरल' कंपाइलर पर फ़ोकस करें। – GoZoner

उत्तर

6

यहां तक ​​कि बंद किए बिना, एलियासिंग कठिन हिस्सा है। विशेष रूप से, मान लीजिए कि एक प्रक्रिया डेटा के एक संरचित टुकड़े बनाती है और फिर इसका एक हिस्सा देता है? आप कैसे निर्धारित करते हैं कि किन हिस्सों को मुक्त करना है? यदि आप इस समस्या को हल कर सकते हैं ... ठीक है, आपने कचरा संग्रह का पुनः आविष्कार किया है।

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

+0

ओपी एक जीसी का उपयोग नहीं करना चाहता है।तो आप इसके किसी भी हिस्से को मुक्त नहीं करते हैं: पी। जीसी के बिना आप अन्य भाषाओं में जो कुछ भी करेंगे, उससे अलग नहीं है, और आपको निश्चित रूप से जीसी का पुन: आविष्कार करने की आवश्यकता नहीं है। सी/सी ++ प्रोग्रामर की तरह ही इसकी आवश्यकता नहीं थी। – MasterMastic

+0

सी और सी ++ जैसी भाषाओं में प्रोग्रामर आमतौर पर मुफ्त() का उपयोग करके स्मृति मुक्त करने के लिए ज़िम्मेदार होता है। इसलिए, जब तक कि आप मुफ्त(), या शायद, (मुक्त)) के साथ एक योजना का प्रस्ताव नहीं दे रहे हैं, या ऐसी भाषा जो कभी भी स्मृति जारी नहीं करती है, तो आपका उत्तर मुझे समझ में नहीं आता है। –

+0

हाँ एक नि: शुल्क फ़ंक्शन ठीक है जो मैं कह रहा हूं। यदि आप जीसी का उपयोग नहीं करते हैं जो आखिरकार एकमात्र तरीका है जिसे मैं व्यक्तिगत रूप से स्मृति जारी करने के बारे में जानता हूं। और नहीं, मैं ऐसी भाषा का प्रस्ताव नहीं दूंगा जो स्मृति को कभी जारी न करे। – MasterMastic

5

कार्य जो उनके कॉलर को लौटने वाली वस्तुओं को निष्पादित करना समाप्त करते हैं। उन वस्तुओं को उन कार्यों के ढेर फ्रेम में आवंटित नहीं किया जा सकता है।

तो या तो आपको मूल्य लौटने पर प्रतिबंध लगाना होगा (इस मामले में, आपके पास ऐसी प्रक्रियाएं हैं जो कार्यात्मक प्रोग्रामिंग नहीं हैं: और कुछ भी उपयोगी करने के लिए, उन प्रक्रियाओं के दुष्प्रभाव होंगे)।

या आपको मूल्य से सब कुछ बनाना है: जब कोई ऑब्जेक्ट लौटाया जाता है, तो उसे कॉलर के स्टैक फ्रेम में लौटने वाले फ़ंक्शन (जिसे बाद में हटाया जाता है) के ढेर फ्रेम से कॉपी किया जाता है।

बाय-वैल्यू सिस्टम में प्रदर्शन और अर्थपूर्ण सीमाएं हैं।

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