संकलित बनाम संकलित: एक उपयोगी अंतर?


29

बहुत सारे प्रश्न यहाँ पर व्याख्यायित बनाम संकलित भाषा के उपकरणों के बारे में पूछे जाते हैं। मैं सोच रहा हूँ कि क्या वास्तव में भेद का कोई अर्थ है। (वास्तव में सवाल आमतौर पर भाषाओं के बारे में हैं, लेकिन वे वास्तव में उन भाषाओं के सबसे लोकप्रिय कार्यान्वयन के बारे में सोच रहे हैं)।

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

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

इस प्रकार मैं पूछता हूं: क्या इन दिनों व्याख्या किए गए कार्यान्वयन और संकलित कार्यान्वयन के बीच एक उपयोगी अंतर है?


7
@ डीडीएमजी उतना नया नहीं जितना कि आप सोच सकते हैं: जस्ट -इन-टाइम का संक्षिप्त इतिहास ...
yannis

4
@DeadMG यह देखते हुए कि पिछले 10 वर्षों में पेश की गई अधिकांश नई भाषाएँ या मुख्य रूप से किसी प्रकार के VM पर चलती हैं, मैं कहूंगा कि उसके पास एक बिंदु है। बेशक अभी भी (और आने वाले दशकों के लिए होगा) देशी कोड के लिए संकलित भाषाएं हैं, और एक जेआईटी लक्जरी रहेगी (या नहीं, अगर PyPy लोगों के पास अपना रास्ता है)। तो हां, संभव ओवरस्टैटमेंट, लेकिन मैं मानता हूं कि मुख्यधारा (अभी और आगे के भविष्य के लिए) बायटेकोड कंपाइलर + संभवतः जेआईटी लगती है।

4
@ डीडीएमजी, आपके पास लंबी सफेद दाढ़ी होनी चाहिए, अगर वीएम मॉडल आपके लिए "नया" है। P-code1966 में पहली बार पेश किया गया था। IBM Aix 1986 से आस पास है।
SK-logic

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

3
@ एसके-तर्क, मुझे लगता है कि आपकी टिप्पणी एक बेहतर उत्तर है तो किसी भी उत्तर को वास्तव में पोस्ट किया गया है
विंस्टन इवर्ट

जवाबों:


23

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

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

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


3
हाँ, प्रोग्रामर को एक बुनियादी समझ होनी चाहिए। लेकिन मुझे आश्चर्य है कि यदि संकलित / व्याख्यात्मक शब्दावली उस तरह से नहीं मिलती है।
विंस्टन एवर्ट

2
धन्यवाद!! व्याख्या की गई "निष्पादित" के लिए केवल एक पर्याय है, और यह है कि सभी कार्यक्रम कैसे चलाए जाते हैं।
गार्डेनहेड

9

भेद गहरा अर्थपूर्ण है क्योंकि संकलित भाषाएं अर्थों को उन तरीकों से प्रतिबंधित करती हैं जो भाषाओं की व्याख्या जरूरी नहीं है। कुछ व्याख्यात्मक तकनीक संकलन के लिए बहुत कठिन (व्यावहारिक रूप से असंभव) हैं।

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

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

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

दुभाषिया कर्नेल के बिना, आपको कुछ मौजूदा लिस्प के साथ बूटस्ट्रैप करना होगा, जैसे SBCL करता है।

व्याख्या के साथ, आप पूर्ण भाषा से एक भाषा विकसित कर सकते हैं, जो विधानसभा भाषा से शुरू होती है। बुनियादी I / O और मूल दिनचर्या विकसित करें, फिर एक eval, फिर भी मशीन भाषा लिखें। एक बार जब आप eval है, उच्च स्तर की भाषा में लिखें; मशीन कोड कर्नेल मूल्यांकन करता है। लाइब्रेरी को कई और दिनचर्या के साथ विस्तारित करने के लिए इस सुविधा का उपयोग करें और एक कंपाइलर भी लिखें। संकलक का उपयोग उन दिनचर्या और संकलक को संकलित करने के लिए करें।

व्याख्या: पथ में एक महत्वपूर्ण कदम पत्थर संकलन के लिए अग्रणी!


1
IMO, यह सबसे अच्छा जवाब है। मैं अपनी खुद की खिलौना भाषा पर काम कर रहा हूं और पिछले पैराग्राफ में जिस तरह से मैं इसे विकसित कर रहा हूं उसका वर्णन करता है। यह वास्तव में नए विचारों पर बहुत आसान काम करता है। CLISP बूटस्ट्रैप प्रक्रिया का उल्लेख करने के लिए भी +1।
पापन

सिद्धांत रूप में, किसी भी "व्याख्या की गई" भाषा को एक "संकलित" एक बनाया जा सकता है एक व्याख्या फ़ाइल है जिसमें व्याख्याकार कार्यक्रम के लिए स्रोत कोड या बाइटकोड से युक्त एक EXE फ़ाइल है। हालांकि बहुत कुशल नहीं हो सकता है।
dan04

ऊपर पढ़ें कैसे Wirth एट अल ने PASCAL को नए मशीन आर्किटेक्चर में पोर्ट करने के लिए P- कोड का आविष्कार किया। यह 1970 के दशक की शुरुआत में था।
जॉन आर। स्ट्रोम ऑक्ट

1
मुझे संदेह है कि आपका शुरुआती पैराग्राफ स्थिर और गतिशील व्यवहार के साथ संकलन और व्याख्या को भ्रमित कर रहा है, लेकिन मैं आपको संदेह का लाभ दूंगा और सिर्फ शब्दार्थ के साथ एक भाषा का उदाहरण पूछूंगा जो संकलन के लिए "व्यावहारिक रूप से असंभव" है। एक कंपाइलर को बूटस्ट्रैप करने के बारे में, यह सच है कि पहले कार्यान्वयन को आपके द्वारा लागू की जाने वाली भाषा के अलावा किसी और चीज़ में लिखा जाना चाहिए, लेकिन इसमें दुभाषिया होने की आवश्यकता नहीं है, यह दूसरी भाषा में लिखा गया संकलक हो सकता है।
8bittree

1

वास्तव में भाषाओं के बहुत सारे कार्यान्वयन अभी भी सख्ती से व्याख्या किए जाते हैं, आपको बस उनके बारे में पता नहीं हो सकता है। कुछ नाम रखने के लिए: UNIX शेल भाषाएँ, Windows cmd और PowerScript गोले, पर्ल, awk, sed, MATLAB, Mathematica और इतने पर।


3
मेरा मानना ​​है कि पर्ल आंतरिक रूप से बाईटेकोड के लिए संकलित है, और कम से कम गणितज्ञ संकलित किया जा सकता है। और कुछ भी awk और sed के कार्यान्वयन को निर्धारित नहीं करता है (मेरा मानना ​​है कि कुछ GNU कोरयूटिल्स नियमित अभिव्यक्ति को निष्पादन से पहले ऑटोमेटा को परिमित करने के लिए संकलित करते हैं, जो उन्हें "इंटरमीडिएट प्रतिनिधित्व करने के लिए संकलन, उस व्याख्या" श्रेणी में डाल देगा)।

1
वास्तव में मुझे पूरा यकीन है कि पर्ल, मैटलैब, मैथेमेटिका सभी बाइटकोड को संकलित करते हैं। मैं पावरस्क्रिप्ट से परिचित नहीं हूं, क्या आपका मतलब पॉवर्सशेल से है? यदि हां, तो वह CLR का उपयोग कर रहा है और इसलिए बायटेकोड का उपयोग करता है।
विंस्टन एवर्ट

@InstonEwert, माफ करना, मेरा मतलब पावरस्ले से था। मेरी समझ यह है कि एक मध्यवर्ती रूप में अनुवाद का मतलब यह नहीं है कि कुछ की व्याख्या नहीं की जाती है। हेक, मूल डार्टमाउथ बेसिक दुभाषिया ने व्याख्या करने से पहले स्रोत को टोकन में अनुवाद किया। जिन उपकरणों का मैंने उल्लेख किया है उनमें से प्रत्येक में एक मोड है जहां यह 1) स्रोत की एक पंक्ति को पढ़ता है, 2) उस लाइन को एक निष्पादन योग्य रूप में अनुवाद करता है (संभवतः मूल कोड के बजाय कुछ मध्यवर्ती कोड), 3) उस पंक्ति के लिए कोड निष्पादित करता है, 4) लूप 1)। एक दुभाषिया की मेरी समझ से मेल खाती है।
चार्ल्स ई। ग्रांट

2
बाइटकोड का अभिप्राय संकलित है। एक बायटेकोड संकलक एक प्रोग्राम है जो स्रोत को लेता है और इसे बायटेकोड में परिवर्तित करता है। इसलिए बायटेकोड के सभी उपयोगों में एक बाईटेकोड संकलक को शामिल करना चाहिए। लेकिन बायटेकोड की व्याख्या भी की जानी चाहिए (या JITted)। तो बायटेकोड का उपयोग करने वाली कोई भी चीज एक दुभाषिया / संकलक संकर है।
विंस्टन Ewert

4
वास्तव में, मेरी बात यह है कि लोगों को "अजगर की व्याख्या की जाती है" और "जावा संकलित है" जैसे बयानों को लागू करने की समझ नहीं है। मैं खोज रहा हूँ कि क्या यह उन शब्दों में एक कार्यान्वयन का वर्णन करने के लिए उपयोगी है। सच्चाई आमतौर पर अधिक जटिल होती है, और व्याख्या / संकलित करने के लिए इसे उबालने की कोशिश करना उपयोगी नहीं होता है।
विंस्टन Ewert

1

मुझे लगता है: बिल्कुल हाँ

वास्तव में, अधिकांश कार्यान्वयन एक ही मूल रणनीति पर परिवर्तित हो रहे हैं

वास्तव में, सी ++ का उद्देश्य डोमेन को कुछ उच्च स्तर की अवधारणा को संकलित करना है जो आमतौर पर दुभाषियों को सौंप दिया जाता है, लेकिन यह अल्पसंख्यक वर्ग पर रहता है ...


2
रुको जब तक क्लैंग + एलएलवीएम सबसे लोकप्रिय संकलक टूलचैन बन गया।
एसके-तर्क

@ एसके-तर्क, नाम के बावजूद, मेरा मानना ​​है कि क्लैंग + एलएलवीएम देशी कोड का उत्पादन करता है।
विंस्टन एवरर्ट

1
अगर आप चाहते हैं तो केवल @inston Ewert। आप एलएलवीएम आईआर स्तर पर रुक सकते हैं और इसके बाद जो चाहें कर सकते हैं - इसकी व्याख्या करें, जेआईटी-संकलन करें, किसी भी तरह से इसे पसंद करें। आप इसे जावास्क्रिप्ट में भी अनुवाद कर सकते हैं और फिर एक दुभाषिया से गुज़र सकते हैं: github.com/kripken/emscripten/wiki
SK-logic

@ एसके-तर्क, स्वच्छ सामान! पता नहीं था कि LLVM ऐसा कर सकता है।
विंस्टन एवरर्ट

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

-1

उपयोगी भेद: व्याख्या किए गए कार्यक्रम रनटाइम पर कार्यों को जोड़कर या बदलकर खुद को संशोधित कर सकते हैं।


8
बकवास। सेल्फ-मॉडिफाइंग (मशीन) कोड किताब की सबसे पुरानी ट्रिक है। फिर, कुछ तर्क भी देशी कोड अंततः एक दुभाषिया सिलिकॉन (सीपीयू) में डाली द्वारा व्याख्या की है। लेकिन अगर हम यह मान लें कि, सभी कोड की व्याख्या की गई है और बनाने के लिए कोई भेद नहीं है।

2
@ डेलन सही कह रहे हैं। मैं सिर्फ इतना जोड़ूंगा कि आधुनिक भाषाएं गतिशील रूप से नई कक्षाएं बनाकर और लोडिंग / अनलोडिंग लाइब्रेरी (या उदाहरण के लिए .NET में "असेंबलियों" को
जोड़कर

5
आम लिस्प संकलित है, लेकिन आप अभी भी रनटाइम में फ़ंक्शन परिभाषाओं को आसानी से बदल सकते हैं।
एसके-तर्क

यह एक बहुत ही रोचक और आवश्यक (उदाहरण के लिए प्रोलॉग में) व्याख्या की विशेषता है।
CapelliC
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.