2012-02-08 13 views
8

जब मैं निम्न तरीकों में से एक में एक मुख्य मॉड्यूल में एक (बड़ा) मॉड्यूल आयात: जब मैं डॉन की तुलना मेंहास्केल: मॉड्यूल आयात के साथ अनावश्यक द्विआधारी विकास

import Mymodule 
import qualified Mymodule as M 
import Mymodule (MyDatatype) 

संकलित बाइनरी ही भारी मात्रा में बढ़ता है उस मॉड्यूल को आयात नहीं करते हैं। यह इस बात पर ध्यान दिए बिना कि मैं उस मॉड्यूल के अंदर कुछ भी उपयोग करता हूं या नहीं, मुख्य मॉड्यूल में। संकलक नहीं होना चाहिए (मैं डेबियन परीक्षण पर जीएचसी का उपयोग कर रहा हूं) केवल इसे चलाने के लिए आवश्यक बाइनरी में जोड़ना चाहिए?

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

उत्तर

17

जहां तक ​​जीएचसी का संबंध है, आयात सूचियां केवल पठनीयता के लिए हैं और नाम संघर्ष से परहेज करती हैं; वे जो भी जुड़ा हुआ है उस पर असर नहीं डालते हैं।

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

डिफ़ॉल्ट रूप से, जीएचसी केवल आपके द्वारा उपयोग किए जाने वाले टुकड़ों की बजाय पूरे पुस्तकालयों में लिंक करता है; आप GHC को -split-objs विकल्प के साथ पुस्तकालयों का निर्माण करके इस से बच सकते हैं (या यूनिक्स) पर अपने कबाल से स्थापित विन्यास फाइल में split-objs: True डाल (~/.cabal/config), लेकिन यह नीचे संकलन धीमा कर देती है, और उचित रूप में GHC डेवलपर्स द्वारा अनुशंसित नहीं है:

-split-objs

लिंकर बताओ कि आम तौर पर एक से अधिक वस्तु फ़ाइलों, शीर्ष स्तर के हास्केल समारोह या मॉड्यूल में एक प्रकार से एक में उत्पन्न होगा एक वस्तु फ़ाइल विभाजित करने के लिए। यह केवल पुस्तकालयों के लिए समझ में आता है, जहां इसका मतलब है कि पुस्तकालय के खिलाफ जुड़े निष्पादन योग्य छोटे होते हैं क्योंकि वे केवल उन ऑब्जेक्ट फ़ाइलों के विरुद्ध लिंक करते हैं जिन्हें उनकी आवश्यकता होती है। हालांकि, सभी वर्गों को अलग से इकट्ठा करना महंगा है, इसलिए यह सामान्य रूप से संकलित करने से धीमा है। इसके अतिरिक्त, लाइब्रेरी का आकार (.a फ़ाइल) 2 से 2.5 बड़ा का कारक हो सकता है। हम जीएचसी पुस्तकालयों के निर्माण के लिए इस सुविधा का उपयोग करते हैं।

- The GHC manual

यह पुस्तकालयों का उपयोग करें, आप क्या आयात की परवाह किए बिना की अप्रयुक्त भागों को छोड़ देगा।

आपको shared Haskell libraries का उपयोग करने में भी रुचि हो सकती है।

+0

उद्धरण ईहर्ड: "जहां तक ​​जीएचसी का संबंध है, आयात सूचियां केवल पठनीयता के लिए हैं और नाम संघर्ष से परहेज करती हैं; वे जो भी जुड़ा हुआ है उसे प्रभावित नहीं करते हैं।" यह सच नहीं हो सकता है, क्योंकि आकार में वृद्धि तब भी होती है जब मैं केवल मॉड्यूल में कुछ भी उपयोग किए बिना मुख्य मॉड्यूल में "आयात Mymodule" डालता हूं। – Josephine

+1

"आयात सूची" मॉड्यूल नाम के बाद कोष्ठक में आयात करने के लिए पहचानकर्ताओं की सूची को संदर्भित करता है, न कि मॉड्यूल के शीर्ष पर आयात विवरणों की सूची। – ehird

+0

ठीक है, यह समझ में आता है। स्पष्टीकरण और बहुत ही जानकारीपूर्ण उत्तर के लिए धन्यवाद! – Josephine

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