इम्पेरेटिव प्रोग्रामिंग

कंप्यूटर विज्ञान में, आदेशसूचक प्रोग्रामिंग सॉफ़्टवेयर का एक प्रोग्रामिंग सिंटेक्स है जो प्रोग्राम की स्थिति को परिवर्तित करने वाले सिंटेक्स का उपयोग करता है। उसी प्रकार जिस प्रकार से प्राकृतिक भाषाए आदेशसूचक कमांड (कंप्यूटिंग) को व्यक्त करती है एक आदेशसूचक प्रोग्रामिंग में कंप्यूटर के प्रदर्शन के लिए कमांड होते हैं। आदेशसूचक प्रोग्रामिंग यह वर्णन करने पर केंद्रित होती है कि एक प्रोग्राम अपने अपेक्षित परिणामों के उच्च-स्तरीय विवरणों के अतिरिक्त चरण दर को कैसे संचालित करता है।

इस शब्द का प्रयोग प्रायः निर्दिष्ट प्रोग्रामिंग के विपरीत किया जाता है जो इस विषय पर ध्यान केंद्रित करती है कि प्रोग्राम को परिणाम कैसे प्राप्त करना चाहिए और इसके सभी विवरणों को निर्दिष्ट किए बिना प्रोग्राम को कैसे पूर्ण जा सकता है।

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

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

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

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

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

आदेशसूचक और वस्तु-उन्मुख भाषाओं का इतिहास
प्रारंभिक आदेशसूचक भाषाएँ मूल कंप्यूटरों की मशीनी भाषाएँ थीं। इन भाषाओं में सिंटेक्स बहुत सरल थे, जो हार्डवेयर कार्यान्वयन को आसान बनाते थे लेकिन जटिल प्रोग्रामों के निर्माण में अवरोध उत्पन्न करते थे। 1954 में अंतर्राष्ट्रीय व्यवसाय मशीन (आईबीएम) में जॉन बैकस द्वारा विकसित फोरट्रान, जटिल प्रोग्रामों के निर्माण में मशीन कोड द्वारा प्रस्तुत अवरोधों को दूर करने वाली पहली प्रमुख प्रोग्रामिंग भाषा थी। फोरट्रान एक संकलित भाषा थी जो नामांकित वेरिएबल, जटिल प्रोग्राम और कई अन्य विशेषताओं की स्वीकृति देती थी जो अब आदेशसूचक भाषाओं में सामान्य हैं। अगले दो दशकों में कई अन्य प्रमुख उच्च-स्तरीय आदेशसूचक प्रोग्रामिंग भाषाओं का विकास हुआ। 1950 और 1960 के दशक के अंत में, ऐल्गॉल को गणितीय एल्गोरिदम को अधिक आसानी से अभिव्यक्त करने की स्वीकृति देने के लिए विकसित किया गया था और यहां तक ​​कि कुछ कंप्यूटरों के लिए ऑपरेटिंग सिस्टम की लक्ष्य भाषा के रूप में भी कार्य किया गया था। एमयूएमपीएस (1966) ने आदेशसूचक सिंटेक्स को एक तार्किक रूप तक प्रदर्शित किया था जो किसी भी प्रकार के सिंटेक्स न देकर, पूर्ण रूप से कमांड पर निर्धारित थे यहाँ तक कि  और  कमांड को एक दूसरे से स्वतंत्र बनाने की सीमा तक, केवल $ नाम के एक आंतरिक वेरिएबल से जुड़ा हुआ है। कोबोल (1960) और बेसिक (1964) दोनों प्रोग्रामिंग सिंटैक्स को अंग्रेजी की तरह बनाने के प्रयास थे। 1970 के दशक में, पास्कल (प्रोग्रामिंग भाषा) निकोलस विर्थ द्वारा विकसित किया गया था और सी को डेनिस रिची द्वारा बनाया गया था, जब वह बेल प्रयोगशालाओं में कार्य कर रहे थे। तब विर्थ ने मोडुला-2 और ओबेरोन को डिजाइन किया। संयुक्त राज्य अमेरिका के सुरक्षा विभाग की आवश्यकताओ के लिए, जीन इचबियाह और हनीवेल के समूह ने भाषा के लिए आवश्यकताओं को परिभाषित करने के लिए 4 साल की परियोजना के बाद 1978 में एडा (प्रोग्रामिंग भाषा) को डिजाइन करना प्रारम्भ किया। विनिर्देश पहली बार 1983 में 1995, 2005 और 2012 में संशोधन के साथ प्रकाशित हुआ था।

1980 के दशक में वस्तु-उन्मुख प्रोग्रामिंग में रुचि में तीव्रता से वृद्धि देखी गई। ये भाषाएँ शैली में आदेशसूचक थीं, लेकिन वस्तुओं का समर्थन करने के लिए इसमे अन्य सुविधाएँ संबद्ध की गईं थी। 20वीं शताब्दी के अंतिम दो दशकों में ऐसी कई भाषाओं का विकास हुआ। स्मॉलटाक -80, मूल रूप से 1969 में एलन के द्वारा परिकल्पित, 1980 में ज़ेरॉक्स पालो ऑल्टो शोध संस्थान (पीएआरसी) द्वारा प्रारम्भ किया गया था। एक अन्य वस्तु-उन्मुख प्रोग्रामिंग भाषा में अवधारणाओं से आरेखण "सिमुला" जिसे विश्व की पहली वस्तु-उन्मुख प्रोग्रामिंग भाषा माना जाता है, जिसे 1960 के दशक में विकसित किया गया था -बज़्ने स्ट्रॉस्ट्रुप ने सी ++ पर आधारित एक वस्तु-उन्मुख भाषा सी ++ को डिजाइन किया था। सी ++ का डिजाइन 1979 में प्रारम्भ हुआ था। और पहला कार्यान्वयन 1983 में पूर्ण हुआ।

1980 और 1990 के दशक के अंत में, वस्तु-उन्मुख अवधारणाओं पर चित्रित उल्लेखनीय आदेशसूचक भाषा पर्ल प्रोग्रामिंग भाषा थीं जिसे 1987 में लैरी वॉल द्वारा प्रारम्भ किया गया था पायथन को 1990 में गुइडो वैन रोसुम द्वारा प्रारम्भ किया गया था विजुअल बेसिक और विजुअल सी ++ जिसमें माइक्रोसॉफ्ट फाउंडेशन क्लास लाइब्रेरी (एमएफसी) 2.0 सम्मिलित है, जिसको माइक्रोसॉफ्ट द्वारा क्रमशः 1991 और 1993 में प्रारम्भ किया गया था 1994 में रासमस लेर्डोर्फ द्वारा प्रारम्भ पीएचपी, जावा (प्रोग्रामिंग भाषा) 1995 में जेम्स गोस्लिंग (सन माइक्रोसिस्टम्स) द्वारा,जावास्क्रिप्ट, ब्रेंडन ईच (नेटस्केप) द्वारा और रूबी (प्रोग्रामिंग भाषा), युकीहिरो "मैट्ज़" मात्सुमोतो द्वारा, दोनों 1995 में प्रारम्भ की गयी थी माइक्रोसॉफ्ट का डॉटनेट फ्रेमवर्क (2002) इसके मूल में आदेशसूचक है, क्योंकि इसकी मुख्य लक्ष्य भाषाएँ हैं, वीबी डॉटनेट और सी# जो माइक्रोसॉफ्ट डॉटनेट पर आधारित हैं हालाँकि माइक्रोसॉफ्ट की एफ#, एक कार्यात्मक भाषा भी इस पर आधारित है।

फोरट्रान
फोरट्रान (1958) को "आईबीएम गणितीय सूत्र अनुवाद प्रणाली" के रूप में प्रस्तुत किया गया था। इसको स्ट्रिंग (कंप्यूटर विज्ञान) सुविधाओं के अतिरिक्त, वैज्ञानिक गणनाओं के लिए डिज़ाइन किया गया था। निर्दिष्ट (कंप्यूटर प्रोग्रामिंग), प्रक्रियात्मक प्रोग्रामिंग और स्टेटमेंट (कंप्यूटर विज्ञान) के साथ, यह समर्थित है:
 * सरणी डेटा संरचना
 * सबरूटीन्स
 * "डू" लूप

यह सफल हुआ क्योंकि:
 * प्रोग्रामिंग और डिबगिंग (दोष मार्जन) लागत कंप्यूटर की लागत से कम थी।
 * यह आईबीएम द्वारा समर्थित था।
 * उस समय के अनुप्रयोग वैज्ञानिक द्वारा किए जाते थे।
 * अमेरिकी सुरक्षा विभाग ने कोबोल के विकास को प्रभावित किया था जिसमें ग्रेस हूपर का प्रमुख योगदान था। हालांकि, गैर आईबीएम विक्रेताओं ने भी फोरट्रान कंपाइलर प्रोग्राम लिखे, लेकिन एक सिंटैक्स के साथ जो संभवतः आईबीएम के कंपाइलर को विफल कर डेटा था अमेरिकी राष्ट्रीय मानक संस्थान (एएनएसआई) ने 1966 में पहला फोरट्रान मानक विकसित किया। और 1978 में, फोरट्रान-77 फोरट्रान 90 समर्थन करता था।

हालांकि, गैर आईबीएम विक्रेताओं ने फोरट्रान कंपाइलर्स भी लिखे, लेकिन एक सिंटैक्स के साथ जो संभवतः आईबीएम के कंपाइलर को विफल कर देगा।अमेरिकी राष्ट्रीय मानक संस्थान (एएनएसआई) ने 1966 में पहला फोरट्रान मानक विकसित किया। 1978 में, फोरट्रान 77 1991 तक मानक बन गया। फोरट्रान 90 समर्थन करता है:
 * रिकॉर्ड (कंप्यूटर विज्ञान)
 * सूचक (कंप्यूटर प्रोग्रामिंग) सरणियों के लिए

कोबोल
कोबोल (1959) कॉमन बिजनेस ओरिएंटेड लैंग्वेज के लिए खड़ा है। फोरट्रान ने प्रतीकों में हेरफेर किया। जल्द ही यह महसूस किया गया कि प्रतीकों को संख्या होने की आवश्यकता नहीं है, इसलिए तार पेश किए गए।
 * अभिलेख
 * सरणियों के लिए संकेत

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

कोबोल के विकास को दृढ़ता से नियंत्रित किया गया था इसलिए एएनएसआई मानकों की आवश्यकता के लिए भाषाओं का विकास नहीं हुआ। इसके परिणामस्वरूप, इसे 1974 तक 15 वर्षों तक नहीं परिवर्तित किया गया। 1990 के दशक मे वस्तु-उन्मुख प्रोग्रामिंग संस्करण मे कई परिणामी परिवर्तन किए गए थे।

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

सी (प्रोग्रामिंग भाषा)
सी प्रोग्रामिंग भाषा को 1973 मे इसका नाम विकसित किया गया क्योंकि भाषा बीसीपीएल को बी से परिवर्तित कर दिया गया था और एटी और टी बेल लैब्स ने अगले संस्करण को "सी" कहा है इसका उद्देश्य यूनिक्स ऑपरेटिंग सिस्टम को लिखना था।

सी
C (प्रोग्रामिंग लैंग्वेज) (1973) को इसका नाम इसलिए मिला क्योंकि भाषा BCPL को B (प्रोग्रामिंग लैंग्वेज) से बदल दिया गया था, और Bell Labs|AT&T Bell Labs ने अगला संस्करण C कहा। इसका उद्देश्य UNIX ऑपरेटिंग सिस्टम लिखना था। सी एक अपेक्षाकृत छोटी प्रोग्रामिंग भाषा है जिससे कंपाइलर लिखना आसान हो जाता है। इसकी वृद्धि ने 1980 के दशक में हार्डवेयर विकास को प्रतिबिम्बित किया। इसकी वृद्धि इसलिए भी हुई क्योंकि इसमें असेंबली भाषा की सुविधाएं हैं, लेकिन यह उच्च स्तरीय सिंटैक्स का उपयोग करता है। इसमें अन्य नए संस्कारण की सुविधाएँ सम्मिलित हैं जैसे:
 * इनलाइन असेंबलर
 * गणितीय पॉइंटर्स
 * फंक्शन संकेत
 * बिट ऑपरेशंस
 * सी और सी ++ में स्वतंत्र रूप से जटिल ऑपरेटरों का संयोजन

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


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


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


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

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

सी ++ (1985) को मूल रूप से "सी-क्लासेस" कहा जाता था। इसको सिमुला भाषा की वस्तु-उन्मुख सुविधाओं के साथ संबद्ध करके सी की क्षमताओं का विस्तार करने के लिए डिज़ाइन किया गया था। एक वस्तु-उन्मुख मॉड्यूल दो फाइलों से बना होता है। परिभाषा फ़ाइल को  कहा जाता है। यहाँ एक साधारण एप्लिकेशन में   क्लास के लिए सी ++ हेडर फ़ाइल दी गई है: // grade.h // --- // Used to allow multiple source files to include // this header file without duplication errors. // -- class GRADE { public: // This is the constructor operation. // --    GRADE ( const char letter ); // This is a class variable. // -    char letter; // This is a member operation. // ---    int grade_numeric( const char letter ); // This is a class variable. // -    int numeric; }; वस्तु-उन्मुख प्रोग्रामिंग ऑपरेशन एक फंक्शन है जिसका नाम क्लास के नाम के समान है। इसे तब निष्पादित किया जाता है जब कॉलिंग ऑपरेशन  स्टेटमेंट को निष्पादित करता है। एक मॉड्यूल की अन्य फाइल स्रोत कोड है। जहाँ एक साधारण एप्लिकेशन में   क्लास के लिए सी ++ स्रोत फ़ाइल है: // grade.cpp // - GRADE::GRADE( const char letter ) {    // Reference the object using the keyword 'this'. // --    this->letter = letter; // This is Temporal Cohesion // -    this->numeric = grade_numeric( letter ); } int GRADE::grade_numeric( const char letter ) {    if ( ( letter == 'A' || letter == 'a' ) ) return 4; else if ( ( letter == 'B' || letter == 'b' ) ) return 3; else if ( ( letter == 'C' || letter == 'c' ) ) return 2; else if ( ( letter == 'D' || letter == 'd' ) ) return 1; else if ( ( letter == 'F' || letter == 'f' ) ) return 0; else return -1; } यहाँ एक साधारण एप्लिकेशन में  क्लास के लिए C++ एक हेडर फाइल है: // person.h // class PERSON { public: PERSON ( const char *name ); const char *name; }; यहाँ एक साधारण एप्लिकेशन में  क्लास के लिए सी ++ स्रोत फ़ाइल है: // student.cpp // --- STUDENT::STUDENT ( const char *name ): // Execute the constructor of the PERSON superclass. // -    PERSON( name ) {    // Nothing else to do. // --- } यहाँ एक साधारण एप्लिकेशन में  क्लास के लिए सी ++ स्रोत फ़ाइल है: // person.cpp // -- PERSON::PERSON ( const char *name ) {    this->name = name; } यहाँ स्पष्टीकरण के लिए एक  प्रोग्राम है: // student.h // - // A STUDENT is a subset of PERSON. // class STUDENT : public PERSON{ public: STUDENT ( const char *name ); GRADE *grade; }; यहाँ एक साधारण एप्लिकेशन में  के लिए सी ++ स्रोत फ़ाइल है: // student.cpp // --- STUDENT::STUDENT ( const char *name ): // Execute the constructor of the PERSON superclass. // -    PERSON( name ) {    // Nothing else to do. // --- } यहाँ स्पष्टीकरण के लिए एक कंप्यूटर सॉफ़्टवेयर प्रोग्राम है: // student_dvr.cpp // --- int main( void ) {    STUDENT *student = new STUDENT( "The Student" ); student->grade = new GRADE( 'a' ); std::cout // Notice student inherits PERSON's name << student->name << ": Numeric grade = " << student->grade->numeric << "\n"; return 0; } यहाँ सब कुछ कंपाइल करने के लिए एक मेकफ़ाइल है: # all: student_dvr clean: rm student_dvr *.o student_dvr: student_dvr.cpp grade.o student.o person.o    सी ++ student_dvr.cpp grade.o student.o person.o -o student_dvr grade.o: grade.cpp grade.h    सी ++ -c grade.cpp student.o: student.cpp student.h    सी ++ -c student.cpp person.o: person.cpp person.h    सी ++ -c person.cpp
 * 1) ifndef GRADE_H
 * 2) define GRADE_H
 * 1) endif
 * 1) include "grade.h"
 * 1) ifndef PERSON_H
 * 2) define PERSON_H
 * 1) endif
 * 1) include "student.h"
 * 2) include "person.h"
 * 1) include "person.h"
 * 1) ifndef STUDENT_H
 * 2) define STUDENT_H
 * 1) include "person.h"
 * 2) include "grade.h"
 * 1) endif
 * 1) include "student.h"
 * 2) include "person.h"
 * 1) include
 * 2) include "student.h"
 * 1) makefile

यह भी देखें

 * फंक्शन प्रोग्रामिंग
 * प्रोग्रामिंग सिंटेक्स की तुलना
 * प्रतिक्रियात्मक प्रोग्रामिंग
 * प्रोग्रामिंग भाषाओं का इतिहास
 * श्रेणी के अनुसार प्रोग्रामिंग भाषाओं की सूची# आदेशसूचक भाषाएं

संदर्भ

 * Pratt, Terrence W. and Marvin V. Zelkowitz. Programming Languages: Design and Implementation, 3rd ed. Englewood Cliffs, N.J.: Prentice Hall, 1996.
 * Sebesta, Robert W. Concepts of Programming Languages, 3rd ed. Reading, Mass.: Addison-Wesley Publishing Company, 1996.


 * Originally based on the article 'Imperative programming' by Stan Seibert, from Nupedia, licensed under the GNU Free Documentation License.