एलएलवीएम में पेड़ जैसी आईआर के बजाय विधानसभा जैसी आईआर क्यों है? या: क्लैंग्स एएसटी के बजाय प्रोजेक्ट्स एलएलवीएम आईआर को क्यों निशाना बनाते हैं?


14

LLVM का मध्यवर्ती प्रतिनिधित्व (LLVM IR) विधानसभा की तरह पेड़ की तरह क्यों है?

वैकल्पिक रूप से, भाषा कार्यान्वयन क्लैंग एएसटी के बजाय एलएलवीएम आईआर को लक्षित क्यों करते हैं?

मैं एक ही बार में दो अलग-अलग सवाल पूछने की कोशिश नहीं कर रहा हूँ अगर ऐसा लगता है। मेरे लिए, यह बस ऐसा लगता है जैसे क्लाइंट और लाइब्रेरी प्रोग्रामर दोनों आम सहमति में आ गए हैं कि LLVM की API, इससे अधिक और कुछ भी कम नहीं है, जाहिर है कि अच्छा सॉफ्टवेयर डिज़ाइन है और मेरा प्रश्न "क्यों?" है।

मेरे द्वारा पूछे जाने का कारण यह है कि ऐसा लगता है कि एलएलवीएम फ्रंट को अधिक कार्यक्षमता प्रदान कर सकता है यदि यह आईआर-एएसटी-जैसा था क्योंकि तब क्लैंग के एएसटी-आधारित टूल का उपयोग किसी भी फ्रंटेंड के लिए किया जा सकता है। वैकल्पिक रूप से, वे भाषाएँ जो LLVM IR को लक्षित करती हैं यदि वे क्लैंग्स एएसटी को लक्षित करती हैं तो उन्हें अधिक कार्यक्षमता मिल सकती है।

क्लैंग के पास एएसटीएस के साथ बनाने और काम करने के लिए कक्षाएं और कार्य हैं और यह एकमात्र फ्रंटएंड प्रोजेक्ट है जो एलएलवीएम प्रोजेक्ट से मजबूती से जुड़ा हुआ है, इसलिए क्लैंग की एएसटी-कार्यक्षमता एलएलवीएम के लिए बाहरी क्यों है?

मेरे सिर के ऊपर से, मुझे पता है कि जंग (जंग), डी (एलडीसी), और हास्केल (जीएचसी) सभी एलएलवीएम को बैकेंड के रूप में उपयोग कर सकते हैं, लेकिन वे क्लैंग एएसटी का उपयोग नहीं करते हैं (जहां तक ​​मुझे पता है, मैं कर सकता था) गलत हो)। मैं इन संकलकों के सभी आंतरिक विवरणों को नहीं जानता, लेकिन कम से कम जंग और डी निश्चित रूप से ऐसा लगता है कि वे क्लेंग के एएसटी के लिए संकलित किए जा सकते हैं। शायद हास्केल भी हो सकता है, लेकिन मैं इसके बारे में बहुत कम निश्चित हूं।

क्या यह ऐतिहासिक कारणों की वजह से है (LLVM मूल रूप से "निम्न स्तर की आभासी मशीन" और बाद में साथ आने वाली क्लैंग)? क्या यह इसलिए है क्योंकि अन्य सीमांत एलएलवीएम को खिलाने के लिए यथासंभव नियंत्रण चाहते हैं? क्या मौलिक कारण हैं कि क्लैंग एएसटी "नॉन-सी-लाइक" भाषाओं के लिए अनुपयुक्त है?

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


कुछ स्पष्ट लेकिन असंतोषजनक उत्तरों को पूर्व-खाली करने के लिए:

हां, असेंबली जैसी आईआर होने से आईआर को नियंत्रित करने के लिए और अधिक नियंत्रण प्राप्त होता है, जो आईआर (शायद एक्स लैंग के पास क्लैंग की तुलना में बेहतर कोडबेस और एएसटी प्रारूप है) लेकिन अगर केवल एक ही उत्तर है, तो यह सवाल बन जाता है कि "एलएलवीएम में केवल एक असेंबली क्यों होती है- एक उच्च स्तरीय वृक्ष की तरह IR के बजाय IR और एक निम्न-स्तरीय असेंबली-जैसे IR? "।

हां, प्रोग्रामिंग भाषा को एएसटी में पार्स करना मुश्किल नहीं है (कम से कम संकलन के अन्य चरणों की तुलना में)। फिर भी, अलग एएसटी का उपयोग क्यों करें? यदि और कुछ नहीं, उसी एएसटी का उपयोग करने से आपको एएसटी पर काम करने वाले टूल का उपयोग करने की अनुमति मिलती है (यहां तक ​​कि एएसटी प्रिंटर जैसी सरल चीजें भी)।

हां, मैं दृढ़ता से मानता हूं कि अधिक मॉड्यूलर होना एक अच्छी बात है, लेकिन अगर यही एकमात्र कारण है, तो अन्य भाषा कार्यान्वयन क्लैंग्स एएसटी के बजाय एलएलवीएम आईआर को लक्षित क्यों करते हैं?

ये पूर्व-गलतियाँ गलत हो सकती हैं या विवरण को अनदेखा कर सकती हैं, इसलिए यदि आपके पास अधिक विवरण हैं या मेरी धारणाएं गलत हैं, तो इन उत्तरों को देने के लिए स्वतंत्र महसूस करें।


एक अधिक निश्चित रूप से जवाब देने योग्य प्रश्न का उत्तर देने के इच्छुक किसी के लिए: विधानसभा बनाम आईआर बनाम पेड़-जैसे आईआर के फायदे और नुकसान क्या हैं?


1
मैं एलएलवीएम विशेषज्ञ नहीं हूं, लेकिन मुझे लगता है कि आपकी तरफ से थोड़ी गलतफहमी है। LLVM में IR की तरह asm नहीं है। वास्तव में, इसका आईआर एक पेड़ की तुलना में एक ग्राफ की तरह अधिक है। मेरा मानना ​​है कि 'एएसएम-लाइक' द्वारा आप मानव पठनीय आईआर (* .ll फ़ाइलों) का उल्लेख कर रहे हैं, यदि ऐसा है तो यह सिर्फ सुविधा के लिए किया जाता है। लेकिन, आइए एक वास्तविक विशेषज्ञ की प्रतीक्षा करें जो अधिक व्यापक जवाब दे सकता है :)
एलेक्सडेनिसोव

1
एक महत्वपूर्ण पहलू इतिहास हो सकता है: LLVM को मूल रूप से संकलक के खर्चों से कंपाइलर बैकएंड के लिए डिज़ाइन किया गया था। यह विचार था कि संकलक विक्रेता भाषा अनुकूलन पर प्रतिस्पर्धा करेंगे, और सीपीयू विक्रेता निम्न-स्तरीय अनुकूलन पर प्रतिस्पर्धा करेंगे। जैसे Microsoft और Apple एक दूसरे के खिलाफ प्रतिस्पर्धा करेंगे जिनके C कंपाइलर C से "सर्वश्रेष्ठ" बिटकोड का उत्पादन करते हैं, और Intel और AMD एक दूसरे के खिलाफ प्रतिस्पर्धा करेंगे जिनके LLVM बैकेंड बिटकोड से "सर्वश्रेष्ठ" मशीन कोड का उत्पादन करते हैं। एप्लिकेशन विक्रेता बिटकॉइन में अपने एप्लिकेशन शिप करेंगे, और अंतिम संकलन उपयोगकर्ता पर किया जाएगा ...
Jörg W Mittag

1
… मशीन। एलएलवीएम एक समय में शुरू हुआ, जहां यह बिल्कुल स्पष्ट नहीं था कि हर कोई इंटेल का उपयोग कर रहा होगा। Apple अभी भी PowerPC पर था, Intel अभी भी Itanium को आगे बढ़ा रहा था, और इसी तरह। AFAIK, Apple अभी भी अपने कुछ 3D फ्रेमवर्क में इस तरह से LLVM का उपयोग करता है, जहां कोड को बिटकोड के रूप में शिप किया जाता है और फिर किस तरह का कार्ड स्थापित किया जाता है, इस पर निर्भर करता है।
जोर्ग डब्ल्यू मित्तग

1
मुझे माफ़ कर दो, लेकिन IR क्या है?
एडम

जवाबों:


13

यहां कई अंतर-संबंधित प्रश्न हैं, मैं उन्हें सर्वश्रेष्ठ के रूप में अलग करने की कोशिश करूंगा।

अन्य भाषाएं LLV IR पर क्यों बनती हैं और AST से नहीं मिलती हैं?

यह केवल इसलिए है क्योंकि क्लैंग एक C / C ++ फ्रंट एंड है और एएसटी यह कसकर C / C ++ को युग्मित करता है। एक अन्य भाषा इसका उपयोग कर सकती है लेकिन इसे सी / सी ++ के कुछ सबसेट के समान शब्दार्थ के पास की आवश्यकता होगी जो बहुत सीमित है। जैसा कि आप इंगित करते हैं, एएसटी को पार्स करना काफी सीधा है, इसलिए आपके शब्दार्थ विकल्पों को सीमित करना छोटी बचत के लायक नहीं है।

हालाँकि, यदि आप C / C ++ के लिए टूलींग लिख रहे हैं, जैसे स्थैतिक विश्लेषणकर्ता, तो एएसटी को फिर से उपयोग करना बहुत मायने रखता है क्योंकि एएसटी के साथ काम करना बहुत आसान है कच्चे टेक्स्ट की तुलना में यदि आप सी / सी ++ के साथ काम कर रहे हैं। ।

एलएलवीएम आईआर यह क्यों है?

एलएलवीएम आईआर को कंपाइलर ऑप्टिमाइज़ेशन लिखने के लिए एक उपयुक्त फॉर्म के रूप में चुना गया था। जैसे, यह प्राथमिक विशेषता है कि यह एसएसए रूप में है। यह काफी निम्न स्तर की IR है ताकि यह भाषाओं की एक विस्तृत श्रृंखला पर लागू हो जैसे कि यह मेमोरी टाइप नहीं करती है क्योंकि यह भाषाओं में बहुत भिन्न होती है।

अब, ऐसा होता है कि संकलक ऑप्टिमाइज़ेशन लिखना काफी विशेषज्ञ कार्य है और अक्सर भाषा फीचर डिज़ाइन के लिए ऑर्थोगोनल होता है। हालाँकि, संकलित भाषा को तेजी से चलाना एक सामान्य आवश्यकता है। इसके अलावा, LLVM IR से ASM में रूपांतरण काफी यांत्रिक है और आमतौर पर भाषा डिजाइनरों के लिए भी दिलचस्प नहीं है।

इसलिए, एक भाषा को एलएलवीएम आईआर में कम करने से एक भाषा डिजाइनर को बहुत सारे "मुफ्त सामान" मिलते हैं जो अभ्यास में बहुत उपयोगी होते हैं जो उन्हें भाषा पर ध्यान केंद्रित करने के लिए छोड़ देते हैं।

क्या एक अलग IR उपयोगी होगा (ठीक है, पूछा नहीं गया है लेकिन निहित है)?

पूर्ण रूप से! एएसटी प्रोग्राम संरचना पर कुछ परिवर्तनों के लिए काफी अच्छे हैं, लेकिन यदि आप प्रोग्राम प्रवाह को बदलना चाहते हैं तो इसका उपयोग करना बहुत कठिन है। एक एसएसए फॉर्म आमतौर पर बेहतर होता है। हालांकि, एलएलवीएम आईआर बहुत निम्न स्तर है इसलिए उच्च स्तर की बहुत सारी संरचना खो जाती है (उद्देश्य के लिए यह अधिक सामान्यतः लागू होता है)। एएसटी और निम्न स्तर के बीच एक आईआर होना आईआर यहां फायदेमंद हो सकता है। रस्ट और स्विफ्ट दोनों इस दृष्टिकोण को लेते हैं और दोनों के बीच एक उच्च स्तरीय आईआर है।


Haskell एलएलवीएम को प्राप्त करने से पहले आईआर की एक संख्या है, साथ ही साथ।
डायलनस्प

1
@ DylanSp वास्तव में। यह जटिल भाषाओं के लिए वास्तव में सबसे अच्छा अभ्यास बनने लगा है। उदाहरण के लिए, रस्ट ने शुरुआत में ऐसा नहीं किया था और एक उच्च स्तरीय आईआर को शामिल करने के लिए फिर से काम किया है। मैं यह भी मानता हूं कि क्लैंग के लिए ऐसा करने के बारे में कुछ बात हुई है, लेकिन मुझे यकीन नहीं है कि वह कहां गई थी।
एलेक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.