2009-02-13 19 views
11

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

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

+1

आप उदाहरण देते हैं या मामलों का उपयोग कर सकते हैं? – spoulson

+0

मैंने कभी यह राय नहीं सुना है। क्या आप इस तरह की सिंटैक्टिक चीनी का उदाहरण दे सकते हैं जिसके बारे में आप बात कर रहे हैं? –

+1

एक यादृच्छिक पक्ष नोट पर, मैंने अभी पंजीकरण किया है SyntaticSugar.com – mmcdole

उत्तर

8

कुछ मामलों में सिंटैक्टिक चीनी अप्रिय तरीकों से बातचीत कर सकती है।

कुछ विशिष्ट उदाहरण:

पहले सी # (या जावा) विशिष्ट, ऑटो मुक्केबाजी और लॉक/सिंक्रनाइज़ निर्माण

private int i; 
private object o = new object(); 

private void SomethingNeedingLocking(bool b) 
{ 
    object lk = b ? i : o; 
    lock (lk) { /* do something */ } 
} 

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

एकाधिक चर घोषणा और संकेत:

long* first, second; 

एक क्लासिक बग (हालांकि का पता आसानी से)। एकाधिक चर की चीनी सूचक घोषणा के साथ फिट नहीं होगी।

कुछ संरचनाओं को चीनी के अन्य पहलुओं को मुद्दों का कारण बनने की आवश्यकता नहीं है, एक क्लासिक उदाहरण ++ ऑपरेटर है। यह बड़े करीने से आप लिख

i = i + 1; 

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

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

+0

सी में, ऑपरेटर ++ मूल रूप से चीनी नहीं था लेकिन अनुकूलन –

+6

निष्पक्ष बिंदु, असेंबली के लिए सी की चीनी वैसे भी जे/के;) – ShuggyCoUk

+0

मूल्य प्रकार पर लॉक लेना सी # (जावा नहीं पता)। आपको ऐसा कुछ करना होगा: लॉक ((ऑब्जेक्ट) i) लेकिन फिर, यह बग को स्पष्ट करता है, है ना! –

1

संभवतः क्योंकि यह प्रोग्रामर में भ्रम पैदा करता है जो नहीं जानते कि दृश्यों के पीछे वास्तव में क्या हो रहा है, जो बदले में कुछ अक्षम या खराब लिखित कोड का कारण बन सकता है .. बस एक अनुमान है, मुझे नहीं लगता कि यह है एक "बुरी चीज" या तो।

1

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

8

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

+5

क्या आप एक ही प्रतिक्रिया में .NET और Java दोनों से नफरत कर रहे हैं? वाहवाही! ;-) –

+0

एक तरह से, हाँ। :) – BobbyShaftoe

0

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

+1

किसी अन्य भाषा की सुविधा से एक भाषा की वाक्य रचनात्मक चीनी को क्या अंतर करता है? आप तर्क दे सकते हैं कि अधिकांश मूल रूप से संकलित भाषाएं असेंबली के शीर्ष पर सिंटैक्टिक चीनी हैं। इसी तरह, ओओपी सी में किया जा सकता है, यह सिर्फ सुंदर नहीं है। –

+0

ओओपी के कुछ पहलू, मेरा मतलब है –

+0

@ रयान-ग्राहम, नहीं, मैं असहमत हूं। मुझे नहीं लगता कि यह सापेक्ष है। आप उन चरम पर जा सकते हैं; हालांकि, मुझे लगता है कि जब आप सिंटैक्स पेश करते हैं जिसे पहले से ही भाषा में तुच्छ कोड के साथ किया जा सकता है, यह केवल सिंटैक्टिक चीनी है। इसके अलावा, अगर यह * बहुत अधिक * करने की कोशिश करता है, ऊपर से कुछ, – BobbyShaftoe

10

सिंटेक्टिक चीनी का कैंसर का कारण बनता है अर्धविराम। एलन पर्लिस

किसी संदर्भ के संदर्भ में तर्क होने पर वाक्य रचनात्मक चीनी के बारे में तर्क करना मुश्किल है। "सिंटेक्टिक चीनी" अच्छा या बुरा क्यों है, इसके बारे में बहुत सारे उदाहरण हैं, और वे सभी संदर्भ के बिना व्यर्थ हैं।

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

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

सादर,

+2

क्या कोई एलन पेरील्स द्वारा उद्धरण की व्याख्या कर सकता है? मैं इसे कभी समझ नहीं पा रहा हूं। – day

+0

@day यहां दो स्पष्टीकरण हैं: 1. http://softwareengineering.stackexchange.com/questions/194007/what-is-the-difference-between-syntax-and-syntactic-sugar#194020 2. https: // GitHub।com/strint/sicpAns/issues/2 –

2

Law of Leaky Abstractions देखें।यह इतना नहीं है कि "सिंटेक्टिक चीनी" एक बुरी बात है, सिर्फ इतना है कि बहुत सारे प्रोग्रामर वास्तव में इसके बारे में जानते हैं कि वे किस चीज से बचाए जाते हैं, और फिर यदि सिंटैक्टिक चीनी समस्याओं में चलती है तो वे खराब हो जाते हैं।

1

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

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

reduce(list.__add__, map(lambda x: list(x), [mi.image_set.all() for mi in list_of_menuitems])) 

यह कुछ सरल बुरी तरह से चला बनाने में एक स्पष्ट प्रयास है: लेकिन जब से मैं एक पर्ल विशेषज्ञ नहीं हूँ, मैं तुम क्या मैं अजगर में के बारे में बात कर रहा हूँ का एक उदाहरण (this question से लिया गया) दे देंगे , बहुत गलत है।

यह कहना नहीं है कि मैं ऐसी सुविधाओं को हटाने के पक्ष में हूं। मुझे लगता है कि ऐसी सुविधाओं को सावधानीपूर्वक इस्तेमाल करने की आवश्यकता है।

1

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

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

2

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

भले ही वे किसी भाषा की क्षमताओं का विस्तार नहीं करते हैं, फिर भी वे बहुत उपयोगी हो सकते हैं।

उदाहरण के लिए, LINQ वाक्य रचनात्मक चीनी है क्योंकि यह सी # 3 में कोई नई क्षमता नहीं जोड़ता है जो सी # 2 में पहले से संभव नहीं था। लेकिन सी # 2 में एक साधारण LINQ अभिव्यक्ति के समान काम करने के लिए पूरा करने के लिए बहुत अधिक कोड लेना होगा और पढ़ने के लिए बहुत कठिन होगा।

इसके विपरीत, जेनेरिक वाक्य रचनात्मक चीनी नहीं हैं, क्योंकि आप सी # 2 में उनके साथ चीजें कर सकते हैं जो सी # 1 के साथ असंभव थे, जैसे कि संग्रह कक्षा बनाना जिसमें मुक्केबाजी के बिना कोई मूल्य प्रकार हो सकता है।

4

बकवास। सी और लिस्प प्रोग्रामर हर समय सिंटेक्टिक चीनी का उपयोग करते हैं।

उदाहरण:

  • बजाय a[i]*(a+i)
  • बजाय '(1 2 3)(quote 1 2 3)
+0

खुराक क्या मायने रखता है। '# @ \' (,()) 'शायद खराब वाक्यविन्यास है, लेकिन मुझे यह भी नहीं पता कि '#' और '@' अभी तक क्या मतलब है, और आम लिस्प के अलावा योजना है, जो विभिन्न नामों का उपयोग करती है। –

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