2011-04-18 9 views
113

पर बजना बनाम मैं एक सवाल ओएस एक्सLLVM ओएस एक्स

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

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

+8

llvm केवल एक बैकएंड है, एक स्टैंडअलोन llvm कंपाइलर नहीं हो सकता है ... इसके लिए केवल अलग-अलग अग्रभाग हैं, जैसे कि जीसीसी और क्लैंग। – smerlin

+3

@ स्मारकिन: "llvm कंपाइलर" क्लैंग + llvm के लिए ऐप्पल का व्यापार नाम है: http://developer.apple.com/technologies/tools/whats-new.html#llvm-compiler –

+0

अन्य विवरण यहां: http: // stackoverflow .com/a/26724886/1 9 38163 –

उत्तर

168

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

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

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

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

+4

इस स्पष्टीकरण के लिए धन्यवाद :) – flumpb

+8

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

+3

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

5

LLVM-जीसीसी-4.2, अपने कोड पार्स करने के लिए जीसीसी सामने के अंत का उपयोग करता है तो संकलित उत्पादन LLVM का उपयोग कर उत्पन्न करता है।

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

43

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

LLVM एक बैकएंड संकलक यह की चोटी पर compilers का निर्माण करने के लिए होती है। यह लक्ष्य आर्किटेक्चर के अनुकूल अनुकूलित कोड के अनुकूलन और उत्पादन से संबंधित है।

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

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

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

फिलहाल, कोड जीसीसी 4.6 द्वारा उत्पादित आम तौर पर एक सा तेजी से होता है, लेकिन बजना अंतराल बंद हो रहा है।