5

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

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

+3

संकलित भाषा "लीवरेज" की बजाय, इसका उपयोग क्यों न करें या इसका लाभ उठाएं? आइए अंग्रेज़ी में भाषा कीवर्ड की संख्या में वृद्धि न करें जब तक कि हमें :) – MarkJ

उत्तर

6

"व्याख्या" और "संकलित" भाषाओं के बीच की रेखा वास्तव में इन दिनों अस्पष्ट है। उदाहरण के लिए, पहली बात यह है कि जब पाइथन स्रोत कोड को देखता है तो इसे बाइटकोड प्रतिनिधित्व में संकलित करता है, अनिवार्य रूप से वही है जो क्लास फाइलों को संकलित करते समय जावा करता है। यह * .pyc फ़ाइलों में क्या है। फिर, पायथन रनटाइम मूल स्रोत का जिक्र किए बिना बाइटकोड निष्पादित करता है। पारंपरिक रूप से, प्रोग्राम को निष्पादित करते समय पूरी तरह से व्याख्या की गई भाषा लगातार स्रोत कोड का संदर्भ लेती है।

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

  • भाषा डिजाइनर यह दिखा सकता है कि भाषा उस तरह के कार्य को संभालने के लिए पर्याप्त लचीला है।
  • भाषा डिजाइनर वास्तव में भाषा में वास्तविक कोड लिखता है, जिसमें परीक्षण होता है और इसलिए दिखाता है कि नींव ठोस है।
  • अन्य लोग भाषा कोर बनाने या समझने में सक्षम होने के बिना उच्च स्तर के फ़ंक्शन को आसानी से पढ़ सकते हैं, उधार ले सकते हैं और यहां तक ​​कि परिवर्तन भी कर सकते हैं।

सिर्फ इसलिए कि पाइथन जैसी भाषा बाइटकोड और निष्पादित करने के लिए संकलित करती है जिसका मतलब यह धीमा नहीं है। ऐसा कोई कारण नहीं है कि कोई भी पाइथन के लिए जस्ट-इन-टाइम (जेआईटी) कंपाइलर नहीं लिख सकता है, जो जावा और .NET पहले से ही प्रदर्शन को बढ़ाने के लिए करता है। वास्तव में, आयरनपीथन सीधे पाइथन को .NET बाइटकोड में संकलित करता है, जिसे तब जेआईटी समेत .NET सिस्टम का उपयोग करके चलाया जाता है।

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

3

भाषाओं को पुन: कार्यान्वित करने की बढ़ती प्रवृत्ति भी है जिसे परंपरागत रूप से जेवीएम या सीएलआर जैसे मंच पर "व्याख्या" माना जाता है - और फिर अंतःक्रियाशीलता के लिए "मूल" कोड तक आसानी से पहुंच की अनुमति देता है। तो ज्योथन और जेआरबी से, आप आसानी से जावा कोड तक पहुंच सकते हैं, और आयरनपीथन और आयरन रूबी से, आप आसानी से .NET कोड तक पहुंच सकते हैं।

इन मामलों में, "दुभाषिया के पीछे संकलित भाषा का लाभ उठाने" की क्षमता को नए कार्यान्वयन के लिए प्राथमिक प्रेरक के रूप में वर्णित किया जा सकता है।

1

जब तक आप ANSI C standard library या STL सी ++ में तरह संकलित कोड आधार के लिए एक पोर्टेबल एपीआई का उपयोग कर रहे हैं, तो उन कार्यों का लाभ लेने पहिया पुनर्रचना से अलग रखती हैं और संभावना एक छोटे, तेज दुभाषिया प्रदान करते हैं। Lua इस दृष्टिकोण को लेता है और यह कई अन्य लोगों की तुलना में निश्चित रूप से छोटा और तेज़ है।

2

www.lua.org पर 'पेपर' अनुभाग देखें।

विशेष रूप से The Implementation of Lua 5.0

लुआ अंतर्निहित (एएनएसआई सी) कोड में सभी मानक कार्यों को परिभाषित करता है। मेरा मानना ​​है कि यह ज्यादातर प्रदर्शन कारणों से है। हाल ही में, यानी 'स्ट्रिंग। *' कार्यों को शुद्ध लुआ में वैकल्पिक कार्यान्वयन मिला, जो उपप्रोजेक्ट्स के लिए महत्वपूर्ण साबित हो सकता है जहां लूआ .NET या Java रनटाइम के शीर्ष पर चलाया जाता है (जहां सी कोड का उपयोग नहीं किया जा सकता है)।