मेरे पास OS X पर llvm, clang और gcc से संबंधित एक प्रश्न है।
Llvm-gcc 4.2, llvm 2.0 और क्लैंग के बीच अंतर क्या है? मुझे पता है कि वे सभी llvm पर निर्माण करते हैं लेकिन वे अलग कैसे हैं?
तेजी से संकलन के अलावा, gcc पर llvm का क्या फायदा है?
मेरे पास OS X पर llvm, clang और gcc से संबंधित एक प्रश्न है।
Llvm-gcc 4.2, llvm 2.0 और क्लैंग के बीच अंतर क्या है? मुझे पता है कि वे सभी llvm पर निर्माण करते हैं लेकिन वे अलग कैसे हैं?
तेजी से संकलन के अलावा, gcc पर llvm का क्या फायदा है?
जवाबों:
LLVM मूल रूप से "निम्न-स्तरीय आभासी मशीन" के लिए खड़ा था, हालांकि अब यह सिर्फ अपने लिए खड़ा है क्योंकि यह एक पारंपरिक आभासी मशीन के अलावा कुछ और हो गया है। यह पुस्तकालयों और उपकरणों का एक सेट है, साथ ही एक मानकीकृत मध्यवर्ती प्रतिनिधित्व भी है, जिसका उपयोग कंपाइलर और बस-इन-टाइम कंपाइलर बनाने में मदद करने के लिए किया जा सकता है। यह अपने स्वयं के मध्यवर्ती प्रतिनिधित्व के अलावा कुछ भी संकलित नहीं कर सकता है; ऐसा करने के लिए भाषा-विशेष के दृष्टिकोण की आवश्यकता है। अगर लोग सिर्फ एलएलवीएम का संदर्भ लेते हैं, तो उनका मतलब सिर्फ निम्न-स्तरीय लाइब्रेरी और टूल्स से है। कुछ लोग क्लैग या llvm-gcc को गलत तरीके से "LLVM" के रूप में संदर्भित कर सकते हैं, जिससे कुछ भ्रम हो सकता है।
llvm-gcc GCC का संशोधित संस्करण है, जो GCC के स्वयं के बजाय LLVM को अपने बैकेंड के रूप में उपयोग करता है। अब यह ड्रैगनट्रैग के पक्ष में पदावनत हो गया है, जो जीसीसी के फोर्किंग के बिना एक ही काम करने के लिए जीसीसी के नए प्लगइन सिस्टम का उपयोग करता है।
क्लैंग एक नया सी / सी ++ / ऑब्जेक्टिव-सी कंपाइलर है, जो अपने स्वयं के फ्रंटएंड और एलएलवीएम को बैकेंड के रूप में उपयोग करता है। इसके द्वारा प्रदान किए जाने वाले फायदे बेहतर त्रुटि संदेश, तेज संकलन समय, और अन्य उपकरणों के लिए संकलन प्रक्रिया (जैसे एलएलडीबी डीबगर और क्लैग स्टैटिक विश्लेषक ) को हुक करने का एक आसान तरीका है । यह यथोचित रूप से मॉड्यूलर है, और इसलिए इसका उपयोग अन्य सॉफ्टवेयरों के लिए एक पुस्तकालय के रूप में किया जा सकता है, जिन्हें सी, सी ++, या ऑब्जेक्टिव-सी कोड का विश्लेषण करने की आवश्यकता है।
इनमें से प्रत्येक दृष्टिकोण (सादे GCC, GCC + LLVM, और Clang) के अपने फायदे और नुकसान हैं। बेंचमार्क के अंतिम कुछ सेटों को मैंने देखा है कि अधिकांश परीक्षण मामलों में जीसीसी ने थोड़ा तेज कोड का उत्पादन किया है (हालांकि एलएलवीएम में थोड़ी बढ़त थी), जबकि एलएलवीएम और क्लैंग ने काफी अच्छा संकलन समय दिया। जीसीसी और जीसीसी / एलएलवीएम कॉम्बो का लाभ यह है कि बहुत अधिक कोड का परीक्षण किया गया है और सी के जीसीसी स्वाद पर काम करता है; कुछ संकलक विशिष्ट एक्सटेंशन हैं जो केवल जीसीसी के पास हैं, और कुछ स्थान जहां मानक कार्यान्वयन को अलग करने की अनुमति देता है, लेकिन कोड एक विशेष कार्यान्वयन पर निर्भर करता है। यह बहुत अधिक संभावना है कि यदि आपको विरासत में बड़ी मात्रा में सी कोड मिलता है तो यह जीसीसी में काम करेगा कि यह क्लैंग में काम करेगा, हालांकि समय के साथ इसमें सुधार हो रहा है।
यहां 2 अलग-अलग चीजें हैं।
LLVM एक बैकएंड कंपाइलर है जिसका मतलब है कि इसके ऊपर कंपाइलर का निर्माण करना। यह अनुकूलन और लक्ष्य वास्तुकला के अनुकूल कोड के उत्पादन से संबंधित है।
CLang एक फ्रंट एंड है जो C, C ++ और ऑब्जेक्टिव C कोड को पार्स करता है और इसे LLVM के लिए उपयुक्त प्रतिनिधित्व में तब्दील करता है।
llvm gcc, 4.2 के आधार पर एक llvm आधारित C ++ कंपाइलर का एक प्रारंभिक संस्करण था, जिसे अब चित्रित किया गया है क्योंकि CLang सब कुछ पार्स कर सकता है जो इसे पार्स कर सकता है, और बहुत कुछ।
अंत में, क्लैंग और जीसीसी के बीच मुख्य अंतर उत्पादित कोड में नहीं है, लेकिन दृष्टिकोण में है। जबकि gcc अखंड है, CLang पुस्तकालयों के एक सूट के रूप में बनाया गया है। यह मॉड्यूलर डिज़ाइन उदाहरण के लिए IDE या पूर्णता उपकरण के लिए पुन: उपयोग के महान अवसर प्रदान करता है।
फिलहाल, gcc 4.6 द्वारा निर्मित कोड आमतौर पर थोड़ा तेज है, लेकिन CLang अंतर को बंद कर रहा है।
llvm-gcc-4.2 आपके कोड को पार्स करने के लिए GCC फ्रंट-एंड का उपयोग करता है, फिर LLVM का उपयोग करके संकलित आउटपुट उत्पन्न करता है।
"Llvm संकलक 2.0" आपके कोड को पार्स करने के लिए क्लैंग फ्रंट-एंड का उपयोग करता है, और LLMM का उपयोग करके संकलित आउटपुट उत्पन्न करता है। "क्लैंग" वास्तव में इस फ्रंट-एंड के लिए सिर्फ नाम है, लेकिन इसे अक्सर एक पूरे के रूप में संकलक के रूप में लापरवाही से इस्तेमाल किया जाता है।