2011-02-03 37 views
38

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

मैंने clang संकलक के बारे में बहुत पहले नहीं सीखा और इसे आजमाने का फैसला किया। त्रुटि संदेश बहुत स्पष्ट थे और मुझे मेरे वाक्यविन्यास में समस्याओं की पहचान करने और ठीक करने में मदद मिली। मेरा सवाल यह है कि इस उपकरण का उपयोग/उससे अधिक क्यों नहीं किया गया है? क्या यह सामान्य संदिग्धों की तुलना में इतना नया है (cc/gcc), या यह है कि यह उन सुविधाओं का समर्थन नहीं करता है जो वे समर्थन करते हैं, या यह प्राप्त करना मुश्किल है? मुझे लगता है कि आखिरी बार, क्योंकि यह मेरे आईमैक पर देव उपकरण के साथ स्थापित किया गया था और मेरे उबंटू बॉक्स पर स्थापित करने के लिए एक ही कमांड (sudo apt-get install clang) की आवश्यकता थी।

+1

आप XCode4 के लिए बेहतर इंतजार कर रहे हैं और फिर आप क्लैंग उपयोग देखेंगे आसमान छूने लगी। – ismail

+0

एक नोट: सीएलएंग उत्पादन सी ​​के लिए परिपक्व है, हालांकि सी ++ समर्थन अभी भी एक सतत प्रगति है, सी ++ 03 सामान्य रूप से अच्छा है, लेकिन सी ++ 0x wrt VC++ और gcc के पीछे है। हालांकि इसे सक्रिय रूप से विकसित किया जा रहा है। –

+1

मैं जीसीसी में सी प्रोग्राम करना चाहता था, क्योंकि, यह * है * संकलक है, मुझे लगता है कि मुझे बॉक्स के बाहर थोड़ा सा देखना है, मुझे वास्तव में कंपाइलर शिकायतों की अभिव्यक्ति पसंद है, इस कंपाइलर को पेश करने के लिए +1। –

उत्तर

34

मेरा सवाल यह है कि इस उपकरण का उपयोग/उससे अधिक क्यों नहीं किया गया है?

शायद यह इतिहास की वजह से है, और क्योंकि हम आम तौर पर मनुष्य कैसे व्यवहार करते हैं।

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

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

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

क्लैंग नया है, कुछ लोगों को केवल काम पर निर्भर होने पर संदेह होगा, अगर इसमें बग है, अगर यह धीमी कोड आदि उत्पन्न करता है - ऐसा लगता है कि यह मानव प्रकृति में संदिग्ध होने के लिए प्रतीत होता है - नई चीजें डरावनी हैं । कई लोग झुकाव के बारे में भी नहीं जानते हैं, कई लोग परवाह नहीं करते क्योंकि वे जीसीसी से खुश हैं।

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

6

मेरा प्रश्न यह है कि इस उपकरण का उपयोग/उससे अधिक क्यों नहीं किया गया है? क्या यह सामान्य संदिग्धों की तुलना में इतना नया है ...

यह बिल्कुल कारण है। यह अभी भी नई है और कोर कार्यक्षमता अभी भी सक्रिय रूप से विकसित की जा रही है। याद रखें कि मौजूदा प्रोजेक्ट कंपाइलर-विशिष्ट विशेषताओं का उपयोग कर रहे हैं - या पुस्तकालयों का उपयोग कर रहे हैं जो किसी भी मामले में, प्रयोगात्मक लोगों के लिए काम करने वाले औजारों को बदलने के लिए घृणा करते हैं, जिनमें अप्रत्याशित बग या अज्ञात प्रदर्शन/आकार/आदि हो सकते हैं। ट्रेडऑफ, भले ही नए उपकरण तेजी से बेहतर हो रहे हों।

+0

ध्यान रखें कि सी ++ समर्थन केवल हाल ही में पूरा हो चुका है, और अभी भी आसपास के बग्स हो सकते हैं। और डिबग प्रतीकों को अभी भी काम की ज़रूरत है (मैंने डीसीसी के मुकाबले 5x बड़ा डीबग प्रतीक आउटपुट के बारे में अफवाहें सुनाई हैं ...) – bdonlan

+1

@ बोडनान, डीबग प्रतीक आकार की समस्या केवल लिनक्स बीटीडब्ल्यू पर है। – ismail

+0

@ बोडनान: मैंने यह कहने की कोशिश की कि 'प्रयोगात्मक' के साथ, लेकिन इसे ज़ोर देना चाहिए। धन्यवाद। –

7

एलएलवीएम थोड़ी देर के लिए आसपास रहा है, लेकिन - कम से कम जंगल की मेरी गर्दन में - यह केवल हाल ही में प्रमुखता के लिए बढ़ गया है, संभवतः इस तथ्य के कारण कि ऐप्पल क्लैंग के साथ जीसीसी को बदलने के लिए देर से भारी दबाव डाल रहा है अपने स्वयं के उपकरण श्रृंखला में।

इसके अलावा, मेरा मानना ​​है कि यह सी ++ समर्थन हाल ही में उत्पादन-ग्रेड बन गया है। संपादित करें: ऐसा प्रतीत होता है कि यह अभी तक भी नहीं है। (नीचे टिप्पणियां देखें।)

एक और कारक यह हो सकता है कि एलएलवीएम का मोटे तौर पर एक विक्रेता द्वारा समर्थित किया गया है, जिस पर गैर-ऐप्पल डेवलपर्स के पास एक सहज अविश्वास है।

+3

यह उत्पादन-ग्रेड नहीं है, बस सुविधा पूर्ण (सी ++ 03)। जैसे यह क्यूटी सही ढंग से AFAIK संकलित नहीं कर सकता है (यह संकलित करता है लेकिन इकाई परीक्षण प्रतिगमन दिखाता है)। –

+0

@ तामास: टिप्पणी के लिए धन्यवाद। मैंने अपना जवाब संशोधित किया है। –

+5

+1, और मैं सिर्फ अंतिम टिप्पणी के लिए दूसरा जोड़ दूंगा! * एक विक्रेता द्वारा समर्थित, जिस पर गैर-ऐप्पल डेवलपर्स के पास एक सहज अविश्वास है। * –

9

क्लैंग फ्रंट एंड अपेक्षाकृत नया है। उदाहरण के लिए, अक्टूबर 2010 में 2.8 release सी ++ 98/03 समर्थन को पूरा करने के लिए चिह्नित करता है।

ऐसा लगता है कि बढ़ती परिपक्वता के साथ, बढ़ती गोद लेने की संभावना होगी। उदाहरण के लिए, फ्रीबीएसडी ओएस (और अन्य बीएसडी ओएस) को क्लैंग के साथ बनाने पर काम चल रहा है, जीसीसी/जी ++ पर निर्भरता को खत्म कर रहा है।

ऐप्पल एलएलवीएम/क्लैंग संयोजन को दबा रहा है। ऐसा लगता है कि वे अपनी पुरानी जीसीसी टूलचैन शाखा (4.2 के आधार पर) का समर्थन करना बंद कर देंगे और ओएसएक्स/आईओएस विकास के लिए पूरी तरह से क्लैंग टूल्स पर निर्भर रहेंगे।

बजना भी सी जैसी भाषाओं के लिए कस्टम compilers में गोद लेने में वृद्धि देख रही है (उदाहरण के लिए OpenCL के लिए शेडर भाषा संकलनकर्ता)

3

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

इस बात का उल्लेख क्यों नहीं किया जाता है, मुझे संदेह है कि जीसीसी को इतने लंबे समय से स्थापित किया गया है, क्योंकि अधिकांश उपयोगकर्ताओं के लिए यह कंपाइलर है। मेरे लिए जीसीसी ठीक काम करता है इसके अलावा यह बेहद गुप्त त्रुटि संदेश है, क्योंकि एक छात्र मुझे थोड़ा सा फेंक देता है।

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

परिशिष्ट: बजना, जीसीसी 4.8 और 4.9 में त्रुटि संदेशों में से स्पष्टता से प्रतिस्पर्धा एक महत्वपूर्ण सुधार से पता चला है के कारण; हालांकि मुझे अभी भी क्लेंग थोड़ा और स्पष्ट लगता है, हालांकि अंतराल में काफी कमी आई है।

2

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

यह आईएमएचओ, ऐसा लगता है कि कुछ लोगों को शायद पुराने संस्करणों में समस्याएं थीं। लेकिन क्लैंग संस्करण 3.0 के साथ, मुझे इनमें से कोई भी समस्या नहीं है। जैसा कि मैंने पहले देखा था, मैं वास्तव में अपनी सभी नई परियोजनाओं में इसका उपयोग कर रहा हूं। लगभग मेरा डिफ़ॉल्ट कंपाइलर, कभी-कभी मैं make C=gcc करता हूं यह देखने के लिए कि क्लैंग त्रुटि/चेतावनी में कितना अंतर है। और कभी भी झगड़ा जीत। बेहतर स्पष्टीकरण के साथ और अनुकूलन के लिए एक महान प्रयास करें। इसमें कोड एक्सटेंशन में सर्वोत्तम प्रदर्शन के लिए कंपाइलर के उपयोग एक्सटेंशन (कुछ जीसीसी इनरहिड) के लिए सुझाव शामिल हैं।

मैंने एक मामूली फ़ंक्शन लिखा था जो एक त्रुटि संदेश मुद्रित करता था। लेकिन मानक आउटपुट पर त्रुटि संदेश मुद्रित करने के बाद मैं कार्यक्रम से बाहर निकलना चाहता हूं।इसलिए, मैं एक साधारण संशोधन करता हूं, फ़ंक्शन में अंतिम विवरण के रूप में exit(1) डालता हूं। निम्नलिखित के रूप में:

void error(const char *fmt, ...) 
{ 
    va_list ap; 
    va_start(ap, fmt); 
    fprintf(stderr, "error: "); 
    vfprintf(stderr, fmt, ap); 
    va_end(ap); 
    exit(1); 
} 

और इसलिए बजना शो

चेतावनी: समारोह 'त्रुटि' विशेषता 'noreturn' के साथ [-Wmissing-noreturn] `

घोषित किया जा सकता (जीसीसी इसे -Wall -Wextra -Wunreachable-code -O3 झंडे के साथ भी नहीं उत्पादित करता है)

मैं कहता हूं "यह अच्छा लगता है। लेकिन 'nonreturn' विशेषता क्या है? मैं ' डी इस बारे में कभी नहीं सुनते या पढ़ते हैं। मैं Google पर कूदता हूं और clang could be declared with attribute 'noreturn' के लिए खोज करता हूं (ओह, हाँ, मैं सिर्फ clang nonreturn attribute लिखा था, लेकिन इसे भूल सकता था) और मुझे this लिंक मिला जो इस विशेषता के बारे में अच्छी जानकारी के साथ और मुझे प्राप्त होने वाले परफॉर्मेंस के संभावित लाभ के साथ मिला।

तो मैं इस विशेषता को अपने फ़ंक्शन प्रोटोटाइप में जोड़ने के लिए चलाता हूं (बेशक, यदि यह जीसीसी या क्लैंग कंपाइलर है; मैक्रोज़ ट्रिक-डिटेक्शन करेगा)। ओह हाँ, मेरे लिए, परफॉर्मेंस का कोई छोटा सा लाभ (बेशक, कोड को पढ़ने योग्य नहीं किए बिना) यह एक जीत है।

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

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

+2

"अनुकूलन" की आवश्यकता वाले प्रोग्राम के सभी क्षेत्रों में से, मुझे लगता है कि ऐप से बाहर निकलने का प्रदर्शन कम से कम चिंता का विषय है। –

+0

यहां अनुकूलन 1) संकलक द्वारा "nonreturn" विशेषता दिखाई देता है; 2) जब मेरे द्वारा मृत कोड '-उनेरटेबल-कोड' हटा दें – Jack

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