मैनुअल मेमोरी प्रबंधन या रनटाइम कचरा संग्रह के बिना टाइप-आधारित मेमोरी सुरक्षा?


13

मान लें कि हम एक प्रकार की, शुद्ध कार्यात्मक प्रोग्रामिंग भाषा चाहते थे, जैसे हास्केल या इदरिस, जिसका उद्देश्य कचरा संग्रह के बिना सिस्टम प्रोग्रामिंग है और जिसका कोई रनटाइम नहीं है (या कम से कम C और Rust "runtimes" से अधिक नहीं है)। कोई चीज जो नंगे धातु पर, कम या ज्यादा चल सकती है।

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


क्या आप कह रहे हैं कि आप कचरा संग्रहण से बचने के तरीके के रूप में भाषा के प्रकारों को पसंद करेंगे? कार्यों के मूल्यांकन में मूल समस्या उत्पन्न होती है। किसी फ़ंक्शन का मूल्यांकन एक क्लोजर के लिए किया जाता है, जो वर्तमान रनटाइम वातावरण को एन्क्रिप्ट करता है। यह कचरा संग्रहण करने का प्रमुख स्रोत है। जब तक आप फ़ंक्शन के लिए टाइपिंग नियम नहीं बदलते हैं, मैं यह नहीं देखता कि इसके साथ कैसे मदद करने जा रहे हैं। जावा और अन्य भाषाओं में टूटे हुए -abstractions को क्लोजर के गठन को बदलकर इसे जगाया जाता है: वे उन संदर्भों को अस्वीकार करते हैं जिनके लिए गैब्रेज संग्रह की आवश्यकता होगी। λ
बाउर

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

मार्टिन हॉफमैन के एलएफपीएल के बारे में क्या ? इसका एक विशेष आधार प्रकार है, "हीरा", जिस पर एक रैखिक प्रकार का अनुशासन लागू किया जाता है, जिससे बुनियादी मेमोरी उपयोग (आवंटन / डील्लोकेशन) के प्रकारों की अनुमति मिलती है। क्या आप उस दिशा में जाएंगे, जिसके बारे में आप बात कर रहे हैं?
दामियानो माज़ा

जवाबों:


18

मोटे तौर पर, सुरक्षित मैनुअल मेमोरी प्रबंधन के लिए दो मुख्य रणनीतियाँ हैं।

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

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

    यदि आप इदरीस-शैली सत्यापन में रुचि रखते हैं, तो आपको ज़ी एट अल की एटीएस भाषा को देखना चाहिए , जो हस्केल-शैली अनुक्रमित प्रकारों के आधार पर सत्यापन के लिए समर्थन के साथ एक जंग / एल 3 शैली की भाषा है, जो केवल प्रूफ-अप्रासंगिक और अधिक देने के लिए रैखिक बनाया गया है प्रदर्शन पर नियंत्रण।

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

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

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

    जेन्सन एट अल के निम्न-स्तरीय कोड के लिए उच्च-स्तरीय जुदाई तर्क इस का एक विशेष रूप से शुद्ध उदाहरण है - यह 686 विधानसभा के लिए जुदाई तर्क बनाता है! हालांकि, इस नस में कई परियोजनाएं हैं, जैसे प्रिंसटन में सत्यापित सॉफ्टवेयर टूलचैन और येल में सर्टिकोस परियोजना।

इन सभी दृष्टिकोणों को रस्ट की तरह थोड़ा सा "महसूस" होगा, क्योंकि चर के उपयोग को प्रतिबंधित करके स्वामित्व को ट्रैक करना उन सभी के लिए महत्वपूर्ण है।


3

रैखिक प्रकार और पृथक्करण तर्क दोनों महान हैं, लेकिन प्रोग्रामर प्रयास के लिए बहुत अधिक आवश्यकता हो सकती है। उदाहरण के लिए, रस्ट में एक सुरक्षित लिंक्ड सूची लिखना बहुत कठिन हो सकता है।

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

रीजन इंट्रेंस काफी सुरक्षित है (मेमोरी को डिलीट नहीं कर सकता) और न्यूनतम प्रोग्रामर हस्तक्षेप की आवश्यकता है, लेकिन यह "टोटल" नहीं है (यानी यह अभी भी मेमोरी को लीक कर सकता है, हालांकि निश्चित रूप से "कुछ नहीं करना" से बेहतर है), इसलिए यह आमतौर पर संयुक्त है व्यवहार में जीसी। MLtonML किट संकलक अधिकांश GC कॉल को खत्म करने के लिए क्षेत्रों का उपयोग करता है, लेकिन इसमें अभी भी GC है क्योंकि यह अभी भी मेमोरी को लीक करेगा। क्षेत्रों के शुरुआती अग्रदूतों में से कुछ के अनुसार, इस क्षेत्र में वास्तव में इस उद्देश्य के लिए आविष्कार नहीं किया गया था (यह स्वत: समानांतरीकरण के लिए था, मुझे लगता है); लेकिन यह सिर्फ निकला यह स्मृति प्रबंधन के लिए भी इस्तेमाल किया जा सकता है।

एक शुरुआती बिंदु के लिए, मैं कहूंगा कि मैड्स टॉफ और जीन-पियरे टैल्पिन द्वारा पेपर "इंप्लीमेंटेशन ऑफ द टाइप कॉल-बाय-वैल्यू λ-कैलकस ऑफ़ अ स्टैक ऑफ़ रीजन्स" का उपयोग किया जाएगा। क्षेत्र के निष्कर्ष पर अधिक कागजात के लिए, एम। टॉफेट और जे.-पी द्वारा अन्य कागजात देखें। तलपिन, पियरे जौवेलॉट के कुछ काम, साथ ही ग्रेग मॉरिसेट, माइक हिक्स और डैन ग्रॉसमैन की साइक्लोन पर पत्रों की श्रृंखला।


-2

"नंगे धातु" सिस्टम के लिए एक तुच्छ योजना केवल सभी रनटाइम मेमोरी आवंटन को समाप्त करना है। याद रखें, यहां तक ​​कि सी malloc/freeजोड़ी को एक रनटाइम लाइब्रेरी की आवश्यकता होती है। लेकिन यहां तक ​​कि जब सभी वस्तुओं को संकलित समय पर परिभाषित किया जाता है, तो उन्हें एक प्रकार से परिभाषित किया जा सकता है।

यहां मुख्य समस्या शुद्ध कार्यात्मक भाषाओं में अपरिवर्तनीय मूल्यों का गल्प है, जो प्रोग्राम के चलने के दौरान बनाई जाती हैं। रियल हार्डवेयर (और निश्चित रूप से नंगे धातु सिस्टम) म्यूटेबल रैम पर निर्भर करते हैं, जो सीमित आपूर्ति में है। व्यवहार में एक कार्यात्मक भाषा के कार्यान्वयन का क्रम गतिशील रूप से रैम को आवंटित करता है क्योंकि नए "अपरिवर्तनीय" मान बनाए जाते हैं, और कचरा तब एकत्र करता है जब "अपरिवर्तनीय" मूल्य की अब आवश्यकता नहीं है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.