LLVM का मध्यवर्ती प्रतिनिधित्व (LLVM IR) विधानसभा की तरह पेड़ की तरह क्यों है?
वैकल्पिक रूप से, भाषा कार्यान्वयन क्लैंग एएसटी के बजाय एलएलवीएम आईआर को लक्षित क्यों करते हैं?
मैं एक ही बार में दो अलग-अलग सवाल पूछने की कोशिश नहीं कर रहा हूँ अगर ऐसा लगता है। मेरे लिए, यह बस ऐसा लगता है जैसे क्लाइंट और लाइब्रेरी प्रोग्रामर दोनों आम सहमति में आ गए हैं कि LLVM की API, इससे अधिक और कुछ भी कम नहीं है, जाहिर है कि अच्छा सॉफ्टवेयर डिज़ाइन है और मेरा प्रश्न "क्यों?" है।
मेरे द्वारा पूछे जाने का कारण यह है कि ऐसा लगता है कि एलएलवीएम फ्रंट को अधिक कार्यक्षमता प्रदान कर सकता है यदि यह आईआर-एएसटी-जैसा था क्योंकि तब क्लैंग के एएसटी-आधारित टूल का उपयोग किसी भी फ्रंटेंड के लिए किया जा सकता है। वैकल्पिक रूप से, वे भाषाएँ जो LLVM IR को लक्षित करती हैं यदि वे क्लैंग्स एएसटी को लक्षित करती हैं तो उन्हें अधिक कार्यक्षमता मिल सकती है।
क्लैंग के पास एएसटीएस के साथ बनाने और काम करने के लिए कक्षाएं और कार्य हैं और यह एकमात्र फ्रंटएंड प्रोजेक्ट है जो एलएलवीएम प्रोजेक्ट से मजबूती से जुड़ा हुआ है, इसलिए क्लैंग की एएसटी-कार्यक्षमता एलएलवीएम के लिए बाहरी क्यों है?
मेरे सिर के ऊपर से, मुझे पता है कि जंग (जंग), डी (एलडीसी), और हास्केल (जीएचसी) सभी एलएलवीएम को बैकेंड के रूप में उपयोग कर सकते हैं, लेकिन वे क्लैंग एएसटी का उपयोग नहीं करते हैं (जहां तक मुझे पता है, मैं कर सकता था) गलत हो)। मैं इन संकलकों के सभी आंतरिक विवरणों को नहीं जानता, लेकिन कम से कम जंग और डी निश्चित रूप से ऐसा लगता है कि वे क्लेंग के एएसटी के लिए संकलित किए जा सकते हैं। शायद हास्केल भी हो सकता है, लेकिन मैं इसके बारे में बहुत कम निश्चित हूं।
क्या यह ऐतिहासिक कारणों की वजह से है (LLVM मूल रूप से "निम्न स्तर की आभासी मशीन" और बाद में साथ आने वाली क्लैंग)? क्या यह इसलिए है क्योंकि अन्य सीमांत एलएलवीएम को खिलाने के लिए यथासंभव नियंत्रण चाहते हैं? क्या मौलिक कारण हैं कि क्लैंग एएसटी "नॉन-सी-लाइक" भाषाओं के लिए अनुपयुक्त है?
मैं इस सवाल को दिमाग में रखने की कवायद नहीं करता। मैं बस यह चाहता हूं कि यह उन लोगों के लिए मददगार हो, जो उत्सुक हैं, लेकिन पहले से ही धाराप्रवाह डिजाइन नहीं कर रहे हैं। चूंकि LLVM और क्लैंग प्रोजेक्ट्स सार्वजनिक रूप से विकसित किए गए हैं, इसलिए मैं उम्मीद कर रहा हूं कि इन प्रोजेक्ट्स के विकास से परिचित कोई व्यक्ति उत्तर दे सकता है या यह उत्तर कुछ संकलित नॉरड्स के लिए पर्याप्त है कि वे उत्तर देने के लिए पर्याप्त आत्मविश्वास महसूस करते हैं।
कुछ स्पष्ट लेकिन असंतोषजनक उत्तरों को पूर्व-खाली करने के लिए:
हां, असेंबली जैसी आईआर होने से आईआर को नियंत्रित करने के लिए और अधिक नियंत्रण प्राप्त होता है, जो आईआर (शायद एक्स लैंग के पास क्लैंग की तुलना में बेहतर कोडबेस और एएसटी प्रारूप है) लेकिन अगर केवल एक ही उत्तर है, तो यह सवाल बन जाता है कि "एलएलवीएम में केवल एक असेंबली क्यों होती है- एक उच्च स्तरीय वृक्ष की तरह IR के बजाय IR और एक निम्न-स्तरीय असेंबली-जैसे IR? "।
हां, प्रोग्रामिंग भाषा को एएसटी में पार्स करना मुश्किल नहीं है (कम से कम संकलन के अन्य चरणों की तुलना में)। फिर भी, अलग एएसटी का उपयोग क्यों करें? यदि और कुछ नहीं, उसी एएसटी का उपयोग करने से आपको एएसटी पर काम करने वाले टूल का उपयोग करने की अनुमति मिलती है (यहां तक कि एएसटी प्रिंटर जैसी सरल चीजें भी)।
हां, मैं दृढ़ता से मानता हूं कि अधिक मॉड्यूलर होना एक अच्छी बात है, लेकिन अगर यही एकमात्र कारण है, तो अन्य भाषा कार्यान्वयन क्लैंग्स एएसटी के बजाय एलएलवीएम आईआर को लक्षित क्यों करते हैं?
ये पूर्व-गलतियाँ गलत हो सकती हैं या विवरण को अनदेखा कर सकती हैं, इसलिए यदि आपके पास अधिक विवरण हैं या मेरी धारणाएं गलत हैं, तो इन उत्तरों को देने के लिए स्वतंत्र महसूस करें।
एक अधिक निश्चित रूप से जवाब देने योग्य प्रश्न का उत्तर देने के इच्छुक किसी के लिए: विधानसभा बनाम आईआर बनाम पेड़-जैसे आईआर के फायदे और नुकसान क्या हैं?