मेरा मानना है कि प्रोग्रामिंग के पीछे के सिद्धांतों को सीखने के लिए C एक अच्छी भाषा है। आप निचले स्तर की भाषाओं में सीखने के लिए क्या खड़े हैं जो "मैगी" हैं जो उच्च स्तर के लोगों से दूर हैं, जैसे कि रूबी?
मेरा मानना है कि प्रोग्रामिंग के पीछे के सिद्धांतों को सीखने के लिए C एक अच्छी भाषा है। आप निचले स्तर की भाषाओं में सीखने के लिए क्या खड़े हैं जो "मैगी" हैं जो उच्च स्तर के लोगों से दूर हैं, जैसे कि रूबी?
जवाबों:
कंप्यूटर विज्ञान के सामान्य अमूर्त अर्थ में, कोई सिद्धांत नहीं हैं, जो सी में मौजूद हैं जो उच्च-स्तरीय भाषाओं में भी मौजूद नहीं हैं। कंप्यूटर विज्ञान के सभी एल्गोरिदम को उबालता है, और सभी एल्गोरिदम को किसी भी भाषा में लागू किया जा सकता है जो कि ट्यूरिंग-पूर्ण है जैसा कि सी है।
C के अतिरिक्त ले जाने वाली भाषा का अंतर उच्च-स्तरीय भाषाओं के रूप में होता है, यह उस अंतर के समान होता है जो मशीन कोड C से अलग होता है: मशीन के कोड से संबंध।
जैसा कि आप उच्च-स्तरीय भाषाओं में कोड लिखते हैं, आप (आमतौर पर) इस बात की चिंता नहीं करते हैं कि आपका कोड मशीन के साथ कैसे इंटरैक्ट करता है। वर्चुअल मशीन जिसे भाषा अपने लिए परिभाषित करती है, कोड निष्पादन के उन पहलुओं को छुपाती है।
सी में, स्मृति के साथ आपके कार्यक्रम की बातचीत सबसे आगे होती है। यह केवल इससे अधिक है कि आपको अपने ढेर के उपयोग का प्रबंधन करना है, इसमें स्टैक के साथ आपके कोड का इंटरैक्शन शामिल है, और कैसे आपके कोड की मात्र मेमोरी तक पहुंच आपके कोड के व्यवहार और प्रदर्शन को प्रभावित करती है - मेमोरी एक्सेस का क्रम भी नहीं। अपने ध्यान से बचने की अनुमति दी जा सकती है, क्योंकि गलत समय पर गलत मेमोरी को पढ़ने से प्रभावी प्रदर्शन खराब हो सकता है।
उच्च-स्तरीय भाषाओं में, ये बातें सरल नहीं हैं। मेमोरी को आपके ज्ञान के बिना, और कभी-कभी आपके संकेत के बिना आवंटित और निपटाया जाता है। ज्यादातर, यह आपके नियंत्रण से बाहर है। अधिकांश मेमोरी आवंटन कब, कहाँ, कैसे और क्यों होते हैं, बस आपसे छिपाया जाता है।
इसी तरह, दूसरी दिशा में, मशीन कोड या असेंबली कोड लिखना अभी तक अधिक विवरण सामने लाता है: आपके दायरे से लगभग कुछ भी नहीं बचा है, और आपके कोड को हर आवंटन, प्रत्येक संसाधन, पास होने वाले डेटा के प्रत्येक टुकड़े के बारे में पता होना चाहिए। सीपीयू के रजिस्टरों के माध्यम से - ज्ञान जो अब तक उच्च-स्तरीय भाषाओं से हटा दिया गया है जैसा कि आर्कियन होना चाहिए।
मुझे पता है कि प्रोग्रामिंग के पीछे के सिद्धांतों को सीखने के लिए C एक अच्छी भाषा है।
मैं असहमत हूं। C प्रोग्रामिंग के पीछे सिद्धांतों को सीखने के लिए बहुत सी सुविधाओं से अनुपस्थित है। अमूर्तता बनाने के लिए सी की विशेषताएं भयानक हैं, और अमूर्तता प्रोग्रामिंग के पीछे प्रमुख सिद्धांतों में से एक है।
यदि आप सीखना चाहते हैं कि हार्डवेयर कैसे काम करता है, और इसलिए मशीन के लिए कुछ यांत्रिक सहानुभूति है, तो आपको मशीन कोड, उर्फ इंस्ट्रक्शन सेट आर्किटेक्चर सीखना चाहिए, और आधुनिक सीपीयू के कैश निर्माण का भी अध्ययन करना चाहिए। ध्यान दें कि मैं विधानसभा भाषा की सिफारिश नहीं कर रहा हूं, बस हार्डवेयर निर्देशों को समझें, ताकि आप समझ सकें कि एक कंपाइलर क्या उत्पन्न करता है।
यदि आप प्रोग्रामिंग सिद्धांतों को सीखना चाहते हैं, तो जावा, सी #, या स्विफ्ट जैसी आधुनिक भाषा का उपयोग करें, या रस्ट जैसे दर्जनों अन्य में से एक। इसके अलावा, कार्यात्मक सहित विभिन्न प्रकार के प्रोग्रामिंग प्रतिमानों का अध्ययन करें।
अधिकांश प्रोग्रामिंग भाषाओं को अमूर्त मशीनों के रूप में वर्णित किया गया है। फिर, उन्हें कंपाइलर, लिंकर्स, असेंबलर, दुभाषिए, स्टैटिक एनालाइज़र, इंटरमीडिएट लैंग्वेज और हार्डवेयर जैसे उपकरणों के सेट का उपयोग करके कार्यान्वित किया जाता है, जो सामूहिक रूप से एक परिणाम देगा, जो प्रोग्राम के अनुसार देखे गए अमूर्त मशीन के कम से कम सभी अपेक्षित व्यवहार का सम्मान करता है। ।
C उपरोक्त नियम का अपवाद नहीं है। यह एक अमूर्त मशीन के संदर्भ में वर्णित है जिसमें आपके वास्तविक हार्डवेयर की कोई धारणा नहीं है।
जैसे, जब लोग कहते हैं कि C आपको सिखाता है कि आपका कंप्यूटर वास्तव में कैसे काम करता है, तो उनका आमतौर पर मतलब यह होता है कि C आपको सिखाता है कि C कैसे काम करता है। लेकिन C सिस्टम प्रोग्रामिंग में इतना व्यापक होने के कारण, यह समझ में आता है कि बहुत सारे लोग इसे कंप्यूटर के साथ भ्रमित करना शुरू कर देते हैं। और मैं व्यक्तिगत रूप से यह कहना चाहूंगा कि यह जानना कि सी कैसे काम करता है, यह जानना अक्सर महत्वपूर्ण है कि कंप्यूटर कैसे काम करता है।
लेकिन फिर भी, C और कंप्यूटर अलग - अलग चीजें हैं। वास्तविक हार्डवेयर वास्तव में जटिल है - उन तरीकों से जो सी कल्पना को बच्चों की किताब की तरह पढ़ते हैं। यदि आप रुचि रखते हैं कि आपका हार्डवेयर कैसे काम करता है, तो आप हमेशा एक मैनुअल देख सकते हैं और कोडांतरक में कोड लिखना शुरू कर सकते हैं। या आप हमेशा डिजिटल सर्किट के बारे में सीखना शुरू कर सकते हैं ताकि आप अपने आप कुछ हार्डवेयर डिजाइन कर सकें। (बहुत कम से कम, आप सराहना करेंगे कि उच्च-स्तरीय सी कैसे है।)
ठीक है, वास्तव में हार्डवेयर के बारे में सीखने में सी के अलावा अन्य चीजें शामिल हैं लेकिन क्या सी आज प्रोग्रामर को कुछ और सिखा सकते हैं?
मुझे लगता है कि यह निर्भर करता है।
इन संभावनाओं में से एक का चयन करने के लिए बहुत जल्दी मत बनो। मैं कई वर्षों से कोड लिख रहा हूं और मुझे अभी भी पता नहीं है कि कौन सा सही उत्तर है, या क्या सही उत्तर दोनों में से एक है, या क्या इस मुद्दे पर एक सही उत्तर के रूप में ऐसी कोई बात है।
मैं यह मानने के लिए थोड़ा इच्छुक हूं कि आपको अंततः दोनों विकल्पों को लागू करना चाहिए, शिथिल रूप से मैंने उन्हें जिस क्रम में वर्णित किया है, लेकिन मुझे नहीं लगता कि यह वास्तव में एक तकनीकी मामला है, मुझे लगता है कि यह ज्यादातर शैक्षिक है। हर व्यक्ति को अलग-अलग तरीके से सीखना लगता है।
यदि आपने मेरे द्वारा प्रस्तावित दूसरे विकल्प को कम से कम शामिल करके उपरोक्त प्रश्न का उत्तर दिया है, तो आपके पास पहले से ही आपके बेल्ट के नीचे कुछ उत्तर हैं: उच्च-स्तरीय भाषाओं में जो कुछ भी सीखा जा सकता है, उसे सी या फिर से आविष्कार करके बेहतर तरीके से सीखा जा सकता है। मिश्रण में C जोड़कर कम से कम विस्तारित किया गया।
लेकिन, आपके जवाब की परवाह किए बिना, निश्चित रूप से कुछ चीजें हैं जो आप सी से लगभग विशेष रूप से सीख सकते हैं (और शायद कुछ अन्य भाषाओं में)।
C ऐतिहासिक रूप से महत्वपूर्ण है। यह एक मील का पत्थर है जिसे आप देख सकते हैं और सराहना कर सकते हैं कि हम कहाँ से आए हैं और शायद हम जहाँ जा रहे हैं उसके बारे में थोड़ा और संदर्भ प्राप्त करें। आप यह मान सकते हैं कि कुछ सीमाएँ क्यों मौजूद हैं और आप इस बात की सराहना कर सकते हैं कि कुछ सीमाएँ हटा दी गई हैं।
C आपको असुरक्षित वातावरण में काम करना सिखा सकता है। दूसरे शब्दों में, यह आपको अपनी पीठ देखने के लिए प्रशिक्षित कर सकता है जब भाषा (कोई भी भाषा) किसी भी कारण से आपके लिए नहीं कर सकती है या नहीं करेगी। यह आपको सुरक्षित वातावरण में भी एक बेहतर प्रोग्रामर बना सकता है क्योंकि आप अपने दम पर कम कीड़े पैदा करेंगे और क्योंकि आप अपने अन्यथा सुरक्षित कार्यक्रम (जैसे संकेत का उपयोग) से कुछ अतिरिक्त गति को निचोड़ने के लिए अस्थायी रूप से सुरक्षा को बंद करने में सक्षम होंगे। C # में), उन मामलों में जहां सुरक्षा रनटाइम लागत के साथ आती है।
C आपको सिखा सकता है कि हर वस्तु की भंडारण आवश्यकताएं, एक मेमोरी लेआउट, तथ्य यह है कि स्मृति को एक परिमित पता स्थान के माध्यम से एक्सेस किया जा सकता है, और इसी तरह। हालांकि अन्य भाषाओं को इन मामलों पर आपका ध्यान देने की आवश्यकता नहीं है, फिर भी कुछ मामले हैं जहाँ कुछ अधिग्रहित अंतर्ज्ञान आपको अधिक सूचित निर्णय लेने में मदद कर सकते हैं।
सी आपको इसके निर्माण प्रणाली के माध्यम से लिंकेज और ऑब्जेक्ट फ़ाइलों और अन्य पेचीदगियों के विवरण के बारे में सिखा सकता है। यह आपको एक उपयोगी हाथ-समझ दे सकता है कि एक मूल रूप से संकलित कार्यक्रम अक्सर स्रोत कोड से निष्पादन तक कैसे जाता है।
C आपके दिमाग को अपरिभाषित व्यवहार की अवधारणा के माध्यम से उपन्यास के तरीकों से सोचने के लिए झुका सकता है। अपरिभाषित व्यवहार सॉफ्टवेयर विकास में मेरी पसंदीदा अवधारणाओं में से एक है, क्योंकि गैर-शास्त्रीय संकलक पर इसके निहितार्थों का अध्ययन एक अद्वितीय मानसिक व्यायाम है जिसे आप अन्य भाषाओं से नहीं प्राप्त कर सकते हैं। हालाँकि, आपको परीक्षण-और-त्रुटि को अस्वीकार करना होगा और इस पहलू की पूरी तरह से सराहना करने से पहले सावधानीपूर्वक और जानबूझकर भाषा का अध्ययन शुरू करना होगा।
लेकिन शायद सबसे महत्वपूर्ण एहसास है कि सी आपको एक छोटी सी भाषा होने के नाते अनुदान दे सकती है, यह विचार है कि सभी प्रोग्रामिंग डेटा और संचालन के लिए उबलते हैं । आप पदानुक्रम के साथ मॉड्यूलर कक्षाओं के रूप में चीजों को देखना पसंद कर सकते हैं और आभासी प्रेषण, या सुरुचिपूर्ण अपरिवर्तनीय मूल्यों के साथ इंटरफेस कर सकते हैं जो शुद्ध गणितीय कार्यों का उपयोग करने पर संचालित होते हैं। और यह सब ठीक है - लेकिन सी आपको याद दिलाएगा कि यह सब सिर्फ डेटा + ऑपरेशन है । यह एक उपयोगी मानसिकता है क्योंकि यह आपको कुछ मानसिक बाधाओं को नीचे लाने की अनुमति देता है।
सी सीखने के लिए अच्छा क्यों है इसका कारण यह नहीं है कि यह किसी भी सिद्धांत को सिखाता है । यह आपको सिखाता है कि चीजें कैसे काम करती हैं ।
सी की तुलना 70 या 80 के दशक की उन अच्छी पुरानी कारों में से एक के साथ की जा सकती है, जिन्हें सिर्फ ड्राइव करने के लिए बनाया गया था। आप उन्हें फाड़ सकते हैं, पेंच से पेंच कर सकते हैं, और समझ सकते हैं कि प्रत्येक भाग कैसे काम करता है, और यह अन्य भागों के साथ मिलकर कैसे काम करता है जिसे आप अपने हाथों में देख सकते हैं। एक बार जब आप सभी भागों को समझ जाते हैं, तो आपके पास एक बहुत स्पष्ट तस्वीर होती है कि पूरा कैसे संचालित होता है।
आधुनिक भाषाएं एक आधुनिक कार की तरह अधिक हैं, जहां इंजन मूल रूप से एक ब्लैक बॉक्स है, जिस तरह से औसत कार मालिक द्वारा समझा जाना बहुत जटिल है। वे कार बहुत कुछ कर सकते हैं, बिल्ली, इन दिनों में सक्रिय रूप से खुद से ड्राइव करना सीख रहे हैं। और उस जटिलता और आराम के साथ, उपयोगकर्ता इंटरफ़ेस को इंजन में वास्तव में आगे बढ़ने से बहुत दूर ले जाया गया है।
जब आप C में प्रोग्रामिंग सीखते हैं, तो आप बहुत सारे स्क्रू और नट्स के संपर्क में आते हैं, जो कंप्यूटर से बना होता है। इससे आप स्वयं मशीन की समझ विकसित कर सकते हैं। उदाहरण के लिए, यह आपको यह समझने की अनुमति देता है कि इस तरह लंबी स्ट्रिंग बनाने के लिए यह एक अच्छा विचार क्यों नहीं है:
java.lang.String result = "";
for(int i = 0; i < components.size; i++) {
result = result + components[i];
};
(मुझे आशा है, यह सही है जावा, मैंने थोड़ी देर में इसका इस्तेमाल नहीं किया है ...) इस कोड उदाहरण से, यह स्पष्ट नहीं है कि लूप में द्विघात जटिलता क्यों है। लेकिन यह मामला है, और यही कारण है कि यह कोड पीसने के लिए आ जाएगा जब आपके पास संक्षिप्त करने के लिए कुछ लाखों छोटे घटक होते हैं। अनुभवी सी प्रोग्रामर तुरंत जानता है कि समस्या कहां है, और संभवतः पहले स्थान पर इस तरह के कोड को लिखने से बचना होगा।
for(int i = 0; i < strlen(s); i++)
सी में, पाश भी द्विघात जटिलता होगा, और यह अपने जावा उदाहरण के रूप में ;-) बस के रूप में unobvious है
सी से बेहतर भाषाएं हैं "प्रोग्रामिंग के पीछे के सिद्धांत", विशेष रूप से सैद्धांतिक सिद्धांतों को सीखने के लिए, लेकिन सी क्राफ्टवर्क के बारे में कुछ व्यावहारिक, महत्वपूर्ण चीजें सीखने के लिए अच्छा हो सकता है। ग्रेफैड का उत्तर निश्चित रूप से सही है, लेकिन IMHO और भी है जो आप C से सीख सकते हैं कि स्मृति का प्रबंधन कैसे करें। उदाहरण के लिए,
अपवादों की अनुपस्थिति में संपूर्ण त्रुटि से निपटने के लिए प्रोग्राम कैसे बनाएं
ऑब्जेक्ट ओरिएंटेशन के लिए किसी भी भाषा के समर्थन के बिना किसी प्रोग्राम में संरचना कैसे बनाएं
डायनामिक सिज़ेबल सूचियों, शब्दकोशों या उपयोगी स्ट्रिंग अमूर्त जैसे डेटा संरचनाओं की अनुपस्थिति में डेटा से कैसे निपटें
जब कंपाइलर या रन टाइम एनवायरनमेंट स्वचालित रूप से आपको चेतावनी नहीं देता है, तब भी सरणी त्रुटियों जैसी सामान्य त्रुटियों से कैसे बचें
टेम्प्लेट या जेनरिक के लिए भाषा समर्थन के बिना जेनेरिक समाधान कैसे बनाएं
और क्या मैंने उल्लेख किया है कि आप सीख सकते हैं कि स्मृति का प्रबंधन कैसे किया जाए? ;-)
इसके अलावा, C सीखने से, आप सीखेंगे कि C ++, Java, C #, ऑब्जेक्टिव C की सिंटैक्टिकल समानताएँ कहाँ से आती हैं।
2005 में, जोएल स्पोल्स्की ने किसी अन्य उच्च स्तरीय भाषा से पहले C सीखने की सिफारिश लिखी । उसकी दलीलें हैं
"आप उच्च स्तरीय भाषाओं में कुशल कोड नहीं बना पाएंगे।"
"आप कभी भी कंपाइलर और ऑपरेटिंग सिस्टम पर काम नहीं कर पाएंगे, जो कि कुछ बेहतरीन प्रोग्रामिंग जॉब हैं।"
"आपको बड़े पैमाने पर परियोजनाओं के लिए आर्किटेक्चर बनाने के लिए कभी भी भरोसा नहीं किया जाएगा"
"यदि आप यह नहीं समझा सकते हैं कि while(*s++ = *t++);
एक स्ट्रिंग की प्रतिलिपि क्यों बनाई जाती है, या यदि यह आपके लिए दुनिया की सबसे स्वाभाविक चीज़ नहीं है, तो ठीक है, आप अंधविश्वास के आधार पर प्रोग्रामिंग कर रहे हैं
बेशक, उन्होंने जो लिखा वह निश्चित रूप से बहस का विषय है, लेकिन उनके कई तर्क IMHO आज भी मान्य हैं।
कंप्यूटिंग के दो मूल सार हैं ट्यूरिंग मशीन और लैम्ब्डा कैलकुलस, और सी एक कम्प्यूटिंग के ट्यूरिंग मशीन के साथ प्रयोग करने का एक तरीका है: ज्यादातर निम्न-स्तरीय कार्यों का एक उत्तराधिकार जिसमें से एक वांछनीय परिणाम निकलता है। लेकिन आपको यह ध्यान रखना होगा कि C अपनी गणना के अपने मॉडल के साथ आता है। तो, C सीखना आपको C अमूर्त मशीन का निम्न-स्तरीय विवरण सिखाएगा, जो वास्तविक आर्किटेक्चर से काफी अलग है। सी में जो सबसे पहली चीज मुझे सिखाई गई थी, वह यह थी कि "चालाक" ट्रिक्स लगाकर कंपाइलर को आउटमार्ट करने की कोशिश कभी नहीं की गई थी, और ऐसा लगता है कि यह रुझान कंपाइलरों में ज्यादा से ज्यादा अनुकूलन की ओर है। अन्य उच्च-स्तरीय भाषाओं की तरह, जब आप C में लिखते हैं, तो कंपाइलर यह समझने की कोशिश करते हैं कि आप अमूर्त C मशीन पर क्या करने की उम्मीद करते हैं और वास्तविक हार्डवेयर पर ऐसा करते हैं।
तो मेरे कहने का मतलब यह है कि C सीखना जरूरी नहीं है कि हार्डवेयर में वास्तव में जो होता है, उसकी अच्छी तस्वीर आपको दी जाए। "सी मशीन के करीब है" को "सबसे उच्च-स्तरीय भाषाओं की तुलना में करीब" समझा जाना चाहिए। यदि आप "यह कैसे काम करता है" की अधिक सटीक तस्वीर चाहते हैं, तो सॉफ्टवेयर आर्किटेक्चर सीखना सीधे अधिक फायदेमंद होने वाला है।
दूसरी ओर, C सीखना आपको सिस्टम प्रोग्रामिंग, निम्न-स्तरीय प्रकार, संकेत और विशेष रूप से मेमोरी आवंटन से परिचित कर सकता है। एल्गोरिदम और डेटा संरचना सीखने के लिए, मुझे नहीं लगता कि अन्य भाषाओं के बजाय सी में उन्हें सीखने का एक फायदा है।
यह बहुत ही खुला हुआ प्रश्न है, निर्णायक जवाब नहीं दे सकता है। आप हर भाषा में बहुत कुछ सीख सकते हैं, बशर्ते आप भाषा के ढांचे को समझें। सी आपको निचले विवरणों को समझने के लिए मजबूर करता है क्योंकि यह मुख्य रूप से एक ऑपरेटिंग सिस्टम लिखने के लिए डिज़ाइन किया गया था। इतने सालों के बाद भी, यह अभी भी सबसे अधिक इस्तेमाल की जाने वाली भाषाओं में से एक है, मुख्य रूप से एम्बेडेड सिस्टम और ओपन सोर्स प्रोजेक्ट्स के लिए धन्यवाद। तो, सवाल यह है कि आप क्या सीखना चाहते हैं? और किस डोमेन में?