संकलक अन्य वर्गों और उनके गुणों के बारे में कैसे जानते हैं?


14

मैं अपनी पहली प्रोग्रामिंग लैंग्वेज लिख रहा हूं जो ऑब्जेक्ट ओरिएंटेड है और अब तक सिंगल 'क्लास' बनाने के साथ अच्छी है। लेकिन, मान लीजिए कि मुझे कक्षाओं में जाना है, कहना है ClassAऔर ClassB। बशर्ते इन दोनों का एक-दूसरे से कोई लेना-देना नहीं है तो सब अच्छा है। हालाँकि, कहते हैं कि ClassAएक - ClassB2 संबंधित प्रश्न बन गया है:

-कैसे होगा संकलक पता जब संकलन ClassAहै कि ClassBयहां तक कि मौजूद है, और, अगर यह होता है, यह कैसे यह गुण जानता है?

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

जवाबों:


13

विभिन्न भाषाएं (और इस तरह संकलक) अलग तरीके से संपर्क करती हैं।

सी परिवार में, विभिन्न मॉड्यूल में एक संबंधित हेडर फ़ाइल होती है जिसका उपयोग ऑब्जेक्ट का निर्माण करते समय किया जाता है। शीर्ष लेख फ़ाइलें ऑब्जेक्ट के आकार और कौन से फ़ंक्शंस या विधियाँ मौजूद हैं, जो कि लागू हो सकती हैं, के बारे में जानकारी प्रदान करती हैं। यह स्मृति आवंटन के लिए आवश्यक जानकारी के लिए अनुमति देता है और "क्या वह विधि / कार्य / प्रक्रिया मौजूद है?" इसका उपयोग किसी एकल इकाई के संकलन करते समय किया जाता है जिसे स्रोत तक पहुंचने की आवश्यकता नहीं होती है।

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

दोनों विकल्प काफी वैध हैं और इनके अपने फायदे और नुकसान हैं। हेडर फाइलें प्रदान करना कुछ बोझिल के रूप में देखते हैं और DRY का उल्लंघन करते हैं । दूसरी ओर, यदि आपके पास हेडर फ़ाइलें नहीं हैं, तो पुस्तकालयों को संकलक और लिंकर द्वारा निरीक्षण करने की आवश्यकता है - -so या। और मशीन पर निर्भर होगा)।


0

व्यावहारिक रूप से, जावा के साथ, एक बार में पूरे कार्यक्रम पर आईडीई की नज़र; जब ClassB को संदर्भित किया जाता है, तो IDE संकलक इसे देखेगा। पुस्तकालयों सहित, सब कुछ एक संपूर्ण है। एक बार कार्यक्रम तैयार हो जाने पर, आप क्लासपैथ बदल सकते हैं, व्यक्तिगत .class फ़ाइलों में और बाहर स्वैप कर सकते हैं और लाइब्रेरी संस्करणों को स्विच कर सकते हैं। आप आईडीई का उपयोग किए बिना व्यक्तिगत .java फ़ाइलों को संकलित कर सकते हैं (या किसी तरह यह जाँच से बच रहे हैं)। परिणाम सब पर एक समान होना चाहिए की जरूरत नहीं है, और अगर यह नहीं है कि आप होगा रन-टाइम मिलता है अपवाद नहीं। (एक आईडीई आपके लिए कई चीजों में से एक है जो रन-टाइम त्रुटियों को संकलित-समय में, या बल्कि, संपादित-समय, त्रुटियों में बदल देती है।)

उसी के बारे में सी #, और मुझे नहीं लगता कि सी और सी ++ वास्तव में अलग-अलग हैं, इसमें जावा और सी # आईडीई क्या कर रहे हैं, बस पर्दे के पीछे आपके लिए सी / सी ++ शैली हेडर बना रहे हैं।


यदि आवश्यक हो, तो जावा संकलक निर्भर सामान को भी संकलित करता है। यदि आप वास्तव में चीजों को बल देने की बहुत कोशिश करते हैं (जैसे, एपीआई के उपभोक्ताओं को संकलित करने के बाद एपीआई को बदलना और पुन: जमा करना) तो इस प्रकार की चीजों से आपको रनटाइम अपवाद मिलता है ।
डोनल फेलो

@ डोनल फेलो: मेरी समस्याएँ लाइब्रेरी से गायब हैं ("लेकिन मैंने अपनी सभी मशीनों पर एक डाल दिया है!") और रनिंग प्रोग्राम्स (अनजाने में हॉट-स्वैपिंग .class फ़ाइलें) को फिर से शुरू करना। मैं उन पैकेजों को अपडेट कर सकता हूं जो अब मुख्य कार्यक्रम से मेल नहीं खाते हैं, हालांकि मैंने अभी तक ऐसा नहीं किया है। मैं किया था सी और .dll के साथ इस बात का एक बहुत कुछ कर (और यह मेरे लिए किया था) साल पहले। मुझे विश्वास है और आशा है कि अब वहां बहुत सारे संरक्षण हैं जो तब नहीं थे।
राल्फचेपिन

मुझे वास्तव में वह नहीं मिलता है जो एक IDE के साथ क्या करना है एक संकलक / लिंकर को कैसे पता है कि संकलन / लिंकर समस्याओं को कैसे हल किया जाए। मुझे गलत होने पर सही करें, लेकिन एक IDE पूरे मुद्दे पर पूरी तरह से रूढ़िवादी है (सिवाय इसके कि यह प्रोग्रामर पर कार्य को आसान बनाता है)। क्यों? क्योंकि सिद्धांत रूप में आईडीई पृष्ठभूमि में संकलक का उपयोग करता है।
थॉमस एडिंग

@ThomasEding: आप काफी सही हैं। जब मैंने इस सवाल का जवाब दिया तो मुझे लग रहा था कि मुझे IDE को कंपाइलर / लिंकर से अलग करने में परेशानी हो रही है। मेरा बहाना: जावा तब तक "लिंक" नहीं करता है जब तक यह चलता है और इसलिए क्लास रेफरी या विधि कॉल को तब तक पता नहीं चल सकता जब तक कि गलत न हो; आईडीई वास्तव में मेरे कार्य को "सहज" नहीं करता है, यह संभव बनाता है। जब मैंने संकलित किया, जब मैंने लिंक किया, और फिर जब मैं भागा तो मैंने (फोरट्रान और सी में, बहुत पहले) त्रुटियों का उपयोग किया। अब मैं लगभग सभी त्रुटियों को ठीक कर देता हूं क्योंकि मैं उन्हें टाइप करता हूं, जो एक अर्थ में आईडीई को एक संकलक, लिंकर और निष्पादित करता है। आज, सभी गैर-रन-टाइम त्रुटियाँ IDE से आती हैं।
राल्फचिनपिन

0

पुरानी भाषाएं कभी-कभी अधिक सख्त होती हैं; विचार करें कि जावा में क्या संभव है:

public interface Ifc {
    public static final Ifc MY_CONSTANT = new Implem();
}

public class Implem implements Ifc {
}

मैंने ऊपर विरोधी पैटर्न को देखा है, और यह वास्तव में बदसूरत है (मैंने इसे मना किया होगा)। दोनों संकलन इकाइयाँ एक दूसरे का उपयोग करती हैं। लेकिन इम्प्ल को बिना संकलित इम्प्लम के कोड के लिए संकलित किया जा सकता है। संकलित कोड, .class, C .obj की तुलना में, "लिंकेज की जानकारी:" में इम्प्लेम का एक आयात होता है, जिसे एक पैरामीटर रहित निर्माता कहा जाता है Implem()। Implem वर्ग तब समस्या के बिना संकलित कर सकता है। आंशिक रूप से ClassLoader - आरंभीकरण करना / JVM वर्ग डेटा बनाना, और आंशिक रूप से जावा वर्चुअल मशीन स्वयं, लिंकर के रूप में थोड़ा सा खेलते हैं , सभी को एकीकृत करते हैं।

उदाहरण के लिए, किसी विशिष्ट लाइब्रेरी के एक संस्करण के साथ संकलन करना, और उस लाइब्रेरी के दूसरे संस्करण के साथ रनटाइम त्रुटियों को पहचानना होगा।

तो इसका उत्तर है: संकलन संकलित वस्तु कोड की इकाइयाँ देता है, जिसे एक साथ जोड़ने के लिए कोड + डेटा + एपीआई के रूप में देखना होता है।

कंपाइलर को बाद में एक साथ पैकिंग भी करनी चाहिए , और लिंकेज एपीआई को सत्यापित करना चाहिए ; एक दूसरा चरण।

यह चिड़चिड़ा हो सकता है और असभ्य दिख सकता है, लेकिन गणितीय प्रमाण एक ही तरीके से काम कर सकते हैं: संपूर्ण शुद्धता साबित करने में पहले से ही सत्यापन तक एक हिस्से को सही मान सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.