सीपीयू द्वारा कोड की लाइनों को कैसे निष्पादित किया जाता है?


11

मैं वास्तव में समझने की कोशिश कर रहा हूं कि वास्तव में एक उच्च-स्तरीय भाषा को मशीन कोड में कैसे बदला जाता है और फिर सीपीयू द्वारा निष्पादित किया जाता है।

मैं समझता हूं कि कोड को मशीन कोड में संकलित किया जाता है, जो कि निम्न स्तर का कोड है जिसे सीपीयू उपयोग कर सकता है। यदि मेरे पास असाइनमेंट स्टेटमेंट है:

x = x + 5;
y = x - 3;

क्या सीपीयू प्रत्येक लाइन को एक बार में निष्पादित करता है? तो यह पहले x = x + 5 को निष्पादित करेगा; निर्देश और फिर अगला निर्देश सीपीयू निष्पादित करेगा y = x- 3 है; मैं वास्तव में निष्पादन प्रक्रिया को समझने की कोशिश कर रहा हूं और मैं जो कोड लिखता हूं वह वास्तव में सीपीयू द्वारा निष्पादित होता है।


आप ओपन सोर्स सीपीयू में से एक के डिज़ाइन को समझने की कोशिश कर सकते हैं, कुछ वास्तव में सरल स्टैक-आधारित कार्यान्वयन हैं जैसे excamera.com/sphinx/fpga-j1.html - वे 3-एड्रेस आर्किटेक्चर की तुलना में बहुत सरल हैं अपने उदाहरण की तरह।
एसके-तर्क

3
जब मैं इस व्यवसाय में आया, तो इसके सरल और अच्छे उत्तर थे। आजकल, CPU बेहद जटिल हैं और प्रसंस्करण शक्ति को बढ़ाने के लिए सभी प्रकार की चीजें करते हैं।
डेविड थॉर्नले

जवाबों:


12

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

यह कोड कुछ इस तरह संकलित हो सकता है (जैसे कि एक असेंबली भाषा में):

load R1, [x] ; meaning load the data stored at memory location x into register 1
add R1, 5
store [x], R1 ; store the modified value into the memory location x
sub R1, 3
store R1, [y]

हालांकि, यदि कंपाइलर जानता है कि एक चर का फिर से उपयोग नहीं किया जाता है, तो स्टोर ऑपरेशन उत्सर्जित नहीं हो सकता है।

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


क्यों नहीं? एक 3-एड्रेस आर्किटेक्चर के निर्देश होंगे जैसे ADD Rx, Rx, $5और SUB Ry, Rx, $3(यह मानते हुए कि x और y चर को रजिस्टर में मैप किया गया था)। आप एक लोड / स्टोर RISC दृष्टिकोण का वर्णन कर रहे हैं।
एसके-तर्क

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

@ SK-Logic: यह केवल इस विशेष उदाहरण के लिए काम करता है। सामान्य तौर पर, हालांकि, मैक्सपोलुन सही है। उच्च स्तरीय भाषा के बयानों को निचले स्तर की भाषा में अनुवादित किया जाना चाहिए, जिसमें वैचारिक रूप से सरल सामान करने के लिए अधिक "लाल टेप" की आवश्यकता होती है। मुझे लगता है कि ओपी इस परिवर्तन का एक उदाहरण पूछ रहा था।
एंड्रेस एफ।

1
@ एसके-लॉजिक: ओपी ने अपने सवाल की शुरुआत "मैं वास्तव में यह समझने की कोशिश कर रहा हूं कि वास्तव में एक उच्च-स्तरीय भाषा [...]"
एंड्रेस एफ।

1
@ SK- तर्क यह है कि "यदि मेरे पास असाइनमेंट स्टेटमेंट है तो कहो: [कोड स्निपेट] क्या CPU एक बार में प्रत्येक लाइन को निष्पादित करता है?" - मुझे ऐसा लगता है जैसे यह एक गैर-कोडांतरक भाषा में स्रोत कोड होने का इरादा है। आम तौर पर, मुझे यह समझने का कोई संकेतक नहीं है कि निम्न-स्तरीय मशीन कोड कैसे है, और कुछ फंतासिंग (जैसे कि लाइनों की बात करना) कुछ गलत धारणाओं को इंगित करते हैं। यह असंभव नहीं है जैसा कि आप समझते हैं, हर किसी को कुछ सरल माइक्रोकंट्रोलर (जैसे मैं और जाहिरा तौर पर दूसरों) में सबसे पहले सिर फेंकने की खुशी नहीं थी। शायद फ्रेंकी को स्पष्ट करना चाहिए।

2

निर्भर करता है।

वास्तव में सरल मशीनों के शुरुआती दिनों में, हाँ, कोड एक समय में एक पंक्ति निष्पादित करता है। जैसे-जैसे मशीनें बड़ी, तेज, और अधिक जटिल होती गईं, आपको दोनों निर्देशों को एक साथ कई निर्देशों को निष्पादित करने की क्षमता दिखाई देने लगी और मेमोरी रीड और रजिस्टरों पर संचालन की तुलना में बहुत अधिक समय लेती है।

कंपाइलिंग ऑप्टिमाइज़र्स को इसे ध्यान में रखना था, और आपके द्वारा दी गई लाइनें समानांतर में "अधिक या कम" निष्पादित की जा सकती थीं, प्रोसेसर के एक भाग में y की गणना पर काम कर रही थी, जबकि दूसरा भाग पहले से गणना की गई नई वैल्यू को स्टोर कर रहा था x (और y की गणना रजिस्टर से उस नए मान का उपयोग कर रही थी)।

कंट्रोल डाटा 6600 पहली मशीन थी जिसके बारे में मुझे पता था कि इस तरह की चीजें होती हैं। इंटीजर जोड़ ने 300 nsec लिया, मेमोरी रेफरेंस (पढ़ा या लिखा) 1000 nsec लिया, गुणन और विभाजन ने बहुत समय लिया। लगभग दस निर्देश तक सभी समानांतर में निष्पादित हो सकते हैं, जिसके आधार पर कार्यात्मक इकाइयों की आवश्यकता थी। सीडीसी 6600 फोरट्रान कंपाइलर इस सब का समय निर्धारण करने में बहुत अच्छे थे।


इस मामले में अगले निर्देश का इनपुट पहले अनुदेश के परिणाम पर निर्भर करता है, इसलिए इसे क्रमिक रूप से निष्पादित किया जाना चाहिए।
एसके-तर्क

@ एसके-तर्क: काफी नहीं। दूसरी पंक्ति का इनपुट पहली पंक्ति के दाईं ओर के परिणाम पर निर्भर करता है, लेकिन, केवल इस बात पर आधारित है कि हम मूल उदाहरण कोड में क्या देख सकते हैं, यह दुकान के परिणाम की स्मृति पर निर्भर नहीं हो सकता है पहली पंक्ति। यदि x को अस्थिर (C / C ++ में) घोषित किया गया था, तो संकलक को परिणाम को पहले स्टोर करने की आवश्यकता होगी, और RENOAD IT FROM MEMORY, Y के नए मूल्य की गणना शुरू करने से पहले, "अस्थिर" का अर्थ है कि कुछ (एक बाधा हैंडलर, कहते हैं) दो लाइनों के बीच में और zap x आ सकता है।
जॉन आर। स्ट्रॉहम

मैंने मान लिया कि x और y रजिस्टर हैं (और कोड एक सी-सी चीज़ की बजाय 3-एड्रेस pseudoassembly भाषा में है)। इस मामले में दोनों निर्देश अपरिहार्य रूप से अनुक्रमिक हैं। अन्यथा ओपी को इस के बजाय दो या अधिक अलग-अलग प्रश्न पूछने थे।
एसके-तर्क

मुझे आश्चर्य है कि क्या प्रोसेसर "अटकलें" लगाने की कोशिश करेंगे कि मूल्य क्या xहै? इस तरह यह पहले ही कोड को निष्पादित कर चुका है और इसे कैश में संग्रहीत किया गया है।
कोलोब कैनियन

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

1

नहीं, उच्च और निचले स्तर की भाषाओं में कोड लाइनों / निर्देशों के बीच कोई एक-से-एक मैपिंग नहीं है। वास्तव में, ऊपर की दोनों पंक्तियों का अनुवाद कई मशीन कोड निर्देशों में किया गया है, जैसे

  1. एक निश्चित मेमोरी पते से एक रजिस्टर में एक मूल्य लोड करें
  2. मान को संशोधित करें
  3. इसे स्मृति में वापस लिखें

इन निर्देशों का वास्तविक विवरण प्लेटफार्मों के बीच भिन्न होता है।

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


0

यह कैसे काम करता है, संभवतः एक संकलक वर्ग के बारे में अधिक जानकारी प्राप्त करने के लिए आपको एक पुस्तक में महान विवरण देखना चाहिए।

मूल रूप से, आपका प्रश्न 2 विभिन्न पहलुओं पर ध्यान केंद्रित कर रहा है।

1) कोड को मशीन कोड में कैसे अनुवादित किया जाता है?

2) समानांतरकरण का उपयोग करके कोड की गणना कब / कैसे की जाती है?

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

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

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