हमें विधानसभा भाषा की आवश्यकता क्यों है?
खैर, वास्तव में केवल एक ही भाषा है जिसकी हमें कभी आवश्यकता होगी , जिसे "मशीन भाषा" या "मशीन कोड" कहा जाता है। यह इस तरह दिख रहा है:
0010000100100011
यह एकमात्र ऐसी भाषा है जिसे आपका कंप्यूटर सीधे बोल सकता है। यह वह भाषा है जिसे CPU बोलता है (और तकनीकी रूप से, विभिन्न प्रकार के CPU विभिन्न संस्करण बोलते हैं)। यह देखने और समझने की कोशिश करने के लिए भी बेकार है।
सौभाग्य से, बाइनरी का प्रत्येक खंड एक विशेष अर्थ से मेल खाता है। इसे कई वर्गों में विभाजित किया गया है:
0010|0001|0010|0011
operation type source register other source destination register
0010 0001 0010 0011
ये मूल्य इनसे मेल खाते हैं:
operation type 0010 = addition
source register 0001 = register 1
other source 0010 = register 2
destination register 0011 = register 3
तो यह ऑपरेशन 1 और 2 रजिस्टर में संख्याओं को जोड़ देगा और उस मूल्य को रजिस्टर 3 में डाल देगा। यदि आप सचमुच इन मूल्यों को सीपीयू में रखते हैं और इसे "जाना" बताते हैं, तो यह आपके लिए दो नंबर जोड़ देगा। ऑपरेशन "घटाना" यहां 0010 के बजाय 0011 या कुछ और हो सकता है। जो भी मूल्य सीपीयू एक घटाव करेगा।
तो एक कार्यक्रम इस तरह दिख सकता है (इसे समझने की कोशिश न करें, क्योंकि मैंने चीजों को समझाने के लिए मशीन कोड के इस विशेष संस्करण को बनाया है):
instruction 1: 0010000100100011
instruction 2: 0011000110100100
instruction 3: 0101001100010111
instruction 4: 0010001001100000
क्या यह पढ़ने के लिए चूसना है? निश्चित रूप से। लेकिन हमें सीपीयू के लिए इसकी आवश्यकता है । ठीक है, अगर हर मशीन कोड एक विशेष कार्रवाई से मेल खाती है, तो बस एक सरल "अंग्रेजी" शॉर्टहैंड बनाने की सुविधा देता है, और फिर एक बार हम समझते हैं कि कार्यक्रम क्या कर रहा है, इसे वास्तविक बाइनरी मशीन कोड में परिवर्तित करें और इसे चलाने के लिए सीपीयू को दें।
तो ऊपर से हमारा मूल निर्देश ऐसा लग सकता है:
(meaning) operation type source register other source destination register
(machine code) 0010 0001 0010 0011
("English") add r1 r2 r3
ध्यान दें कि इस अंग्रेजी संस्करण में मशीन कोड के लिए एक सटीक मैपिंग है । इसलिए जब हम इस "अंग्रेजी" की एक पंक्ति लिखते हैं, तो हम वास्तव में केवल मित्रवत और अधिक समझने योग्य मशीन कोड लिख रहे हैं।
खैर, यह विधानसभा भाषा है। इसलिए यह मौजूद है, और यह मूल रूप से क्यों बनाया गया था।
यह समझने के लिए कि हमें अब इसकी आवश्यकता क्यों है, उपरोक्त उत्तर पढ़ें, लेकिन इसे समझने की कुंजी यह है: उच्च स्तरीय भाषाओं में एक भी प्रतिनिधित्व नहीं है मशीन कोड है। जैसे C, या पायथन, या जो भी:
z = x + y
यह ऊपर से हमारे जोड़ की तरह लगता है, मानकर x
रजिस्टर 1 में y
है, रजिस्टर 2 में है, और z
रजिस्टर 3 में समाप्त होना चाहिए। लेकिन इस लाइन के बारे में क्या?
z = x * 2 + (y / 6) * p + q - r
बाइनरी के 16 बिट्स में उस लाइन का प्रतिनिधित्व करने की कोशिश करें और सीपीयू को "गो" बताएं। आप नहीं कर सकते। मशीन कोड में एक जोड़, घटाव और एक बार में 4 या 5 चर के साथ और कुछ भी करने के लिए कोई एकल संचालन निर्देश नहीं है। इसलिए इसे पहले मशीन कोड के अनुक्रम में बदलना होगा। जब आप "संकलन" करते हैं या उच्च स्तर की भाषा "व्याख्या" करते हैं तो यही आप करते हैं।
ठीक है, हमारे पास ऐसा करने के लिए कार्यक्रम हैं, इसलिए हमें अब विधानसभा की आवश्यकता क्यों है? वैसे कहें कि आपका कार्यक्रम आपकी अपेक्षा से अधिक धीमी गति से चल रहा है, और आप जानना चाहते हैं कि क्यों। इस लाइन की मशीन भाषा "आउटपुट" को देखकर ऐसा लग सकता है:
1010010010001001
0010001000010000
0110010000100100
0010001011000010
0010100001000001
0100010100000001
0010010101000100
0010101010100000
0000100111000010
बस पायथन की एक पंक्ति को प्राप्त करने के लिए। तो आप वास्तव में उस पर डिबग करना चाहते हैं?!?!?!? सं । इसके बजाय, आप अपने संकलक से पूछते हैं कि आप उसे किस रूप में आउटपुट दे सकते हैं जो आप वास्तव में आसानी से समझ सकते हैं, जो उस मशीन कोड के बिल्कुल समान असेंबली भाषा का संस्करण है । तब आप यह पता लगा सकते हैं कि आपका कंपाइलर कुछ गूंगा कर रहा है या नहीं और उसे ठीक करने की कोशिश करें।
(@ राफेल की सलाह पर अतिरिक्त ध्यान दें: आप वास्तव में सीपीयू के उस काम को बाइनरी कोड के अलावा अन्य चीजों के साथ कर सकते हैं, जैसे टर्नरी (बेस 3) या दशमलव कोड, या एएससीआईआई। हालांकि, व्यावहारिक उद्देश्यों के लिए, हम वास्तव में बाइनरी के लिए फंस गए हैं।)