पर कार्यात्मक भाषाओं को संकलित करना मान लीजिए कि आप पोर्टेबल सी के लिए एक कार्यात्मक भाषा संकलित कर रहे हैं, और यह भी मान लें कि विभिन्न कारणों से आप रूढ़िवादी कचरा संग्रह के बजाय सटीक चाहते हैं। कचरा कलेक्टर के लिए कोई पोर्टेबल तरीका नहीं है (शायद सामान्य मामले में कोई रास्ता नहीं) यह पता लगाने के लिए कि सी स्टैक पर पॉइंटर क्या है और नहीं है। ऐसा लगता है कि इस समस्या के दो समाधान हैं:सी
छाया स्टैक। प्रत्येक सी फ़ंक्शन को पॉइंटर के बारे में बहीखाता रखने की जानकारी बनाए रखें। यह दृष्टिकोण द्वारा अनुशंसित दृष्टिकोण है LLVM।
इस तथ्य का लाभ उठाएं कि आप एक कार्यात्मक भाषा संकलित कर रहे हैं, जिसका अर्थ है कि मेनलाइन कोड का कोई दुष्प्रभाव नहीं है। जब आवंटक स्मृति से बाहर निकलता है, तो कचरा कलेक्टर को स्वयं बुलाए जाने के बजाय, यह वर्तमान ऑपरेशन को लांगजंप के साथ मुख्य लूप पर वापस कर देता है, जो कचरा कलेक्टर कहता है (एक संदर्भ में जहां वेरिएबल्स का सेट पॉइंटर्स हो सकता है अग्रिम में) फिर ऑपरेशन को पुनरारंभ करता है।
मुझे ऐसा लगता है कि, यदि आप एक शुद्ध कार्यात्मक भाषा जहां दूसरा दृष्टिकोण लागू होता है के साथ काम कर रहे हैं, यह हस्तलिखित सी
साथ मिश्रण करने के लिए आसान पहला दृष्टिकोण से अधिक कुशल है, साथ ही होना चाहिएक्या कोई समस्या है जो मैं देख रहा हूं? इस तकनीक के मौजूदा चर्चा या कार्यान्वयन के लिए कोई संदर्भ?
संभवतः सहायक नहीं है, लेकिन मैंने अपनी योजना दुभाषिया के लिए मार्क-स्वीप लिखने के दौरान पहली बार कोशिश की। प्रदर्शन चूस गया, इसलिए मैं सी रनटाइम के ढेर के बाहर पूरी तरह वर्चुअल स्टैक के साथ समाप्त हुआ, मुख्य रूप से क्रॉस-रनटाइम स्टैक आत्मनिरीक्षण लगभग असंभव है। प्रदर्शन भी चूस गया लेकिन gdb/ddd के बिना डीबग करना आसान था। मैंने ऐसा करने का फैसला किया क्योंकि यह दुभाषिया था और जब मैं कार्यान्वयन के कंपाइलर चरण (जो आम तौर पर कभी खत्म नहीं हुआ) तक पहुंच गया। – Deleted
आप वर्तमान ऑपरेशन को पुनरारंभ करने की योजना कैसे बनाते हैं? समय-समय पर चेकपॉइंट सहेजें, फिर अंतिम अच्छा एक (कैसे?) –
@ n.m को पुनर्स्थापित करें: उस संबंध में प्रश्न का महत्वपूर्ण हिस्सा "कोड का कोई दुष्प्रभाव नहीं है"। प्रश्नकर्ता एक शुद्ध कार्यात्मक भाषा मान रहा है, इसलिए कोई भी राज्य कभी संशोधित नहीं होता है। चेकपॉइंट "लेने" की कोई ज़रूरत नहीं है, और जब आप किसी पिछले राज्य में जाते हैं तो आपको किसी भी बदलाव को "पूर्ववत" करने की आवश्यकता नहीं होती है क्योंकि भाषा परिवर्तन करने में सक्षम नहीं है। सिद्धांत रूप में, कोड में आपकी स्थिति आपको प्रोग्राम की स्थिति के बारे में जानने के लिए आवश्यक सबकुछ बताती है। –