2010-06-20 8 views
5

मेरी समझ यह है कि एक कंपाइलर उच्च स्तरीय भाषा को मशीन कोड में परिवर्तित करता है। मेरे पास एक सवाल है कि एक कंपाइलर (वीसी ++ कहें) इन-टर्न में एक असेंबलर का भी उपयोग करता है? मुझे असेंबली कोड देखना याद है, जब भी कोई दुर्घटना हो या ऐसा कुछ हो।क्या एक कंपाइलर में एक असेंबलर भी है?

+1

असेंबलर कुछ निमोनिक कोड (जैसे 'mov ax, bx') के लिए मशीन निर्देशों (कोड के बिट्स) का एक-से-एक मैपिंग है। यही कारण है कि आप बिना किसी बड़े प्रयास के असेंबली कोड मशीन कोड और वापस अनुवाद कर सकते हैं। कंपाइलर अधिक जटिल काम कर रहा है और स्रोत कोड और उत्पादित कोड के बीच कोई एक-एक संबंध नहीं है (इससे कोई फर्क नहीं पड़ता कि यह सीधे मशीन कोड या असेंबली निर्देश है)। यही कारण है कि आप आमतौर पर बाइनरी कोड से स्रोत कोड नहीं देख सकते हैं। – ony

+0

ओनी: यह एक गैर प्रतीकात्मक, गैर मैक्रो बैकएंड असेंबलर के लिए जाता है। लेकिन जीएएस आउटपुट भी प्रतीकात्मक है। –

उत्तर

5

यह संकलक पर निर्भर करता है; कई कंपाइलर्स असेंबली के लिए संकलित कर सकते हैं। उदाहरण के लिए, आप की तरह, जीसीसी के लिए 'एस' ध्वज पारित करता है, तो:

gcc -S -o test.S test.c 

कि फ़ाइल test.S जो आप देख सकते हैं में अपने test.c फ़ाइल के लिए आउटपुट विधानसभा। (यदि आप असेंबली को पढ़ने की कोशिश कर रहे हैं, तो मैं -O0 का उपयोग करने की अनुशंसा करता हूं, क्योंकि इसमें कंपाइलर ऑप्टिमाइज़ेशन संभवतः आपके द्वारा बिल्ली को भ्रमित कर देगा)।

चूंकि आपने अपने प्रश्न में विजुअल सी ++ का उल्लेख किया है, इसलिए पॉल डिक्सन नीचे बताते हैं कि विज़ुअल सी ++ एक ही चीज़ को पूरा करने के लिए the /FA flag का उपयोग करता है।

+1

उत्पन्न करने के लिए एमएएसएम को कॉल करता है, वास्तव में, मुख्य रूप से मुख्य रूप से जीसीसी ऐसा करता है :-) अधिकांश वाणिज्यिक लोगों को धीमी उत्पन्न करने/यदि आवश्यक हो तो असेंबलर उत्पन्न करने के लिए केवल एक विकल्प के साथ पाठ चरण को दोबारा पोस्ट करना। –

1

एक कंपाइलर सीधे मशीन कोड पर जाता है।

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

कंपाइलर में एक असेंबलर भी शामिल हो सकता है ताकि आप उच्च स्तर की भाषा के साथ इनलाइन असेंबलर कोड शामिल कर सकें या असेंबलर आउटपुट उत्पन्न कर सकें।

+0

सही नहीं है .... मैं एक कंपाइलर प्रोग्राम कर सकता हूं जो एक असेंबलर के साथ इकट्ठा होने के लिए केवल असेंबली स्रोत आउटपुट करता है ... इसके अलावा, कंपाइलर शायद ही _Directly_ मशीन कोड पर जाता है ... आंतरिक प्रतिनिधित्व (लक्ष्य मशीन कोड से अलग) कोड (!) अनुकूलन करने के लिए बहुत उपयोगी हो सकता है और इसी तरह ... ठीक है, सबकुछ संभवतः छुपा हुआ है, लेकिन "_directly_" बहुत अधिक है! : डी – ShinTakezou

+0

आप ओपी के प्रश्न का उत्तर देने के लिए कर सकते हैं विजुअल स्टूडियो एंबेबलर आउटपुट नहीं करता है और फिर एक्सई –

1

सबसे compilers एक विधानसभा लिस्टिंग देखने का विकल्प भी होगा

  • कुलपति उत्पादन के लिए एक कोडांतरक /FA
  • जीसीसी के साथ
  • साथ लिस्टिंग, का उपयोग -S स्विच
0

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

मैं कुलपति ++, लेकिन सबसे compilers, जीएनयू जीसीसी doensn't एक असेंबलर शामिल के रूप में के बारे में पता नहीं है, लेकिन एक बाहरी असेंबलर कार्यक्रम आह्वान (एनएएसएम, या ग्नू के रूप में के रूप में)।

चीयर्स

3

सामान्य तौर पर, एक संकलक दूसरे में एक भाषा अनुवाद करता है। अधिकांश कंपाइलर्स लक्ष्य मशीन कोड; निम्नतम स्तर से लेकर उच्चतम स्तर तक:

  1. प्रत्येक निर्देश सेट के लिए बैक-एंड समेत सीधे मशीन कोड का निर्माण करें।
  2. उत्पादन विधानसभा भाषा है, जो एक बाहरी कोडांतरक में भेजा जाता है। यह जीसीसी करता है। आखिरकार, मौजूदा असेंबलरों का उपयोग क्यों नहीं करें? सीधे ओपोड उत्पन्न करना एक दर्द है।
  3. कोड का एक निम्न स्तर के मध्यवर्ती फार्म, जैसे LLVM bytecode है, जो मशीन कोड के रूप में तब्दील हो जाता है उत्पन्न करें। एलएलवीएम संकलक-लेखकों के लिए एक देवता है, क्योंकि यह बड़ी संख्या में अनुकूलन को संभालता है और कई बैक-एंड का समर्थन करता है, जबकि आपको असेंबली की तुलना में उच्च स्तर पर लिखने देता है।
  4. सी की तरह एक भाषा में कोड रूपांतरण, और फिर इसे एक और संकलक के लिए गुजरती हैं। Facebook does this to PHP: वे इसे C++ पर संकलित करते हैं, और उसके बाद जीएनसी का उपयोग असेंबली को संकलित करने के लिए करते हैं, जिसे जीएनयू द्वारा देशी कोड में इकट्ठा किया जाता है।

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

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