2010-06-24 6 views
19
  • विशेष रूप से सी और सी ++ के लिए, डिफ़ॉल्ट रूप से कितने पास उपयोग किए जाते हैं?
  • क्या यह संख्या उपयोग किए गए अनुकूलन के स्तर के आधार पर बदलती है? (यह होना चाहिए)
  • क्या इसे सीधे बदला जा सकता है?

मैं इस जानकारी को http://gcc.gnu.org/ में खोज रहा था, लेकिन site:http://gcc.gnu.org/ का उपयोग करके गूगलिंग कुछ भी नहीं मिला।कोड पर कितने पास जीसीसी उपयोग करते हैं?

इस बारे में किसी भी दस्तावेज के लिए कोई भी संकेतक भी उपयोगी होगा।


पास से मेरा स्रोत कोड केवल और नहीं कई पास परिभाषा Wikipedia ने सुझाव दिया की मूल प्रतिनिधित्व पर एक पास था।

+3

+1, हालांकि यह मुझे आश्चर्यचकित करता है कि दो बार से अधिक कोड को पारित करने का कोई कारण क्यों होगा। प्री-प्रोसेसर के लिए एक पास, और दूसरा विश्लेषण के लिए एक सार सिंटेक्स ट्री में कोड लोड करने के लिए। –

+1

मैं मानता हूं, दो बार से अधिक पास करने की आवश्यकता नहीं होनी चाहिए। एक बार प्रीप्रोसेसर के लिए और एक बार संकलक के लिए। हालांकि मुझे संदेह है कि संकलक एक बार से अधिक समय में सिंटेक्स ट्री को पार कर सकता है! –

+0

@ जस्टिन एथियर इतने कोड को "एएसटी या कुछ अन्य मध्यवर्ती प्रतिनिधित्व के हिसाब से" पारित नहीं किया गया है?(सवाल इस पहलू में थोड़ा अस्पष्ट लगता है) :-) –

उत्तर

0

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

Class A { 
    B* b; 
} 

Class B { 
    A* a; 
} 

सी # और अन्य भाषाओं की आवश्यकता नहीं है, क्योंकि पहला पास संदर्भ और दूसरा पास संकलन बनाता है।

लेकिन फिर मैं संकलक में विशेषज्ञ नहीं हूं।

+10

आगे की घोषणा भाषा की एक संपत्ति है, और जीसीसी के साथ कुछ लेना देना नहीं है। यह के एंड आर के मूल सी संकलक के कार्यान्वयन से संबंधित हो सकता है। –

+2

यह स्वतंत्र अनुवाद इकाइयों और लिंकिंग की धारणा से अधिक संबंधित है। तर्कसंगत रूप से, यह एक अलग संकलक पास है, लेकिन जीसीसी पास नहीं है। – MSalters

-3

क्या आपका मतलब स्रोत कोड पर गुजरता है? सिर्फ एक बार। इसे "टोकननाइजेशन" या "लेक्सिकल विश्लेषण" चरण कहा जाता है, या अधिक व्यापक रूप से, "पार्सिंग" कहा जाता है।

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

कंपाइलर्स को "चरण" में विभाजित कर दिया गया है। किसी भी कंपाइलर पाठ्यपुस्तक के लिए परिचय पढ़ें। यह चरणों को समझाएगा (लगभग एक दर्जन तार्किक चरण हैं), और जीसीसी पाठ्यपुस्तक मॉडल का पालन करता है। कुछ चरणों को आम तौर पर एक "पास" में जोड़ा जाता है, अन्य अलग-अलग "पास" होते हैं।

पास अवधारणा वास्तव में चरण अवधारणा है के रूप में compilers पर चर्चा के संदर्भ में के रूप में उपयोगी नहीं है।

+0

http://en.wikipedia.org/wiki/One-pass_compiler http://en.wikipedia.org/wiki/Multi-pass_compiler –

0

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

यदि यह उत्तर आपको संतुष्ट नहीं करता है, तो आपको शायद स्रोत कोड पर "पास" के रूप में परिभाषित करने के बारे में अधिक सटीक स्पष्टीकरण प्रदान करना चाहिए।

+0

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

+0

Lazer, एक अच्छा कंपाइलर ने पहले पास में कुछ उपयोगी जानकारी एकत्र की है कि दूसरा पास कुछ भी नहीं जोड़ता है। आखिरकार, पाठ नहीं बदलता है, तो दूसरे पास के लिए क्या है यह पता लगाने के लिए कि पहले नहीं कर सका? – MSalters

+0

@ नाथन एडम्स: यह पूरी तरह झूठा है। सी भाषा प्रोटोटाइप की आवश्यकता नहीं है। सी ++ भाषा कक्षा की शुरुआत में परिभाषित इनलाइन फ़ंक्शन के शरीर के अंदर कक्षा की पूर्ण घोषणा का उपयोग करने की अनुमति देती है। इसलिए, "आगे देख रहे" की अवधारणा स्पष्ट रूप से सी ++ में मौजूद है, जिसे अक्सर "बहु-पास संकलन" के रूप में जाना जाता है। दावा है कि सी ++ उस बिंदु से "एक पास" है, जो पेटी से गलत है। – AnT

1

मैंने कभी भी पाठक प्रतिनिधित्व पर कई बार गुजरने वाले संकलक के बारे में नहीं सुना है (सिवाय इसके कि यदि आप प्रीप्रोसेसर को एक पास के रूप में मानते हैं)। यहां तक ​​कि जब संकलकों ने फ़ाइलों द्वारा संचारित कई गुजरते थे, तब भी फाइलों में एक मध्यवर्ती प्रतिनिधित्व (धारावाहिक एएसटी + प्रतीक तालिका) होता था।

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

0

बहु-पास की आपकी परिभाषा पुरानी प्रतीत होती है, जो उस समय से उत्पन्न होती है जहां पूरे कार्यक्रम स्रोत केवल उपलब्ध स्मृति में फिट नहीं होते हैं। ये समय अब ​​चले गए हैं और मुझे एक एकल, वर्तमान बहु-पास (पुरानी परिभाषा) कंपाइलर नहीं पता है।

संकलक के लिए जर्मन विकिपीडिया प्रविष्टि में दोनों परिभाषाओं दिए गए हैं: http://de.wikipedia.org/wiki/Compiler

मल्टी पास-संकलक

बी diesem Compilertyp मांद Zielcode übersetzt में mehreren Schritten में wird der Quellcode। मांद में Anfangszeiten des Compilerbaus wurde der Übersetzungsprozess hauptsächlich deshalb में mehrere Durchläufe zerlegt, वेल मर Kapazität डेर कंप्यूटर बहुधा nicht ausreichte, उम मांद vollständigen संकलक und दास zu übersetzende डेबूटस्ट्रैप gleichzeitig im Hauptspeicher zu halten। Heutzutage ein मल्टी पास-संकलक vor allem Dazu, Vorwärtsreferenzen (Deklaration eines Bezeichners नच Dessen erster Verwendung) und aufzulösen aufwendige Optimierungen durchzuführen dient।

+1

शायद मैं बहुत पक्षपातपूर्ण हूं, लेकिन मेरी समझ यह है कि अंग्रेजी विकिपीडिया से उद्धरण आमतौर पर, अधिक उपयोगी हैं। धन्यवाद। –

+0

@IskanderSharipov मैं पूरी तरह से सहमत हूं। दुर्भाग्य से, मुझे अंग्रेजी विकिपीडिया में कोई समकक्ष प्रविष्टि नहीं मिली है। "मल्टी-पास कंपाइलर" नामक एक व्यक्ति को प्रश्न के लेखक द्वारा खारिज कर दिया गया था क्योंकि इसमें मूल स्रोत कोड की तुलना में अन्य प्रस्तुतियों पर गुजरना शामिल है। –

1

जीसीसी में, मूल रूप से, दो प्रकार के पास होते हैं, अर्थात्: gimple, rtl। जीसीसी 4.6.2 में कुल अद्वितीय पास 207 हैं। हां किसी दिए गए कार्यक्रम पर पास की संख्या ऑप्टिमाइज़ेशन स्तर पर निर्भर करती है। और इनमें से कुछ पास एक बार और अधिक ले लिए जाते हैं। यदि कोई भी इन पासों से गुजरना चाहता है, तो gcc स्रोत कोड में passes.c फ़ाइल के माध्यम से जाएं। जीसीसी में passes.c के लिए पथ 4.6.2: जीसीसी स्रोत -> जीसीसी -> passes.c

हां आप जीसीसी में गतिशील प्लगइन के रूप में अपने पास जोड़कर पास की संख्या बदल सकते हैं।

+0

आप अपने कई उत्तरों को हटाकर स्वचालित पोस्टबान को ट्रिगर करने जा रहे हैं। – Will

2

जैसा कि अन्य ने ऊपर बताया है, आधुनिक कंपाइलर्स पार्सिंग चरण में केवल एक ही पास करते हैं और फिर आंतरिक प्रतिनिधित्व (आमतौर पर पेड़ या अन्य इन-मेमोरी ग्राफ-जैसी डेटा संरचना) का उपयोग करके कई चरणों में होते हैं।

कंक्रीटली जीसीसी इस दृष्टिकोण का उपयोग करता है। देखें: https://gcc.gnu.org/onlinedocs/gccint/Parsing-pass.html#Parsing-pass

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