2012-01-12 4 views
20

मानक द्वारा निर्दिष्ट एक सी ++ प्रोग्राम के संकलन के चरण हैं?सी ++ प्रोग्राम के संकलन के चरण क्या हैं?

यदि हां, तो वे क्या हैं?

यदि नहीं, तो व्यापक रूप से उपयोग किए गए कंपाइलर (मैं एमएसवीएस पसंद करूंगा) का उत्तर बहुत अच्छा होगा।

मैं प्रीप्रोकैसिंग, टोकननाइजेशन, पार्सिंग और इस तरह के बारे में बात कर रहा हूं। वह आदेश क्या है जिसमें उन्हें निष्पादित किया जाता है और वे विशेष रूप से क्या करते हैं?

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

+3

यहाँ [जीसीसी internals पुस्तिका के पृष्ठ] (http://gcc.gnu.org/onlinedocs/gccint/Passes.html#Passes) । मैंने सोचा कि यह उस भाषा का इस्तेमाल करता था जिसे आप चाहते थे लेकिन स्पष्ट रूप से नहीं। यदि आप जीसीसी स्रोत में देखते हैं तो व्यक्तिगत अनुकूलन पास का भार होता है। मुझे नहीं लगता कि मानक, यह निर्धारित करता है कि इसे प्राप्त करने के लिए उसे क्या करना चाहिए, यह नहीं कि यह कैसे करना चाहिए, और यह कि आपकी सर्वश्रेष्ठ शर्त एक अकादमिक कंपाइलर निर्माण पाठ्यक्रम या पाठ्यपुस्तक होगी - मुझे यकीन है कि वहां बहुत कुछ है। – Rup

+0

@ शार्पतोथ मैंने सवाल वापस ले लिया - मेरा मानना ​​है कि यह शीर्षक एक ही चीज़ की तलाश करने वाले लोगों द्वारा अधिक आसानी से पाया जा सकता है। –

+0

@ लुचियान ग्रिगोर: ठीक है, हालांकि, शीर्षक परिवर्तन वास्तव में महत्वपूर्ण है - "यह आमतौर पर कैसे किया जाता है" v "मानक कहता है कि यह कैसे किया जाना चाहिए"। वैसे भी यह आपका सवाल है, आप तय करते हैं। – sharptooth

उत्तर

33

मानक द्वारा निर्दिष्ट सी ++ प्रोग्राम के संकलन के चरणों क्या हैं?

हां और नहीं।

सी ++ मानक 9 "अनुवाद के चरणों" को परिभाषित करता है। the N3242 draft (10 एमबी पीडीएफ) से हवाला देते हुए, दिनांक 2011-02-28, खंड 2.2 (पूर्व अधिकारी सी ++ 11 मानक की रिहाई के लिए):

अनुवाद का सिंटैक्स नियमों के बीच पूर्वता द्वारा निर्दिष्ट किया जाता निम्नलिखित चरणों [फुटनोट देखें]

  1. शारीरिक स्रोत फ़ाइल वर्ण एक कार्यान्वयन से परिभाषित तरीके में मैप किया जाता है, के लिए बुनियादी स्रोत चरित्र सेट (अंत लाइन संकेतकों के लिए नई लाइन पात्रों को शुरू) यदि आवश्यक। [एसएनआईपी]
  2. बैकस्लैश वर्ण (\) के प्रत्येक उदाहरण के तुरंत बाद एक नया-रेखा वर्ण हटा दिया जाता है, भौतिक स्रोत लाइनों को फॉर्म लॉजिकल स्रोत लाइनों में विभाजित किया जाता है। [एसएनआईपी]
  3. स्रोत फ़ाइल प्रीप्रोकैसिंग टोकन (2.5) और सफेद-स्पेस वर्णों (टिप्पणियों सहित) के अनुक्रमों में विघटित है। [एसएनआईपी]
  4. प्रीप्रोकैसिंग निर्देश निष्पादित किए जाते हैं, मैक्रो इनवॉक्शंस का विस्तार किया जाता है, और _Pragma unary ऑपरेटर अभिव्यक्ति निष्पादित की जाती है। [कटाव]
  5. एक चरित्र में प्रत्येक स्रोत वर्ण सेट सदस्य शाब्दिक या एक स्ट्रिंग शाब्दिक, साथ ही प्रत्येक एस्केप अनुक्रम और एक चरित्र में सार्वभौमिक-चरित्र-नाम शाब्दिक या एक गैर कच्चे स्ट्रिंग शाब्दिक रूप में, में बदल जाती है निष्पादन चरित्र सेट के संबंधित सदस्य; [एसएनआईपी]
  6. निकट स्ट्रिंग शाब्दिक टोकन को समेकित किया जाता है।
  7. टोकन को अलग करने वाले व्हाइट-स्पेस वर्ण अब महत्वपूर्ण नहीं हैं। प्रत्येक प्रीप्रोकैसिंग टोकन को टोकन में परिवर्तित किया जाता है। (2.7)। परिणामी टोकन वाक्य रचनात्मक रूप से और अर्थात् विश्लेषण किए जाते हैं और अनुवाद इकाई के रूप में अनुवादित होते हैं। [कटाव]
  8. अनुवादित अनुवाद इकाइयों और इन्स्टेन्शियशन इकाइयों के रूप में इस जोड़ दिया जाता है: [कटाव]
  9. सभी बाहरी एंटिटी संदर्भ हल कर रहे हैं। लाइब्रेरी घटकों को वर्तमान अनुवाद में परिभाषित इकाइयों के बाहरी संदर्भों को संतुष्ट करने के लिए लिंक किया गया है। ऐसे सभी अनुवादक आउटपुट को प्रोग्राम छवि में एकत्रित किया गया है जिसमें निष्पादन वातावरण में निष्पादन के लिए आवश्यक जानकारी शामिल है।

[फुटनोट] क्रियान्वयन व्यवहार करना चाहिए, जैसे कि इन अलग चरणों पाए जाते हैं, हालांकि व्यवहार में विभिन्न चरणों को एक साथ तह किया जा सकता है।

[कटाव] मार्कर द्वारा इंगित रूप में, मैं पूरे अनुभाग, बस भर में विचार प्राप्त करने के लिए पर्याप्त उद्धृत नहीं किया है।

जोर देने के लिए, कंपाइलर्स इस सटीक मॉडल का पालन करने के लिए आवश्यक हैं, जब तक कि अंतिम परिणाम ऐसा न हो।

चरण 1-6 प्रीप्रोसेसर के लिए कम या ज्यादा मेल खाता है, 7 जो आप आमतौर पर संकलन के रूप में सोच सकते हैं, 8 टेम्पलेट्स के साथ सौदों, और 9 लिंकिंग के अनुरूप हैं।

(सी के अनुवाद चरणों समान हैं, लेकिन # 8 छोड़ा गया है।)

+0

एफडब्ल्यूआईडब्ल्यू, जीसीसी चरण 6 में प्रीप्रोकैसिंग का हिस्सा नहीं है ('gcc -E' आसन्न स्ट्रिंग अक्षर को संगत नहीं करता है)। मेरे पास तुलना करने के लिए हाथ करने के लिए एक और कंपाइलर नहीं है। –

+1

इस पृष्ठ में एक फुटनोट कहता है: "कार्यान्वयन का व्यवहार करना चाहिए जैसे कि ये अलग-अलग चरण होते हैं, हालांकि अभ्यास में विभिन्न चरणों को एक साथ जोड़ा जा सकता है"। – rodrigo

+0

@rodrigo: मैंने पहले से ही उस फुटनोट को उद्धृत किया है। आप शायद इसे चूक गए क्योंकि मैंने इसे उद्धरण के नीचे नहीं रखा था। मैंने अभी इसे वहां ले जाया है। –

6

9 तथाकथित "अनुवाद के चरण" मानक में [lex.phases] (2.2 में सी ++ 11, 2.1 में सी ++ 03) में मानक में सूचीबद्ध हैं।

मानक में मांग की गई विस्तार अलग-अलग होती है: प्रीप्रोसेसिंग कई चरणों में विभाजित होती है, क्योंकि मानक में विभिन्न बिंदुओं पर यह महत्वपूर्ण है कि "पहले से ही किया गया है" और "बाएं करने के लिए क्या" है, जब कोई विशेष बिट व्यवहार परिभाषित किया गया है। तो हालांकि यह आपको एक व्याख्याता लिखने के बारे में नहीं बताता है, यह आपको एक सुंदर स्पष्ट रोडमैप देता है।

दूसरी तरफ लिंक करना यह तय करने के लिए ज्यादातर कार्यान्वित किया जाता है कि यह वास्तव में कैसे प्राप्त किया जाता है, क्योंकि मानक परवाह नहीं करता है एक दिया गया नाम देखा जाता है, जो इसका संदर्भ है।

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

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

3

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

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

मेरे पास एक संक्षिप्त रूप था, व्यक्तिगत कंपेलरों के विवरण ढूंढना मुश्किल है। मुझे संदेह है कि वाणिज्यिक कारणों से पूरी तरह से माइक्रोसॉफ्ट की पेशकश जैसे वाणिज्यिक कंपाइलरों पर बहुत कुछ है। जीसीसी आपकी सबसे अच्छी शर्त है, although Microsoft is happy to describe the process. हालांकि यह बहुत ही साधारण सामान है: सभी कामों को संकलित करता है। असली सोना यह है कि वे इन चरणों, एल्गोरिदम और डेटा संरचनाओं का उपयोग कैसे करते हैं। उस संबंध में, I recommend this book। मैंने कुछ साल पहले विश्वविद्यालय पाठ्यक्रम के लिए एक नई नई प्रति खरीदी, और मैंने पुस्तकालय से अपनी अधिकांश पाठ्यपुस्तकों को उधार लिया :)।

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

  • कोई संबंधित समस्या नहीं^_^