2009-05-03 3 views
24

मैं के बारे में LLVM काफी कम किसी भी प्रणाली, मॉडल करने के लिए किया जा रहा उत्साहित किया गया है और यह के रूप में होनहार एप्पल यह गोद लेने गया था कि देखा गया है; लेकिन फिर फिर से ऐप्पल विशेष रूप से Haskell का समर्थन नहीं करता है;एलएलवीएम बनाम सी--; एलएसवीएम मूल रूप से सीस्क की तुलना में हास्केल के लिए बेहतर क्यों नहीं हो सकता है?

और, कुछ लगता है कि हास्केल C-- के साथ बंद बेहतर होगा:

LLVM'ers शून्य भूमि के ऊपर कचरा संग्रहण की समस्या हल नहीं किया है वह बहुत आश्चर्य की बात नहीं है। इस सुलझाने जबकि डाटा मॉडल के नास्तिक रह कंप्यूटर विज्ञान में एक खुला प्रश्न है।

- LHC won't be using LLVM.

+10

आपको ब्लॉग –

+1

प्राप्त करने की आवश्यकता है, आपको इस तरह के लंबे उद्धरणों के लिए उद्धरण विकल्प का उपयोग करने की आवश्यकता है। – Unknown

+0

संपादन यह दिखाता है कि यह * ब्लॉग से चिपकाया गया था। – ShreevatsaR

उत्तर

21

ठीक है, UNSW में एक परियोजना LLVM को GHC कोर अनुवाद करने के लिए है

याद रखें: यह स्पष्ट नहीं था कि 10 साल पहले LLVM सभी बुनियादी सुविधाओं के सी का निर्माण होगा - करने में सक्षम नहीं था। दुर्भाग्य से, एलएलवीएम में पोर्टेबल, अनुकूलित कोड के लिए बुनियादी ढांचा है, लेकिन अच्छे उच्च स्तरीय भाषा समर्थन के लिए आधारभूत संरचना नहीं है, जो सी - हेक्टेयर डी है।

एक दिलचस्प परियोजना C-- से LLVM लक्षित करने के लिए ... होगा


अद्यतन, GHC 7, GHC uses LLVM for code generation के रूप में। -fllvm ध्वज का उपयोग करें। इसने कुछ निम्न स्तर के कार्यक्रमों के लिए संख्यात्मक प्रदर्शन में सुधार किया है। अन्यथा, प्रदर्शन पुराने जीसीसी बैकएंड के समान है।

+0

। बहुत बढ़िया जवाब; जो कि सिर्फ अंधेस्पस्पॉट था- पूर्ववत मैं देख रहा था! । llvm'ers समवर्ती समर्थन की कमी के लिए एक समान प्रतिक्रिया थी: यह एक ऐड-ऑन लाइब्रेरी चीज है। । सी - को llvm, पर पोर्ट किया जा सकता है जिसका अर्थ है कि llvm का gc बस उपयोग नहीं किया जाएगा। –

+1

लिंक अब काम नहीं कर रहा है :(, क्या आखिरी अपडेट के बाद स्थिति बदल गई है? –

12

GHC अब आधिकारिक तौर पर एक LLVM बैकएंड है, और यह पता चला है कि यह competitive with the GCC and native-codegen and actually faster in some cases है। और एलएलवीएम प्रोजेक्ट has accepted the new calling convention डेविड टेरेई ने एलएलवीएम पर हास्केल के लिए बनाया, तो आश्चर्यजनक रूप से, दोनों परियोजनाएं वास्तव में एक साथ काम कर रही हैं।

25

नई कोड पीढ़ी के बैकएंड के साथ थोड़ा सा काम करने के साथ जो सी - का उपयोग करता है, मैं कह सकता हूं कि कई कारण हैं कि सी - एलएलवीएम से बेहतर क्यों हो सकता है, और क्यों वे वास्तव में बिल्कुल नहीं हैं वही चीज।

  1. सी-- एलएलवीएम की तुलना में उच्च स्तर के अमूर्तता पर संचालित होता है; उदाहरण के लिए, हम सी में कोड उत्पन्न कर सकते हैं - जहां स्टैक पॉइंटर पूरी तरह से निहित है, और संकलन प्रक्रिया के दौरान बाद में इसे प्रकट करता है। इससे कुछ प्रकार के अनुकूलन बहुत आसान हो जाते हैं, क्योंकि उच्च स्तर का प्रतिनिधित्व कम आविष्कारों के साथ अधिक कोड गति की अनुमति देता है।

  2. जब तक हम सक्रिय रूप से इसे ठीक करने के लिए देख रहे हैं, LLVM एक ही समस्या से ग्रस्त है कि के माध्यम से सी बैकएंड का सामना करना पड़ा: यह proc अंक बनाने के लिए हमें की आवश्यकता है। प्रो पॉइंट क्या हैं? अनिवार्य रूप से, क्योंकि हास्केल क्लासिक कॉल/सेवानिवृत्त बुला सम्मेलन का उपयोग नहीं करता, जब भी हम एक subprocedure कॉल की नैतिक बराबर करते हैं तो हम ढेर पर एक निरंतरता पुश करने के लिए और फिर subprocedure के लिए कूद की जरूरत है। यह निरंतरता आमतौर पर एक स्थानीय लेबल होता है, लेकिन एलएलवीएम को यह एक वास्तविक प्रक्रिया होने की आवश्यकता होती है, इसलिए हमें छोटे टुकड़ों में कार्यों को तोड़ने की आवश्यकता होती है (प्रत्येक टुकड़ा को प्रो पॉइंट कहा जाता है)। अनुकूलन के लिए यह बुरी खबर है, जो प्रक्रिया-स्तर पर काम करती है।

  3. C-- और LLVM dataflow अनुकूलन करने के लिए एक अलग दृष्टिकोण रखना।एलएलवीएम पारंपरिक एसएसए शैली का उपयोग फाई-नोड्स के साथ करता है: सी-- हुप्पल नामक एक शांत ढांचे का उपयोग करता है जिसे आपको एसएसए इनवेरिएंट को बनाए रखने की आवश्यकता नहीं होती है। मैं पुष्टि कर सकता हूं: हुप्ल में प्रोग्रामिंग अनुकूलन बहुत मजेदार है, हालांकि कुछ प्रकार के अनुकूलन (एक बार उपयोग किए जाने वाले चर के इनलाइनिंग को ध्यान में रखना) इस डेटाफ्लो सेटिंग में बिल्कुल प्राकृतिक नहीं हैं।

+0

जब आप सी कहते हैं, तो क्या आप मुख्य सी-- कार्यान्वयन या जीएचसी के सीएम संस्करण का जिक्र कर रहे हैं। – refi64

2

अभ्यास में एक मुद्दा एलएलवीएम एक चलती लक्ष्य के बहुत अधिक रहा है।

जीएचसी को एलएलवीएम के कई संस्करणों का समर्थन करने की कोशिश करने में कुछ परेशानी हुई है। इस बारे में ghc-dev मेलिंग सूची पर एक सक्रिय discussion है।

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

इसके अलावा, ऐतिहासिक रूप से, और वर्तमान में AFAIK, एलएलवीएम प्रोजेक्ट पोर्टेबल प्लेटफ़ॉर्म प्रदान करने से प्राथमिकता नहीं देता है, और कुछ डेवलपर्स ने यह वर्णन किया है कि यह is a compiler IR and not a form of portable assembly language है।

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

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

संबंधित मुद्दे