जीसीसी बनाम क्लैंग / एलएलवीएम - प्रत्येक के पेशेवरों और विपक्ष [बंद]


20

GCC vs clang / LLVM के पेशेवरों और विपक्ष क्या हैं?


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

जवाबों:


19

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

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


17
  1. क्लैंग की रिपोर्ट करने में बेहतर त्रुटि है। उदाहरण के लिए, यदि आप किसी फ़ंक्शन नाम से आपको कॉल करते हैं, तो Clang रिपोर्ट करेगा कि यह संभवतः एक टाइपो है (और सही नाम का सुझाव दें), जबकि GCC अज्ञात फ़ंक्शन नाम के बारे में शिकायत करेगा।

  2. यदि आप x86 / x86-64 को लक्षित करते हैं तो जीसीसी आमतौर पर तेज कोड का उत्पादन करता है। एआरएम के लिए स्थिति अस्पष्ट है, अक्सर क्लैंग बेहतर अनुकूलन करता है। इसके अलावा, AFAIK Clang कोड आकार के लिए अनुकूलन का समर्थन नहीं करता है।

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

  4. जेरी कॉफ़िन के विपरीत, मुझे लगता है कि जीसीसी का निर्माण क्लैंग की तुलना में बहुत कठिन है। क्लैंग के गेटिंग स्टार्टेड पेज से प्रक्रिया हमेशा मेरे लिए काम करती थी। जीसीसी के लिए इसी तरह के मैनुअल ने पहले प्रयास में कभी काम नहीं किया। GCC के GMP, MPFR, MPC, पर्मा पॉलीहेड्रा लाइब्रेरी और CLooG के विशेष संस्करणों पर निर्भरताएं हैं, और मुझे उन संस्करणों को खोजने के लिए कई पुनरावृत्तियों की आवश्यकता है जो एक विशेष GCC रिलीज़ के लिए काम करेंगे (हाँ, उन पुस्तकालयों के नवीनतम संस्करणों का उपयोग करने से काम नहीं चलता है) )।

  5. मुझे लग रहा है कि जीसीसी की तुलना में क्लैंग का परीक्षण बेहतर है। भले ही मैं केवल जीसीसी के आधिकारिक रिलीज का उपयोग करता हूं, लेकिन कभी-कभी यह दोषपूर्ण कोड का उत्पादन करता है। क्लैंग के लिए मैं आमतौर पर ट्रंक संस्करण का उपयोग करता हूं (फिर से, क्योंकि यह निर्माण करना आसान है), लेकिन मैंने कभी भी इसे गलत आउटपुट उत्पन्न करते नहीं देखा।

  6. लिनक्स की दुनिया में जीसीसी लगभग मानक है, और यह बहुत सारे गैर-मानक सुविधाओं को जोड़ता है जो लिनक्स सॉफ्टवेयर में व्यापक रूप से उपयोग किए जाते हैं। क्लैंग जीसीसी के साथ संगत होने की कोशिश करता है, लेकिन कभी-कभी यह चुपचाप उन्हें अनदेखा कर देता है। सबसे महत्वपूर्ण बात, क्लैंग ओपनएमपी का समर्थन नहीं करता है। हालाँकि, इसमें ऐसे एक्सटेंशन भी हैं जो GCC द्वारा समर्थित नहीं हैं, लेकिन उपयोगी हो सकते हैं (जैसे ऐड-इन-कैरी आंतरिक कार्य __buildin_addc)।

  7. यदि आप संकलक अनुसंधान करना चाहते हैं, या बस इसके बारे में उत्सुक हैं कि यह कैसे काम करता है, तो आप Clang / LLVM स्रोत कोड को अधिक सुलभ पाएंगे। क्लैंग / एलएलवीएम कोड मानव-पठनीय है, केवल संकलक-पठनीय नहीं है।

  8. (AINAL डिस्क्लेमर लागू होता है) Clang / LLVM लाइसेंस आपको इस बारे में अधिक स्वतंत्रता देता है कि आप कोड के साथ क्या कर सकते हैं, जैसे वाणिज्यिक या बंद-स्रोत उत्पाद में उपयोग करें। जीसीसी रनटाइम लाइब्रेरी के लिए लाइसेंस प्रतिबंधों की एक और परत जोड़ता है जबकि क्लैंग कंपाइलर रनटाइम (कंपाइलर-आरटी लाइब्रेरी) अनुमेय एमआईटी लाइसेंस के तहत है।

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


दिलचस्प है, मैंने कभी नहीं जाना है कि क्लैंग ने ऐड-इन-कैरी आंतरिक है। लेकिन यह होना चाहिए __builtin_add, नहीं __buildin_addc। वैसे भी, क्लैंग उत्पन्न करने के लिए काफी स्मार्ट है, addcजब इसे कैरी के रूप में तुलना करते हुए एक विस्तृत ऐड का सामना करना पड़ता है
phuclv

मेरा मतलब __builtin_addcनहीं है__buildin_addc
फुल्विक

प्रदर्शन की तुलना यहां पुरानी है। अधिक हालिया बेंचमार्क के अनुसार, क्लैग x86 / 64 से थोड़ा अधिक आधे परीक्षणों में तेजी से होता है (उदाहरण के लिए openbenchmarking.org/result/1605071-HA-GCCCLANG568 )
जूल्स

3

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


-3

आज (8/11/2011), जीसीसी क्लैंग की तुलना में सी ++ 0x सुविधाओं का बहुत अधिक समर्थन करता है। यदि आप उन सुविधाओं को चाहते हैं, तो यह एक बिना दिमाग वाला है; जीसीसी आपका विकल्प है।


यह उत्तर मेरे शोध के अनुसार निर्दिष्ट समय सीमा के भीतर सटीक और सूचनात्मक है।

8
लेकिन वास्तव में एक बहुत अच्छा जवाब नहीं है, क्योंकि आज (28/07/2012) के अनुसार यह बिंदु अब वैध नहीं है। क्लैंग जीसीसी से अधिक का समर्थन करता है, अगर कुछ भी।
डेडएमजी जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.