बाएं से दाएं भाषा सिंटैक्स के लाभ


18

मैं Channel9 पर हर्ब सटर के साथ एक साक्षात्कार देख रहा हूं और उसने वीडियो के अंत में उल्लेख किया है कि बाएं से दाएं भाषा सिंटैक्स भविष्य के सी ++ मानक के लिए उसकी सीटी पर शीर्ष पर होगा (हालांकि वह स्वीकार करता है कि सी ++ को उस तरह से संशोधित करना बहुत ज्यादा एक पूरी तरह से अलग जानवर के लिए करना होगा)।

इसके अलावा:

  • मनुष्यों द्वारा अधिक समझने योग्य, नग्न आंखों के लिए स्पष्ट; जैसे

    //C syntax
    
    /*pointer to function taking a pointer to function(which takes 2 integers as 
    
    arguments and returns an int), and an int as arguments and returning an int*/
    
    int (*fp)(int (*ff)(int x, int y), int b)
    
    //Go analogous syntax which is left to write
    
    f func(func(int,int) int, int) int
  • पार्स करने में आसान (वीडियो में बताए अनुसार बेहतर टूल सपोर्ट की ओर जाता है - उदाहरण के लिए कोड रीफैक्टरिंग)

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


1
हैस्केल बाएं से दाएं उपयोग करता है:f :: (Int -> Int -> Int) -> Int -> Int
कारोली होर्वाथ

1
एक्शनस्क्रिप्ट भी function strlen(s:String):int {...}:। इसके अलावा, टाइप किए गए लैम्ब्डा कैलकुलस (इसलिए, हास्केल)।
outis

2
क्या कोई समझा सकता है कि कृपया समापन वोट दें :)? मैं इसे बंद करने का कोई कारण नहीं देख सकता, लेकिन शायद मैं एक "गलत" सवाल पूछ रहा हूं।

1
मैंने मतदान बंद नहीं किया, लेकिन, @Djjosh की टिप्पणी उचित है, यह प्रोग्रामर्स के लिए अधिक उपयुक्त है, उम्मीद है कि कोई इसे माइग्रेट करेगा ...
निम

3
@ फ्रेंक: और फंक्शन पॉइंट्स के मामले में यह मत भूलिए कि वाक्यविन्यास अजीब है क्योंकि वास्तविक प्रकार विभाजित है ! यह एक कम झटका है ...
मैथ्यू एम।

जवाबों:


12

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

कोई भी फ़ंक्शन जो सरणी प्रकार का तर्क देता है, या फ़ंक्शन पॉइंटर प्रकार वर्तमान में पढ़ना मुश्किल है:

// common way of obtaining the static size in elements of an array:
template <typename T, int N>
char (&array_size_impl( T (&)[N] ))[N];
// alternative parser:
template <typename T, int N>               // this would probably be changed also
array_simple_impl function( T [N] & ) char [N] &;

और गलतफहमी के लिए कम मौका होगा (जैसा कि सबसे-वैक्सिंग-पार्स ):

// Current C++
type x( another_type() );      // create an instance x of type passing a
                               // default constructed another_type temporary?
                               // or declare a function x that returns type and takes as argument
                               // a function that has no arguments and returns another_type
// How the compiler reads it:
x function( function() another_type ) type;

// What many people mean:
x type { another_type{} };

C ++ 0x में यूनिफॉर्म इनिशियलाइज़ेशन के समान दृष्टिकोण का उपयोग करना (यानी {}इनिशियलाइज़ेशन की पहचान करना)। ध्यान दें कि बाएं से दाएं दृष्टिकोण से यह बहुत स्पष्ट है कि हम क्या परिभाषित कर रहे हैं। बहुत से लोग (मुझे यकीन है) अतीत में इस पार्सिंग त्रुटि से किसी भी बिंदु पर काटे गए हैं (एक से अधिक बार), और यह बाएं से दाएं सिंटैक्स के साथ ऐसा नहीं होगा।


अभिव्यक्ति के बारे में कैसे? यह "बाएं से दाएं सिंटैक्स" कैसे ऑपरेटर वरीयता और मूल्यांकन के क्रम को प्रभावित करेगा?

1
@celavek: यदि आप साक्षात्कार में वापस जाते हैं, तो आप ध्यान देंगे कि वह भाषा के पूरे वाक्य विन्यास को बदलना नहीं चाहता, केवल घोषणा एस और परिभाषा एस। बेशक, जो अन्य अभिव्यक्तियों में अनुमति दे सकता है, मुझे भी यकीन नहीं है कि ऊपर दिए गए उदाहरणों में अंतिम पंक्ति उचित बाएं से दाएं है (सोचें कि अस्थायी कैसे बनाया जाता है, जिसे सी # में बदलने की आवश्यकता हो सकती है ... कि करने के लिए दो अर्थ विज्ञान देकर हल किया जाता है newके लिए ऑपरेटर structया classहै, जो सी पर लागू नहीं है ++ C ++ में मूल्य / संदर्भ प्रकार पर कोई भेद नहीं है।
डेविड Rodríguez - dribeas

5

हाउ वी गॉट हियर

फ़ंक्शन पॉइंट घोषित करने के लिए सी सिंटैक्स का उपयोग दर्पण उपयोग के लिए किया गया था। इस तरह से एक नियमित कार्य घोषणा पर विचार करें <math.h>:

double round(double number);

एक पॉइंट वैरिएबल के लिए आप इसे टाइप सुरक्षा के साथ असाइन कर सकते हैं

fp = round;

आपको उस fpबिंदु को इस तरह से चर घोषित करना होगा:

double (*fp)(double number);

इसलिए आपको केवल यह देखना है कि आप फ़ंक्शन का उपयोग कैसे करेंगे, और उस फ़ंक्शन का नाम एक पॉइंटर संदर्भ के साथ roundबदल देगा , जिसमें*fp । हालाँकि, आपको एक अतिरिक्त सेट की आवश्यकता है, जो यह कहता है कि यह थोड़ा गड़बड़ है।

यकीनन, यह मूल C में आसान हुआ करता था, जिसमें फ़ंक्शन सिग्नेचर भी नहीं था, लेकिन चलो वापस वहाँ नहीं जाते हैं, ठीक है?

जिस स्थान पर यह विशेष रूप से बुरा हो जाता है, वह यह पता लगाता है कि एक फ़ंक्शन को कैसे घोषित किया जाए जो या तो एक तर्क के रूप में लेता है या एक फ़ंक्शन को पॉइंटर लौटाता है, या दोनों।

यदि आप एक समारोह था:

void myhandler(int signo);

आप इसे सिग्नल फ़ंक्शन (3) में इस तरह से पास कर सकते हैं:

signal(SIGHUP, myhandler);

या यदि आप पुराने हैंडलर को रखना चाहते हैं, तो

old_handler = signal(SIGHUP, new_handler);

जो बहुत आसान है। क्या बहुत आसान है - और न ही सुंदर, न ही आसान - घोषणाओं को सही मान रहा है।

signal(int signo, ???)

ठीक है, आप बस अपने फ़ंक्शन घोषणा पर वापस जाएं और एक बिंदु संदर्भ के लिए नाम स्वैप करें:

signal(int sendsig, void (*hisfunc)(int gotsig));

क्योंकि आप घोषणा नहीं कर रहे हैं gotsig, तो आपको यह पढ़ने में आसानी हो सकती है कि क्या आप छोड़ देते हैं:

signal(int sendsig, void (*hisfunc)(int));

या शायद नहीं। :(

सिवाय इसके कि यह काफी अच्छा नहीं है, क्योंकि सिग्नल (3) पुराने हैंडलर को भी लौटाता है, जैसे:

old_handler = signal(SIGHUP, new_handler);

तो अब आपको यह पता लगाना है कि उन सभी को कैसे घोषित किया जाए।

void (*old_handler)(int gotsig);

उस चर के लिए पर्याप्त है जिसे आप असाइन करने जा रहे हैं। ध्यान दें कि आप वास्तव में gotsigयहां केवल घोषणा नहीं कर रहे हैं old_handler। तो यह वास्तव में पर्याप्त है:

void (*old_handler)(int);

यह हमें संकेत के लिए एक सही परिभाषा देता है (3):

void (*signal(int signo, void (*handler)(int)))(int);

बचाव के लिए टंकण

इस समय तक, मुझे लगता है कि हर कोई सहमत होगा कि यह एक गड़बड़ है। कभी-कभी अपने अमूर्त नाम देना बेहतर होता है; अक्सर, वास्तव में। अधिकार के साथ typedef, यह समझना बहुत आसान हो जाता है:

typedef void (*sig_t) (int);

अब आपका अपना हैंडलर वैरिएबल बन जाता है

sig_t old_handler, new_handler;

और संकेत के लिए आपकी घोषणा (3) बस हो जाती है

sig_t signal(int signo, sig_t handler);

जो अचानक समझ में आता है। * से छुटकारा पाने से कुछ भ्रमित कोष्ठकों से भी छुटकारा मिल जाता है (और वे कहते हैं कि परेंस हमेशा चीजों को समझने में आसान बनाते हैं - हाह!)। आपका उपयोग अभी भी समान है:

old_handler = signal(SIGHUP, new_handler);

लेकिन अब आप के लिए घोषणाओं को समझने का मौका है old_handler, new_handlerऔर यहां तक किsignal जब आप पहली बार उन्हें या जरूरत का सामना उन्हें लिखने के लिए।

निष्कर्ष

बहुत कम सी प्रोग्रामर, यह पता चला है, संदर्भ सामग्री के परामर्श के बिना इन चीजों के लिए सही घोषणाओं को तैयार करने में सक्षम हैं।

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

इस व्यापक कठिनाई के कारण, हालांकि, यह शायद समझदार नहीं है, लेकिन वास्तव में उन सभी घोषणाओं के बारे में जाने का एक तरीका है जो अब आपको ट्रिपल-अल्फा गीक प्रोग्रामर होने की आवश्यकता नहीं है, जो केवल इस का उपयोग करने के लिए तीन से ऊपर बैठे हैं। आराम से बात करना।


1
प्रयास में कठिन, अनुसरण करने में कठिन ... +1 हालांकि इस बात को दर्शाता है कि सी में यह अधिकार कभी-कभी कठिन होता है
celavek

4

मुझे लगता है कि जब आप बाएं से दाएं बिट पर ध्यान केंद्रित करते हैं तो आप कुछ हद तक चूक जाते हैं।

C और C ++ की समस्या उनके पास भयावह व्याकरण है, जिसे पढ़ना (मनुष्य) और तोता (उपकरण) दोनों के लिए मुश्किल है।

अधिक सुसंगत (या नियमित) होना ) व्याकरण होने से दोनों पर आसानी होती है। और आसान पार्सिंग का मतलब आसान टूलींग है: अधिकांश वर्तमान उपकरण सी ++ सही नहीं पाते हैं, ग्रहण का नवीनतम प्लगइन भी नहीं है क्योंकि उन्होंने पहिया को फिर से बनाने की कोशिश की ... और असफल रहे, और उनके पास संभवतः औसत ओएस प्रोजेक्ट की तुलना में अधिक लोग हैं।

तो आप शायद इसे पढ़ने और ध्यान देने पर ध्यान केंद्रित करते हैं ... और यह एक बड़ी बात है :)


यह एक बड़ा आश्चर्य है कि ग्रहण के बारे में अभी भी उपरोक्त घोषणाओं की तरह चीजों को पार्स करने में असमर्थ है। वे असली सी पार्सर का उपयोग क्यों नहीं करते हैं gcc?
14

@ टिचर: मैंने एक्लिप्स के साथ दो मुद्दों का पता लगाया है, और दोनों मैक्रोज़ से जुड़े हुए लगते हैं। शायद एएसटी पीढ़ी की तुलना में अधिक प्रीप्रोसेसर मुद्दा।
15th पर Matthieu एम।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.