कुछ प्रोग्रामर C, Python, C ++ को अलग तरह से क्यों वर्गीकृत करते हैं? - स्तर के संबंध में


16

मैं अजगर पर एक परिचयात्मक पाठ्यक्रम ले रहा हूं और प्रशिक्षक कहता है कि अजगर उच्च स्तरीय भाषा है और C और C ++ निम्न स्तर की भाषाएं हैं। यह भ्रामक है। मैंने सोचा था कि सी, सी ++, पायथन, जावा, आदि सभी उच्च स्तरीय भाषाएं थीं।

मैं C, C ++, आदि पर स्टैक्वोवरफ़्लो पर प्रश्न पढ़ रहा था और वे सभी उन भाषाओं को उच्च स्तर के रूप में संदर्भित करते हैं। यह मुझे लगता है कि कुछ प्रोग्रामर उन शब्दों का इस्तेमाल परस्पर करते हैं।


1
कई चीजों की तरह, उच्च बनाम निम्न स्तर एक सरलीकरण है - समझ के लिए उपयोगी है, लेकिन संभावित रूप से भ्रामक अगर आप भूल जाते हैं कि यह एक सरलीकरण है। क्या स्तर निश्चित रूप से सापेक्ष है, जैसा कि अन्य ने कहा है। लेकिन यह जरूरी नहीं कि एक पंक्ति है - अलग-अलग दिशाएं हैं जो आप में सार कर सकते हैं (जैसे अलग-अलग प्रतिमान)। सिर्फ इसलिए कि आप मशीन अमूर्त से आगे बढ़ रहे हैं, जरूरी नहीं कि आप अपने आवेदन के लिए एक उपयुक्त अमूर्त की ओर बढ़ रहे हों।
स्टीव ३१

यहां तक ​​कि शुरुआती बिंदु भिन्न हो सकते हैं। उदाहरण के लिए, आईएमओ लैंबडा कैलकुलस अमूर्त का एक निम्न स्तर है - मशीन में बहुत सार, लेकिन यह एक बहुत ही सरल अमूर्त है जो कार्यात्मक भाषाओं के लिए शुरुआती बिंदु के रूप में कार्य करता है ताकि शीर्ष पर सार का निर्माण शुरू हो सके। किसी भी मामले में, लैम्ब्डा पथरी मशीन कोड की तुलना में किसी विशेष अनुप्रयोग के लिए आदर्श अमूर्त के करीब नहीं है।
स्टीव ३१

जवाबों:


31

उच्च स्तर और निम्न स्तर सापेक्ष शब्द हैं इसलिए समय के साथ उपयोग बदल गया है। 70 के दशक में UNIX ने तरंगें बनाई क्योंकि यह दर्शाता था कि एक ऑपरेटिंग सिस्टम मुख्य रूप से उच्च स्तरीय भाषा में लिखा जा सकता है: C. उस समय C को उच्च स्तर पर कोडांतरक के विपरीत माना जाता था।

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

सी एक दूसरे अर्थ में निम्न स्तर है: यह कंप्यूटर हार्डवेयर के प्रत्यक्ष हेरफेर को सक्षम करता है (कम से कम जैसा ओएस सीधे अनुमति देगा)। पायथन, जावा, आदि के सबसे सामान्य कार्यान्वयन हार्डवेयर से कम से कम एक कदम आगे हैं क्योंकि वे एक वीएम में चलते हैं। यदि आप Python से हार्डवेयर में हेरफेर करना चाहते हैं, तो आप Python VM में एक एक्सटेंशन लिखेंगे, आमतौर पर C या C ++ में।

C ++ एक विषम मामला है। यह मानक पुस्तकालय के हिस्से के रूप में अच्छी डेटा संरचनाएं प्रदान करता है, लेकिन यह हार्डवेयर के निम्न-स्तरीय हेरफेर की भी अनुमति देता है।


3
C ++ वास्तव में एक अजीब मामला नहीं है, IMO - यह केवल एक मिश्रित-स्तरीय भाषा है। अमूर्तता का स्तर आपके द्वारा उपयोग की जाने वाली सुविधाओं पर निर्भर करता है।
स्टीव

1
@ स्टीव 314: हाँ और नहीं: आम तौर पर अमूर्त जानकारी छिपाने के साथ आता है, यानी एक भाषा या पुस्तकालय एक ब्लैक बॉक्स की तरह है जो एक इंटरफ़ेस प्रदान करता है, और कोई भी यह जानना नहीं चाहता है कि ब्लैक बॉक्स के अंदर क्या है। सी ++ इसमें थोड़ा अजीब है क्योंकि यह उच्च-स्तरीय निर्माण प्रदान करता है, लेकिन प्रोग्रामर को उनके प्रतिनिधित्व तक पहुंचने और उन्हें तोड़ने से नहीं रोकता है। C ++ एकमात्र ऐसी भाषा है जिसके बारे में मुझे पता है कि अलग-अलग अमूर्त परतों को अलग नहीं करता है (लेकिन शायद ऐसी अन्य भाषाएं हैं जो मुझे नहीं पता हैं)।
जियोर्जियो

1
@Giorgio - C ++ आपको किसी भी कार्यान्वयन विवरण को छिपाने की अनुमति देता है - जैसे कि इसे किसी वर्ग के निजी आंतरिक भाग का हिस्सा बनाते हैं इसलिए इसका उपयोग करने का एकमात्र आधिकारिक तरीका उस वर्ग के सार्वजनिक इंटरफ़ेस के माध्यम से है। बेशक आप नियमों को तोड़ सकते हैं और अपनी स्मृति को आप सभी को निकालना चाहते हैं - लेकिन व्यवहार में आप ऐसा किसी भी भाषा में कर सकते हैं जो वास्तविक दुनिया के अनुप्रयोग विकास का समर्थन करता है।
स्टीव

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

@ जिओर्जियो - निश्चित रूप से मेरे पास उन मूल्यों को खोजने में एक कठिन समय हो सकता है जिन्हें मैं स्मृति में भ्रष्ट करना चाहता हूं, लेकिन सी ++ में वही लागू हो सकता है, यह इस बात पर निर्भर करता है कि मैंने उन्हें कितनी अच्छी तरह छिपाया है। उदाहरण के लिए, मैं PIMPL का उपयोग कर सकता हूं । यदि मैं तब केवल उस लाइब्रेरी के लिए ऑब्जेक्ट कोड और हेडर प्रदान करता हूं जो समझता है कि जो इंगित करता है, तो-होने के लिए विध्वंसक को रिवर्स-इंजीनियर करना होगा जो ऑब्जेक्ट कोड को यह पता लगाने के लिए कि क्या उप-प्रकार और कैसे।
स्टीव ३१

8

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

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

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

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

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

उच्च-स्तरीय भाषाओं में फ़ंक्शन का लाभ होता है। वे हमें स्वतंत्र रूप से डिजाइन करने और विकसित करने की अनुमति देते हैं (और सुरक्षित रूप से!)।

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

उम्मीद है की यह मदद करेगा


5

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

सबसे निचला स्तर, स्पष्ट रूप से, बाइनरी मशीन कोड है - यह सटीक प्रतिनिधित्व है जो ओएस लोड करता है और सीपीयू को खिलाता है। असेंबली इसके ऊपर निर्मित अमूर्तता का पहला स्तर है: बाइनरी कोड के बजाय, कोई एमनेमोनिक्स, मानव-पठनीय प्रतीकात्मक कोड लिखता है जो बाइनरी मशीन निर्देशों का प्रतिनिधित्व करता है। यह वही है जो लोग UNIX से पहले सिस्टम प्रोग्रामिंग के लिए उपयोग करते थे।

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

C ++ अमूर्तता की एक और परत जोड़ता है: इसमें कक्षाएं (अमूर्त vtables और संदर्भ एक OOP सिंटैक्स में गुजरती हैं), newऔर delete(एकल निर्माण में मेमोरी एलोकेशन और वैरिएबल इनिशियलाइज़ेशन को बंडल करता है), कंपाइल-टाइम टाइप चेकिंग, टेम्प्लेट (टाइप-सेफ कंपाइल-टाइम) मेटाप्रोग्रामिंग), और संकलन-समय सिंटैक्स उपयुक्तताओं का एक गुच्छा जैसे नामस्थान, फ़ंक्शन और ऑपरेटर ओवरलोडिंग, आदि।

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

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

लंबी कहानी छोटी: उच्च-स्तर-नेस एक स्लाइडिंग स्केल है, और आपके द्वारा उल्लिखित तीन भाषाओं के लिए यह C <C ++ <Python है।


मैं कहूंगा कि उच्च-स्तर बनाम निम्न-स्तर एक पैमाना नहीं है, बल्कि दो अलग-अलग पैमाने हैं। निम्न-स्तर-नेस मशीन के व्यवहार से कितनी अच्छी तरह संबंधित है, जबकि उच्च-स्तर-नेस एक अमूर्तता प्रदान करने की क्षमता से संबंधित है। सी # C99 की तुलना में एक उच्च स्तरीय भाषा के अधिक है, लेकिन है यह भी सी स्टैंडर्ड द्वारा परिभाषित भाषा की तुलना में कम स्तर के, एक पर एक सरणी दो में प्रक्रिया "लघु" मूल्यों के लिए एक "पूर्णांक" सूचक का उपयोग कर उदाहरण के व्यवहार के बाद से समय C # में परिभाषित किया गया है, लेकिन C99 में नहीं।
सुपरकैट

3

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

निम्न-स्तरीय भाषाएँ:
ये भाषाएँ "पास" हैं कि मशीन क्या निष्पादित कर सकती है (सबसे निम्न स्तर: असेंबली कोड!)।
इन भाषाओं के साथ काम करते समय, प्रोग्रामर को मेमोरी प्रबंधन जैसे निम्नतम स्तर के सामान के बारे में सोचना पड़ता है .. आप हार्डवेयर के उस अर्थ में करीब हैं, कि आपको इसके साथ सीधे काम करना है।

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

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