क्यों अपने सभी गतिशील सुविधाओं के साथ तुतलाना कर सकते हैं स्थिर संकलित किया लेकिन अजगर नहीं कर सकते हैं (अपने सभी गतिशील सुविधाओं खोने के बिना)?लिस्प बनाम अजगर - स्टेटिक संकलन
उत्तर
कुछ भी नहीं है कि अजगर के स्थिर संकलन से बचाता है। यह थोड़ा कम कुशल है क्योंकि पाइथन कुछ गतिशील गुणों को बरकरार रखने के लिए, और अधिक परिवर्तनीय स्थानीय दायरे को प्रकट करता है (उदाहरण के लिए eval) आपको संकलित प्रोग्राम के साथ कंपाइलर को शामिल करने की आवश्यकता है लेकिन कुछ भी इससे रोकता नहीं है।
जिसके अनुसार, शोध से पता चलता है कि ज्यादातर अजगर कार्यक्रम, जबकि स्थिर विश्लेषण के तहत गतिशील, बल्कि स्थिर और रनटाइम पर monomorphic कर रहे हैं। इसका मतलब है कि रनटाइम जेआईटी संकलन दृष्टिकोण पायथन कार्यक्रमों पर बहुत बेहतर काम करता है। पाइपन को मशीन कोड में संकलित करने वाले दृष्टिकोणों के लिए अनदेखा-निगल, पायपी, साइको देखें। लेकिन आयरनपीथन और ज्योथन जो मूल रूप से एक स्थिर भाषाओं के लिए एक वर्चुअल मशीनों का उपयोग करते हैं जो पाइथन को मशीनकोड में संकलित करने के लिए करते हैं।
क्या इसके लायक के लिए, पाइथन स्क्रिप्ट .pyc फ़ाइलों में संकलित कर रहे हैं जब क्रियान्वित कर रहे हैं, "Compiled" Python files देखते हैं।
तुम भी एक निष्पादन में एक अजगर कार्यक्रम संकलित करने के लिए इस तरह के py2exe के रूप में एक उपकरण का उपयोग कर सकते हैं।
के पक्ष में कुछ गतिशील विशेषताओं को खो देते हैं, यह सुनिश्चित नहीं है कि यह तुलनीय है। आप एक पायथन दुभाषिया के बिना पीईसी फाइलों को चला नहीं सकते हैं। आमतौर पर, (कुछ) देशी मशीन कोड के लिए लिस्प संकलन। Py2exe द्वारा उत्पादित एक्सिस में बाइटकोड, पायथन दुभाषिया और डीएल एम्बेडेड हैं, लेकिन यह मशीन कोड नहीं है। – joaquin
@joaquin: संकलन और व्याख्या के बीच कोई कठोर रेखा नहीं है। कुछ भी एक प्रोसेसर बनाने से रोकता है जो सीधे पायथन बाइटकोड चलाता है। या विपरीत छोर से, आप संकलित x86 मशीन कोड ले सकते हैं और इसे x86 एमुलेटर में व्याख्या कर सकते हैं। आखिरकार, कोड डेटा है और डेटा कोड है। –
@ एंट्स: धन्यवाद। मुझे लगता है कि मैं आपकी बात समझता हूं लेकिन फिर भी, मूल मशीन कोड कोड का अधिक अनुकूलित रूप होगा, किसी दिए गए हालत और प्रोसेसर के लिए तेज़ संभव होगा। आपके द्वारा उल्लेख की जाने वाली अन्य संभावनाएं उस से कम से कम एक कदम होगी, और लगातार तेज़ी से नहीं होगी। क्या यह ग़लत है?। शायद अवधारणा में कोई अंतर नहीं है, लेकिन क्या यह व्यावहारिक शर्तों में समान है? मैं कंप्यूटर वैज्ञानिक नहीं हूं इसलिए मुझे माफ़ कर दो अगर मैं कुछ बेवकूफ – joaquin
दरअसल, ऐसा कोई भी चीज नहीं है जो आपको पाइथन प्रोग्राम को स्थिर रूप से संकलित करने से रोकती है, यह सिर्फ इतना है कि अब तक कोई भी ऐसा कंपाइलर नहीं लिखा है (मुझे व्यक्तिगत रूप से पाइथन का रनटाइम सीएल की तुलना में बहुत आसान लगता है)।
आप कह सकते हैं कि अंतर की तरह "कितना समय compilers वास्तव में लिखने पर खर्च किया गया था और करता है भाषा कैसे एक लिखने के लिए के एक औपचारिक विनिर्देश है" विवरण में निहित है।
के उन बिंदुओं को संबोधित करते हैं: काम 70 के दशक में वापस शुरू करने नहीं तो पहले से
- लिस्प compilers अब 40 साल के लिए विकसित किया गया है, (मैं भी बहुत आलसी मेरी दिनांक के बारे में सुनिश्चित नहीं हूँ, सटीक गूगल वाले)। यह एक कंपाइलर लिखने के बारे में लोअर का एक बड़ा हिस्सा बनाता है। ओटीओएच, पायथन को नाममात्र रूप से "शिक्षण भाषा" के रूप में डिजाइन किया गया था, और ऐसे कंपाइलर महत्वपूर्ण नहीं थे।
- विनिर्देश की कमी - पायथन में एक एकल स्रोत नहीं है जो भाषा के सटीक अर्थशास्त्र को निर्दिष्ट करता है। निश्चित रूप से, आप पीईपी दस्तावेजों को इंगित कर सकते हैं, लेकिन यह अभी भी इस तथ्य को नहीं बदलेगा कि एकमात्र असली कल्पना मुख्य कार्यान्वयन का स्रोत है, सीपीथन। जो, नोटा फायदे, प्रकार का एक सरल संकलक है (बाइटकोड में)।
कि क्या यह संभव है के लिए के रूप में - अजगर काफी सरल संरचना का उपयोग करता प्रतीकों आदि, इसके अर्थात् शब्दकोशों से निपटने के लिए। आप उन्हें एक कार्यक्रम की प्रतीक तालिका के रूप में देख सकते हैं। आप डेटा प्रकारों को आदिम लोगों को पहचानने के लिए टैग कर सकते हैं और बाकी को संग्रहीत नामकरण और आंतरिक संरचना के आधार पर प्राप्त कर सकते हैं। बाकी भाषा भी काफी सरल है। केवल एक ही बिट गायब इसे लागू करने के लिए वास्तविक काम है, और इसे सही ढंग से चलाएं।
पायथन को 'संकलित' किया जा सकता है, जहां संकलन को एक ट्यूरिंग पूर्ण भाषा (स्रोत कोड) से दूसरे (ऑब्जेक्ट कोड) में अनुवाद के रूप में देखा जाता है। हालांकि लिस्प में, वस्तु असेंबली है, जो कुछ पाइथन (सिद्ध) के साथ सैद्धांतिक रूप से संभव है लेकिन संभव नहीं है।
सच कारण हालांकि कम सपाट है। लिस्प कई तरीकों से एक क्रांतिकारी भाषा है जो अपनी बोलियों में अग्रणी है प्रोग्रामिंग भाषाओं में सुविधाओं के बहुत सारे का उपयोग आज हम करते हैं।लिस्पस में हालांकि वे भाषा की मूल बातें से तार्किक रूप से 'अनुसरण' करते हैं। भाषा जो जावास्क्रिप्ट, रूबी, पर्ल और पायथन जैसे लिस्प्स की कच्ची अभिव्यक्ति शक्तियों से प्रेरित होती है, को जरूरी रूप से व्याख्या की जाती है क्योंकि 'अल्गोल-जैसी वाक्यविन्यास' वाली भाषा में उन विशेषताओं को प्राप्त करना मुश्किल है।
लिस्प को इन गुणों को 'होमो-आइकॉनिक' होने से लाभ मिलता है, लिस्प प्रोग्राम और एक लिस्प डेटा-स्ट्रक्चर के बीच कोई आवश्यक अंतर नहीं होता है। लिस्प प्रोग्राम डेटा-स्ट्रक्चर्स हैं, यदि आप चाहें तो इस तरह के एस-एक्सप्रेशन में प्रोग्राम के संरचनात्मक विवरण हैं, इसलिए एक संकलित लिस्प प्रोग्राम प्रभावी रूप से 'लेक्सर और सभी चीजों की आवश्यकता के बिना' स्वयं को व्याख्या करता है ', एक लिस्प प्रोग्राम बस पार्स पेड़ के मैनुअल इनपुट के रूप में देखा जाना चाहिए। जो एक वाक्यविन्यास की आवश्यकता होती है जिसे कई लोगों के साथ काम करने के लिए प्रतिद्वंद्वी लगता है, इसलिए प्रतिमान की कच्ची अभिव्यक्ति शक्ति को अधिक पठनीय वाक्यविन्यास में परिवहन करने के कई प्रयास किए गए थे, जिसका अर्थ यह है कि यह संकलित करने के लिए अक्षम है, लेकिन असंभव नहीं है असेंबली की ओर।
इसके अलावा, पाइथन को असेंबली में संकलित करना संभवतः धीमा और वर्चुअल मशीन पर 'अर्ध-व्याख्या' से बड़ा होगा, पाइथन में बहुत सी विशेषताएं सिंटैक्टिक विश्लेषण पर निर्भर करती हैं।
उपर्युक्त हालांकि एक विशाल लिस्प फैनबॉय द्वारा लिखा गया है, उस ब्याज के संघर्ष को ध्यान में रखें।
.oO (10 शब्दों या उससे कम में जवाब) – hop
आप साइथन (http://www.cython.org/) या शेडस्किन (http://code.google.com/p/shedskin) के साथ पाइथन कोड को स्थिर रूप से संकलित कर सकते हैं /), जो अजगर से सी/सी ++ कोड उत्पन्न करता है, लेकिन मुझे लगता है कि वे अक्सर तेजी से स्थिर प्रकार – cryo