विशेष रूप से अभिव्यंजक शक्ति का क्या उल्लेख है?


34

एक्सप्रेसिव पावर को विकिपीडिया द्वारा परिभाषित किया गया है:

.. विचारों की चौड़ाई जिसे उस भाषा में दर्शाया और संचार किया जा सकता है।

क्या "विचार" चीजों (संचालन, संरचना, एल्गोरिदम, आदि) को संदर्भित करता है? हम मशीन से संवाद कर सकते हैं ? या क्या यह "मानव" अवधारणाओं को संदर्भित करता है जिसे अन्य मनुष्यों को भाषा के साथ पकड़ा और संचार किया जा सकता है?

अभिव्यंजक शक्ति का आकलन और मापन कैसे किया जाता है?

उदाहरण के लिए, यदि हमने जावास्क्रिप्ट की तरह एक भाषा ली और चर नामों पर एक अजीब प्रतिबंध लगा दिया, जैसे कि चर को अंडरस्कोर से पहले 8-अंकीय संख्या होना चाहिए, तो मिलान करना/^_[0-9]{8}$/ , क्या हम अभिव्यंजक शक्ति खो देंगे?

या यह केवल बेतुका और कष्टप्रद होगा?


स्पष्टीकरण देना:

क्या भाषा के लिए निहित सामान्य विचारों द्वारा मापा जाने वाली अभिव्यंजक शक्ति है :

  • पूर्णांक और तार
  • छोरों
  • सशर्त,

या विशिष्ट , विशिष्ट विचारों की संख्या जो भाषा का प्रतिनिधित्व कर सकती है:

  • पूर्णांक 1, 2 ... 2 ^ 32
  • तार जिसमें "लोमड़ी क्या कहती है?" और "वहा प कह प प प प प"
  • मेंढक के मेरे संग्रह में प्रत्येक मेंढक के लिए
  • अगर मेंढक है हरे या कुछ और तो कुछ करना

3
यह ध्यान दिया जाना चाहिए कि किसी दिए गए दायरे में किसी कार्यक्रम को अधिकतम 100 मिलियन चर तक सीमित करने से अभिव्यक्ति पर कुछ सीमा लागू होती है। उदाहरण के लिए, फ़ायरफ़ॉक्स को लागू करना असंभव हो सकता है। ;-)
R ..

1
ध्यान दें कि जब आप इस "प्रोग्रामिंग भाषाओं" को टैग करते हैं, तो प्रोग्रामिंग लैंगग्यूज एकमात्र प्रकार की कंप्यूटर भाषाएं नहीं होती हैं जिनकी अभिव्यंजक शक्ति पर चर्चा की जा सकती है। दरअसल, आप जिस पेज को लिंक करते हैं, वह वेब ओन्टोलॉजी भाषा का पहला उदाहरण है।
जॉन हन्ना

जवाबों:


39

अभिव्यक्तता पर ऐतिहासिक पेपर मैथियास फेलेसेन (1991) द्वारा प्रोग्रामिंग भाषाओं की अभिव्यक्ति पर आधारित है । इसमें भाषा की अभिव्यक्ति की गणितीय रूप से कठोर परिभाषा है।

सहज रूप से, यदि प्रत्येक प्रोग्राम को भाषा A में लिखा जा सकता है, तो उसे केवल स्थानीय परिवर्तनों के साथ भाषा B में भी लिखा जा सकता है , लेकिन भाषा B में कुछ ऐसे कार्यक्रम लिखे गए हैं, जिन्हें उनकी वैश्विक संरचना को बदले बिना भाषा A में नहीं लिखा जा सकता है (अर्थात सिर्फ साथ नहीं। विशुद्ध रूप से स्थानीय परिवर्तन), तब भाषा B भाषा A की तुलना में अधिक अभिव्यंजक है ।

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


तो, (अभी तक कागज पर ध्यान नहीं दिया गया है) व्यक्त करने के बारे में है कि आप स्रोत के पाठकों के विपरीत मशीन को क्या व्यक्त कर सकते हैं ? यह एक उपाय है कि आप क्या करने के लिए हार्डवेयर को निर्देश दे सकते हैं? कोड में आप कितने "मानव" विचारों को संरक्षित या संचार कर सकते हैं, इसका कोई माप नहीं है? ... शायद मुझे एक और सवाल पूछने की ज़रूरत है; लेकिन, अगर यह मामला है, तो यह "कार्यक्षमता" से अलग कैसे है हम भी बात करते हैं?
svidgen

शायद ओपी में मेरा उदाहरण खराब है। ए और बी दोनों भाषाओं पर विचार करें, दोनों सरणियों के साथ; लेकिन, भाषा A में भी संरचनाएं हैं। किसी भी भाषा में मैं Point2 डी सरणियों की एक सरणी का उपयोग करके श्रृंखला का प्रतिनिधित्व कर सकता हूं । लेकिन, को Pointअधिक मानव-पठनीय अवधारणा के रूप में व्यक्त करने का लाभ है । है एक अधिक अर्थपूर्ण?
svidgen

@svidgen क्योंकि सभी ट्यूरिंग-पूर्ण भाषाएं कम्प्यूटेशनल रूप से समतुल्य हैं, संभावित कार्यक्रमों का सेट जो लिखा जा सकता है, सैद्धांतिक रूप से उन सभी के लिए समान है। उपरोक्त परिभाषा के अनुसार, भाषा B अधिक अभिव्यंजक है तो A, यदि B में लिखे गए प्रोग्राम को A में फिट करने के लिए पुनर्गठित किया जाना है (न केवल लाइन द्वारा वाक्यविन्यास रेखा को बदलना, बल्कि नई कक्षाओं, लूप आदि को शुरू करना एक पायथन को फिर से लिखना है। जावा 7 में प्रोग्राम है जो उपयोग करता है lambdas, map, filter, प्रथम श्रेणी प्रकार / तरीकों / काम करता है, हो सकता है कुछ eval, अकेले metaclass जादू या डायनामिक रूप से तैयार प्रकार आदि जाने
marczellm

@marczellm तो, "विचार" किस अभिव्यक्ति को संदर्भित करता है, क्या भाषा स्वयं का निर्माण करती है? उदाहरण के लिए, एक सशर्त एक विचार है? एक लूप एक विचार है? एक स्ट्रिंग? संख्या? आदि।?
svidgen

1
@ Jörg क्या आप अपने जवाब में एक उदाहरण रख सकते हैं? यह एक सुंदर परिभाषा है, लेकिन यह वास्तव में सवाल का जवाब देने के लिए बहुत कुछ नहीं करता है।
svidgen

10

एक्सप्रेसिव पावर को विकिपीडिया द्वारा परिभाषित किया गया है:

आइए उस पेज को फिर से पढ़ें। ध्यान देने वाली पहली चीजों में से एक यह है कि यह "भाषा" कहती है, न कि "प्रोग्रामिंग भाषा", और इसके अधिकांश उदाहरण प्रोग्रामिंग भाषा नहीं हैं, उदाहरण के लिए दिया गया पहला उदाहरण OWL2 EL और OWL2 RL की तुलना है, जो दोनों ही मनोविज्ञान है भाषाओं।

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

क्या "विचार" चीजों (संचालन, संरचना, एल्गोरिदम, आदि) को संदर्भित करता है? हम मशीन से संवाद कर सकते हैं? या क्या यह "मानव" अवधारणाओं को संदर्भित करता है जिन्हें अन्य मनुष्यों को भाषा के साथ पकड़ा और संचार किया जा सकता है?

यह संदर्भित करता है कि उस भाषा में क्या व्यक्त किया जा सकता है, विशुद्ध रूप से अपने आप में एक चीज के रूप में माना जाता है।

उदाहरण के लिए, (मैं अपने उदाहरणों के लिए पूरे जावास्क्रिप्ट का उपयोग करूँगा, क्योंकि आपका प्रश्न इंगित करता है कि इसकी एक भाषा जिसे आप जानते हैं) जावास्क्रिप्ट कथन पर विचार करें:

var x = 3 + 4;

यह दर्शाता है कि 3 और 4 के मूल्य योग की गणना की गई है और xकिसी दिए गए नाम स्थान के दायरे में एक लेबल के साथ जुड़े मूल्य ।

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

यह पांडित्यपूर्ण लग सकता है, लेकिन यह वास्तव में काफी महत्वपूर्ण है कि भाषाएं ऐसी चीजें हैं जिनके बारे में वास्तविक कंप्यूटर के विचार के बिना अमूर्त में तर्क दिया जा सकता है। एक बात के लिए, कंप्यूटर भाषाओं के सैद्धांतिक बिंदुओं के बारे में तर्क करने वाले लोग, जो व्यवहार में अभी तक संभव नहीं थे, उन चीजों में से एक है जो हमें आज हम कहाँ हैं; कंप्यूटर को कंप्यूटर विज्ञान की आवश्यकता है, लेकिन कंप्यूटर विज्ञान को कंप्यूटर की आवश्यकता नहीं है, बस एक संगणना का विचार है।

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

अर्थपूर्ण शक्ति शब्द का प्रयोग अर्थ की सीमा के साथ किया जा सकता है। इसका मतलब उस भाषा में व्यक्त विचारों का माप हो सकता है:

  • आसानी (सैद्धांतिक अभिव्यक्ति) की परवाह किए बिना

  • संक्षिप्त और तत्परता से (व्यावहारिक अभिव्यंजना)

पहला अर्थ गणित और तर्क के क्षेत्रों पर हावी है जो भाषाओं के औपचारिक विवरण और उनके अर्थ, जैसे औपचारिक भाषा सिद्धांत, गणितीय तर्क और प्रक्रिया बीजगणित से संबंधित है।

अनौपचारिक चर्चा में, शब्द का अर्थ अक्सर दूसरे अर्थ या दोनों के लिए होता है। प्रोग्रामिंग भाषाओं पर चर्चा करते समय अक्सर ऐसा होता है। शब्द के इन अनौपचारिक उपयोगों को औपचारिक रूप देने के प्रयास किए गए हैं

शब्द के इन दो उपयोगों में से, पहला व्यावहारिक प्रभाव पूरी तरह से संबंधित है से कंप्यूटर से अवगत कराया जा सकता है।

दूसरा पठन और लेखन दोनों में मानवीय समझ से अधिक संबंधित है, हालांकि यह जिस हद तक ऐसा करता है, उपयोग के बीच बहुत भिन्न होता है, क्योंकि वे अनौपचारिक हैं और जैसे कि कठोरता से परिभाषित नहीं हैं।

उदाहरण के लिए, यदि हमने जावास्क्रिप्ट की तरह एक भाषा ली और चर नामों पर एक अजीब प्रतिबंध लगा दिया, जैसे कि चर को अंडरस्कोर से पहले 8-अंकीय संख्या होना चाहिए, तो मिलान करना /^_[0-9]{8}$/, क्या हम अभिव्यंजक शक्ति खो देंगे?

औपचारिक परिभाषा के अनुसार, हमने कोई अभिव्यंजक शक्ति नहीं खोई है: हम 100,000,000 चर तक ही सीमित हैं, लेकिन अगर हमें वास्तव में जरूरत है तो हम नए बनाए गए नाम स्थान के भीतर अधिक चर रखने के लिए ऑब्जेक्ट बनाकर इसके आसपास प्राप्त कर सकते हैं। जैसा कि आज जावास्क्रिप्ट में लिखा गया कोई भी कार्यक्रम इस नए रूप में फिर से लिखा जा सकता है, इसलिए वे समान रूप से अभिव्यंजक हैं।

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

यह भी ध्यान देने योग्य है कि लोग अनौपचारिक रूप से करेंगे उन चीजों पर विचार जो भाषा का कड़ाई से हिस्सा नहीं हैं। आज तक इसके निर्माण से जावास्क्रिप्ट में परिवर्तन पर विचार करें।

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

अधिक अनौपचारिक परिभाषा के अनुसार, यह कुछ चीजों में बहुत अधिक अभिव्यंजक हो गया है जैसे कि सरणी में हेरफेर, अपवाद से निपटने और (शायद सबसे अधिक) नियमित अभिव्यक्तियों के समावेश में। ये कुछ भी ऐसा नहीं करते हैं जो पहले जावास्क्रिप्ट में नहीं किया जा सकता था, हालांकि वे अक्सर कुछ लाइनों और एक सबसिंड निष्पादन समय में कुछ कर सकते हैं जो कि किलोबाइट्स को जावास्क्रिप्ट 1.0 में लिखने के लिए और चलाने के लिए एक लंबा समय लगेगा।

फिर से बहुत अधिक अनौपचारिक परिभाषा द्वारा, जावास्क्रिप्ट के ब्राउज़र में पहले उपयोग से परिवर्तन (फॉर्म इनपुट के मूल्यों को बदलने में सक्षम) document.write जबकि पृष्ठ को पहले पार्स किया जा रहा है और एक नए स्थान पर चला जाता है या इतिहास में वापस या आगे बढ़ जाता है, लेकिन बहुत सुंदर है) आज के लिए इतना कुछ नहीं) (सर्वर कॉल से डेटा के आधार पर पृष्ठ पर किसी भी चीज़ को बदलने में सक्षम) पूरी तरह से अपार है, हालांकि यह अधिकांश जावास्क्रिप्ट से संबंधित नहीं है, लेकिन ऑब्जेक्ट मॉडल और एपीआई से बना है भाषा के बजाय उपलब्ध (जैसे IE में vbscript समान रूप से उन परिवर्तनों से लाभान्वित)।

मेरे दिमाग में, वह अंतिम उपयोग इतना अनौपचारिक है कि वास्तव में सही नहीं होना चाहिए, लेकिन यह अनौपचारिक परिभाषाओं के साथ समस्या है।

औपचारिक अवज्ञा से, यह वास्तव में अधिक अभिव्यंजक नहीं है।


2
"कंप्यूटर को कंप्यूटर विज्ञान की आवश्यकता है, लेकिन कंप्यूटर विज्ञान को कंप्यूटर की आवश्यकता नहीं है" मुझे वह पसंद है
chbaker0

चर नामकरण प्रतिबंध के संबंध में, विचारों का प्रतिनिधित्व करने की भाषा की क्षमता से असंबंधित बाहरी विचारों (चीजों के लिए मूल-भाषा के नाम) को संदर्भित करने की क्षमता है? ... शायद इस सवाल के मूल में और अधिक: क्या हम जिन विचारों के बारे में बात कर रहे हैं, वे केवल सामान्य भाषा के निर्माण को व्यक्त करते हैं? जैसे, जोड़, घटाव, निषेध, सरणियाँ, वर्ग इत्यादि? विशेष विचारों के विपरीत हम भाषा के साथ व्यक्त कर सकते हैं? उदाहरण के लिए, सरणी कहा जाता है fishiesप्रकार केFish
svidgen

अधिक स्पष्टीकरण के लिए आप मेरा संपादन देख सकते हैं। ... ऐसा लगता है जैसे आप कह रहे हैं कि यह दोनों (मेरे संपादन का जिक्र है); लेकिन पहली सूची "औपचारिक" है और दूसरी सूची "अनौपचारिक" है। अगर ऐसा है, तो क्या इसका कोई मानदंड है कि इसे बातचीत में अयोग्य तरीके से कैसे इस्तेमाल किया जाए? या ... क्या आप केवल स्पष्टीकरण के लिए पूछना चाहते हैं?
svidgen

4

मुझे नहीं लगता कि चर नामकरण नियम वास्तव में "अभिव्यक्ति" से अभिप्रेरित हैं। मुझे लगता है कि "अभिव्यंजना" अधिक मौलिक चीजों को संदर्भित करता है। उदाहरण के लिए, लिनक के पहले सी # के साथ सी # पर विचार करें। Linq के जुड़ने के बाद, C # में सीधे SQL जैसी क्वेरी लिखना संभव हो गया। यह पूर्व विकल्पों की तुलना में बहुत अधिक सुरुचिपूर्ण है, उदाहरण के लिए एसक्यूएल को स्ट्रिंग शाब्दिक रूप में डालना और फिर इसे सर्वर में पास करना, या "के लिए" का उपयोग करके संग्रह पर पुनरावृत्ति करना।

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


0

विकिपीडिया लेख द्वारा संदर्भित के रूप में, अभिव्यंजक शक्ति उन कार्यक्रमों के सेट को संदर्भित करती है जिन्हें भाषा में व्यक्त किया जा सकता है। जो कुछ भी आप "प्रोग्रामिंग भाषा" के रूप में सोचते हैं (जावास्क्रिप्ट, LISP, C #, पर्ल, आदि) अनिवार्य रूप से ट्यूरिंग पूर्ण हैं, जिसका अर्थ है कि वे किसी भी चीज़ को "कम्प्यूटेबल" कह सकते हैं।

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

सामान्य तालिका अभिव्यक्तियों के साथ SQL का एक संस्करण बिना संस्करण के अधिक स्पष्ट है क्योंकि CTE आपको पुनरावर्ती प्रश्नों का प्रतिनिधित्व करने की अनुमति देता है जो अन्यथा SQL में व्यक्त करना असंभव होगा।


0

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

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

हालांकि "शब्द" के उपयोग से भ्रमित न हों। जावा प्रोग्राम जावा भाषा का एक शब्द है (हालांकि यह कई फाइलों को समाहित कर सकता है जिसमें रिक्त स्थान द्वारा अलग-अलग वर्णों के कई तार होते हैं)।

इस अपेक्षाकृत सरल अवधारणा से निपटने के लिए आधुनिक प्रोग्रामिंग भाषाओं के रूप में ऐसी जटिल भाषाओं का उपयोग करना काउंटर-उत्पादक होगा, यही कारण है कि मैं इसके बजाय गणितीय सूत्रों का उपयोग करूंगा।

  • आइए भाषा ए को परिभाषित करें कि पूर्णांक जोड़ सहित सभी सूत्र हों।

  • आइए भाषा बी को पूर्णांक गुणन से जुड़े सभी सूत्रों की भाषा के रूप में परिभाषित करें।

दोनों ही मामलों में हम पहचान तत्व के उपयोग को अस्वीकार करते हैं। इस प्रकार भाषा A में "1 + 1", "1 + 2", "1 + 3", "2 + 3" और इसी तरह के शब्द हैं। भाषा B में "2 * 2", "2 * 3", "2 * 4", "3 * 4" और इसी तरह के शब्द हैं। हम संबंधित प्रतीकों को "*" और "+" (पूर्णांक जोड़ और पूर्णांक गुणन) की सामान्य व्याख्या भी प्रदान करते हैं। तो, "1 + 1" की व्याख्या 2 है, और "2 * 2" की व्याख्या 4 है।

अब निरीक्षण करें कि भाषा A, B की तुलना में कड़ाई से अधिक अभिव्यंजक है, क्योंकि पूर्णांकों में यह सच है कि गुणा को बार-बार जोड़ा जा सकता है, लेकिन सामान्य रूप में गुणा के अलावा प्रतिनिधित्व करने का कोई तरीका नहीं है।


इसे सम्‍मिलित करने के लिए: भाषा A को भाषा B की तुलना में अधिक अभिव्यंजक कहा जा सकता है जब उनकी व्याख्या कार्य सह-डोमेन साझा करती है, लेकिन B की व्याख्या फ़ंक्शन की छवि ए की व्याख्या फ़ंक्शन की छवि का एक उचित सबसेट है।


-1

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

परिवर्तनीय नामकरण प्रतिबंध अभिव्यक्तियों को कम नहीं करते हैं (जब तक कि कुछ नाम न हों कि कोई भी सभी एल्गोरिदम को व्यक्त नहीं कर सकता है और कोई एरे + इंडेक्स जैसी चीज़ों के साथ नकली चर नहीं कर सकता है)।

अभिव्यंजक शक्ति की कमी का एक सरल उदाहरण यह है: आपको do_homeworkऔर bring_down_trash। यह आसानी से कोड में लिखा है:

do_homework();
bring_down_trash();

यह समाधान दिखता बिल्कुल स्पष्ट है लेकिन वास्तव में do_homeworkऔर bring_down_trashअव्यवस्थित, एक भी लिख सकता है कर रहे हैं:

bring_down_trash();
do_homework();

जो समान रूप से अभेद्य है क्योंकि यह व्यक्त नहीं करता है कि हमने एक आदेश को लागू करने का इरादा नहीं किया था। हम धागे का उपयोग भी नहीं करना चाहते हैं। हम कुछ इस तरह कहना चाहते हैं:

compiler_or_interpreter_pick_one(
    {
        do_homework();
        bring_down_trash();
    },
    {
        bring_down_trash();
        do_homework();
    }
);

जहाँ तक मुझे पता है कि किसी भी प्रोग्रामिंग भाषा में व्यक्त करना असंभव है।

एक उदाहरण जो मुझे कोई अंत नहीं देता है वह यह है कि जावा में वस्तुओं की एक सरणी होना असंभव है। आप ऑब्जेक्ट को पॉइंटर्स का एक सरणी बना सकते हैं लेकिन उसमें समान मेमोरी लेआउट (बोल दक्षता) नहीं है।

एक अन्य उत्तर से एक उदाहरण लेते हुए : C ++ एक वर्ग या एक उदाहरण में तरीकों को जोड़ने का समर्थन नहीं करता है । यह सच है, हालांकि, यह C ++ की अभिव्यक्ति को सीमित नहीं करता है।

struct Extensible{
    std::vector<std::function<void(Extensible *)>> instanceExtensions;
    static std::vector<std::function<void(Extensible *)>> classExtensions;
};

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

* कुछ भाषाओं में एक विशेषता के रूप में अभिव्यक्ति की कमी है। आमतौर पर वे अनंत लूप लिखना असंभव बनाते हैं। यह रुकने की समस्या को हल कर सकता है और शुद्धता के लिए स्वचालित साबित करता है।


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

1
@Telastyn बेतुका क्यों होगा? बेशक, डिस्क को कच्चा बाइनरी लिखना केवल अभिव्यंजक नहीं है, लेकिन एक भाषा जो ऐसा कर सकती है वह एक से अधिक अर्थपूर्ण है जो सभी नहीं के बराबर है।
nwp

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

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

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