किसी प्रोग्रामिंग भाषा की ऑर्थोगोनलिटी को कैसे सत्यापित / प्रमाणित करें?


10

मुझे ऑर्थोगोनलिटी की अवधारणा पता है, लेकिन प्रोग्रामिंग भाषा के दृष्टिकोण से, क्या इसे सत्यापित / प्रमाणित करने का कोई तरीका है?

उदाहरण के लिए C # में, एक का उपयोग कर सकते हैं publicया staticएक विधि हस्ताक्षर के लिए। आप या तो दोनों का उपयोग कर सकते हैं और वे एक-दूसरे के साथ हस्तक्षेप नहीं करेंगे, इसलिए वे एक दूसरे के लिए रूढ़िवादी हैं, है ना?

मेरा सवाल यह है कि मैं बाकी विशेषताओं के बारे में कैसे जाना जा सकता है, विशेष रूप से ऐसी विशेषताएं जो एक दूसरे से संबंधित नहीं हैं?

क्या सभी सुविधाओं को एक साथ मिलकर / स्टैक करना है?

क्या कोई प्रोग्रामिंग भाषा है जो 100% ऑर्थोगोनल है?


(पास) शुरुआत से शुरू करें: विधानसभा भाषा?
मैथ्यू फ्लिन

1
वास्तव में कुछ साबित करने के लिए, आपको इसके लिए एक औपचारिक परिभाषा की आवश्यकता है। और अगर आपकी परिभाषा C # कल्पना जितनी बड़ी होने वाली है, तो कुछ भी साबित करने से बहुत काम आएगा।
22

जवाबों:


4

मुझे यकीन नहीं है कि ऑर्थोगोनलिटी सामान्य प्रयोजन के मामले में सी # जैसी उच्च-स्तरीय भाषाओं के मामले में उपयोगी या मान्य मीट्रिक के रूप में काम कर सकती है, क्योंकि इसके लिए "संचालन" और "ऑपरेंड्स" के भेद की आवश्यकता होती है - भाषा के छोटे हिस्से जो आसानी से नहीं होते हैं सी # जैसी उच्च-क्रम वाली भाषाओं में भिन्न।

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

इस संबंध में, मैं C # संकलक के रूप में लक्ष्य # के रूप में स्टैक मशीन भाषा का उपयोग करते हुए सामान्य मध्यवर्ती भाषा की रूढ़िवादिता के लिए जाँच करूँगा , न कि #।

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


6

"ऑर्थोगोनलिटी" शब्द एक सटीक गणितीय धारणा के लिए एक आम आदमी का शब्द है: भाषा शब्द एक प्रारंभिक बीजगणित बनाते हैं (विकिपीडिया में देखें)।

इसका मूल रूप से अर्थ है "वाक्य रचना और अर्थ के बीच 1-1 पत्राचार"। इसका मतलब है: चीजों को व्यक्त करने का एक तरीका है, और, यदि आप किसी विशेष स्थान पर कुछ अभिव्यक्ति कर सकते हैं, तो आप वहां कोई अन्य अभिव्यक्ति भी रख सकते हैं।

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

मैं जोर देना चाहता हूं कि "अर्थ" का अर्थ कम्प्यूटेशनल परिणाम नहीं है। स्पष्ट रूप से, 1 + 2 और 2 + 1 दोनों समान 3. हालांकि शब्द अलग-अलग हैं, और इसका एक ही परिणाम होने पर भी एक अलग गणना करें। अर्थ अलग है, जैसे दो प्रकार के एल्गोरिदम अलग हैं।

आपने "अमूर्त सिंटैक्स ट्री" (एएसटी) के बारे में सुना होगा। यहां "अमूर्त" शब्द का अर्थ ठीक "ऑर्थोगोनल" है। तकनीकी रूप से अधिकांश एएसटी वास्तव में अमूर्त नहीं हैं!

शायद आपने "सी" प्रोग्रामिंग भाषा के बारे में सुना है? C टाइप नोटेशन अमूर्त नहीं है। विचार करें:

int f(int);

तो यहाँ एक फ़ंक्शन घोषणा वापसी प्रकार है int। इस फ़ंक्शन के लिए सूचक का प्रकार निम्न द्वारा दिया गया है:

int (*)(int)

ध्यान दें, आप फ़ंक्शन का प्रकार नहीं लिख सकते हैं! C प्रकार संकेतन बेकार है bigtime! यह सार नहीं है। यह ऑर्थोगोनल नहीं है। अब, मान लें कि हम एक ऐसा फंक्शन बनाना चाहते हैं जो इंट के बजाय उपरोक्त प्रकार को स्वीकार करता है:

int (*) ( int (*)(int) )

ऑल ओके .. लेकिन .. क्या होगा अगर हम इसके बजाय इसे वापस करना चाहते हैं:

int (*)(int) (*) (int)

ओह! अमान्य। :

(int (*)(int)) (*) (int)

ओह! वह भी काम नहीं करता है। हमें यह करना है (यह एकमात्र तरीका है!):

typedef int (intintfunc*) (int);
intintfunc (*)(int)

अब इसका ठीक है, लेकिन यहां एक टाइफाइड का उपयोग करना बुरा है। C चूसता है। यह सार नहीं है। यह ऑर्थोगोनल नहीं है। यहाँ आप एमएल में यह कैसे करते हैं, जो है:

 int -> (int -> int)

हम वाक्य रचना स्तर पर C की निंदा करते हैं।

ठीक है, अब C ++ को रोकते हैं। हम टेम्प्लेट के साथ ऊपर की मूर्खता को ठीक कर सकते हैं और एक एमएलए जैसे नोटेशन (अधिक या कम) प्राप्त कर सकते हैं:

fun<int, int>
fun< fun<int,int>, int>

लेकिन वास्तविक प्रकार की प्रणाली मूलभूत रूप से संदर्भों द्वारा त्रुटिपूर्ण है: यदि Tएक प्रकार है, तो T&एक प्रकार है? जवाब माफ़ है: वाक्यविन्यास स्तर पर, यदि आपके पास U = T & टाइप है, तो U & की अनुमति है, लेकिन इसका अर्थ है T &: संदर्भ का संदर्भ मूल संदर्भ है। यह बेकार है! यह शब्दार्थ की विशिष्टता को तोड़ देता है। इससे भी बदतर: T & & को वाक्यात्मक रूप से अनुमति नहीं है: यह प्रतिस्थापन सिद्धांत को तोड़ता है। तो C ++ संदर्भ को दो अलग-अलग तरीकों से तोड़ता है, बाध्यकारी समय (पार्सिंग या टाइप विश्लेषण) के आधार पर। यदि आप यह समझना चाहते हैं कि यह कैसे करना है .. वहाँ संकेत के साथ कोई समस्या नहीं है!

लगभग कोई वास्तविक भाषा ओर्थोगोनल नहीं है। यहां तक ​​कि योजना, जो अभिव्यक्ति की महान स्पष्टता का दिखावा करती है, नहीं है। हालाँकि कई अच्छी भाषाओं को "यथोचित रूप से ऑर्थोगोनल फीचर बेस के करीब" माना जा सकता है और यह एक भाषा के लिए एक अच्छी सिफारिश है, जो वाक्य रचना और अंतर्निहित शब्दार्थ दोनों पर लागू होती है।


तो आपको लगता है कि एमएल दूसरों की तुलना में अधिक ऑर्थोगोनल है? लिस्प और हास्केल के बारे में क्या?
जोन वेंज

1
@joan: ठीक है, लिस्प में कोई भी विशेषता नहीं है, इसलिए यह vaccuuo में आवश्यकता को पूरा करता है :)
Yttrill

@joan: मैं हास्केल प्रोग्रामर नहीं हूं, इसलिए यह कहना थोड़ा कठिन है, लेकिन "बेहद उच्च स्तर की कार्यक्षमता" के हास्केल में मौजूदगी मजबूत ऑर्थोगोनलिटी का संकेत है: आप बस मोनोपार्क या एरो के सुसंगत कार्यान्वयन नहीं कर सकते हैं जब तक कि भाषा के बाकी हिस्सों में पर्याप्त "
रूढ़िवादिता

आप पास्कल के बारे में क्या सोचते हैं। सी। से बेहतर लगता है
सुपरकैट

मुझे पता है कि मेरी टिप्पणी लगभग 4 साल देर हो चुकी है लेकिन मैं अभी इसके पार आया हूं। हर बात पर यह जवाब गलत है। यहां तक ​​कि पूरे "यह एकमात्र तरीका है!" हिस्सा बस गलत है। आप आसानी से व्यक्त कर सकते हैं कि बिना किसी टाइप किए हुए उदाहरण के int (*intintfunc())(int) { ... }- intintfunc एक फ़ंक्शन है जो कोई तर्क नहीं लेता है और एक फ़ंक्शन को एक पॉइंटर देता है जो 1 इंट तर्क लेता है और एक इंट्यू वैल्यू देता है।
विज

4

ओर्थोगोनलिटी को साबित करना नकारात्मक साबित हो रहा है। इसका मतलब है कि आपके पास कोई भी निर्माण नहीं है जो ऑर्थोगोनल नहीं है, जिसका अर्थ है कि यह साबित करना बहुत आसान है कि ऑर्थोगोनल कुछ नहीं है।

व्यवहार में, ज्यादातर लोग पूरी तरह से ऑर्थोगोनल होने या नहीं होने के बजाय डिग्री के संदर्भ में प्रोग्रामिंग भाषाओं की orthogonality के बारे में बात करते हैं। जब एक संदर्भ में कुछ करने से ज्ञान दूसरे संदर्भ में अनुवाद करता है और "वह करता है जो आप अपेक्षा करते हैं," तो उस भाषा को अधिक रूढ़िवादी कहा जाता है। LISP को अत्यधिक ऑर्थोगोनल माना जाता है क्योंकि सब कुछ एक सूची है, लेकिन मुझे नहीं लगता कि यह कहा जा सकता है कि यह कुछ अतिरेक के कारण 100% ऑर्थोगोनल है जो इसे उपयोग करना आसान बनाते हैं। C ++ को बहुत ही ऑर्थोगोनल नहीं माना जाता है क्योंकि बहुत कम "गोचैस" होते हैं, जहां यह आपके काम करने के तरीके के बारे में नहीं सोचता है।


3

चेतावनी, मुझे इस विषय के बारे में कुछ भी पता नहीं है।

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

C # के लिए, मुझे लगता है कि यह ऑर्थोगोनल है, इसमें ज्यादातर सिंटैक्स ट्रिक्स ( foreachदिमाग में आता है) बेस कंस्ट्रक्शन के विशेष रूप से गठित संस्करणों ( छोरों foreachबन जाता है) के लिए बस फ्रंट-एंड हैं for। कुल मिलाकर, भाषा केवल चीजों को एक ही तरीके से करने का सही मायने में समर्थन करती है, भले ही वाक्यगत चीनी उन्हें करने के लिए अतिरिक्त तरीके प्रदान करती है। और अंत में, यह सब MSIL(या जो कुछ भी इन दिनों कहा जाता है) के लिए संकलित होता है और MSILसंभवतः ऑर्थोगोनल है।

यदि आप चेतावनी देते हैं कि वाक्य-रचना चीनी सामान अनिवार्य रूप से एक "रैपर" है, तो इसे "कठिन तरीका" करने से आप भाषा की विभिन्न विशेषताओं का विश्लेषण कर सकते हैं, चीनी को छोड़ सकते हैं, और देख सकते हैं कि क्या कोई निर्माण हैं जो वास्तव में ओवरलैप हैं। यदि नहीं, तो मुझे लगता है कि आप भाषा को ऑर्थोगोनल घोषित कर सकते हैं।

मेरे दो सेंट।


मुझे लगता है कि अगर दोनों के लिए और एक भाषा की विशेषताएं हैं, जबकि एक दूसरे की एक वाक्यात्मक चीनी है (जहां फॉरचेक के प्रभाव का उपयोग करने के लिए प्राप्त किया जा सकता है), भाषा वहां अपनी रूढ़िवादिता खो देती है।
vpit3833

के do...whileरूप में एक ही प्रभाव प्रदान करने के लिए इस्तेमाल नहीं किया जा सकता है for? मैंने कभी भी सिंटैक्टिक शुगर नहीं माना है।
मैथ्यू फ्लिन

1
@ मैथ्यूफ्लिन: बाह! वे दोनों सिंथेटिक चीनी हैं, आप बस पुनरावृत्ति समारोह के साथ अपने पुनरावृत्ति को बदल सकते हैं! ;)
FrustratedWithFormsDesigner

2
@FrustratedWithFormsDesigner: GOTO के लिए सिंटैक्टिक शुगर नहीं है?
इवान

2
@MatthewFlynn do whileएक लूप निष्पादन की गारंटी देता है और इस तथ्य के बाद स्थिति की जांच करता है। forपहले स्थिति की जांच करता है, और एक भी निष्पादन की गारंटी नहीं देता है।
अंकलवर्ल्ड

2

मेरा सवाल यह है कि मैं बाकी विशेषताओं के बारे में कैसे जाना जा सकता है, विशेष रूप से ऐसी विशेषताएं जो एक दूसरे से संबंधित नहीं हैं?

आप वह कर रहे हैं जो आप कर रहे हैं, उन सभी संयोजनों की गणना करना जो काम करते हैं या निषिद्ध हैं।

बस इतना ही। यह करने के लिए काफी दर्दनाक है।

क्या सभी सुविधाओं को एक साथ मिलकर / स्टैक करना है?

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

सभी डेटा संरचनाएं सभी आदिम प्रकारों के साथ काम करती हैं। सभी अभिव्यक्ति ऑपरेटर सभी प्रकार के साथ काम करते हैं। वे orthogonality की आम परिभाषाएँ हैं। लेकिन आप अधिक (या कम) चाहते हो सकते हैं

कभी-कभी, हालांकि, ऑपरेटिंग सिस्टम या विरासत पुस्तकालयों के कारण विशेष मामले हैं जो ऑर्थोगोनल नहीं हैं।

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

ऑर्थोगोनल "ऑर्थोगोनल पर्याप्त" कैसे है? आपको अपनी भाषा में ओर्थोगोनलिटी की डिग्री से खुश होने के लिए क्या देखना होगा।


2

अपरंपरागत सुविधाओं की सूची वास्तव में अधिकांश प्रोग्रामिंग भाषाओं में लंबी है, जैसे

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

उन लोगों में से कुछ ही मेरे दिमाग में आते हैं, लेकिन कई अन्य हैं, और अन्य भाषाओं में भी हैं।

यह सुनिश्चित करना कठिन है कि भाषा सुविधाओं के बीच सूक्ष्म हस्तक्षेप नहीं है। जैसा कि कार होरे ने अपने पेपर "संकेत भाषा प्रोग्रामिंग पर संकेत" में इंगित किया है:

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

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

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

यह सब बहुत दिलचस्प है - लेकिन बहुत चुनौतीपूर्ण भी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.