optimization जीएचसी कार्यान्वयन के बारे में अच्छा प्रारंभिक पाठ?




compiler-construction haskell (2)

संभवतः यह एक प्रारंभिक पाठ के संदर्भ में आपके मन में नहीं था, लेकिन एडवर्ड यांग के पास हास्केल ढेर पर चर्चा करने वाले ब्लॉग पोस्ट की एक सतत श्रृंखला है, कैसे थंक्स लागू किए जाते हैं आदि।

यह चित्रण के साथ और हास्केल के लिए नए किसी के लिए बहुत अधिक जानकारी देने के बिना चित्रों के साथ दोनों मनोरंजक है। श्रृंखला में आपके कई प्रश्न शामिल हैं:

एक और तकनीकी स्तर पर, ऐसे कई कागजात हैं जो कवर करते हैं (अन्य चीजों के साथ संगीत कार्यक्रम में), जो आप जानना चाहते हैं उसके कुछ हिस्सों .:

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

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

साथ ही, जबकि मुझे पता है कि लिस्प, प्रोलॉग और अनिवार्य भाषाओं को आम तौर पर कैसे लागू किया जाता है, मुझे आलसी भाषा को लागू करने के बारे में कोई जानकारी नहीं है। मैं भी थोड़ा उत्सुक हूँ।

इसलिए मैं पूरी श्रृंखला के बारे में प्रोग्राम स्रोत से निष्पादन मॉडल तक और जानना चाहता हूं।

जिन चीज़ों के बारे में मुझे आश्चर्य है:

  • क्या सामान्य अनुकूलन लागू होते हैं?

  • मूल्यांकन के लिए कई उम्मीदवार होने पर निष्पादन आदेश क्या होता है (जबकि मुझे पता है कि यह आवश्यक आउटपुट से प्रेरित है, फिर भी पहले मूल्यांकन ए और फिर बी के बीच बड़े प्रदर्शन अंतर हो सकते हैं, या यह पता लगाने के लिए पहले बी का मूल्यांकन कर सकते हैं कि आपको आवश्यकता नहीं है ए बिल्कुल)

  • thunks कैसे प्रतिनिधित्व कर रहे हैं?

  • ढेर और ढेर कैसे उपयोग किया जाता है?

  • सीएएफ क्या है? (प्रोफाइलिंग कभी-कभी इंगित करती है कि हॉटस्पॉट वहां है, लेकिन मेरे पास कोई सुराग नहीं है)


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

क्या सामान्य अनुकूलन लागू होते हैं?

इस पर मुख्य पत्र है: हास्केल , एसएल पेटन जोन्स और ए सैंटोस, 1 99 8 के लिए एक रूपांतरण-आधारित ऑप्टिमाइज़र , जो कि समय सुधारने के लिए कोर हास्केल जैसी भाषा के प्रकार-संरक्षित परिवर्तन (रिफैक्टरिंग) को लागू करने के मॉडल जीएचसी उपयोगों का वर्णन करता है। स्मृति उपयोग इस प्रक्रिया को "सरलीकरण" कहा जाता है।

हास्केल कंपाइलर में किए गए विशिष्ट चीजों में शामिल हैं:

  • इनलाइन किए जाने वाले;
  • बीटा कमी;
  • मृत कोड उन्मूलन;
  • परिस्थितियों में परिवर्तन: केस-ऑफ-केस, केस विचलन।
  • बॉक्स से निकालना;
  • निर्मित उत्पाद वापसी;
  • पूर्ण आलस्य परिवर्तन;
  • विशेषज्ञता;
  • ईटा विस्तार;
  • लैम्ब्डा उठाना;
  • कठोरता विश्लेषण।

और कभी - कभी:

  • स्थिर तर्क परिवर्तन;
  • निर्माण / फ़ोल्डर या स्ट्रीम संलयन;
  • सामान्य उप-अभिव्यक्ति उन्मूलन;
  • कन्स्ट्रक्टर विशेषज्ञता।

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

मूल्यांकन के लिए कई उम्मीदवार होने पर निष्पादन आदेश क्या होता है

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

आम तौर पर, यह देखने के लिए कि निष्पादन आदेश क्या है, कोर को देखें, उदाहरण के लिए ghc-core टूल। कोर के लिए एक परिचय अनुकूलन पर आरडब्ल्यूएच अध्याय में है।

Thunks कैसे प्रतिनिधित्व कर रहे हैं?

थंक्स को कोड पॉइंटर के साथ ढेर-आवंटित डेटा के रूप में दर्शाया जाता है।

ढेर वस्तुओं के लेआउट देखें। विशेष रूप से, देखें कि कैसे thunks का प्रतिनिधित्व किया जाता है

ढेर और ढेर कैसे उपयोग किया जाता है?

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

  • (बॉक्सिंग) वस्तुओं को वैश्विक ढेर पर आवंटित किया जाता है;
  • प्रत्येक थ्रेड ऑब्जेक्ट में ढेर होता है , जिसमें ढेर ऑब्जेक्ट्स के समान लेआउट वाले फ़्रेम होते हैं;
  • जब आप फ़ंक्शन कॉल करते हैं, तो आप स्टैक पर मानों को धक्का देते हैं और फ़ंक्शन पर कूदते हैं;
  • यदि कोड को एक कन्स्ट्रक्टर आवंटित करने की आवश्यकता है, तो डेटा ढेर पर रखा जाता है।

स्टैक उपयोग मॉडल को गहराई से समझने के लिए, "पुल / एंटर बनाम इवल / लागू करें" देखें

सीएएफ क्या है?

एक "निरंतर आवेदक फॉर्म"। अपने कार्यक्रम के निष्पादन के जीवनकाल के लिए आपके कार्यक्रम में आवंटित एक शीर्ष स्तर स्थिरांक के रूप में। चूंकि उन्हें स्थाई रूप से आवंटित किया जाता है , इसलिए उन्हें विशेष रूप से कचरा कलेक्टर द्वारा इलाज किया जाना चाहिए।

संदर्भ और आगे पढ़ने :





heap-memory