विधानसभा कोड बनाम मशीन कोड बनाम वस्तु कोड?


227

ऑब्जेक्ट कोड, मशीन कोड और असेंबली कोड में क्या अंतर है?

क्या आप उनके अंतर का एक दृश्य उदाहरण दे सकते हैं?


मैं इस बारे में भी उत्सुक हूं कि "ऑब्जेक्ट कोड" नाम कहां से आया है? इसमें "ऑब्जेक्ट" शब्द का क्या अर्थ है? क्या यह किसी तरह ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग या सिर्फ नामों के संयोग से संबंधित है?
1


मैं इस बारे में नहीं पूछ रहा हूं कि ऑब्जेक्ट कोड क्या है, कैप्टन ओबर्ज़। मैं इस बारे में पूछ रहा हूं कि नाम कहां से आया और इसे "ऑब्जेक्ट" कोड क्यों कहा जाता है।
बारबर्कवार

जवाबों:


296

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

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

असेंबली कोड सादा-पाठ है और (कुछ हद तक) मानव पढ़ने में सक्षम स्रोत कोड, जिसमें अधिकतर मशीन निर्देशों के साथ 1: 1 एनालॉग है। यह वास्तविक निर्देशों, रजिस्टरों या अन्य संसाधनों के लिए mnemonics का उपयोग करके पूरा किया जाता है। उदाहरणों में शामिल हैं JMPऔर MULTCPU के कूद और गुणा निर्देश के लिए। मशीन कोड के विपरीत, CPU असेंबली कोड को नहीं समझता है। असेंबलर या कंपाइलर के उपयोग से आप असेंबली कोड को मशीन में बदल देते हैं, हालांकि हम आमतौर पर उच्च स्तरीय प्रोग्रामिंग भाषा के साथ कंपाइलर के बारे में सोचते हैं जो सीपीयू निर्देशों से आगे अमूर्त होते हैं।

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

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


24
+1: अच्छा, लेकिन कुछ हद तक सरल उत्तर - सभी विधानसभा निर्देशों का अनुवाद 1: 1 से मशीन के निर्देशों में नहीं किया गया है, और ऑब्जेक्ट फ़ाइलों में अन्य डेटा (रिलोकेशन इंफॉर्मेशन, सिंबल टेबल, ...) शामिल हो सकते हैं
क्रिस्टोफ

5
अपने पहले अंक के लिए एक शब्द जोड़ा गया, 2 को स्पष्ट करने के लिए संपादित किया गया।
जोएल कोएहॉर्न

2
@Christoph: आप कहते हैं कि "सभी विधानसभा निर्देशों का अनुवाद 1: 1 से मशीन के निर्देशों तक नहीं किया जाता है" कृपया एक उदाहरण दें।
ओलॉफ फोर्शेल

5
@Olof: RISC आर्किटेक्चर कभी-कभी एक असेंबली-स्तरीय वर्चुअल इंस्ट्रक्शन सेट प्रदान करते हैं - जैसे MIPS छद्म निर्देश ( en.wikipedia.org/wiki/MIPS_altecture#Pseudo_instructions )
क्रिश्चियन

3
@Panzercrisis असेंबलर द्वारा कुछ भी नहीं मिला है। आपने जो वास्तविक मशीन निर्देशों को लिखा है, उसका सीधा अनुवाद है। और मैं संकलक "आवश्यक" द्वारा डाले गए अतिरिक्त कोड को नहीं कहूंगा
जोएल कोएहॉर्न

125

अन्य उत्तरों ने अंतर का अच्छा विवरण दिया, लेकिन आपने एक दृश्य के लिए भी कहा। यहाँ एक आरेख है जो वे सी कोड से एक निष्पादन योग्य तक की यात्रा दिखा रहे हैं।


3
मुझे यह वास्तव में मददगार लगता है, लेकिन यह "मशीन कोड" लेबल को गायब कर रहा है
एलेक्सएक्स रोशे

तो जब यह निष्पादन योग्य कोड स्तर पर है, तो क्या यह मशीन कोड के बराबर है?
CMCDragonkai

3
इस आरेख के संदर्भ में, "ऑब्जेक्ट कोड" मशीन कोड है।
ग्राफिक्स नोब

5
दरअसल, ऑब्जेक्ट कोड और एक्जीक्यूटेबल कोड दोनों मशीन कोड होते हैं। अंतर यह है कि ऑब्जेक्ट कोड पूरा कार्यक्रम नहीं है। इसे अन्य सहायक पुस्तकालय / मॉड्यूल कोड के साथ संयोजित करने की आवश्यकता होती है, जैसा कि आरेख में एक पूर्ण निष्पादन योग्य प्रोग्राम / कोड बनाने के लिए संकेत दिया गया है।
okey_on

@okeyxyz किस स्तर पर यह कहना सही होगा कि इसे सीधे प्रोसेसर द्वारा निष्पादित किया जाता है? कोडांतरक के बाद, लिंकर के बाद, लोडर के बाद, इसके बाद माइक्रोकंट्रोलर में परिवर्तित हो जाता है?
Celeritas

49

विधानसभा कोड मशीन कोड का एक मानव पठनीय प्रतिनिधित्व है:

mov eax, 77
jmp anywhere

मशीन कोड शुद्ध हेक्साडेसिमल कोड है:

5F 3A E3 F1

मुझे लगता है कि आप ऑब्जेक्ट फ़ाइल के रूप में ऑब्जेक्ट कोड का मतलब है। यह मशीन कोड का एक प्रकार है, इस अंतर के साथ कि जंपर्स को ऐसे मानकीकृत किया जाता है कि एक लिंकर उन्हें भर सकता है।

असेंबलर का उपयोग असेंबली कोड को मशीन कोड (ऑब्जेक्ट कोड) में बदलने के लिए किया जाता है। एक लिंकर एक निष्पादन योग्य बनाने के लिए कई ऑब्जेक्ट (और लाइब्रेरी) फ़ाइलों को लिंक करता है।

मैंने एक बार शुद्ध हेक्स (कोई कोडांतरक उपलब्ध नहीं) में एक कोडांतरक कार्यक्रम लिखा है सौभाग्य से यह पुराने (प्राचीन) 6502 पर वापस आ गया था। लेकिन मुझे खुशी है कि पेंटियम ओपकोड के लिए कोडांतरक हैं।


76
नहीं नहीं नहीं नहीं। मशीन कोड हेक्स कोड नहीं है। यह शुद्ध बाइनरी है। हेक्स कोड केवल बाइनरी का एक सुविधाजनक प्रतिनिधित्व है।
ब्रेटन

56
अगर हम वास्तव में चरम सीमा पर जा रहे हैं, तो यह द्विआधारी नहीं है, यह एक सर्किट में संग्रहीत बिजली की मात्रा है। ;-)
तून Krijthe

17
हां बिल्कुल। वहाँ hexidecimal बीच एक संबंध है, और क्या आप "मशीन कोड" कहेंगे, लेकिन यह कहने के लिए hexidecimal काफी सही नहीं है है मशीन कोड। बस इतना ही कहना चाहूंगा।
ब्रेटन

9
@ ब्रेटन उस अर्थ में, "हेक्स कोड" जैसी कोई चीज़ सही नहीं है? "हेक्स कोड" मशीन कोड को देखने का एक तरीका है। आप मशीन कोड को हेक्साडेसिमल, बाइनरी, ऑक्टल, दशमलव या फिर जैसे चाहें वैसे देख सकते हैं। उस अर्थ में भी, फिर भी "बाइनरी कोड" नहीं है। फिर से, "बाइनरी कोड" मशीन कोड को देखने का एक तरीका है।
उत्कर्ष

9
@ बर्टन जो आप कहते हैं वह वास्तव में बहुत मायने नहीं रखता है .. बाइनरी हेक्स की तरह प्रतिनिधित्व का एक तरीका है। यदि यह हेक्स नहीं है, तो यह बाइनरी भी नहीं है।
कोरे तुगे

18

8B 5D 32 मशीन कोड है

mov ebx, [ebp+32h] विधानसभा है

lmylib.soयुक्त 8B 5D 32वस्तु कोड है


8

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

$ 1902: बीडी 37 14: एलडीए $ 1437, एक्स
$ 1905: 85 03: एसटीए $ 03
$ 1907: 85 09: एसटीए $ 09
$ 1909: सीए: डीईएक्स
$ 190A: 10: BPL $ 1902

उपरोक्त कोड, यदि अटारी 2600 कारतूस में पता $ 1900 पर संग्रहीत है, तो एक तालिका से प्राप्त विभिन्न रंगों में कई पंक्तियों को प्रदर्शित किया जाएगा, जो पता $ 1437 से शुरू होता है। कुछ टूल्स पर, किसी एड्रेस में टाइप करने पर, ऊपर की लाइन के सबसे दाहिने हिस्से के साथ, बीच कॉलम में दिखाए गए मानों को मेमोरी में स्टोर करना होगा, और अगली लाइन को निम्नलिखित एड्रेस के साथ शुरू करना होगा। उस रूप में टाइपिंग कोड हेक्स में टाइप करने की तुलना में बहुत अधिक सुविधाजनक था, लेकिन किसी को हर चीज के सटीक पते को जानना था।

अधिकांश असेंबलर एक को प्रतीकात्मक पते का उपयोग करने की अनुमति देते हैं। उपरोक्त कोड को और अधिक लिखा जाएगा:

rainbow_lp:
  lda ColorTbl, x
  sta WSYNC
  Sta COLUBK
  डेक्स
  bpl इंद्रधनुष_lp

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


1
+1। एक और अतिरिक्त बिंदु: अलग-अलग विधानसभा भाषा वाक्यविन्यास भी हैं , जिनमें सबसे प्रसिद्ध इंटेल और एटीएंडटी हैं
informatik01

1
@ Informatik01: कैसे Zilog Z80 इंटेल बनाम 8080 mnemonics के बारे में? मुझे लगता है कि इंटेल बनाम एटी एंड टी वाक्यविन्यास युद्ध से पहले होगा।
सुपरकैट

बहस न करते हुए, मैंने बस उस पहलू (अलग वाक्यविन्यास) का उल्लेख किया और दो सबसे लोकप्रिय / प्रसिद्ध / प्रसिद्ध वाक्य रचनाओं का उदाहरण दिया।
informatik01

4

स्रोत कोड, असेंबली कोड, मशीन कोड, ऑब्जेक्ट कोड, बाइट कोड, निष्पादन योग्य फ़ाइल और लाइब्रेरी फ़ाइल।

इन सभी शब्दों को अक्सर अधिकांश लोगों के लिए इस तथ्य के लिए भ्रमित किया जाता है कि उन्हें लगता है कि वे पारस्परिक रूप से अनन्य हैं । उनके संबंधों को समझने के लिए आरेख देखें। प्रत्येक पद का विवरण नीचे दिया गया है।


कोड के प्रकार


सोर्स कोड

मानव पठनीय (प्रोग्रामिंग) भाषा में निर्देश


उच्च स्तरीय कोड

उच्च स्तरीय (प्रोग्रामिंग) भाषा में लिखे गए निर्देश
जैसे, C, C ++ और Java प्रोग्राम


विधानसभा कोड

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


वस्तु कोड

एक संकलन प्रक्रिया का उत्पाद। यह मशीन कोड या बाइट कोड के रूप में हो सकता है।
उदाहरण के लिए, file.o


मशीन कोड

मशीन भाषा में निर्देश।
जैसे, a.out


बाइट कोड

एक मध्यवर्ती रूप में निर्देश जिसे जेवीएम जैसे दुभाषिया द्वारा निष्पादित किया जा सकता है।
जैसे, जावा क्लास फाइल


निष्पादनीय फाइल

लिंकिंग का उत्पाद सफल हुआ। वे मशीन कोड हैं जो सीपीयू द्वारा सीधे निष्पादित किए जा सकते हैं।
उदाहरण के लिए, .exe फ़ाइल।

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


लाइब्रेरी फ़ाइल

कुछ कोड अलग-अलग कारणों से इस रूप में संकलित किए जाते हैं जैसे कि पुन: प्रयोज्य और बाद में निष्पादन योग्य फ़ाइलों द्वारा उपयोग किया जाता है।


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

@PeterCordes टिप्पणी के लिए आपका बहुत-बहुत धन्यवाद। मुझे इस बात की जानकारी नहीं थी कि आपने जीसीसी के कामकाज के बारे में क्या कहा। हालांकि, मुझे डर है कि क्या मैं आपके साथ पूरी तरह से सहमत हो सकता हूं। मेरा मतलब क्या है, स्रोत कोड मानव-पठनीय प्रोग्रामिंग भाषा का उपयोग करके लिखा गया है। यह मनुष्यों द्वारा लिखा या बनाए रखा जा सकता है या नहीं रखा जा सकता है। मुझे यकीन है कि आप ट्रांसकंपलर के बारे में जानते होंगे। अपने दृष्टिकोण से, आप इस तरह के संकलक के उत्पाद को किस श्रेणी में रखेंगे? सोर्स कोड या कुछ और? कृपया मुझे सुधारें अगर मैं गलत हूं। आगे की टिप्पणियों का हमेशा स्वागत है।
बर्ट्राम गिलफॉयल

1

असेंबली कोड की यहां चर्चा की गई है

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

मशीन कोड की यहां चर्चा की गई है

"मशीन कोड या मशीन भाषा एक निर्देश और डेटा की एक प्रणाली है जिसे सीधे कंप्यूटर की केंद्रीय प्रसंस्करण इकाई द्वारा निष्पादित किया जाता है।"

असल में, कोडांतरक कोड भाषा है और यह कोड (ऑब्जेक्ट एक संकलक के अनुरूप) द्वारा (सीपीयू चलाता है कि मूल कोड) ऑब्जेक्ट कोड के लिए अनुवादित है।


1

मुझे लगता है कि ये मुख्य अंतर हैं

  • कोड की पठनीयता
  • आपका कोड क्या कर रहा है इस पर नियंत्रण रखें

पठनीयता के साथ बनाए जाने के 6 महीने बाद पठनीयता कोड में सुधार कर सकती है या प्रतिस्थापित कर सकती है, दूसरी ओर, यदि प्रदर्शन महत्वपूर्ण है, तो आप उत्पादन में आपके पास मौजूद विशिष्ट हार्डवेयर को लक्षित करने के लिए निम्न स्तर की भाषा का उपयोग करना चाह सकते हैं, इसलिए तेजी से निष्पादन।

आईएमओ आज कंप्यूटर तेजी से पर्याप्त हैं ताकि एक प्रोग्रामर को ओओपी के साथ तेजी से निष्पादन मिल सके।


1

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

जबकि मनुष्यों द्वारा कुछ हद तक समझ में आता है, असेंबलर अभी भी निम्न स्तर का है। कुछ भी उपयोगी करने के लिए बहुत सारे कोड लगते हैं।

इसलिए इसके बजाय हम C, BASIC, FORTAN (मुझे पता है कि मैंने खुद को डेट किया है) जैसी उच्च स्तरीय भाषाओं का उपयोग करते हैं। जब इन उत्पादन ऑब्जेक्ट कोड संकलित किया। प्रारंभिक भाषाओं में मशीन भाषा उनके ऑब्जेक्ट कोड के रूप में थी।

आज कई भाषाएँ ऐसी JAVA और C # आमतौर पर एक बाईटेकोड में संकलित होती हैं जो मशीन कोड नहीं है, लेकिन एक जिसे आसानी से मशीन कोड का उत्पादन करने के लिए रन टाइम पर व्याख्या की जाती है।


जावा और सी # के बारे में आपकी टिप्पणी - दोनों ही जस्ट इन टाइम संकलन का उपयोग करते हैं ताकि बायोटेक की व्याख्या न हो। C # (.NET आम तौर पर) इंटरमीडिएट लैंग्वेज (IL) के लिए संकलित होता है, जिसे बाद में लक्ष्य सीपीयू के लिए देशी मशीन लैंग्वेज में JITed किया जाता है।
क्रेग शीयर

-1

आपके कार्यक्रमों की स्रोत फाइलें ऑब्जेक्ट फ़ाइलों में संकलित की जाती हैं, और फिर लिंकर उन ऑब्जेक्ट फाइलों को एक साथ जोड़ता है, जो आपके आर्किटेक्चर के मशीन कोड सहित एक निष्पादन योग्य फ़ाइल का निर्माण करते हैं।

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

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

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