इस प्रश्न का उत्तर ठीक उसी पर निर्भर करता है जो आप सीखना चाहते हैं।
अजगर और रूबी
पायथन और रूबी जैसी उच्च-स्तरीय भाषाओं का सुझाव अक्सर दिया जाता है क्योंकि वे उच्च स्तर की होती हैं और वाक्य रचना काफी पठनीय होती है। हालाँकि, इन भाषाओं में आम डेटा संरचनाओं के लिए सार है। सीखने के अभ्यास के रूप में आपको अपने स्वयं के संस्करणों को लागू करने से रोकना नहीं है, लेकिन आप पा सकते हैं कि आप अन्य उच्च-स्तरीय डेटा संरचनाओं के शीर्ष पर उच्च-स्तरीय डेटा संरचनाओं का निर्माण कर रहे हैं, जो आवश्यक रूप से उपयोगी नहीं है।
इसके अलावा, रूबी और पायथन गतिशील रूप से टाइप की जाने वाली भाषाएं हैं। यह अच्छा हो सकता है लेकिन यह शुरुआती के लिए भी भ्रामक हो सकता है और त्रुटियों को पकड़ना कठिन (प्रारंभिक) हो सकता है क्योंकि वे आमतौर पर रनटाइम तक स्पष्ट नहीं होंगे।
सी
C दूसरे चरम पर है। यह अच्छा है यदि आप वास्तव में निम्न-स्तरीय विवरण सीखना चाहते हैं जैसे कि मेमोरी कैसे प्रबंधित की जाती है, लेकिन स्मृति प्रबंधन अचानक एक महत्वपूर्ण विचार है, जैसे कि, मॉलोक () / मुक्त () का सही उपयोग। यह विचलित करने वाला हो सकता है। इसके अलावा, C ऑब्जेक्ट-ओरिएंटेड नहीं है। यह एक बुरी बात नहीं है, लेकिन ध्यान देने योग्य है।
सी ++
C ++ का उल्लेख किया गया है। जैसा कि मैंने टिप्पणी में कहा, मुझे लगता है कि यह एक भयानक विकल्प है। सी ++ सरल उपयोग में भी छिपकर जटिल है और इसमें "गोचैस" की हास्यास्पद मात्रा है। इसके अलावा, C ++ का कोई सामान्य आधार वर्ग नहीं है। यह महत्वपूर्ण है क्योंकि हैश टेबल जैसी डेटा संरचनाएं एक सामान्य आधार वर्ग होने पर निर्भर करती हैं। आप नाममात्र आधार वर्ग के लिए एक संस्करण लागू कर सकते हैं लेकिन यह थोड़ा कम उपयोगी है।
जावा
जावा का भी उल्लेख किया गया है। बहुत से लोग जावा से घृणा करना पसंद करते हैं और यह सच है कि भाषा अत्यधिक क्रियात्मक है और कुछ अधिक आधुनिक भाषा सुविधाओं (जैसे बंद) में कमी है, लेकिन वास्तव में कोई भी मायने नहीं रखता है। जावा सांख्यिकीय रूप से टाइप किया गया है और इसमें कचरा संग्रह है। इसका मतलब यह है कि जावा कंपाइलर कई त्रुटियों को पकड़ लेगा जो डायनेमिक रूप से टाइप की गई भाषाएं (रनटाइम तक) नहीं होंगी और सेगमेंटेशन दोष (जो यह नहीं कहती है कि आप जावा में मेमोरी लीक नहीं कर सकते हैं, जाहिर तौर पर आप कर सकते हैं)। मुझे लगता है कि जावा एक अच्छा विकल्प है।
सी#
सी # भाषा जावा के अधिक आधुनिक संस्करण की तरह है। जावा की तरह, यह एक प्रबंधित (कचरा एकत्र) मध्यवर्ती संकलित भाषा है जो एक आभासी मशीन पर चलती है। C / C ++ के अलावा यहां सूचीबद्ध हर दूसरी भाषा भी एक वर्चुअल मशीन पर चलती है, लेकिन पायथन, रूबी, आदि की सीधे-सीधे व्याख्या की जाती है, बजाय इसके कि बायकोड को संकलित किए।
मूल रूप से जावा के रूप में C # के समान पेशेवरों और विपक्ष हैं।
हास्केल (आदि)
अंत में, आपके पास कार्यात्मक भाषाएं हैं: हास्केल, ओकेमेल, स्कीम / लिस्प, क्लोजर, एफ #, आदि। ये सभी समस्याओं के बारे में बहुत अलग तरीके से सोचते हैं और कुछ बिंदुओं पर सीखने लायक होते हैं, लेकिन फिर से यह नीचे आता है कि आप क्या सीखना चाहते हैं। कार्यात्मक प्रोग्रामिंग या डेटा संरचनाएं? मैं इस मुद्दे को भ्रमित करने के बजाय एक समय में एक चीज सीखना चाहता हूं। यदि आप कुछ बिंदु पर एक कार्यात्मक भाषा सीखते हैं (जो मैं सुझाऊंगा), हास्केल एक सुरक्षित और बढ़िया विकल्प है।
मेरी सलाह
जावा या C # चुनें। दोनों के पास मुफ्त, उत्कृष्ट आईडीई (एक्लिप्स, नेटबीन और इंटेलीज कम्युनिटी एडिशन फॉर जावा, विजुअल स्टूडियो एक्सप्रेस फॉर सी #, विजुअल स्टूडियो कम्युनिटी एडिशन) है जो लेखन और रनिंग कोड को एक तस्वीर बनाते हैं। यदि आप किसी मूल डेटा संरचना का उपयोग किसी सरणी से अधिक जटिल नहीं करते हैं और कोई भी वस्तु जो आप स्वयं लिखते हैं तो आप मूल रूप से वही चीज़ सीखेंगे जो आप C / C ++ में करेंगे, लेकिन वास्तव में मेमोरी को प्रबंधित किए बिना।
मुझे समझाने दो: एक एक्स्टेंसिबल हैश टेबल को पर्याप्त तत्वों को जोड़ने पर आकार बदलने की आवश्यकता होती है। किसी भी कार्यान्वयन में इसका अर्थ होगा कि बैकिंग डेटा संरचना (आमतौर पर एक सरणी) के आकार को दोगुना करना और मौजूदा तत्वों में प्रतिलिपि बनाना। कार्यान्वयन मूल रूप से सभी अनिवार्य भाषाओं में समान है लेकिन C / C ++ में आपको विभाजन दोषों से निपटना पड़ता है जब आप किसी चीज़ को सही तरीके से आवंटित या डीललेट नहीं करते हैं।
पायथन या रूबी (यह वास्तव में कोई फर्क नहीं पड़ता है) जो मेरी अगली पसंद होगी (और अन्य दो के बहुत करीब) सिर्फ इसलिए कि पहले से डायनामिक टाइपिंग समस्याग्रस्त हो सकती है।