ओएस एक्स पर एलएलवीएम बनाम क्लैंग


133

मेरे पास OS X पर llvm, clang और gcc से संबंधित एक प्रश्न है।

Llvm-gcc 4.2, llvm 2.0 और क्लैंग के बीच अंतर क्या है? मुझे पता है कि वे सभी llvm पर निर्माण करते हैं लेकिन वे अलग कैसे हैं?

तेजी से संकलन के अलावा, gcc पर llvm का क्या फायदा है?


9
llvm केवल एक बैकएंड है, वहाँ एक स्टैंडअलोन llvm संकलक नहीं हो सकता ... इसके लिए केवल अलग-अलग दृश्य हैं, जैसे gcc और clang।
स्मरलिन

4
@ शेमलिन: "llvm कंपाइलर" क्लैंग + llvm के लिए Apple का व्यापार नाम है: developer.apple.com/technologies/tools/…
स्टीफन कैनन

यहाँ अन्य विवरण: stackoverflow.com/a/26724886/1938163
मार्को ए।

जवाबों:


201

LLVM मूल रूप से "निम्न-स्तरीय आभासी मशीन" के लिए खड़ा था, हालांकि अब यह सिर्फ अपने लिए खड़ा है क्योंकि यह एक पारंपरिक आभासी मशीन के अलावा कुछ और हो गया है। यह पुस्तकालयों और उपकरणों का एक सेट है, साथ ही एक मानकीकृत मध्यवर्ती प्रतिनिधित्व भी है, जिसका उपयोग कंपाइलर और बस-इन-टाइम कंपाइलर बनाने में मदद करने के लिए किया जा सकता है। यह अपने स्वयं के मध्यवर्ती प्रतिनिधित्व के अलावा कुछ भी संकलित नहीं कर सकता है; ऐसा करने के लिए भाषा-विशेष के दृष्टिकोण की आवश्यकता है। अगर लोग सिर्फ एलएलवीएम का संदर्भ लेते हैं, तो उनका मतलब सिर्फ निम्न-स्तरीय लाइब्रेरी और टूल्स से है। कुछ लोग क्लैग या llvm-gcc को गलत तरीके से "LLVM" के रूप में संदर्भित कर सकते हैं, जिससे कुछ भ्रम हो सकता है।

llvm-gcc GCC का संशोधित संस्करण है, जो GCC के स्वयं के बजाय LLVM को अपने बैकेंड के रूप में उपयोग करता है। अब यह ड्रैगनट्रैग के पक्ष में पदावनत हो गया है, जो जीसीसी के फोर्किंग के बिना एक ही काम करने के लिए जीसीसी के नए प्लगइन सिस्टम का उपयोग करता है।

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

इनमें से प्रत्येक दृष्टिकोण (सादे GCC, GCC + LLVM, और Clang) के अपने फायदे और नुकसान हैं। बेंचमार्क के अंतिम कुछ सेटों को मैंने देखा है कि अधिकांश परीक्षण मामलों में जीसीसी ने थोड़ा तेज कोड का उत्पादन किया है (हालांकि एलएलवीएम में थोड़ी बढ़त थी), जबकि एलएलवीएम और क्लैंग ने काफी अच्छा संकलन समय दिया। जीसीसी और जीसीसी / एलएलवीएम कॉम्बो का लाभ यह है कि बहुत अधिक कोड का परीक्षण किया गया है और सी के जीसीसी स्वाद पर काम करता है; कुछ संकलक विशिष्ट एक्सटेंशन हैं जो केवल जीसीसी के पास हैं, और कुछ स्थान जहां मानक कार्यान्वयन को अलग करने की अनुमति देता है, लेकिन कोड एक विशेष कार्यान्वयन पर निर्भर करता है। यह बहुत अधिक संभावना है कि यदि आपको विरासत में बड़ी मात्रा में सी कोड मिलता है तो यह जीसीसी में काम करेगा कि यह क्लैंग में काम करेगा, हालांकि समय के साथ इसमें सुधार हो रहा है।


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

5
MacOS X या iOS के लिए निर्माण करते समय, विचार करें कि Clang वह सॉफ़्टवेयर है, जिसका उपयोग Apple ऑपरेटिंग सिस्टम सहित अपने सभी MacOS X और iOS सॉफ़्टवेयर का निर्माण करने के लिए करता है, और यह कि Clang वही है जो आपको स्वचालित रूप से प्राप्त होता है, बिना किसी प्रयास के, और वह सब जो आप कभी भी प्राप्त करेंगे। मदद के लिए पूछ का उपयोग कर रहा है। Apple ने कभी भी gcc पिछले gcc 4.2 का समर्थन नहीं किया है, और अब gcc के किसी भी संस्करण को शिप नहीं करता है।
gnasher729

1
@ gnasher729, हाँ, यह उत्तर 3 साल पहले लिखा गया था, जब Apple अभी भी llvm-gcc और Clang दोनों को शिपिंग कर रहा था, साथ में डिफ़ॉल्ट कंपाइलर के रूप में llvm-gcc था। तब से अब तक समय बदल गया है।
ब्रायन कैंपबेल

54

यहां 2 अलग-अलग चीजें हैं।

LLVM एक बैकएंड कंपाइलर है जिसका मतलब है कि इसके ऊपर कंपाइलर का निर्माण करना। यह अनुकूलन और लक्ष्य वास्तुकला के अनुकूल कोड के उत्पादन से संबंधित है।

CLang एक फ्रंट एंड है जो C, C ++ और ऑब्जेक्टिव C कोड को पार्स करता है और इसे LLVM के लिए उपयुक्त प्रतिनिधित्व में तब्दील करता है।

llvm gcc, 4.2 के आधार पर एक llvm आधारित C ​​++ कंपाइलर का एक प्रारंभिक संस्करण था, जिसे अब चित्रित किया गया है क्योंकि CLang सब कुछ पार्स कर सकता है जो इसे पार्स कर सकता है, और बहुत कुछ।

अंत में, क्लैंग और जीसीसी के बीच मुख्य अंतर उत्पादित कोड में नहीं है, लेकिन दृष्टिकोण में है। जबकि gcc अखंड है, CLang पुस्तकालयों के एक सूट के रूप में बनाया गया है। यह मॉड्यूलर डिज़ाइन उदाहरण के लिए IDE या पूर्णता उपकरण के लिए पुन: उपयोग के महान अवसर प्रदान करता है।

फिलहाल, gcc 4.6 द्वारा निर्मित कोड आमतौर पर थोड़ा तेज है, लेकिन CLang अंतर को बंद कर रहा है।


5

llvm-gcc-4.2 आपके कोड को पार्स करने के लिए GCC फ्रंट-एंड का उपयोग करता है, फिर LLVM का उपयोग करके संकलित आउटपुट उत्पन्न करता है।

"Llvm संकलक 2.0" आपके कोड को पार्स करने के लिए क्लैंग फ्रंट-एंड का उपयोग करता है, और LLMM का उपयोग करके संकलित आउटपुट उत्पन्न करता है। "क्लैंग" वास्तव में इस फ्रंट-एंड के लिए सिर्फ नाम है, लेकिन इसे अक्सर एक पूरे के रूप में संकलक के रूप में लापरवाही से इस्तेमाल किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.