5

मैं कार्यात्मक भाषाओं के दुभाषियों के बारे में सामान्य प्रश्न हैं, का उपयोग करता है दुभाषिया के लिए अपना रास्ता बनाओ)?क्रम आम तौर पर कार्यात्मक भाषा कोड का एक अनिवार्य की तरह व्याख्या

मैंने देखा कोई प्रश्न नहीं (जैसे this) वास्तव में इस प्रश्न पर मिलता है, और विभिन्न भाषाओं की परिभाषाओं पर तर्कों के साथ खोजों में बाधा आती है।

संपादित करें: एकमात्र प्रश्न पर फिसल गया जिसे मैंने उत्तर देने की आवश्यकता समाप्त कर दी।

+2

दुभाषिया के लिए अपना रास्ता बनाने के फायदे से आपका क्या मतलब है? – sepp2k

+1

@ sepp2k बस सूचीबद्ध विशिष्ट उदाहरणों की तरह: कार्यात्मक प्रोग्रामिंग भाषाओं की विभिन्न सामान्य विशेषताएं प्रतीत होती हैं। मैं जानना चाहता हूं कि क्या ये विशेषताएं अनिवार्य शैली से कार्यात्मक प्रोग्रामिंग को अलग करने लगती हैं, वास्तव में रनटाइम पर कोई फर्क नहीं पड़ता है, या यह कोडिंग शैली में एक और अधिक सतही अंतर है जो दोनों को अलग करता है। सही बात? –

+0

मैंने शीर्षक और प्रश्न का थोड़ा सा बदल दिया, उम्मीद है कि यह अब और स्पष्ट है। –

उत्तर

29

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

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

कार्यात्मक कार्यक्रमों के "फायदे" हो सकते हैं क्योंकि अर्थशास्त्र बेहतर व्यवहार किया जाता है, इसलिए आप प्रोग्राम के बारे में अधिक आसानी से कारण बता सकते हैं, और उदाहरण के लिए एक्सप्रेस अनुकूलन को सरल तरीके से कर सकते हैं। आजकल बहुत सारे कंपाइलर Single Static Assignment (SSA) इंटरमीडिएट फॉर्म का उपयोग करते हैं, जो मूल रूप से निम्न स्तर की कार्यात्मक भाषा है - हालांकि यह संकलक समुदाय के लोगों द्वारा स्वतंत्र रूप से खोजा गया था। अधिकांश अनुकूलन करना आसान होता है जब आप परिवर्तनीय उत्परिवर्तन को समाप्त कर देते हैं, उदाहरण के लिए, और एक चर वैल्यू को अपने सभी दायरे में रखता है। ऐसे कार्यात्मक मध्यवर्ती रूपों पर more efficient ways में पंजीकरण आवंटन करने के लिए कुछ तकनीकें हैं।

¹: एंड्रयू एपेल का संक्षिप्त 1998 लेख देखें: SSA is Functional Programming; यदि आप एसएसए फॉर्म के बारे में विवरण में रूचि रखते हैं, तो some reading notes एसएसए और अन्य कार्यात्मक मध्यवर्ती रूपों जैसे CPS के बीच संबंध के बारे में हैं।

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

निम्न-स्तर की सुविधाओं तक पहुंच के संबंध में: फोरट्रान, सी और सी ++ शायद सबसे अच्छे हैं, और सबसे व्यापक रूप से उपलब्ध हैं, "बहुत कम स्तर पर जा सकते हैं" भाषाएं।कुछ भाषाएं उन क्षमताओं में से कुछ प्रदान करने का प्रयास करती हैं: उदाहरण के लिए ATS (मूल रूप से एक कार्यात्मक प्रोग्रामिंग भाषा, हालांकि यह इतना कठिन धातु है कि यह देखना मुश्किल है) स्टैक-आवंटन संस्करण ढेर-आवंटन पर अच्छा नियंत्रण प्रदान करता है, Haskell और the CLR (C#,etc.) अनबॉक्स किए गए इस तरह के निम्न स्तर के तर्क के विशेष मामले के रूप में समग्र प्रकार, और इसी तरह Rust स्मृति खपत के बारे में निम्न स्तर के निर्णय लेने के तरीके प्रदान करने का प्रयास कर रहा है।
हालांकि, यह निश्चित रूप से उपयोगी होता है जब आपने कोड के एक छोटे से हिस्से को अलग किया है जो आपके प्रदर्शन के लिए महत्वपूर्ण है, और आप इसे बाहर निकालना चाहते हैं (कुछ लचीलापन/सादगी/रखरखाव छोड़ना), यह नहीं बदलेगा रोजमर्रा की परिस्थितियों में आपका जीवन, जब तक कि आप एक एम्बेडेड/कर्नेल प्रोग्रामर न हों। आपको उत्पादक भाषा से अधिक प्रदर्शन लाभ मिलेगा जो आपको सही अमूर्त स्तर का उपयोग करने की अनुमति देता है, और आपकी समस्या के लिए सही डिज़ाइन और एल्गोरिदम चुनने पर अधिक समय व्यतीत करता है। बेशक, कोई भी दोनों रखना चाहता था, और यह संभव है लेकिन मुश्किल है।

+0

यह सही है, धन्यवाद। –

0

क्या वास्तव में रनटाइम पर एक अनिवार्य भाषा बनाम एक कार्यात्मक भाषा का उपयोग करने के लिए कोई फायदे हैं (या जो दुभाषिया के लिए अपना रास्ता बनाते हैं)?

हां। यदि आप एक कार्यात्मक भाषा का उपयोग करते हैं, तो लाभ यह है कि दुभाषिया लेखक शायद तेज़ी से किया जाता है। यदि आप एक अनिवार्य एक का उपयोग करते हैं, तो थोड़ा कम स्मृति और सीपीयू का उपयोग किया जा सकता है।

तो, कोई फर्क नहीं पड़ता कि आप इसे कैसे करते हैं, फायदे हैं।

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

संबंधित मुद्दे