क्या गतिशील भाषाओं की हमेशा व्याख्या की जाती है?


18

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


4
गतिशील भाषा को परिभाषित करें, क्या यह गतिशील रूप से टाइप किया गया है?
बेन्जामिनबी

3
उद्देश्य-सी कई "गतिशील" गुणों को प्रदर्शित करता है।
एडवर्ड स्ट्रेंज

4
@ जोब, कोई इसे लिस्प के साथ दशकों तक कर सकता है। और यह दोनों संकलित और गतिशील रूप से टाइप किया गया है। इसलिए, संकलन और व्याख्या के बीच एक सटीक सीमा रेखा नहीं थी।
लॉजिक

2
@ डारिएन आप संकलन समय पर चलाने के साथ-साथ कोड निष्पादित कर सकते हैं। कड़ाई से बोलना, यह व्याख्या नहीं है।
xmm0

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

जवाबों:


33

अधिकांश (यदि सभी नहीं) गतिशील भाषाओं [अर्थात पायथन, पीएचपी, पर्ल और रूबी] को देखते हुए, वे सभी व्याख्या की जाती हैं।

सच नहीं। आप पायथन स्रोत को संकलित कर सकते हैं। यह एक अस्तित्वगत प्रमाण है।

गतिशील रूप से टाइप की जाने वाली भाषाओं के लिए व्याख्याकार हैं, और गतिशील रूप से टाइप की जाने वाली भाषाओं के लिए कंपाइलर हैं। दो अवधारणाएं रूढ़िवादी हैं।

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


19
पायथन को सिंटैक्टिक रूप से मान्य होने के लिए व्हाइटबोर्ड पर इंडेंट को किस परिशुद्धता से मेल खाना चाहिए? ;)
एड-क्यूए मोर्ट-ओर-वाई-जूल

1
आप पायथन को संकलित नहीं कर सकते। PYC केवल एक मॉड्यूल के भार में तेजी लाता है। और py2exe बस व्याख्याकार को स्रोत फ़ाइल के साथ exe में एम्बेड करता है।
बेंजामिन

8
@ Ubiquité: .pycफाइलें बाइटकोड हैं। अजगर स्रोत कोड उन्हें बनाने के लिए पार्स, अनुकूलित और संकलित किया गया था। बाइटकोड निर्देश अपेक्षाकृत उच्च-स्तर के होते हैं और इसका सबसे लोकप्रिय कार्यान्वयन एक सादा दुभाषिया होता है (इसके विपरीत, PyPy को देखें जो JIT- कंपाइल बाइटकोड को रनटाइम के समय बहुत ही चतुर मशीन कोड में बदल देता है) लेकिन पायथन जावा की तुलना में कम संकलित नहीं है या सी#। पायथन केवल "संकलित" नहीं है यदि "संकलन" को देशी-से-आगे के संकलन तक ही सीमित रखा गया था , लेकिन किसी ने भी इसके बारे में कुछ नहीं कहा और आम तौर पर यह किसी भी भाषा-से-भाषा परिवर्तन का उल्लेख कर सकता है।

4
@ Ubiquité: हाँ, यह सही है, लेकिन यह आपके दावे के साथ कोई संबंध नहीं है कि "आप पायथन को संकलित नहीं कर सकते हैं" या क्या यह संभव है कि आप पायथन को संकलित कर सकें। और सबसे पहले, आप मिश्रण कर रहे हैं Pythonऔर CPython, जबकि बाद वाला पूर्व का एक कार्यान्वयन है, इसलिए है PyPy
फैंटम ०

2
@ClemC किसी भाषा के सभी गुणों को एक संकलक या दुभाषिया में बनाया जाता है, अन्यथा दुभाषिया या संकलक दूसरी भाषा के लिए कुछ है।
पीटर बी

15

आम लिस्प गतिशील रूप से (और दृढ़ता से) टाइप किया जाता है और आमतौर पर संकलित किया जाता है

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


12

C # 4.0 गतिशील प्रकारों (देर से बाध्यकारी) का समर्थन करता है और इसे संकलित किया जाता है।


4

नोड.जेएस गूगल के वी 8 जावास्क्रिप्ट इंजन पर आधारित है। V8 रनटाइम संकलन करता है। V8 उस तथ्य को देखते हुए तेजी से अंधा कर रहा है। बस http://shootout.alioth.debian.org देखें और V8 बनाम उपरोक्त किसी भी व्याख्या की गई भाषा की तुलना करें।


3

नहीं - गतिशील भाषाओं को संकलित करना निश्चित रूप से संभव है।

यहां तक ​​कि कुछ गतिशील भाषाएं भी हैं जो हमेशा डिजाइन द्वारा संकलित की जाती हैं (उदाहरण के लिए क्लोजर)।

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

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

जावा जैसी भाषा में एक विधि कॉल की तुलना में यह एक महत्वपूर्ण ओवरहेड जोड़ता है, जहां सही विधि को कक्षा की परिभाषा से संकलक द्वारा निर्धारित किया जा सकता है और मूल कोड में एक साधारण फ़ंक्शन कॉल तक कम किया जा सकता है।

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


2

एक बार, BASIC की व्याख्या की गई थी। और BASIC के कुछ वेरिएंट में डायनेमिक टाइपिंग थी। और आप उनके लिए कंपाइलर भी प्राप्त कर सकते थे।

(यह 100K फ्लॉपी ड्राइव के दिनों में वापस आ गया था, जब डायनासोर अभी भी पृथ्वी पर घूमते थे और नाश्ते के लिए अनसुने s / w डेवलपर्स को खा जाते थे।)


... लेकिन केवल तब जब उन्होंने GOTO का उपयोग किया। (जो, निश्चित रूप से, यदि वे BASIC में विकसित हो रहे थे, तो काफी सामान्य है। AHA! यह बताते हैं!)
मेसन व्हीलर

अपने डिजाइन के समय में बेसिक एक संकलित भाषा थी।
एपीग्रामग्राम

2

विभिन्न स्मॉलटॉक कार्यान्वयन इसे अलग तरीके से संभालते हैं, लेकिन उनमें से कई एक उच्च-प्रदर्शन वीएम पर चलने वाले बाइटकोड को संकलित करते हैं।


2

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

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


1

Chrome, IE9 और Firefox 3.1+ सभी जावास्क्रिप्ट को देशी बायनेरिज़ के लिए संकलित करते हैं, और जावास्क्रिप्ट गतिशील रूप से टाइप किया जाता है।

मुझे लगता है कि इस कारण कि गतिशील भाषाएं ऐतिहासिक रूप से व्याख्यायित होती हैं, क्योंकि गतिशील टाइपिंग और इंटरप्रिटिंग (या विशेष रूप से, संकलन की कमी) दोनों को सामान्य रूप से स्क्रिप्टिंग भाषाओं और स्क्रिप्टिंग कार्यों के लिए उपयोगी माना जाता है।

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


1

पायथन, आमतौर पर, संकलित है। कोडित को बाइट कोड के साथ संकलित किया जाता है, फिर व्याख्या की जाती है।

पर्ल इसी तरह से काम करता है।

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


-5

हाँ। सभी गतिशील भाषाओं की व्याख्या की गई भाषा है (लेकिन एक व्याख्या की गई भाषा गैर-गतिशील हो सकती है)।

कारण सरल है: यदि यह गतिशील है, तो द्विआधारी संकलन के स्तर पर गतिशीलता को निष्पादित करने के लिए एक दुभाषिया की आवश्यकता है।

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


2
गलत। गतिशील भाषाओं को संकलित किया जा सकता है (और कभी-कभी बहुत कुशलता से, उदाहरण के लिए जेआईटी और अनुकूली संकलन तकनीकों का उपयोग करके)
बेसिल स्टायरनेविच

"मोटे तौर पर, JIT संकलन व्याख्या के लचीलेपन के साथ संकलित कोड की गति को जोड़ता है, एक दुभाषिया के ओवरहेड के साथ ..." en.wikipedia.org/wiki/Just-in-time_compilation आपके प्रोग्राम को संकलित नहीं करता है: यह संकलित है आप के लिए दुभाषिया
ClearMind


ज़रूर। आपके लिंक में उल्लेख किया गया है: "स्वयं की एक विशेषता यह है कि यह उसी प्रकार की वर्चुअल मशीन प्रणाली पर आधारित है जिसका उपयोग पहले स्मॉलटाक सिस्टम करता था। अर्थात, प्रोग्राम्स स्टैंड-अलोन इकाइयाँ नहीं हैं क्योंकि वे C जैसी भाषाओं में हैं, लेकिन उनकी आवश्यकता है पूरे स्मृति वातावरण को चलाने के लिए। ” स्टैंड-अलोन = द्विआधारी संकलित नहीं बाइनरी संकलन को निष्पादित करने के लिए वर्चुअल मशीन की आवश्यकता होती है
क्लीयरमाइंड

1
संकलक की आपकी परिभाषा बहुत अधिक प्रतिबंधात्मक है। प्रत्येक कंपाइलर बाइनरी एक्ज़ीक्यूटेबल फ़ाइल नहीं बनाता है। हाल ही में एक प्रतिरूप के लिए, एसबीसीएल के कार्यान्वयन का अध्ययन करें । छोटे टुकड़ों में नवीनतम ड्रैगन बुक और लिस्प
बेसिल स्टारीनेविच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.