प्रबंधित भाषा बनाम संकलित भाषा अंतर?


18

जब लोग संकलित भाषाओं और प्रबंधित भाषाओं के बीच अंतर करने की कोशिश करते हैं तो मैं भ्रमित हो जाता हूं। अनुभव से, मैं समझता हूं कि अधिकांश संकलित भाषाओं को C, C ++ माना जाता है, जबकि प्रबंधित भाषाएँ जावा, C # हैं (स्पष्ट रूप से अधिक हैं, लेकिन ये केवल कुछ उदाहरण हैं)। लेकिन वास्तव में दो प्रकार की भाषाओं के बीच मुख्य अंतर क्या है?

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


2
यह शब्द Microsoft द्वारा गढ़ा गया है, संकीर्ण अर्थों में जावा को भी प्रबंधित किया गया है। - लगभग सभी मामलों में हम यह है कि एक के एक सबसेट की तरह कामयाब भाषाओं कि compiles.Also, इस, मेरा मानना है कि संबंधित है के बारे में सोच सकते हैं programmers.stackexchange.com/questions/72446/...
shabunc

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

6
@ शिवनगरी, एक "भाषा" कुछ भी संकलित नहीं करती है। इसका कार्यान्वयन करता है। और आप पायथन को सांख्यिकीय रूप से संकलित कर सकते हैं (उदाहरण के लिए PyPy या IronPython देखें)। OTOH, यह वास्तव में एक गतिशील रूप से टाइप की गई भाषा के साथ कुशलतापूर्वक करना मुश्किल है ("ट्रेसिंग JIT", "अमूर्त व्याख्या", आदि)
SK-logic

@ एसके-तर्क: सहमत, मैंने एक बुरा कहा है। मैं मंच का उल्लेख करना चाहता था, भाषा का नहीं।
शिवन ड्रैगन

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

जवाबों:


47

अंतर "संकलित" बनाम "प्रबंधित" में नहीं है, ये दो ऑर्थोगोनल अक्ष हैं। "प्रबंधित" करके वे आम तौर पर एक कचरा एकत्र स्मृति प्रबंधन की उपस्थिति और / या एक आभासी मशीन बुनियादी ढांचे की उपस्थिति का मतलब है। दोनों का संकलन से कोई लेना-देना नहीं है और लोग इसके विपरीत होने के लिए कुछ भी करते हैं।

यह सब "मतभेद" काफी धुंधला, कृत्रिम और अप्रासंगिक हैं, क्योंकि एक ही क्रम में प्रबंधित और अप्रबंधित स्मृति को मिलाना हमेशा संभव होता है, और संकलन और व्याख्या के बीच का अंतर भी बहुत अस्पष्ट है।


2
यह वही है जो मैंने मूल रूप से ध्यान में रखा था, लेकिन मुझे बहुत से ऐसे लोग मिले हैं जो इस अंतर को बनाए रखते हैं। स्पष्ट उत्तर के लिए धन्यवाद।
l46kok

प्रबंधित कोड का अर्थ है कि रनटाइम पर, जिस भी निष्पादन वातावरण में आप चल रहे हैं, उस पर ध्यान देने के लिए एक मध्यवर्ती भाषा है? ताकि मध्यवर्ती भाषा (मान लें कि बायटेकोड) को एक संकलक द्वारा निर्मित किया जाना है। IMO, कि जोड़े "कोड" और "संकलन" की अवधारणा को थोड़ा प्रबंधित करते हैं। हालाँकि, यदि भाषा "संकलित" है, तो यह नहीं दिखाता है कि यह एक प्रबंधित कोड (जैसे। C ++ बनाम जावा)
zgulser

@zgulser, नहीं, मध्यवर्ती भाषाएँ ओर्थोगोनल हैं। प्रबंधित का अर्थ है कि भाषा रनटाइम के साथ एक GC एकीकृत होना। जैसे, OCaml रनटाइम "प्रबंधित" है, हालांकि यह सीधे देशी के लिए संकलित है।
एसके-तर्क

8

विकिपीडिया को उद्धृत करने के लिए:

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

प्रबंधित कोड को निष्पादित करने के लिए रनटाइम (.NET CLT की तरह) की आवश्यकता होती है।


5
प्रबंधित कोड का फ्रेमवर्क से कोई लेना-देना नहीं है। यह एक रनटाइम की जरूरत है जो स्मृति का प्रबंधन करता है।
ओड

शायद मेरा शब्दांकन थोड़ा हटकर है, लेकिन क्या .NET फ्रेमवर्क वास्तव में एक "सामान्य भाषा रनटाइम" नहीं है?
जनवेदल

3
नंबर में CLR शामिल है, लेकिन इसमें बेस क्लास लाइब्रेरीज़, IL स्पेसिफिकेशन और बहुत कुछ शामिल हैं।
ओड

4

मुझे लगता है कि कोई भेद किया जाना चाहिए, हालांकि यह "संकलित" और "प्रबंधित" के बीच जरूरी नहीं है। ये विपरीत नहीं हैं; एक भाषा को संकलित और प्रबंधित नहीं किया जा सकता है, या व्याख्या नहीं की जा सकती है (संकलित नहीं) और प्रबंधित, या दोनों, या यहां तक ​​कि न तो।

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

एक "प्रबंधित" भाषा एक प्रोग्राम है जो एक विशिष्ट रनटाइम वातावरण में खपत होने वाले कार्यक्रमों का उत्पादन करने के लिए डिज़ाइन किया गया है, जिसमें लगभग हमेशा एक बायटेकोड दुभाषिया शामिल होता है; एक "वर्चुअल मशीन" जो प्रोग्राम का कोड लेती है और कुछ अतिरिक्त मशीन या पर्यावरण-विशिष्ट परिवर्तन करती है। वातावरण में स्मृति प्रबंधन भी शामिल हो सकता है, जैसे कि "कचरा संग्रहकर्ता" और अन्य "सुरक्षा" सुविधाओं का अर्थ है अंतरिक्ष और उपकरणों के "सैंडबॉक्स" के भीतर कार्यक्रम का संचालन करना, हालांकि ऐसी विशेषताएं "प्रबंधित" रनटाइम के एकमात्र डोमेन नहीं हैं । वस्तुतः सभी व्याख्या की गई भाषाओं को प्रबंधित किया जा सकता है, क्योंकि उन्हें "उपयोगकर्ता" कोड की तर्ज पर चलाने वाले दुभाषिया की आवश्यकता होती है। इसके अलावा, JVM और .NET भाषाएँ (जावा, स्काला, C #, VB, F #, IronWhatever) को एक मध्यवर्ती भाषा या IL में संकलित किया जाता है, जो सतही रूप से और बाइनरी असेंबली भाषा के फ़ंक्शन के समान है, लेकिन किसी भी "देशी" निर्देश सेट का 100% पालन नहीं करता है। इन निर्देशों को JVM या .NET के CLR द्वारा निष्पादित किया जाता है, जो प्रभावी रूप से मशीन के सीपीयू आर्किटेक्चर और / या ओएस के लिए विशिष्ट देशी द्विआधारी निर्देशों का अनुवाद करता है।

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

यदि आप तकनीकी प्राप्त करना चाहते हैं, तो आजकल मल्टीटास्किंग ओएस को लक्षित करने वाले लगभग सभी कार्यक्रम "प्रबंधित" होते हैं; OS चल रहे प्रत्येक प्रोग्राम के लिए एक "वर्चुअल मशीन" बनाएगा, जिसमें प्रोग्राम सोचता है (या कम से कम उसे अन्यथा नहीं जानना है) कि यह केवल चल रही चीज है। कोड स्वयं के भीतर और अन्य संदर्भित पुस्तकालयों में कॉल कर सकता है जैसे कि वह कार्यक्रम केवल मेमोरी में भरी हुई चीज थी; इसी तरह, डेटा और नियंत्रण उपकरणों को स्टोर करने और हेरफेर करने के लिए रैम और अन्य उच्चतर मेमोरी आवंटित करने के लिए कॉल को कोडित किया जाता है जैसे कि संपूर्ण मेमोरी आर्किटेक्चर उपलब्ध था। वीएम (और इसके पीछे का ओएस) तब विभिन्न मेमोरी पॉइंटर्स को प्रोग्राम के वास्तविक स्थान, उसके डेटा, और डिवाइस ड्राइवरों को हुक आदि में अनुवाद करता है। यह अक्सर मेमोरी ऑफसेट को लागू करके किया जाता है (प्रत्येक वीएम को 2 जीबी का एक ब्लॉक मिलता है। या जो भी स्मृति, पता X पर शुरू करना, जो कार्यक्रम को मान सकता है जैसे कि X पता 0 था) और ऐसा करने के लिए बहुत सस्ता है, लेकिन अन्य चीजें हैं जो ओएस कर्नेल के लिए जिम्मेदार हैं, जैसे कि प्रक्रिया निर्धारण और अंतर-प्रक्रिया संचार, जो हैं प्रबंधन करने के लिए मुश्किल। हालांकि, इस मूल पैटर्न को आमतौर पर "प्रबंधित" नहीं माना जाता है, क्योंकि कार्यक्रम को यह जानने की जरूरत नहीं है कि यह एक वर्चुअल मशीन द्वारा चलाया जा रहा है और अक्सर अपनी आवंटित मेमोरी को "साफ" रखने के लिए जिम्मेदार है। एक प्रोग्राम जिसे MS-DOS कमांड लाइन पर चलाने के लिए डिज़ाइन किया गया था, उसे नए विंडोज OS पर चलाया जा सकता है, जिसमें MS-DOS का वातावरण भी उनके नीचे नहीं है; कार्यक्रम को इसके बजाय "वर्चुअल कंसोल" वातावरण दिया गया है, और बशर्ते यह "सैंडबॉक्स" छोड़ने की कोशिश न करे


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

2
कंपाइलर और दुभाषियों को आम तौर पर भाषाओं की बहुत विशिष्ट बोलियों को संकलित और व्याख्या करने के लिए पाया जाता है जिन्हें संकलन या व्याख्या से गुजरने के लिए डिज़ाइन किया गया है। किसी को भी जावास्क्रिप्ट स्रोत कोड का संकलन नहीं है जो मुझे पता है, और किसी की व्याख्या नहीं है C #। भाषाओं को एक या दूसरे तरीके से उपभोग करने के लिए डिज़ाइन किया गया है। इस प्रकार, यह आमतौर पर भाषा को "संकलित" या "व्याख्या" के रूप में संदर्भित करने के लिए स्वीकार्य होता है क्योंकि भाषा में उपयोग किए जाने वाले पूर्ण वातावरण में उन दो चरणों में से एक शामिल होता है।
कीथ्स


en.wikipedia.org/wiki/Interpreted_language - "सैद्धांतिक रूप से, किसी भी भाषा को संकलित या व्याख्या किया जा सकता है, इसलिए इस पदनाम को सामान्य कार्यान्वयन अभ्यास के कारण विशुद्ध रूप से लागू किया जाता है न कि किसी भाषा की कुछ आवश्यक संपत्ति।"
कीथ सिप

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

2

सरल भाषा में प्रबंधित भाषा यह एक उच्च-स्तरीय भाषा है जो निष्पादित करने के लिए एक रन-टाइम वातावरण द्वारा प्रदान की गई सेवाओं पर निर्भर करती है, जैसे कचरा संग्रह सेवा, इसीलिए इसे सामान्य रूप से प्रबंधित किया जाता है लेकिन यह एकमात्र सेवा नहीं है जो इसका उपयोग करती है , और इनमें से कुछ सेवाएं हैं security services, exception handling, standard types, यह Common Language Run-time CLR.Net भाषाओं या जावा जैसे आभासी वातावरण का उपयोग करने के लिए करता है, जो `जावा वर्चुअल मशीन JVM 'का उपयोग करता है।

Unmanaged Language ऑपरेटिंग सिस्टम द्वारा वर्चुअल रन-टाइम सेवाओं या इंटरमीडिएट भाषा की आवश्यकता के बिना एक निम्न-स्तरीय भाषा निष्पादन योग्य है, ऐसी भाषाएं, ऐसी भाषाओं C, C++द्वारा निर्मित मानवरहित कोड, लाइब्रेरी रूटीन का उपयोग करता है जो गतिशील रूप से OS से जुड़ने के लिए ओएस से जुड़ा होता है। DLLs (डायनेमिक लिंक लाइब्रेरी) नामक निष्पादित करने के लिए कोड, मानवरहित कोड सीधे मेमोरी को एक्सेस करता है यही कारण है कि यह प्रबंधित कोड की तुलना में तेज़ है, लेकिन जब तक आप एक हार्डवेयर ड्राइवर या परिष्कृत वीडियो गेम नहीं बना रहे हैं, तब तक आप वास्तव में अनवांटेड भाषाओं का उपयोग नहीं करना चाहते हैं भूमिका राज्य जैसे अनुभवहीन डेवलपर्स के साथ काम करना खतरनाक हो सकता हैwith great power comes great responsibility, और यही कारण है कि प्रबंधित भाषाएं डेवलपर्स को सिस्टम के निचले भाग में गोताखोरी के बिना एक्स्टेंसिबल कोड का उत्पादन करने में मदद करने के लिए मौजूद हैं, लेकिन फिर भी आप मिश्रित कोड बना सकते हैं यदि आपको ज़रूरत है, तो ये लेख यह सब समझाते हैं:

प्रबंधित / अप्रबंधित कोड इंटरऑपरेबिलिटी का अवलोकन

नमूना: अनवांटेड C ++, C ++ / CLI और C # कोड को मिक्स करना

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