2016-02-27 12 views
6

मैंने एक पास और बहु पास कंपाइलर्स के बारे में बहुत सी पोस्ट देखी हैं लेकिन मुझे बिंदु नहीं लगता है।एक पास और बहु ​​पास कंपाइलर्स के बीच अंतर?

  • एक पास compilers क्या हैं?

  • मल्टी पास कंपाइलर्स क्या हैं?

  • उनके बीच मुख्य अंतर क्या है?

  • क्या कोई भी उनके बीच एक बहुत ही सरल भाषा में अंतर प्रदान कर सकता है?

उत्तर

5

अवधि बहु-पास की उत्पत्ति एक समय था जब कंप्यूटर एक बहुत कम स्मृति था से आता है। कंपाइलर्स को बहुत सारी मेमोरी चाहिए, और एक छोटी मेमोरी मशीन में, इसे प्रबंधित करना मुश्किल है।

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

(यह वही अवधारणा तथाकथित "दो पास असेंबलर" पर लागू होती है: पहला पास असेंबलर स्रोत कोड, सिंटैक्स चेक पढ़ता है, यह पता लगाता है कि लेबल प्रतीकों के लिए किस स्थान मान का उपयोग किया जाना चाहिए; दूसरा पास ऑब्जेक्ट कोड का उपयोग करके ऑब्जेक्ट कोड बनाता है पहले पास में निर्दिष्ट प्रतीक स्थान)।

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

यदि आप आंतरिक रूप से कंपाइलर देखते हैं, तो वे चरणों में काम करते हैं। विशिष्ट चरणों हो सकता है:

* Parse and syntax check 
* Build symbol tables 
* Perform semantic sanity check 
* Determine control flow 
* Determine data flow 
* Generate some "intermediate" language (representing abstract instructions) 
* Optimize the intermediate language 
* Generate machine code from the optimized language 

क्या एक विशिष्ट संकलक चरणों के लिए करता है संकलक संकलक करने से भिन्न होता है। इनमें से प्रत्येक चरण प्रोग्राम प्रस्तुतियों को अंतिम मशीन कोड के करीब धक्का देता है। एक एन-पास कंपाइलर इन चरणों में से एक या अधिक को एक ही पास में बंडल करेगा।

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

किसी भी मामले में, कंपाइलर अभी भी बहु-चरण आंतरिक रूप से हैं।(ऐसे कंपाइलर्स हैं जो इन चरणों में से एक चरण में क्या करते हैं, आमतौर पर, वे बहुत अधिक ऑप्टमाइज़ेशन नहीं कर सकते हैं)।

+1

उपरोक्त; यह मेरी समझ में, ऐतिहासिक रूप से सही उत्तर है। डाउनवोट को समझ नहीं सकता। – ibid

+0

जैसा कि मैंने दूसरे टिप्पणी पर मेरी टिप्पणी में उल्लेख किया है, यह उत्तर ड्रैगन पुस्तक (द्वितीय संस्करण) द्वारा समर्थित है। – ibid

+0

@ibid: हाँ, मैं पुराना स्कूल हूं। मैंने बस स्मृति से उद्धृत किया है: - { –

5

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

एकल-पास कंपाइलर में सभी चरणों को एक पास में होता है। तो यह कुछ स्रोत कोड पढ़ता है, इसका विश्लेषण करता है, इसे टाइप करता है, इसे अनुकूलित करता है और इसके लिए कोड उत्पन्न करता है, और केवल तब कोड के अगले बिट पर चलता है।

सिंगल पास कंपाइलर्स कम मेमोरी का उपभोग करते हैं (क्योंकि वे पूरे एएसटी और/या इंटरमीडिएट कोड को स्मृति में नहीं रखते हैं) और आमतौर पर तेज़ी से चलते हैं।

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

आगे एक बहु-पास संकलक अधिक प्रकार के अनुकूलन का उपयोग कर सकता है, इसलिए एक ही पास में संकलित किए जा सकने वाली भाषाओं के लिए, आधुनिक कंपाइलर आमतौर पर एकाधिक पास का उपयोग करते हैं।

+0

यह 'चरण' के बजाय 'एकाधिक पास में एकाधिक पास में संकलन को अलग करता है' की तरह नहीं होगा? क्या इससे अधिक समझदारी नहीं होगी? –

+1

@ user5871514 उन्हें पास करने से पहले और अधिक समझदारी हो सकती है, मैं मानता हूं। कंपाइलर निर्माण के संदर्भ में, इन शब्दों को आमतौर पर समानार्थी के रूप में उपयोग किया जाता है। – sepp2k

+2

ओह और फिर आप एक पास कैसे परिभाषित करते हैं? यह चरणों का संयोजन होना चाहिए? तो समानार्थी के रूप में इसका उपयोग कैसे किया जा सकता है? –

0

एक संकलक में एक पास कुछ भी नहीं है लेकिन नीचे

.Often के लिए एक बार पूरे कार्यक्रम माध्यम से जा रहा ऊपर से एक पास कई phases.Generally एक पास से मिलकर बनता है दोनों शाब्दिक और के लिए पर्याप्त है पूरा करने के लिए वाक्यविन्यास विश्लेषण। इसका मतलब है कि पूरे कार्यक्रम को एक बार जाकर, हम जांच सकते हैं कि कोई कथन वाक्य रचनात्मक रूप से सही है या नहीं। और फिर सिंटैक्स विश्लेषण का आउटपुट एक सार वाक्यविन्यास पेड़ है, जो स्रोत कोड के अलावा कुछ भी नहीं है (संघनित) एक पेड़ के रूप में। अर्थशास्त्री विश्लेषक को एएसटी के माध्यम से अपने काम करने के लिए और एक बार फिर पूरे कार्यक्रम के माध्यम से प्रभावी ढंग से जाकर जाना होगा। अर्थपूर्ण विश्लेषण पूरा करने के लिए दो पास आवश्यक हैं। (यदि एक स्पष्ट एएसटी आवश्यक है)।

0
  • वन-पास संकलक एक संकलक है कि प्रत्येक संकलन इकाई के स्रोत कोड के माध्यम से केवल एक बार गुजरता है। एक मल्टी-पास कंपाइलर एक प्रकार का कंपाइलर है जो कई बार प्रोग्राम के स्रोत कोड या अमूर्त वाक्यविन्यास पेड़ को संसाधित करता है।

  • वन-पास compilers बहु-पास compilers

  • वन-पास संकलक लेकिन गुजरता के दायरे बहु-पास संकलक गुजरता की व्यापक गुंजाइश है सीमित है की तुलना में तेजी है।

  • मल्टी-पास कंपेलरों को कभी-कभी विस्तृत कंपाइलर कहा जाता है जहां एक-पास कंपाइलर को कभी-कभी संकीर्ण कंपाइलर कहा जाता है।

  • कई प्रोग्रामिंग भाषाओं को एक पास पास कंपाइलर्स के साथ प्रदर्शित नहीं किया जा सकता है, उदाहरण के लिए पास्कल को एक पास कंपाइलर के साथ कार्यान्वित किया जा सकता है, जहां जावा जैसी भाषाओं को बहु-पास कंपाइलर की आवश्यकता होती है।
0

एक "पास", स्रोत प्रोग्राम या पिछले पास के उत्पादन में पढ़ता परिवर्तनों बनाता है अपने चरणों के अनुसार और एक मध्यवर्ती फ़ाइल है, जो फिर अगले दर्रे से पढ़ा जा सकता है में उत्पादन लिखता है।

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