निम्न-स्तरीय क्रमादेशन लेेंग्वेज

निम्न-स्तरीय प्रोग्रामिंग भाषा एक प्रोग्रामिंग भाषा है जो कंप्यूटर के निर्देश सेट आर्किटेक्चर से बहुत कम या कोई अमूर्तता (कंप्यूटर विज्ञान) प्रदान करती है - भाषा मानचित्र में आदेश या कार्य जो प्रोसेसर के निर्देशों के समान संरचनात्मक रूप से हैं। आम तौर पर, यह मशीन कोड या असेंबली भाषा को संदर्भित करता है। भाषा और मशीन भाषा के बीच निम्न (इसलिए शब्द) अमूर्तता के कारण, निम्न-स्तरीय भाषाओं को कभी-कभी हार्डवेयर के करीब होने के रूप में वर्णित किया जाता है। एक निश्चित प्रकार के सिस्टम आर्किटेक्चर के लिए अनुकूलित होने के कारण निम्न-स्तरीय भाषाओं में लिखे गए प्रोग्राम अपेक्षाकृत सॉफ्टवेयर पोर्टेबिलिटी | गैर-पोर्टेबल होते हैं।

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

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

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

हालांकि कुछ प्रोग्राम मशीन भाषा में लिखे जाते हैं, प्रोग्रामर अक्सर कोर निपात के साथ काम करके या फ्रंट पैनल से डिबगिंग करके इसे पढ़ने में माहिर हो जाते हैं।

उदाहरण: nth फाइबोनैचि संख्या की गणना करने के लिए 32-बिट x86 मशीन कोड के हेक्साडेसिमल प्रतिनिधित्व में एक फ़ंक्शन: 8B542408 83FA0077 06B80000 0000C383 FA027706 B8010000 00C353BB 01000000 B9010000 008D0419 83FA0376 078BD989 सी14एईबीएफ1 5बीसी3

विधानसभा भाषा
दूसरी पीढ़ी की भाषाएँ मशीन कोड के शीर्ष पर एक अमूर्त स्तर प्रदान करती हैं। TX-0 और PDP-1 जैसे कंप्यूटरों पर कोडिंग के शुरुआती दिनों में, MIT हैकर संस्कृति ने सबसे पहले असेंबलर लिखने का काम किया। असेंबली लैंग्वेज में बहुत कम शब्दार्थ (कंप्यूटर विज्ञान) या औपचारिक विनिर्देश होते हैं, केवल मानव-पठनीय प्रतीकों की मैपिंग होती है, जिसमें प्रतीकात्मक पते, opcode, स्मृति पता, न्यूमेरिक कॉन्स्टेंट, स्ट्रिंग (कंप्यूटर विज्ञान) आदि शामिल हैं। आमतौर पर, एक मशीन निर्देश (कंप्यूटिंग) को असेंबली कोड की एक पंक्ति के रूप में दर्शाया जाता है। असेंबलर वस्तु फ़ाइल का उत्पादन करते हैं जो अन्य ऑब्जेक्ट फ़ाइलों के साथ लिंकर (कंप्यूटिंग) कर सकते हैं या स्वयं लोडर (कंप्यूटिंग) हो सकते हैं।

अधिकांश असेंबलर निर्देशों के सामान्य अनुक्रम उत्पन्न करने के लिए मैक्रो (कंप्यूटर विज्ञान) प्रदान करते हैं।

उदाहरण: उपरोक्त के समान फाइबोनैचि संख्या कैलकुलेटर, लेकिन एटी एंड टी सिंटैक्स का उपयोग करके x86-64 विधानसभा भाषा में: <वाक्यविन्यास लैंग = एएसएम> _फाइब: movl $1, %eax एक्सओआरएल% ईबीएक्स,% ईबीएक्स .fib_loop: सीएमपीएल $1, %edi जेबी .fib_done movl %eax, %ecx अतिरिक्त %ईबीएक्स, %ईएक्स movl% ecx,% ebx सबल $1, %edi jmp .fib_loop .fib_done: गीला करना 

इस कोड उदाहरण में, x86-64 प्रोसेसर (इसके प्रोसेसर रजिस्टर) की हार्डवेयर सुविधाओं का नाम दिया गया है और सीधे हेरफेर किया गया है। फ़ंक्शन x86 कॉलिंग कन्वेंशन#सिस्टम V AMD64 ABI के अनुसार %edi से अपने इनपुट को लोड करता है और 'EAX', 'EBX', और 'ECX' रजिस्टरों में मूल्यों में हेरफेर करके इसकी गणना तब तक करता है जब तक कि यह समाप्त न हो जाए और वापस न आ जाए। ध्यान दें कि इस असेंबली लैंग्वेज में वैल्यू रिटर्न करने की कोई अवधारणा नहीं है। परिणाम 'ईएक्स' रजिस्टर में संग्रहीत किया गया है, 'आरईटी' कमांड केवल कोड प्रोसेसिंग को स्टैक पर संग्रहीत कोड स्थान पर ले जाता है (आमतौर पर इस फ़ंक्शन को कॉल करने वाले निर्देश के तुरंत बाद) और यह लेखक पर निर्भर है कॉलिंग कोड यह जानने के लिए कि यह फ़ंक्शन 'ईएक्स' में अपना परिणाम संग्रहीत करता है और इसे वहां से पुनर्प्राप्त करता है। x86-64 असेंबली लैंग्वेज किसी फ़ंक्शन से मान वापस करने के लिए कोई मानक नहीं लगाती है (और वास्तव में, फ़ंक्शन की कोई अवधारणा नहीं है); प्रक्रिया के वापस आने के बाद राज्य की जांच करने के लिए कॉलिंग कोड पर निर्भर करता है, अगर उसे मूल्य निकालने की आवश्यकता होती है।

इसकी तुलना C (प्रोग्रामिंग लैंग्वेज) में समान फ़ंक्शन के साथ करें, एक उच्च-स्तरीय भाषा:

<वाक्यविन्यास प्रकाश लैंग = सी> अहस्ताक्षरित int fib (अहस्ताक्षरित int n) { अगर (! एन) वापसी 0; और अगर (एन <= 2) वापसी 1; अन्य { अहस्ताक्षरित इंट ए, सी; के लिए (ए = सी = 1;; --एन) { सी + = ए; अगर (एन <= 2) वापसी सी; ए = सी - ए; }  } } 

यह कोड असेंबली भाषा के उदाहरण की संरचना में बहुत समान है लेकिन अमूर्तता के संदर्भ में महत्वपूर्ण अंतर हैं:


 * इनपुट (पैरामीटर 'एन') एक अमूर्त है जो हार्डवेयर पर कोई संग्रहण स्थान निर्दिष्ट नहीं करता है। व्यवहार में, C कंपाइलर इनपुट के लिए स्टोरेज लोकेशन निर्धारित करने के लिए कई संभावित कॉलिंग कन्वेंशनों में से एक का अनुसरण करता है।
 * असेंबली लैंग्वेज वर्जन स्टैक से इनपुट पैरामीटर को एक रजिस्टर में लोड करता है और लूप के प्रत्येक पुनरावृत्ति में रजिस्टर में वैल्यू को घटाता है, स्टैक पर मेमोरी लोकेशन में वैल्यू को कभी भी नहीं बदलता है। सी कंपाइलर पैरामीटर को एक रजिस्टर में लोड कर सकता है और वही कर सकता है या जहां भी संग्रहीत किया जाता है, वहां मान अपडेट कर सकता है। यह कौन सा चुनता है एक कार्यान्वयन निर्णय है जो पूरी तरह से कोड लेखक से छिपा हुआ है (और कोई साइड इफेक्ट नहीं है (कंप्यूटर विज्ञान), सी भाषा मानकों के लिए धन्यवाद)।
 * स्थानीय चर a, b और c अमूर्त हैं जो हार्डवेयर पर किसी विशिष्ट संग्रहण स्थान को निर्दिष्ट नहीं करते हैं। सी कंपाइलर तय करता है कि लक्ष्य आर्किटेक्चर के लिए वास्तव में उन्हें कैसे स्टोर किया जाए।
 * रिटर्न फ़ंक्शन वापसी के लिए मान निर्दिष्ट करता है, लेकिन यह निर्धारित नहीं करता है कि यह कैसे लौटाया जाता है। किसी विशिष्ट आर्किटेक्चर के लिए C कंपाइलर मान वापस करने के लिए एक 'मानक' तंत्र लागू करता है। x86 आर्किटेक्चर के लिए कंपाइलर आम तौर पर (लेकिन हमेशा नहीं) EAX रजिस्टर का उपयोग एक मूल्य वापस करने के लिए करते हैं, जैसा कि असेंबली लैंग्वेज उदाहरण में होता है (असेंबली लैंग्वेज उदाहरण के लेखक ने C कन्वेंशन को कॉपी करने के लिए चुना है लेकिन असेंबली लैंग्वेज r नहीं है)इसकी गणना करें)।

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

उच्च स्तरीय भाषाओं में निम्न स्तर की प्रोग्रामिंग
1960 के दशक के उत्तरार्ध के दौरान, उच्च-स्तरीय प्रोग्रामिंग भाषा | उच्च-स्तरीय भाषाएँ जैसे IBM PL/S|PL/S, BLISS, BCPL, विस्तारित ALGOL (बरोज बड़ी प्रणालियों के लिए) और C (प्रोग्रामिंग भाषा) में कुछ हद तक पहुँच शामिल थी निम्न-स्तरीय प्रोग्रामिंग कार्य। इसके लिए एक विधि इनलाइन असेंबली है, जिसमें असेंबली कोड उच्च स्तरीय भाषा में एम्बेडेड होता है जो इस सुविधा का समर्थन करता है। इनमें से कुछ भाषाएँ आर्किटेक्चर-निर्भर अनुकूलन संकलक को लक्ष्य प्रोसेसर आर्किटेक्चर का उपयोग करने के तरीके को समायोजित करने की अनुमति देती हैं।