10

कौन सा भाषाएं पॉइंटर-मुक्त भाषाओं (आईई: पायथन, जावा, पर्ल, PHP, रूबी, जावास्क्रिप्ट, आदि) में मैन्युअल मेमोरी प्रबंधन है? मुझे कभी सुनवाई याद नहीं है।मैन्युअल मेमोरी प्रबंधन के साथ भाषाएं व्याख्या की?

कचरा संग्रह के गैर-निर्धारिक देरी (या पर्याप्त देरी नहीं होने पर अंतरिक्ष जटिलता) की व्याख्या की गई भाषाओं के बारे में प्रमुख चिंता नहीं है? तो जावा की तरह बिल्कुल कुछ क्यों न लिखें, लेकिन आपको मैन्युअल रूप से मुफ्त मेमोरी बलों?

संपादित

क्या मैं नियमित स्मृति प्रबंधन द्वारा मतलब है कि भाषा की वस्तुओं के लिए संदर्भ है, और आप एक संदर्भ का उपयोग कर वस्तु को नष्ट कर सकते है।

उदाहरण:

Object a = new Object(); // a is a reference to the object 
Object b = a; // b is a reference to the same object 
a.method(); // fine 
delete b; // delete the object referenced by b 
a.method(); // null dereference exception 

तो क्या चेतावनियां (मेमोरी लीक के अलावा) वहाँ इस उदाहरण की तरह एक भाषा में हो सकता है?

+0

बीटीडब्ल्यू, यहां "व्याख्या" द्वारा आपका क्या मतलब है? बाइटकोड के इन दिनों में जावा पाइथन, पीएचपी या जावास्क्रिप्ट के रूप में ज्यादा "व्याख्या" है। हो सकता है कि आप "गतिशील रूप से टाइप की गई" भाषाओं का अधिक सटीक उल्लेख करेंगे? – jsbueno

+0

किसी दुभाषिया द्वारा निष्पादित कुछ भी, यह किसी प्रकार का मध्यवर्ती रूप या सादा बाइटकोड हो। विशेष रूप से php/java/perl/python/ruby ​​जैसे कुछ भी जो आपको अपना पता स्थान कचरा नहीं देगा। –

+1

सी # सूचक नहीं है। –

उत्तर

1

कारण परिपत्र संदर्भ, शून्य सूचक अपवाद और एकाधिक संदर्भ हैं। एक साधारण उदाहरण:

var a = new Object(); 
var b = a; 
a = null;//or delete a or free a or whatever; 
print(b);//what now? is b null? or is b still new Object()? 

हैं, तो ऊपर के उदाहरण में, b अब रिक्त है, तो आप कुछ प्रमुख समस्याओं के साथ समाप्त जब चर को पुनर्परिभाषित। उदाहरण के लिए, a को शून्य पर सेट करने के बजाय, यदि आप इसे c पर सेट करते हैं तो क्या होगा? b भी c होगा?

आप circular references, on wikipedia जैसी अन्य समस्याओं के बारे में पढ़ सकते हैं।

+0

परिपत्र संदर्भ समस्या क्षेत्र-आधारित स्मृति प्रबंधन के साथ हल किया जा सकता है। शुरुआती मैनुअल दृष्टिकोण क्षेत्र और स्टैक-आधारित मेमोरी प्रबंधन थे, जैसे फर्थ फॉरगेट। –

+0

हां नल संदर्भ ठीक रहे होंगे, हालांकि मैंने संदर्भ एलियासिंग के बारे में नहीं सोचा था, जो चीजों को जटिल बनाता है। –

0

व्याख्याित आवश्यक रूप से कचरा संग्रहित नहीं है। पर्ल, टीसीएल, पायथन, इत्यादि। मेरा मानना ​​है कि सभी सरल संदर्भ गिनती का उपयोग करते हैं, इसलिए स्मृति पुनर्मूल्यांकन निश्चित है, हालांकि सभी पारदर्शी नहीं (कभी भी एक Perl प्रोग्राम पर strace कोशिश की?)।

+0

संदर्भ गणना एक प्रकार का कचरा संग्रह है, जो अक्सर इसकी विफलताओं के बावजूद उपयोग की जाती है क्योंकि इसे कार्यान्वित करना आसान है और प्लेटफॉर्म पर निर्भर नहीं है। –

+0

हां, लेकिन यह सिर्फ शब्दावली है। मेरा मतलब है जावा/सी # में जीसी-इन-द-बैकग्राउंड बनाम इनलाइन रीफ-गिनती। –

+0

हाँ मुझे पता है कि पाइथन संदर्भ गिनती करता है। मैं ऑब्जेक्ट्स को स्पष्ट रूप से हटाने के बारे में बात कर रहा हूं ताकि उनके संदर्भ में दो संदर्भ और एक संदर्भ के माध्यम से हटाने से किसी भी संदर्भ के माध्यम से ऑब्जेक्ट तक पहुंचने का प्रयास किया जा सके। –

2

कुछ उच्च प्रदर्शन में Lua जैसी भाषाओं की व्याख्या की गई, आप कचरा संग्रहण मैन्युअल रूप से संभाल सकते हैं। lua_gc देखें।

4

Forth ने स्मृति के क्षेत्र को ढेर किया है जिसे FORGET के साथ जारी किया जा सकता है।

2

कुछ सी/सी ++ दुभाषिया उपलब्ध हैं, उदाहरण के लिए, this one

मैंने इसे स्वयं से नहीं देखा, लेकिन मुझे लगता है कि यह संकलित सी/सी ++ के अनुकूल होने का दावा करता है, इसलिए इसे "मैन्युअल" मेमोरी प्रबंधन होना चाहिए।

0

अजगर के एपीआई oficially एक चालू या बंद देरी कचरा संग्रहण चालू करने के लिए अनुमति देता है - मानक लाइब्रेरी के "जीसी" मॉड्यूल पर दस्तावेज़ीकरण की जाँच करें:

http://docs.python.org/library/gc.html

लेकिन वह क्या यह धीमी गति से बनाता है नहीं है स्थिर भाषाओं की तुलना में - डेटा की गतिशील प्रकृति गति अंतर के लिए जिम्मेदार मुख्य है।

1

तो सवाल के इस हिस्से का जवाब दे: कचरे के

प्रमुख चिंता का विषय बारे भाषाओं में व्याख्या की गैर नियतात्मक देरी (या अंतरिक्ष जटिलता जब वहाँ पर्याप्त नहीं देरी) नहीं है संग्रह? तो क्यों जावा की तरह कुछ लिखना नहीं है, लेकिन आपको मैन्युअल रूप से मुफ्त मेमोरी देता है?

यह कुछ सिस्टमों के लिए चिंता का विषय हो सकता है। अन्य प्रणालियों के लिए बहुत मुश्किल नहीं है। कचरा संग्रह के साथ चल रहे सॉफ़्टवेयर सिस्टम की तुलना में स्मृति को तेज़ी से आवंटित कर सकते हैं जो सिर्फ मॉलोक को कॉल करते हैं। बेशक आप बाद में जीसी समय पर भुगतान करना समाप्त कर देते हैं।

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

कचरा संग्रह के लिए कई अलग-अलग रणनीतियों हैं। सिस्टम के लिए कौन सी रणनीति सर्वोत्तम है, आवश्यकताओं पर निर्भर करेगा। लेकिन अगर आपको पूर्ण निर्धारणा की आवश्यकता होती है, तो आप कुछ भी उपयोग कर सकते हैं: Realtime Java

3

कौन सी व्याख्या की गई भाषाओं में मैन्युअल मेमोरी प्रबंधन है? मुझे कभी सुनवाई याद नहीं है।

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

सी एक संकलित भाषा है? वहां सी दुभाषिया हैं। क्या पाइथन एक व्याख्या की गई भाषा है? सभी 8 वर्तमान पायथन कार्यान्वयन एक कंपाइलर का उपयोग करते हैं।

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

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

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

+0

मुझे लगता है कि इसका अर्थ है कि वह सिर्फ पियथन, पर्ल, आदि जैसे स्क्रिप्टिंग का मतलब है ... आप सही हैं, लेकिन यह चर्चा = पी लाने के लिए यह गलत जगह है। – Claudiu

+0

वास्तव में आप सही हैं, लेकिन मेरे पास मेरे प्रश्न में जो कुछ भी था, उसके साथ वास्तव में कुछ भी नहीं करना है। मैं व्याख्या की गई भाषा के बारे में और अधिक विशिष्ट होने का प्रयास करूंगा: "स्मृति सुरक्षित (जरूरी नहीं कि" स्क्रिप्ट-आईएसएच ") भाषाएं जो सी/सी ++ जैसी नज़दीकी धातु नहीं हैं जो आपको अपना पता मिटा नहीं देती अंतरिक्ष जब तक आप _really_ करना चाहते हैं; ऐसी भाषाएं जो आमतौर पर जेआईटी संकलित और/या व्याख्या की जाती हैं (और/या उस प्रक्रिया से पहले बाइट कोड में भी संकलित (और या अगली बार संकलित))। " –

18

प्रश्न के पीछे परिसर थोड़ा कुशल हैं:

  • स्मृति मॉडलभाषा की संपत्ति, नहीं इसके कार्यान्वयन है।

  • व्याख्या की जा रही है कार्यान्वयन, एक भाषा नहीं है।

उदाहरण:

  • प्रोग्रामिंग भाषा योजना स्वचालित स्मृति प्रबंधन है, और यह चोरी, गैम्बिट सहित कुछ ठीक देशी-कोड compilers PLT योजना में व्याख्या कार्यान्वयन के कई दर्जनों, लेकिन यह भी है, और है (जिसमें दोनों एक दुभाषिया और एक जेआईटी कंपाइलर निर्बाध संक्रमण बनाते हैं)।

  • प्रोग्रामिंग भाषा हास्केल में स्वचालित मेमोरी प्रबंधन है; दो सबसे प्रसिद्ध कार्यान्वयन दुभाषिया एचयूजीएस और कंपाइलर GHC हैं। देशी कोड (yhc) और व्याख्या (हीलियम) में संकलन के बीच समान रूप से विभाजित कई अन्य सम्माननीय कार्यान्वयन हैं।

  • प्रोग्रामिंग भाषा सी में मैन्युअल मेमोरी प्रबंधन है, और जबकि विश्व सी कंपाइलर्स से भरा है, हम में से पुराने पुराने 1 9 80 के दशक को याद रखने के लिए पुरानी हैं, सबर-सी या सी-टेरप, दो बहुत ही उपयोगी सी दुभाषियों को याद कर सकते हैं MS-DOS।

फिर भी अपने प्रश्न के पीछे एक सच्चा अवलोकन है: स्मृति प्रबंधन को साथ भाषाएं आम तौर पर संकलित कर रहे हैं। क्यूं कर?

  • मैन्युअल मेमोरी प्रबंधन एक विरासत सुविधा है, जो अक्सर विरासत कोड के साथ संगत होने के लिए उपयोग किया जाता है। विरासत भाषाएं आमतौर पर देशी-कोड कंपाइलर्स के लिए पर्याप्त परिपक्व होती हैं।

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

  • मैन्युअल मेमोरी प्रबंधन भी (और कभी-कभी यहां तक ​​कि उचित रूप से) प्रदर्शन को बेहतर बनाने के लिए उपयोग किया जाता है। 1 99 0 के दशक से बेन जोर्न के उत्कृष्ट प्रयोगात्मक अध्ययनों से पता चलता है कि स्वचालित मेमोरी प्रबंधन मैन्युअल मेमोरी प्रबंधन की तुलना में तेज़ या तेज़ है, लेकिन लगभग दोगुनी स्मृति की आवश्यकता है।इसलिए मैन्युअल मेमोरी प्रबंधन अक्सर बहुत छोटे उपकरणों पर उपयोग किया जाता है, जहां स्मृति दुर्लभ होती है, और बहुत बड़े डेटा केंद्रों में, जहां स्मृति को दोगुनी करना महंगा होता है। (यह कभी-कभी उन लोगों द्वारा भी उपयोग किया जाता है जो स्मृति प्रबंधन के बारे में ज्यादा नहीं जानते हैं, लेकिन जिन्होंने सुना है कि कचरा संग्रह धीमा है। वे 1 9 80 में सही थे।) और जब प्रदर्शन के लिए चिंता होती है तो आपको आमतौर पर देशी-कोड संकलक मिल जाता है एक दुभाषिया से।

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

सारांश में:

  • स्मृति प्रबंधन को बनाम स्वत: भाषा है।

  • बनाम व्याख्या की संकलित कार्यान्वयन है।

  • सिद्धांत में दो विकल्प हो सकता है और orthogonally बना रहे हैं, लेकिन व्यावहारिक इंजीनियरिंग कारणों के लिए स्वचालित स्मृति प्रबंधन अक्सर व्याख्या साथ संबद्ध है।

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

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


नोट जोड़ा के बाद प्रश्न संपादित किया गया था: आप "व्याख्या" से "सूचक मुक्त" बदल दिया है। लेकिन आप एक टिप्पणी में कहते हैं कि आप new और delete वाली भाषाओं के बारे में पूछना चाहते हैं। new और delete के साथ कोई भी भाषा पॉइंटर्स है: परिभाषा के अनुसार, जो भी new रिटर्न एक सूचक है। (कुछ भाषाओं में, पॉइंटर्स के अन्य स्रोत भी हो सकते हैं।) तो मुझे लगता है कि आप क्या कहना चाहते हैं "पॉइंटर अंकगणित के बिना भाषाएं और ऑपरेटर के पते के बिना"।

+0

मैन्युअल मेमोरी प्रबंधन 'नए' और 'डिलीट' ऑपरेटरों के रूप में। एक 'delete'd ऑब्जेक्ट को हटाना करने का प्रयास अपरिभाषित व्यवहार के बजाय अपवाद या किसी अन्य प्रकार की त्रुटि का कारण बन जाएगा। मूल रूप से जावा के समान लेकिन एक डिलीट ऑपरेटर के साथ, मेरे उदाहरण के अनुसार। यद्यपि मैन्युअल मेमोरी प्रबंधन के बारे में आपके पास एक विरासत चीज़ होने के बारे में एक अच्छा मुद्दा है। –

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