C से कौन से सिद्धांत सीखे जाते हैं जो उच्च स्तरीय भाषाओं में नहीं सीखे जा सकते? [बन्द है]


11

मेरा मानना ​​है कि प्रोग्रामिंग के पीछे के सिद्धांतों को सीखने के लिए C एक अच्छी भाषा है। आप निचले स्तर की भाषाओं में सीखने के लिए क्या खड़े हैं जो "मैगी" हैं जो उच्च स्तर के लोगों से दूर हैं, जैसे कि रूबी?


2
आप वैसे भी मैजिक या कुछ सीखते हैं। क्योंकि C "धातु के करीब है," आप धातु के बारे में अधिक सीखते हैं।
रॉबर्ट हार्वे

1
जब तक मैंने C ++ का सामना नहीं किया, मैंने संदर्भ की अवधारणा को पूरी तरह से नहीं समझा।
user6245072

6
सी आपको सिखाएगा कि स्टैक ओवरफ्लो वास्तव में क्या है। मुश्किल रास्ता।
david25272

1
काश नए प्रोग्रामर अच्छे पुराने पास्कल और स्ट्रक्चर्ड प्रोग्रामिंग सीखकर शुरुआत करते। आप खुद को तार्किक और संरचित व्यक्त करना सीखते हैं।
बेंट

2
कुछ ऐसा जो केवल C और C ++ आपको सिखाता है कि संकलक आपका सबसे बड़ा दुश्मन है।
कोडइन्चोस

जवाबों:


9

कंप्यूटर विज्ञान के सामान्य अमूर्त अर्थ में, कोई सिद्धांत नहीं हैं, जो सी में मौजूद हैं जो उच्च-स्तरीय भाषाओं में भी मौजूद नहीं हैं। कंप्यूटर विज्ञान के सभी एल्गोरिदम को उबालता है, और सभी एल्गोरिदम को किसी भी भाषा में लागू किया जा सकता है जो कि ट्यूरिंग-पूर्ण है जैसा कि सी है।

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

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

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

उच्च-स्तरीय भाषाओं में, ये बातें सरल नहीं हैं। मेमोरी को आपके ज्ञान के बिना, और कभी-कभी आपके संकेत के बिना आवंटित और निपटाया जाता है। ज्यादातर, यह आपके नियंत्रण से बाहर है। अधिकांश मेमोरी आवंटन कब, कहाँ, कैसे और क्यों होते हैं, बस आपसे छिपाया जाता है।

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


6
मैंने कभी यह नहीं समझा कि लोग इस प्रकार की चर्चाओं में हमेशा ट्यूरिंग-पूर्णता का उल्लेख क्यों करते हैं। इस संदर्भ में ट्यूरिंग-पूर्णता सार्थक नहीं है; सी, इस संदर्भ में अन्य प्रोग्रामिंग भाषाओं से अलग नहीं है तो कुछ भी नहीं सी का उपयोग करने जा ही समय ट्यूरिंग-पूर्णता प्रासंगिक हो जाता है जाता है जब कुछ है जो चर्चा कर ट्यूरिंग-पूर्णता के बारे में सीखा जा करने के लिए वहाँ नहीं ट्यूरिंग-पूर्ण, सीएसएस या HTML की तरह । नर्क, अगर आप पर्याप्त कठिन हैं, तो भी ट्यूरिंग-पूर्ण । अधिक सार्थक प्रश्न प्रयोज्यता
रॉबर्ट हार्वे

3
@RobertHarvey मेरा कहना है कि जब तक किसी भाषा की कम्प्यूटेशनल क्षमता न्यूनतम होती है, तब तक उसका "स्तर" एल्गोरिदम के दृष्टिकोण से अप्रासंगिक हो जाता है, जो इस संदर्भ में केवल वही चीजें हैं जो मायने रखती हैं।
ग्रेफेड

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

2
<विडंबना> जीवविज्ञान रसायन विज्ञान का एक विशेष मामला है, जो कण भौतिकी का एक विशेष मामला है। यदि आप कण भौतिकी को जानते हैं तो जीव विज्ञान से कुछ भी नहीं सीख सकते हैं। सही? </ विडंबना>
फ्लोरियन एफ

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

13

मुझे पता है कि प्रोग्रामिंग के पीछे के सिद्धांतों को सीखने के लिए C एक अच्छी भाषा है।

मैं असहमत हूं। C प्रोग्रामिंग के पीछे सिद्धांतों को सीखने के लिए बहुत सी सुविधाओं से अनुपस्थित है। अमूर्तता बनाने के लिए सी की विशेषताएं भयानक हैं, और अमूर्तता प्रोग्रामिंग के पीछे प्रमुख सिद्धांतों में से एक है।

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

यदि आप प्रोग्रामिंग सिद्धांतों को सीखना चाहते हैं, तो जावा, सी #, या स्विफ्ट जैसी आधुनिक भाषा का उपयोग करें, या रस्ट जैसे दर्जनों अन्य में से एक। इसके अलावा, कार्यात्मक सहित विभिन्न प्रकार के प्रोग्रामिंग प्रतिमानों का अध्ययन करें।


12
C केवल अमूर्त बनाने में ठीक है। आप सी में तरीके लिख सकते हैं, और आप सी में संरचनाओं के रूप में डेटा को पैकेज कर सकते हैं। सी का उपयोग करके संपूर्ण ऑपरेटिंग सिस्टम बनाए गए हैं। सी क्या अच्छा नहीं है, जो हर किसी के "आधुनिक" विचार को संतुष्ट कर रहा है कि ऑब्जेक्ट-ओरिएंटेशन क्या देखने वाला है पसंद।
रॉबर्ट हार्वे

4
काफी नहीं। ASM की तुलना में C काफी उच्च स्तर का है। बस इसमें वर्गों का उपयोग करने की उम्मीद न करें, हालांकि ऐसा करने के तरीके हैं , यदि आप बहुत इच्छुक हैं।
रॉबर्ट हार्वे

4
अपनी टिप्पणी में "असेंबलर" के लिए "ब्रेनफक" को स्थान दें, और यह अभी भी सच होना चाहिए। लेकिन इसका मतलब यह नहीं है कि मैं जल्द ही किसी भी समय ब्रेनफक का उपयोग करने जा रहा हूं।
रॉबर्ट हार्वे

6
सी की विशेषताओं के बारे में आपके तर्क में वास्तव में केवल योग्यता है यदि आप मानते हैं कि कक्षाएं (और कचरा संग्रह, आदि) एक नया प्रोग्रामर सिखाने का एक आवश्यक तत्व हैं (जो मैं नहीं करता)। यहां कोई भी वर्गविहीन भाषा में कक्षाओं का उपयोग करने की कोशिश करने की वकालत नहीं कर रहा है।
रॉबर्ट हार्वे

5
@ रॉबर्ट, मेरा तर्क है कि सी एक निचले स्तर की भाषा है, और जैसे कि यह प्रोग्रामिंग के सिद्धांतों को समझने के लिए शायद ही सबसे अच्छी भाषा है, जिसे हम कोडांतरक के बारे में भी कह सकते हैं, और, क्योंकि वे निचले स्तर की भाषाएं नहीं हैं। वे किसी भी तरह प्रोग्रामिंग के "सच्चे" सिद्धांतों के करीब हैं। हार्डवेयर और ऑपरेटिंग सिस्टम कैसे काम करते हैं, यह समझने के बजाय ये भाषाएं बेहतर हैं, और अगर यह रुचि है, तो मैं निर्देश सेट वास्तुकला और मशीन भाषा सीखने में, सबसे निचले स्तर पर सही स्किप करने की सिफारिश कर रहा हूं। अन्यथा, चुनने के लिए बहुत सारी भाषाएँ हैं।
एरिक Eidt

8

C और (सार) मशीन

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

C उपरोक्त नियम का अपवाद नहीं है। यह एक अमूर्त मशीन के संदर्भ में वर्णित है जिसमें आपके वास्तविक हार्डवेयर की कोई धारणा नहीं है।

जैसे, जब लोग कहते हैं कि C आपको सिखाता है कि आपका कंप्यूटर वास्तव में कैसे काम करता है, तो उनका आमतौर पर मतलब यह होता है कि C आपको सिखाता है कि C कैसे काम करता है। लेकिन C सिस्टम प्रोग्रामिंग में इतना व्यापक होने के कारण, यह समझ में आता है कि बहुत सारे लोग इसे कंप्यूटर के साथ भ्रमित करना शुरू कर देते हैं। और मैं व्यक्तिगत रूप से यह कहना चाहूंगा कि यह जानना कि सी कैसे काम करता है, यह जानना अक्सर महत्वपूर्ण है कि कंप्यूटर कैसे काम करता है।

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

कैसे करते हैं आप सीखते हैं? और आप कैसे सीखते हैं?

ठीक है, वास्तव में हार्डवेयर के बारे में सीखने में सी के अलावा अन्य चीजें शामिल हैं लेकिन क्या सी आज प्रोग्रामर को कुछ और सिखा सकते हैं?

मुझे लगता है कि यह निर्भर करता है।

  • कुछ ऐसे हैं जो कहेंगे कि आप एक ऐसे वातावरण में काम करके एक अवधारणा को बेहतर ढंग से सीख सकते हैं जो इसे प्रदान करता है और इसे प्रोत्साहित करता है, अक्सर कई तरीकों से।
  • कुछ ऐसे हैं जो कहेंगे कि आप एक ऐसे वातावरण में काम करके एक अवधारणा को बेहतर तरीके से सीख सकते हैं जो इसे पेश नहीं करता है और जहां आपको इसके बजाय खुद का निर्माण करना है।

इन संभावनाओं में से एक का चयन करने के लिए बहुत जल्दी मत बनो। मैं कई वर्षों से कोड लिख रहा हूं और मुझे अभी भी पता नहीं है कि कौन सा सही उत्तर है, या क्या सही उत्तर दोनों में से एक है, या क्या इस मुद्दे पर एक सही उत्तर के रूप में ऐसी कोई बात है।

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

सी में विशेष रूप से

यदि आपने मेरे द्वारा प्रस्तावित दूसरे विकल्प को कम से कम शामिल करके उपरोक्त प्रश्न का उत्तर दिया है, तो आपके पास पहले से ही आपके बेल्ट के नीचे कुछ उत्तर हैं: उच्च-स्तरीय भाषाओं में जो कुछ भी सीखा जा सकता है, उसे सी या फिर से आविष्कार करके बेहतर तरीके से सीखा जा सकता है। मिश्रण में C जोड़कर कम से कम विस्तारित किया गया।

लेकिन, आपके जवाब की परवाह किए बिना, निश्चित रूप से कुछ चीजें हैं जो आप सी से लगभग विशेष रूप से सीख सकते हैं (और शायद कुछ अन्य भाषाओं में)।

  • C ऐतिहासिक रूप से महत्वपूर्ण है। यह एक मील का पत्थर है जिसे आप देख सकते हैं और सराहना कर सकते हैं कि हम कहाँ से आए हैं और शायद हम जहाँ जा रहे हैं उसके बारे में थोड़ा और संदर्भ प्राप्त करें। आप यह मान सकते हैं कि कुछ सीमाएँ क्यों मौजूद हैं और आप इस बात की सराहना कर सकते हैं कि कुछ सीमाएँ हटा दी गई हैं।

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

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

  • सी आपको इसके निर्माण प्रणाली के माध्यम से लिंकेज और ऑब्जेक्ट फ़ाइलों और अन्य पेचीदगियों के विवरण के बारे में सिखा सकता है। यह आपको एक उपयोगी हाथ-समझ दे सकता है कि एक मूल रूप से संकलित कार्यक्रम अक्सर स्रोत कोड से निष्पादन तक कैसे जाता है।

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

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


5

सी सीखने के लिए अच्छा क्यों है इसका कारण यह नहीं है कि यह किसी भी सिद्धांत को सिखाता है । यह आपको सिखाता है कि चीजें कैसे काम करती हैं

सी की तुलना 70 या 80 के दशक की उन अच्छी पुरानी कारों में से एक के साथ की जा सकती है, जिन्हें सिर्फ ड्राइव करने के लिए बनाया गया था। आप उन्हें फाड़ सकते हैं, पेंच से पेंच कर सकते हैं, और समझ सकते हैं कि प्रत्येक भाग कैसे काम करता है, और यह अन्य भागों के साथ मिलकर कैसे काम करता है जिसे आप अपने हाथों में देख सकते हैं। एक बार जब आप सभी भागों को समझ जाते हैं, तो आपके पास एक बहुत स्पष्ट तस्वीर होती है कि पूरा कैसे संचालित होता है।

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

जब आप C में प्रोग्रामिंग सीखते हैं, तो आप बहुत सारे स्क्रू और नट्स के संपर्क में आते हैं, जो कंप्यूटर से बना होता है। इससे आप स्वयं मशीन की समझ विकसित कर सकते हैं। उदाहरण के लिए, यह आपको यह समझने की अनुमति देता है कि इस तरह लंबी स्ट्रिंग बनाने के लिए यह एक अच्छा विचार क्यों नहीं है:

java.lang.String result = "";
for(int i = 0; i < components.size; i++) {
     result = result + components[i];
};

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


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

1
आपका जवाब ठीक निश्चित रूप से है, लेकिन यदि आप लिखना for(int i = 0; i < strlen(s); i++)सी में, पाश भी द्विघात जटिलता होगा, और यह अपने जावा उदाहरण के रूप में ;-) बस के रूप में unobvious है
डॉक ब्राउन

यकीन नहीं है, लेकिन मैं इस पर भरोसा करने के लिए जावा कंपाइलर पर भरोसा करूंगा :-)
ब्रूनो शापर

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

@PeterTaylor यदि आपके पास एक जावा प्रशिक्षक है जो अपने सी को जानता है, हाँ। लेकिन मुझे संदेह है कि इस तरह का ज्ञान आसपास रहने वाले लोगों को होगा जो सी जानते हैं कि वे मर चुके हैं। सी प्रोग्रामर के लिए, यह एक सी-स्ट्रिंग क्या है की बहुत परिभाषा है, जो उन्हें बताता है कि मेरा कोड उदाहरण कुशल नहीं हो सकता है। जावा प्रोग्रामर के लिए, यह कुछ गहरे, रहस्यमय, और उनके द्वारा उपयोग किए जाने वाले अमूर्त के बारे में बहुत कम जानकारी है, जो उन्हें इस प्रकार के कोड से बचने के लिए कहता है। ठीक है, मैं यहां थोड़ा अतिरंजित कर रहा हूं, लेकिन आपको यह विचार मिलता है: सी प्रोग्रामर को यह पता होना चाहिए, जावा प्रोग्रामर इसे नहीं जानने के साथ दूर हो सकता है।
cmaster - मोनिका

2

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

  • अपवादों की अनुपस्थिति में संपूर्ण त्रुटि से निपटने के लिए प्रोग्राम कैसे बनाएं

  • ऑब्जेक्ट ओरिएंटेशन के लिए किसी भी भाषा के समर्थन के बिना किसी प्रोग्राम में संरचना कैसे बनाएं

  • डायनामिक सिज़ेबल सूचियों, शब्दकोशों या उपयोगी स्ट्रिंग अमूर्त जैसे डेटा संरचनाओं की अनुपस्थिति में डेटा से कैसे निपटें

  • जब कंपाइलर या रन टाइम एनवायरनमेंट स्वचालित रूप से आपको चेतावनी नहीं देता है, तब भी सरणी त्रुटियों जैसी सामान्य त्रुटियों से कैसे बचें

  • टेम्प्लेट या जेनरिक के लिए भाषा समर्थन के बिना जेनेरिक समाधान कैसे बनाएं

  • और क्या मैंने उल्लेख किया है कि आप सीख सकते हैं कि स्मृति का प्रबंधन कैसे किया जाए? ;-)

इसके अलावा, C सीखने से, आप सीखेंगे कि C ++, Java, C #, ऑब्जेक्टिव C की सिंटैक्टिकल समानताएँ कहाँ से आती हैं।

2005 में, जोएल स्पोल्स्की ने किसी अन्य उच्च स्तरीय भाषा से पहले C सीखने की सिफारिश लिखी । उसकी दलीलें हैं

  • "आप उच्च स्तरीय भाषाओं में कुशल कोड नहीं बना पाएंगे।"

  • "आप कभी भी कंपाइलर और ऑपरेटिंग सिस्टम पर काम नहीं कर पाएंगे, जो कि कुछ बेहतरीन प्रोग्रामिंग जॉब हैं।"

  • "आपको बड़े पैमाने पर परियोजनाओं के लिए आर्किटेक्चर बनाने के लिए कभी भी भरोसा नहीं किया जाएगा"

  • "यदि आप यह नहीं समझा सकते हैं कि while(*s++ = *t++);एक स्ट्रिंग की प्रतिलिपि क्यों बनाई जाती है, या यदि यह आपके लिए दुनिया की सबसे स्वाभाविक चीज़ नहीं है, तो ठीक है, आप अंधविश्वास के आधार पर प्रोग्रामिंग कर रहे हैं

बेशक, उन्होंने जो लिखा वह निश्चित रूप से बहस का विषय है, लेकिन उनके कई तर्क IMHO आज भी मान्य हैं।


1
C सीखने के लिए एक बहुत अच्छी भाषा है इससे पहले कि आप उन "उच्च स्तरीय चीजों को सीखें जो आपको लगता है कि C समर्थन नहीं करता है", क्योंकि यह आपको यह समझने में मदद करता है कि वे चीजें वास्तव में कैसे काम करती हैं (और वे कितनी महंगी हैं)।
ब्रेंडन

@ बेंडन: मुझे यकीन नहीं है कि अगर आपकी टिप्पणी का इरादा एक समझौते, असहमति या मेरे जवाब के लिए सिर्फ एक विचार व्यक्त करना है।
डॉक ब्राउन

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

@ErikEidt: वास्तव में, लेकिन विशेष रूप से C ecosphere में बहुत सारी किताबें, ट्यूटोरियल और अन्य सामग्री मौजूद हैं जो इन विषयों से निपटेंगे। उदाहरण के लिए, स्टीव मैगुइरे द्वारा "सॉलिड कोड लिखना"। निश्चित रूप से, यदि कोई व्यक्ति केवल भाषा वाक्य रचना सीखने के लिए K & R का पहला संस्करण चुनता है, तो वह शायद एक बेहतर प्रोग्रामर नहीं बनेगा।
डॉक ब्राउन

1

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

तो मेरे कहने का मतलब यह है कि C सीखना जरूरी नहीं है कि हार्डवेयर में वास्तव में जो होता है, उसकी अच्छी तस्वीर आपको दी जाए। "सी मशीन के करीब है" को "सबसे उच्च-स्तरीय भाषाओं की तुलना में करीब" समझा जाना चाहिए। यदि आप "यह कैसे काम करता है" की अधिक सटीक तस्वीर चाहते हैं, तो सॉफ्टवेयर आर्किटेक्चर सीखना सीधे अधिक फायदेमंद होने वाला है।

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


1
तो, सी आपको क्या सिखा सकता है कि उच्च स्तर की भाषाएं नहीं कर सकती हैं?
फिलिप केंडल

2
मुझे लगता है कि निहित जवाब है: " कुछ नहीं , कम से कम उन चीजों को नहीं जो प्रस्तावक आमतौर पर दावा करते हैं"। मैं वैसे भी इसका जवाब समझता हूं।
जोर्ग डब्ल्यू मित्तग

-3

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

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