"सिंटेक्स" और "सिंटैक्टिक शुगर" में क्या अंतर है


45

पृष्ठभूमि

सिंथेटिक चीनी पर विकिपीडिया पृष्ठ :

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

मुझे वास्तव में समझ में नहीं आता है कि Syntactic Sugar और Syntax के बीच क्या अंतर है।

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

उसी विकिपीडिया पृष्ठ से:

कंपाइलर्स, स्टैटिक एनालिसर्स और लाइक सहित भाषा प्रोसेसर, प्रसंस्करण से पहले अधिक मौलिक निर्माणों में अक्सर सुव्यवस्थित निर्माणों का विस्तार करते हैं, एक प्रक्रिया जिसे कभी-कभी "डीजेरिंग" कहा जाता है।

एक विचार अभ्यास के रूप में, यदि मैं "हमेशा" इस कथन में "हमेशा" का अर्थ लेता हूं: यदि अंतर सिर्फ यह था कि क्या कंपाइलर अगले चरण में जाने से पहले सिंटैक्स "डिसुगर" करता है, तो एक कोडर कैसे हो सकता है, जो सराय नहीं जानता है संकलक को पता है (या देखभाल) कि क्या Sugar'd सिंटैक्स है या नहीं?

इस साइट पर एक बहुत ही संबंधित प्रश्न "कठोर चीनी की परिभाषा?" एक जवाब है जो शुरू होता है:

IMHO मुझे नहीं लगता कि आपके पास सिंथैटिक शुगर के लिए एक परिभाषा हो सकती है, क्योंकि वाक्यांश बीएस है और लोगों द्वारा "वास्तविक प्रोग्रामर" के बारे में "वास्तविक ऑपरेटिंग सिस्टम" का उपयोग करके "वास्तविक प्रोग्रामर" के बारे में बात करने की संभावना है।

जो मुझे संकेत दे सकता है कि शायद भाषा का उपयोग करने वाले कोडर के लिए बहुत बड़ा अंतर नहीं है? शायद अंतर केवल संकलक लेखक के लिए बोधगम्य है? हालांकि ऐसे उदाहरण भी हो सकते हैं जिनमें यह कोडर के लिए सहायक हो कि भाषा का उपयोग करके यह जान सकें कि सिंथेटिक शुगर के घेरे में क्या है? (लेकिन शायद वास्तव में विषय पर कोई भी प्रवचन लौ शब्द के रूप में उपयोग करने के लिए जाता है?)

सवाल का दिल

तो ... प्रश्न का संक्षिप्त संस्करण:

  • क्या सिंटैक्स और सिन्सेटिक शुगर में वास्तविक अंतर है?
  • यह किसके लिए मायने रखता है?

अतिरिक्त भोजन के लिए सोचा

विषय विरोधाभास पर बोनस:

विकिपीडिया पृष्ठ पर एक उदाहरण दिया गया है:

उदाहरण के लिए, C भाषा में a[i]संकेतन चीनी के लिए संकेतन है*(a + i)

जबकि उपरोक्त लिंक पर एक और उत्तर उसी उदाहरण के बारे में बात करता है:

अब विचार करो a[i] == *(a + i)। किसी भी C प्रोग्राम के बारे में सोचें जो किसी भी तरह से सरणियों का उपयोग करता है।

और सारांश है कि:

[]अंकन इस अमूर्त की सुविधा। यह सिंटैक्टिक शुगर नहीं है।

उसी उदाहरण के लिए विपरीत निष्कर्ष!


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

7
एक समस्या यह है कि कुछ लोगों को लगता है कि "सिंटैक्टिक शुगर" एक गंदा शब्द है, जब यह नहीं है। प्रत्येक फ़ंक्शन या वर्ग जिसे आप सिस्टम में जोड़ते हैं, उन्हें "सिंटैक्टिक शुगर" माना जा सकता है, क्योंकि वे ऐसे विचार बनाते हैं जो स्पष्ट रूप से भाषा में पहले से ही थोड़ा (या बहुत कुछ) व्यक्त करने में आसान थे।
जॉरिस टिम्मरमन्स

जाहिर है, यह आपके लिए मायने रखता है।
एसएसहीन

11
अंत में, यह सब बिजली के ऊपर सिर्फ चीनी है।
एंथनी Pegram

जवाबों:


34

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

व्यवहार में, सिंटैक्ट शुगर का उपयोग केवल आसानी से उपयोग करने की सुविधा के लिए एक भाषा में जोड़े गए सिंटैक्स का वर्णन करने के लिए किया जाता है, जैसे कि इनफ़िक्स lhs + rhsमैप बनाना lhs.Add(rhs)। मैं सी के ऐरे को सिंटैक्टिक शुगर बनाने पर विचार करूंगा।

यह ज्यादातर मायने रखता है क्योंकि सुरुचिपूर्ण डिजाइन नकल की मात्रा को सीमित करते हैं। जरूरत है (या कम से कम चाहने वाले) सिंथैटिक शुगर को कुछ लोगों द्वारा डिजाइन फेल होने के संकेत के रूप में देखा जाता है।


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

3
@Giorgio कैसे "इन दो कार्यक्रमों की गणना समान कार्य" "इन दो कार्यक्रमों के समान शब्दार्थ" से अलग है? इसके अलावा, आप प्रोग्राम पर ध्यान केंद्रित कर रहे हैं, सिंटैक्टिक तत्वों पर नहीं। पूरे कार्यक्रम में चीनी नहीं हो सकती है। एक ऑपरेटर, एक तरह का बयान आदि, वाक्यगत चीनी हो सकता है।

@ जियोर्जियो - वास्तव में, मैं अलग-अलग कार्यक्षमता वाले विभिन्न शब्दार्थों के साथ समान कार्यक्षमता पर विचार कर रहा हूं। और हाँ, वहाँ अपने स्वयं के संकलक है कि एक ही शब्दार्थ है और उस "चीनी" बुला की तरह कूद कूद हो सकता है। सच कहूँ तो, इस तरह की अनौपचारिक अवधारणा के लिए एक औपचारिक परिभाषा नहीं होने जा रही है।
तेलस्तीन

1
@ जियोर्जियो फिर, मेरे गोमांस आपके समतुल्य लेने के साथ नहीं है, लेकिन आप कार्यक्रमों के लिए सिंटैक्टिक चीनी की अवधारणा को आजमाते हैं और लागू करते हैं। शब्द पूरे कार्यक्रमों को संदर्भित नहीं करता है! आपकी परिभाषा के आधार पर, यह या तो केवल परमाणु निर्माण खंड है, या केवल लघु कार्यक्रम के टुकड़े (पहला कवर करने के लिए लगता है> 80%, लेकिन मुझे यकीन नहीं है कि यह सब कुछ शामिल करता है जिसे आमतौर पर सिंटैक्टिक चीनी माना जाता है)।

3
@Giorgio उदाहरण के लिए, पूरे कार्यक्रम ;-) या कुछ भी पर्याप्त नहीं है कि दोनों योगों में कई असंबंधित भाषा कीवर्ड शामिल हैं। ऐसा कुछ जिसे मैंने कभी सिटैक्टिक शुगर if (a) return blah; ...बनाम नहीं माना है result_type res; if (a) res = blah; else {...}; return res;। आपको उन कार्यक्रमों के बीच कोई अंतर खोजने के लिए, विशिष्ट भाषाओं को मानने की आवश्यकता होगी, और अत्यंत भाषा-वकील-वाई (अक्सर छोटे-चरण संचालन शब्दार्थों के बिंदु तक) प्राप्त करना होगा।

10

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

जो किसी भाषा के बाकी वाक्य-विन्यास के अलावा वाक्य-रचना की चीनी को निर्धारित करता है, वह यह है कि भाषा में लिखे जाने वाले कार्यक्रमों को प्रभावित किए बिना भाषा से वाक्य-रचना को हटाना संभव होगा।

अधिक औपचारिक परिभाषा देने के लिए, मैं कहूंगा

Syntactic चीनी भाषा के वाक्य-विन्यास के वे भाग होते हैं जिनके प्रभाव भाषा में अन्य वाक्य रचना के संदर्भ में परिभाषित किए जाते हैं।

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


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

@ जियोर्जियो: मैंने अपने पहले पैराग्राफ को फिर से परिभाषित किया क्योंकि यह थोड़ा अजीब था। लेकिन मैं इस बात से सहमत नहीं हूं कि सिंटैक्टिक शुगर को आम तौर पर तदर्थ कहा जाता है। सिंटैक्टिक शुगर का सबसे व्यापक रूप से ज्ञात बिट संभवतः सी का ->ऑपरेटर है और मैं यह नहीं देखता कि यह ऑपरेटर दूसरों की तुलना में कम सामान्य कैसे है।
बार्ट वैन इनगेन शानौ

1
@ जियोर्जियो: उस मामले में, एक विधानसभा निर्देश के लिए सीधे मैप नहीं होने वाली हर चीज को सिंटैक्टिक शुगर माना जाना चाहिए, क्योंकि इसे हमेशा सरल टुकड़ों में तोड़ा जा सकता है (इसमें फ़ंक्शन भी शामिल हैं)। मुझे नहीं लगता कि आपको कई लोग उस दृश्य को साझा करते हुए नहीं पाएंगे।
बार्ट वैन इनगेन शानौ

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

1
चूंकि "तदर्थ समाधान" अक्सर खराब होते हैं, इसलिए ऐसा लग सकता है कि "तदर्थ" का मतलब ही बुरा है। लेकिन "एड-हॉक पॉलीमॉर्फिज्म" AKA फ़ंक्शन ओवरलोडिंग ( en.wikipedia.org/wiki/Ad_hoc_polymorphism ) भी है, जो बुरा नहीं है। कम से कम इतालवी (मेरी मातृभाषा) में, लैटिन "एड-हॉक" का उपयोग अपने आप में नकारात्मक नहीं है। यदि अंग्रेजी में इसका नकारात्मक अर्थ है, तो मेरी अज्ञानता को क्षमा करें।
जियोर्जियो

6

अन्य उत्तरों में एक प्रमुख अवधारणा का उल्लेख नहीं किया गया है: सार वाक्यविन्यास ; इसके बिना, "सिंटैक्टिक शुगर" शब्द का कोई मतलब नहीं है।

एब्सट्रैक्ट सिंटैक्स, भाषाओं के तत्वों और संरचना को परिभाषित करता है, और बड़े वाक्यांशों के निर्माण के लिए उस भाषा के वाक्यांशों को कैसे जोड़ा जा सकता है। सार सिंटैक्स कंक्रीट सिंटैक्स से स्वतंत्र है। शब्द "सिंटैक्टिक शुगर", जैसा कि मैं इसे समझता हूं, ठोस सिंटैक्स को संदर्भित करता है।

सामान्य तौर पर, किसी भाषा को डिज़ाइन करते समय, आप अपने अमूर्त वाक्य रचना के प्रत्येक शब्द के लिए ठोस वाक्यविन्यास बनाना चाहते हैं, ताकि लोग सादे पाठ का उपयोग करके आपकी भाषा में कोड लिख सकें।

अब हम कहते हैं कि आप फू के लिए एक अजीब ठोस वाक्यविन्यास बनाएँ । उपयोगकर्ता शिकायत करते हैं, और आप एक ही सार सिंटैक्स का प्रतिनिधित्व करने के लिए एक नया ठोस सिंटैक्स लागू करते हैं । परिणाम यह है कि आपका अमूर्त वाक्यविन्यास और शब्दार्थ नहीं बदला है, लेकिन अब आपके पास एक ही सार वाक्यविन्यास शब्द के लिए दो ठोस वाक्यविन्यास हैं।

यह, मेरा मानना ​​है कि "सिंटैक्टिक शुगर" कहने पर लोगों का क्या मतलब है - ऐसे परिवर्तन जो केवल ठोस सिंटैक्स को प्रभावित करते हैं, लेकिन जो अमूर्त सिंटैक्स या शब्दार्थ को प्रभावित नहीं करते हैं।

और इसलिए "सिंटैक्टिक शुगर" और "ठोस सिंटैक्स" के बीच का अंतर अब स्पष्ट है। मुझे सम। :)

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


मुझे यह भी ध्यान देना चाहिए कि यह केवल मेरी राय है; मैं केवल इसे मानता हूं क्योंकि यह एकमात्र व्याख्या है जिसके बारे में मैं सोच सकता हूं कि यह मेरे लिए समझ में आता है।


1
मैंने तुलनात्मक अमूर्त बनाम ठोस वाक्यविन्यास के बारे में भी सोचा था लेकिन मुझे यकीन नहीं है कि यह हमेशा वाक्यविन्यास चीनी की व्याख्या करता है। उदाहरण के लिए, C में, pकिसी फ़ील्ड वाले किसी स्ट्रक्चर को एक पॉइंटर दिया गया है, xएक्सप्रेशन करते हैं (*p).xऔर p->xसमान सार सिंटैक्स होते हैं? लेकिन मुझे लगता है कि यह बहुत अच्छा होगा अगर सब कुछ अमूर्त बनाम ठोस वाक्यविन्यास के लिए उबला हुआ हो।
जियोर्जियो

@Giorgio दुर्भाग्य से, मैं पर्याप्त रूप से सी को यह बताने के लिए पर्याप्त नहीं जानता कि क्या उनमें से कोई भी दूसरे के लिए वाक्यविन्यास चीनी है, या उनके सार वाक्यविन्यास के पेड़ क्या दिखेंगे। या यहां तक ​​कि अगर सी की कल्पना वास्तव में एक सार वाक्यविन्यास को परिभाषित करती है। :(

1
पहली अभिव्यक्ति .जड़ के साथ एक पेड़ के रूप में पार्स की जा सकती है । रूट का बायां सबनोड एक है *, और उसका बच्चा है p। रूट का सही सबनोड है x। दूसरी अभिव्यक्ति के लिए, अमूर्त वाक्यविन्यास पेड़ ->के मूल में है और जड़ में दो बच्चे हैं pऔर x। मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या यह दोनों अभिव्यक्तियों को अलग-अलग तरीके से पार्स करने के लिए समझ में आता है ताकि उनके पास एक ही सार वाक्यविन्यास का पेड़ हो, लेकिन मैं यह नहीं देखता कि इस समय कैसे हो।
जियोर्जियो

3
मुझे नहीं लगता कि यह पार्स ट्री, जिसे अक्सर एएसटी के रूप में वर्णित किया जाता है, वही सार वाक्यविन्यास मैट के बारे में बात कर रहा है। दोनों अभिव्यक्तियों में समान क्रिया है ( पॉइंटर प्रकार को संदर्भ प्रकार में बदलें, फिर सदस्य का संदर्भ लेंx )
बेकार

1
"दोनों अभिव्यक्तियों में समान क्रिया है (पॉइंटर प्रकार को संदर्भ प्रकार में बदलें, फिर सदस्य x का संदर्भ लें)": यह शब्दार्थ है, न कि सार वाक्य-विन्यास। सार सिंटैक्स एक प्रोग्राम के वास्तविक संरचना को दर्शाता है कि एक पेड़ का उत्पादन करने के लिए ठोस सिंटैक्स (जैसे (या ;) के बेकार विवरण को छोड़ने का उल्लेख करता है (देखें en.wikipedia.org/wiki/Abstract_syntax_tree )। हालाँकि, सार सिंटैक्स में प्रोग्राम के शब्दार्थों के बारे में कुछ भी नहीं कहा जाता है।
जियोर्जियो

4

सिंथेटिक चीनी भाषाओं के सिंटैक्स का एक सबसेट है। मूल विचार यह है कि एक ही बात कहने का एक से अधिक तरीका है।

यह कहना मुश्किल है कि कौन से टुकड़े वाक्यगत चीनी हैं और कौन से टुकड़े "शुद्ध वाक्यविन्यास" हैं जैसे कथन "यह कहना कठिन है कि कौन सा रूप पहले आया" या "यह जानना कठिन है कि भाषा के लेखक का इरादा किस तरह से है" या "यह है" यह तय करने के लिए कुछ मनमाना है कि कौन सा रूप सरल है ”।

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

व्यवहार में, यह वह तरीका है जिससे मामले की वास्तविकता तय की जाती है।


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

3

वास्तव में, विकिपीडिया से आपका पहला उद्धरण यह सब कहता है "... चीजों को पढ़ना आसान बनाता है ...", ".... मनुष्यों को उपयोग करने के लिए मीठा ...."।

लेखन में, संक्षिप्त रूप जैसे "नहीं" या "नहीं" को वाक्यगत चीनी माना जा सकता है।


विचार करें (1) "मुझे अब जाना चाहिए" बनाम (2) "मुझे अब जाना चाहिए": क्या (1) सिंथेटिक चीनी के लिए (2)?
जियोर्जियो

1
@Giorgio मैं नहीं कहूँगा।
ओज

पठनीयता के कारण ("चाहिए" "से चाहिए" से अधिक पठनीय नहीं है) या अर्थ के कारण ("चाहिए" और "चाहिए" से भिन्न अर्थ हैं)।
जियोर्जियो

@ जियोर्जियो मेला काफी :)
ozz

1
आह मैं देख रहा हूँ :) मुझे लगता है कि मुझे लगता है कि एक से अधिक है, मुझे नहीं लगता कि एक उदाहरण में दूसरे की तुलना में अधिक पठनीय है
ozz

3

आमतौर पर वाक्य रचना चीनी भाषा का वह हिस्सा है जिसे भाषा के मौजूदा हिस्से (वाक्य रचना) द्वारा सामान्यता की हानि के बिना लेकिन संभवतः स्पष्टता के नुकसान के साथ व्यक्त किया जा सकता है। कभी-कभी कंपाइलरों में स्पष्ट अवरोही कदम होता है जो स्रोत कोड द्वारा बनाई गई एएसटी को बदल देता है और चीनी के अनुरूप नोड्स को हटाने के लिए सरल कदम लागू करता है।

उदाहरण के लिए, हास्केल के पास निम्नलिखित नियमों के साथ मोनोकार्ड के लिए सिंटेक्स चीनी है जिसे पुनरावर्ती रूप से लागू किया गया है

do { f }            ~> f
do { g; h }         ~> g >> do h
do { x <- f; h }    ~> f >>= \x -> do h
do { let x = f; h } ~> let x = f in do h

अभी इसका कोई मतलब नहीं है कि इसका वास्तव में क्या मतलब है - हालाँकि आप देख सकते हैं कि LHS पर विशेष वाक्यविन्यास को RHS (अर्थात् फ़ंक्शन एप्लिकेशन, लैम्ब्डा और let's) पर कुछ और बुनियादी में बदला जा सकता है । इस कदम से दोनों दुनिया के सर्वश्रेष्ठ रखने की अनुमति मिलती है:

  1. LHS पर सिंटैक्स प्रोग्रामर (सिंटैक्स शुगर) के लिए आसान है जो मौजूदा विचारों को अधिक स्पष्ट तरीके से व्यक्त करता है
  2. हालाँकि, आरएचएस कंस्ट्रक्शन के लिए कंपाइलर में समर्थन पहले से ही संकलक में मौजूद है, लेकिन इसे बाहर के पार्सर और डीसर्जिंग (त्रुटि रिपोर्टिंग को छोड़कर) के रूप में कुछ विशेष करने की आवश्यकता नहीं है।

इसी तरह सी में आप फिर से लिखने वाले नियम की कल्पना कर सकते हैं (ऑपरेटर की ओवरलोडिंग आदि के कारण यह C ++ के लिए सही नहीं है):

f->h ~> (*f).h
f[h] ~> *(f + h)

आप सी ->या []सी का उपयोग किए बिना सभी कार्यक्रमों को लिखने की कल्पना कर सकते हैं जो आज इस निर्माण का उपयोग करते हैं। हालाँकि, प्रोग्रामर्स के लिए इसका उपयोग करना कठिन होगा, इसलिए सिंटैक्स शुगर प्रदान करता है (मुझे लगता है कि यह 70 में संकलक के लिए भी सरल हो सकता है)। यह संभवतः कम स्पष्ट है क्योंकि आप तकनीकी रूप से निम्नलिखित, पूरी तरह से वैध जोड़ सकते हैं, नियम को फिर से लिख सकते हैं:

*f ~> f[0] -- * and [] have the same expressiveness 

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

f1 = do x <- doSomething
        return x
f2 = doSomething

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


3

मुझे लगता है कि सबसे स्पष्ट उदाहरण सी में "+ =" वाक्यविन्यास होगा।

i = i + 1;

तथा

 i +=  1;

बिल्कुल वही काम करते हैं और मशीन के निर्देशों का एक ही सेट करने के लिए संकलन करते हैं। दूसरा रूप टाइप करने वाले कुछ वर्णों को सहेजता है, लेकिन, इससे भी महत्वपूर्ण बात यह स्पष्ट करती है कि आप इसके वर्तमान मूल्य के आधार पर किसी मूल्य को संशोधित कर रहे हैं।

मैं "++" पोस्ट / उपसर्ग ऑपरेटर को विहित उदाहरण के रूप में उद्धृत करने जा रहा था, लेकिन एहसास हुआ कि यह वाक्यात्मक चीनी से अधिक था। i = i + 1वाक्यविन्यास का उपयोग करके एकल अभिव्यक्ति में ++ i और i ++ के बीच अंतर को व्यक्त करने का कोई तरीका नहीं है ।


+ = जैसे मामलों में काम कर सकते हैं a[f(x)] += 1
फ्लोरियन एफ

1

पहले, मैं कुछ अन्य उत्तरों को एक ठोस उदाहरण के साथ संबोधित करूँगा। लूप के लिए C ++ 11 रेंज-आधारित (बहुत सी अन्य भाषाओं में फॉरेक्स लूप की तरह)

for (auto value : container) {
    do_something_with(value);
}

के बराबर है (यानी, का एक सुगर संस्करण)

for (auto iterator = begin(container); iterator != end(container); ++iterator) {
    do_something_with(*iterator);
}

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

पहला संस्करण आशय बनाता है (कंटेनर में प्रत्येक आइटम पर जाकर) स्पष्ट। यह असामान्य व्यवहार पर भी प्रतिबंध लगाता है जैसे कि ट्रैवर्सल के दौरान कंटेनर को संशोधित करना, या iteratorलूप बॉडी में आगे बढ़ना , या लूप की शर्तों को पूरी तरह से गलत करना। यह बग के संभावित स्रोतों से बचता है और ऐसा करने में, कोड के बारे में पढ़ने और तर्क की कठिनाई को कम करता है।

उदाहरण के लिए, दूसरे संस्करण में एक-चरित्र की गलती:

for (auto iterator = begin(container); iterator <= end(container); ++iterator) {
    do_something_with(*iterator);
}

एक-एक-अतीत की त्रुटि और अपरिभाषित व्यवहार देता है।

इसलिए, शर्करायुक्त संस्करण उपयोगी है, क्योंकि यह अधिक प्रतिबंधक है, और इस प्रकार विश्वास और समझने में सरल है।


दूसरा, मूल प्रश्न के लिए:

क्या सिंटैक्स और सिन्सेटिक शुगर में वास्तविक अंतर है?

नहीं, "सिंटैक्टिक शुगर" (ठोस) भाषा सिंटैक्स है, जिसे "शुगर" माना जाता है, क्योंकि यह भाषा के अमूर्त सिंटैक्स या कोर कार्यक्षमता का विस्तार नहीं करता है। मुझे इस पर मैट फेनविक का जवाब पसंद है।

यह किसके लिए मायने रखता है?

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

अंत में, बोनस प्रश्न पर

[] संकेतन इस अमूर्तता को सुविधाजनक बनाता है।

इस तरह एक बहुत लग रहा है परिभाषा वाक्यात्मक चीनी की: यह समर्थन करता है (और के लिए भाषा का लेखक 'आशीर्वाद प्रदान करता है) सरणियों के रूप में संकेत का उपयोग कर। p[i]प्रपत्र नहीं तुलना में अधिक प्रतिबंधात्मक वास्तव में है *(p+i)तो फर्क सिर्फ इतना आशय का स्पष्ट संचार (और एक मामूली पठनीयता लाभ) है।


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

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

0

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

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

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


मुझे लगता है कि पारिभाषिक शब्द का अर्थ है ("यह केवल वाक्यात्मक चीनी है") इस तथ्य से आता है कि वाक्यगत चीनी किसी भी जानकारी को नहीं जोड़ती है।
जियोर्जियो

1
यह इस विचार से आ सकता है कि वाक्य-विन्यास किसी भी जानकारी को नहीं जोड़ता है , लेकिन यह विचार एक तथ्य नहीं है। इरादे के बारे में जानकारी (उदाहरण के लिए, एक प्रसिद्ध मुहावरे का उपयोग करने के लिए) अभी भी जानकारी है।
बेकार 15

@ पता: जानकारी से मेरा मतलब था कि एक कार्यक्रम में या बिना शक्कर के समान व्यवहार होता है। बेशक यह सिंटैक्टिक शुगर के साथ अधिक पठनीय हो सकता है (यह पाठक के लिए सूचना / प्रलेखन जोड़ता है) जो एक फायदा है।
जियोर्जियो

जाली। सिंथेटिक चीनी एक pejorative नहीं है। अपने या अपने नमक के लायक कोई भी प्रोग्रामर पुस्तकालयों का निर्माण करेगा जो सभी जटिल कार्यों को कॉपी और पेस्ट करने के बजाय अधिक जटिल कार्य को सरल और सरल बनाता है। इससे बेहतर-व्यवहार किया जाता है, और अधिक बनाए रखने योग्य कोड। यह मूल रूप से जटिल, सरल, सरल वाक्यविन्यास में पैटर्न को मिलाकर सिंटैक्टिक शुगर को पूरा करता है।
क्रेग

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