2012-12-30 19 views
9

मैं थोड़ा हास्केल कंपाइलर लिख रहा हूं, और मैं जितना संभव हो उतना हास्केल 2010 को कार्यान्वित करना चाहता हूं। मेरा कंपाइलर एक मॉड्यूल पार्स कर सकता है, लेकिन एक प्रोग्राम में मॉड्यूल को पूरा करना एक गैर-मामूली कार्य लगता है। मैं मुश्किल, लेकिन शायद वैध, हास्केल मॉड्यूल के कुछ उदाहरण बना हुआ: मॉड्यूल F निर्यात G.xएज-केस हास्केल मॉड्यूल आयात और निर्यात को हल करना

module F(G.x) where 
    import F as G 
    x = 2 

यहाँ, लेकिन G.xF.x रूप में एक ही है, इसलिए मॉड्यूल F निर्यात x अगर और वह भी तब, यह निर्यात करता है x

module A(a) where 
    import B(a) 
    a = 2 

module B(a) where 
    import A(a) 

इस उदाहरण में, मॉड्यूल A के निर्यात संकलक अगर aB से आयात घोषित a = 2 रूप में ही है की जाँच करने के है, लेकिन B निर्यात a अगर और वह भी तब, A निर्यात a को हल करने।

module A(f) where 
    import B(f) 

module B(f) where 
    import A(f) 

मॉड्यूल A को हल करने के दौरान, संकलक may've मान लिया है कि fB से आयात मौजूद है, जिसका अर्थ है कि A निर्यात f, इस प्रकार BA(f) आयात और निर्यात f कर सकते हैं। एकमात्र समस्या यह है कि कहीं भी f परिभाषित नहीं है :)।

module A(module X) where 
    import A as X 
    import B as X 
    import C as X 
    a = 2 

module B(module C, C.b) where 
    import C 
    b = 3 

module C(module C) 
    import B as C 
    c = 4 

यहाँ, module निर्यात का कारण यह है कि निर्यात सूचियों एक दूसरे पर और खुद पर निर्भर हैं।

हास्केल 2010 spec द्वारा परिभाषित अनुसार ये सभी उदाहरण वैध हास्केल होना चाहिए।

मैं पूछना चाहता हूं कि क्या कोई विचार है कि हास्केल मॉड्यूल को सही तरीके से और पूरी तरह से कैसे कार्यान्वित किया जाए?

मान लें कि एक मॉड्यूल बस (सरल) चर बाइंडिंग, import रों (संभवतः as या qualified के साथ), और संभवतः योग्य चर के निर्यात सूची और module ... संक्षिप्त रूपों में शामिल है।

  • गणना प्रत्येक मॉड्यूल
  • लिंक अपने बाध्यकारी
  • लिंक हर (शायद योग्य) अपने बाध्यकारी के लिए हर मॉड्यूल में इस्तेमाल किया चर के लिए हर निर्यात चर का निर्यात किया चर के परिमित सूची: एल्गोरिथ्म करने में सक्षम हो गया है

उत्तर

9

आपको A Formal Specification for the Haskell 98 Module System में रुचि हो सकती है।

मैं ब्लॉग पोस्ट की एक श्रृंखला में कुछ दिलचस्प किनारे के मामलों को भी कवर कर रहा हूं, जिनमें से केवल first one अभी प्रकाशित हुआ है।

अंत में, मैं बिल्कुल उस पर काम कर रहा हूं - एक लाइब्रेरी जो हास्केल मॉड्यूल को संभालती है। इसे haskell-names कहा जाता है।

अपने लक्ष्यों के आधार पर, आप इसे अपने कंपाइलर में उपयोग कर सकते हैं, स्रोत कोड का अध्ययन कर सकते हैं या योगदान कर सकते हैं। (आपके उदाहरण उत्कृष्ट परीक्षण के मामले बनाएंगे।)


अपने प्रश्न का उत्तर देने के लिए: रिकर्सिव मॉड्यूल को एक निश्चित बिंदु की गणना करके संभाला जाता है।

आप मॉड्यूल ग्राफ में दृढ़ता से जुड़े घटक के साथ शुरू करते हैं। इस घटक में प्रत्येक मॉड्यूल के लिए, आप एक धारणा से शुरू करते हैं कि यह कुछ भी निर्यात नहीं करता है। फिर आप इन मॉड्यूल पर फिर से जाएं, और ताजा जानकारी के आधार पर नई निर्यात सूचियों की गणना करें। आप साबित कर सकते हैं कि यह प्रक्रिया monotonic है - हर बार जब निर्यात सूची बढ़ती है (या, कम से कम, संकीर्ण नहीं होता है)। जल्द या बाद में यह बढ़ता बंद हो जाता है - तो आप निश्चित बिंदु तक पहुंच गए हैं।

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

+0

वाह, धन्यवाद, मुझे उम्मीद नहीं थी कि वास्तव में इस समस्या को लक्षित करने वाले कागजात और पुस्तकालय हैं :) –

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