मैंने नोट किया है कि IDE का समर्थन कहीं भी अच्छा नहीं है, लेकिन भाषा स्वयं कार्यात्मक प्रोग्रामिंग मुहावरों का बहुत अधिक सफाई से समर्थन करती है।
मैंने नोट किया है कि IDE का समर्थन कहीं भी अच्छा नहीं है, लेकिन भाषा स्वयं कार्यात्मक प्रोग्रामिंग मुहावरों का बहुत अधिक सफाई से समर्थन करती है।
जवाबों:
मैं अब एक वर्ष से अधिक समय से स्काला की प्रोग्रामिंग कर रहा हूं, इसलिए मैं इस प्रश्न का उत्तर देने के लिए स्वयं को एक वर्ष में सेट करने का प्रयास करूंगा।
इससे पहले कि मैं इसे सीखना शुरू करूँ, ऊपर दिए गए बिंदु कमोबेश मैं स्काला के बारे में सोचते थे।
एक वर्ष के दौरान, मुझे यहां पता चला है:
मुझे लगता है कि स्काला बहुत जटिल है। यह सी ++ की तरह महसूस करता है कि इसमें चीजों को करने के विभिन्न तरीकों के असंख्य हैं। कुछ लोग इसे "समृद्धि", "अभिव्यक्ति" या "शक्ति" कहेंगे, लेकिन आपका लाभ भिन्न हो सकता है। कई वास्तविक विश्व परियोजनाओं में आपको कृत्रिम रूप से सीमित करना होगा कि आप किस भाषा की विशेषताओं का उपयोग करने जा रहे हैं और क्या नहीं, ताकि इसमें शामिल सभी डेवलपर्स भाषा के समान सबसेट को बोल सकें।
फंक्शनल प्रोग्रामिंग के लिए मैं क्लोजर पसंद करता हूं , जो स्काला की तुलना में सरल है।
पवित्र युद्ध शुरू होने दो ;-)
लगभग एक साल पहले, जैसा कि मैं अपने स्टार्टअप के उत्पादों के भविष्य के बारे में अधिक निराश हो गया था अगर मैंने जावा का उपयोग जारी रखा, तो मैंने स्काला को एक कोशिश देने का फैसला किया। मैं उस समय जावास्क्रिप्ट और पायथन में पहले से ही प्रोग्रामिंग कर रहा था, रूबी भी एक अच्छा विकल्प था, लेकिन मैं एक सांख्यिकीय रूप से टाइप की गई भाषा की तलाश कर रहा था, अधिमानतः एक जो जेवीएम पर चल सकती थी।
मैंने वास्तव में स्काला को पसंद करने की कोशिश की, मैंने वास्तव में किया, लेकिन मैंने पाया कि यह कोड बिल्कुल बदसूरत और समझने में कठिन है। मुझे नाटकीय रूप से आश्चर्य हुआ कि अगर स्काला जावा के लिए हमारा सबसे अच्छा जवाब था, तो मुझे निश्चित रूप से खराब कर दिया गया था और एक ऐसी भाषा के साथ काम करना जारी रखने की सजा दी गई थी जो मुझे बिल्कुल पसंद नहीं थी ...
सौभाग्य से, बहुत बाद में नहीं, मुझे फेंटम के बारे में पता चला । अरे यार, क्या मैं इसे प्यार करता था! मेरे लिए, यह जर्मन नौकरशाही के लिए अमेरिकी के शानदार जवाब की तरह था! यह उन आवश्यकताओं से मेल खाता था जिनकी मैं स्काला में तलाश कर रहा था, लेकिन बहुत अधिक सुरुचिपूर्ण ढंग से । इसमें विम , एक्लिप्स और नेटबीन्स इंटीग्रेशन, एक अच्छा वेब फ्रेमवर्क , इसके साथ चलने वाले परिपक्व उत्पाद , एक छोटा लेकिन अविश्वसनीय रूप से सहायक समुदाय ... डायनामिक और स्टेटिक टाइपिंग था! मैं आनन्दित हुआ!
(मैं जारी रख सकता था, लेकिन यह पोस्ट स्काला के बारे में है, फेंटम के बारे में नहीं है, इसलिए मैं यहां रुकता हूं। मेरी पसंद स्पष्ट है , फिर भी दोनों की तुलना करने वाला यह पद है । मैं कभी नहीं समझ सका कि स्काला की तुलना में फैंटम को इतना कम ध्यान क्यों जाता है। लेकिन जाहिरा तौर पर मैं केवल एक ही नहीं हूं, अगर आप इस पॉडकास्ट [ एमपी 3 ] को अंत तक सुनते हैं ।)
जब मैंने शुरू में 2 साल पहले स्काला के साथ डब किया था, तो यह मुझे अलग-थलग लग रहा था। कुछ बिंदु पर मुझे पता चला कि कोर भाषा वास्तव में जावा की तुलना में बहुत सरल है, लेकिन इसका सिंटैक्स और शब्दार्थ इतना लचीला है कि आप एक मैक्रो फीचर के बिना भी इसकी तरह नई भाषा के निर्माण कर सकते हैं। मैंने तब से अपने सभी जावा प्रोजेक्ट्स के लिए पूरी तरह से स्काला में बदल दिया है, क्योंकि यह मुझे बहुत अधिक बॉयलरप्लेट कोड के बिना लिखने देता है।
मुझे क्लोजर पसंद है, लेकिन ऐसी परिस्थितियां हैं, जहां प्लेटफॉर्म को आपको स्थिर बायटेकोड (एंड्रॉइड, एप्लेट्स, ...) को संकलित करने की आवश्यकता होती है और जब आप ऐसा कर सकते हैं, तो स्काला में, यह वहीं है।
हालांकि स्काला आपको कई समस्याओं को कार्यात्मक तरीके से हल करने देता है, मैं अक्सर उन समस्याओं का पता लगाता हूं जहां कक्षाओं का उपयोग करना अधिक स्वाभाविक लगता है। यह चीजों को थोड़ा और अधिक जटिल बनाता है, लेकिन सी ++ की जटिलताओं और दर्द के पास कहीं नहीं है।
मेरे लिए सबसे बड़ी टेकअवे जब मैंने वास्तव में भाषा सीखना शुरू कर दिया था, तो मैं सिर्फ जावा में किया गया कार्यक्रम कर सकता था, बस शोर के बिना (थोड़ा सा जब आप ग्रूवी शुरू करते हैं), लेकिन अंततः आप सत्ता में गहरा गोता लगाने की कोशिश करना चाहते हैं भाषा का - यह आपके साथ बढ़ता है।
IDE प्रश्न के बारे में: सब कुछ के लिए Emacs का उपयोग करने के बाद, मेरे सभी IDE मुद्दे दूर हो गए :-)
मुझे कई कारणों से स्काला पसंद है, लेकिन एक है जिसे अक्सर अनदेखा किया जाता है: इसकी सादगी।
ओबेरॉन की तरह स्काला शायद उतना सरल नहीं है, लेकिन यह कुछ अन्य भाषाओं की तुलना में काफी सरल है। स्काला लैंग्वेज स्पेसिफिकेशन ~ 160 पेज है, जावा लैंग्वेज स्पेसिफिकेशन ~ 600 है (सिर्फ भाषा, जेवीएम या लाइब्रेरी नहीं!), ECMA-334 C # लैंग्वेज स्पेसिफिकेशन (जो AFAIK विजुअल C # 2.0 के सबसेट से मेल खाता है) ~ 440 पृष्ठ (यह LINQ क्वेरी कॉम्प्रिहेंशन, लैम्ब्डा एक्सप्रेशन, एक्सटेंशन मेथड, जेनेरिक को- और कंट्रोवर्सी, dynamic
डिफॉल्ट मान के साथ वैकल्पिक तर्क, कीवर्ड तर्क जैसे सामान के बिना है var
)। यहां तक कि ECMAScript 5.1 का मौजूदा मसौदा ~ 210 पृष्ठों पर बड़ा है। और निश्चित रूप से मेरी अपनी "डिफ़ॉल्ट" भाषा, रूबी, जिसका वर्तमान आईएसओ ड्राफ्ट ~ 310 पृष्ठों पर है, जो केवल रूबी 1.8.6, 1.9.1 और 1.9.2 के चौराहे के लगभग असामान्य रूप से छोटे उपसमूह को निर्दिष्ट करता है।
यहाँ Scala के बारे में क्या है:
अशक्त सूचक के साथ शुरू करने के लिए एक बहुत बुरा विचार था। होरे ने इसे अपनी "अरब डॉलर की गलती" कहा, लेकिन स्काला इससे भी बदतर है। इसमें नल, नल, कोई नहीं और नील नाम की वस्तुएं हैं। null Java के साथ इंटरऑपरेबिलिटी के लिए है। Null null पॉइंटर फॉर्म W3C DOM स्पेसिफिकेशन है, कोई भी ऐसा नहीं है जिसे null को बदलना चाहिए था, और Nil एक खाली चीज है।
जब भाषा का निर्माण हैक हो जाता है तो यह आमतौर पर प्रोग्रामर होता है जिसे भाषा को दोष देना होता है न कि उसे। स्काला में, हालांकि, मुख्य भाषा में पहले से ही पुस्तकालय कक्षाएं शामिल हैं, जिसका एकमात्र प्रलेखित व्यवहार "यह एक हैक है"। यह विश्वास नहीं है? स्कैलाडोक को scala.xml.Group के लिए खोजें।
कम से कम नहीं, स्काला बुरी तरह से प्रलेखित है। आधिकारिक दस्तावेज में शायद ही कोई स्काला क्लास उदाहरण कोड के साथ आता है। स्कैला जावा की तुलना में सीखने के लिए काफी कठिन है और इसके लिए कंप्यूटर विज्ञान में गहन ज्ञान की आवश्यकता है।
एक स्काला-हैटर के लिए गलत होने से बचने के लिए, यहाँ मुझे इसके बारे में प्यार है:
null
जावा का अशक्त सूचक है, Null
इसका "प्रकार" है। None
एक संभव "राज्य" है Option[T]
, जो एक या एक शून्य तत्वों के साथ एक संग्रह है। Nil
एक खाली सूची है। जब आप इसे भयावह बनाना चाहते हैं, तो यह नहीं है। वे प्रकार एक दूसरे के साथ बदली या विनिमेय नहीं हैं और जैसा वे करना चाहिए वैसा ही व्यवहार करते हैं।
स्काला है जटिल। इसके आसपास कोई रास्ता नहीं! इसका सिंटैक्स बेहद लचीला है और इसे कई तरीकों से अनुकूलित किया जा सकता है (सभी ऑपरेटरों / इन्फिक्स संकेतन से ऊपर) - और टाइप सिस्टम में किसी भी अन्य भाषा की तुलना में अधिक भिन्न विशेषताएं हैं जो मुझे पता है।
तो चीजें हैं कि सीधे हास्केल में जैसे कि टाइप नहीं कर रहे हैं: Typeclasses उन सभी को कवर करने के लिए।
जैसा कि स्काला कार्यात्मक प्रोग्रामिंग, OO, प्रक्रियात्मक प्रोग्रामिंग और जावा पुस्तकालयों के साथ-साथ स्वयं के विचारों को एक साथ रखने की कोशिश करता है, हम अंत में बहुत सारी अवधारणाओं को समाप्त करते हैं जो किसी भी तरह "एक ही दिशा में" जाते हैं:
उनके बीच चयन करना पहली बार में मुश्किल लगता है और कोई भी आसानी से आश्चर्यचकित हो सकता है यदि किसी समस्या का सही समाधान मिल गया है। यह भी आसानी से हैक करके सामान का उत्पादन संभव है implicit
।
लेकिन दिलचस्प बात यह है: स्काला काम करता है। यह समझना कभी-कभी कठिन होता है कि (विशेष रूप से निहितार्थ रूपांतरण + विरासत के माध्यम से पता लगाना क्यों ... किसी वस्तु को कार्यक्षमता मिली है X
), लेकिन आपको उस समय के बारे में परेशान करने की आवश्यकता नहीं है।
स्काला को जितना संभव हो उतना सीधा लिखें और यह काम करेगा। हर उस चीज़ से भ्रमित मत होइए जो संभव है और बस वही उपयोग करें जो आपको चाहिए। और अगर आपको कुछ चाहिए, तो आप सुनिश्चित हो सकते हैं कि किसी तरह स्काला के पास है;)
और जितना बेहतर आप प्राप्त करेंगे, उतने ही अधिक आप Scala को ऑपरेटरों, इंक्विटिस, मोनडेस, फंकी सिंटैक्स के साथ कस्टमाइज़ कर पाएंगे ... और अंत में एक डीएसएल के करीब कुछ प्राप्त करेंगे जो आपकी समस्या को पूरी तरह से संबोधित करेंगे।
आखिरकार, आपके पास हमेशा स्कैला को क्लीनर, आसान सिंटैक्स, प्रकार के अनुमान और कुछ कार्यात्मक सुविधाओं के साथ बहुत बेहतर जावा के रूप में उपयोग करने की संभावना है।
यह एक उत्कृष्ट भाषा है जो कई मायनों में जावा की तुलना में सरल है।
ज्यादातर लोग, प्रोग्रामर या नहीं, उन्हीं कारणों से जावा प्रोग्रामर इसे पसंद नहीं करेंगे, जावा प्रोग्रामर या नहीं, नई प्रोग्रामिंग लैंग्वेज सीखना पसंद नहीं करते हैं। मुझे संदेह है कि प्रोग्रामिंग भाषा सीखने वाले अधिकांश लोगों को यह सीखना पसंद नहीं था।
यदि आप किसी भाषा के C ++ के रूप में जटिल होने के बारे में चिंतित हैं, तो मैं प्लेग की तरह क्लोजर से बचूंगा। क्लींजर की तुलना में स्काला अधिक जटिल है, ऐसे लोगों के लिए, जो एक या दोनों भाषाओं के बारे में पूरी तरह से अनभिज्ञ हैं।
क्लोजर के पास मैक्रोज़ हैं, जिसका अर्थ है कि आप भाषा के सिंटैक्स को जितना चाहें बदल सकते हैं, आपको न केवल "चीजों को करने के विभिन्न तरीकों का असंख्य" बल्कि चीजों को करने के तरीकों की लगभग अनंत संख्या है। और इस नए सिंटैक्स में से कोई भी प्रोग्रामर मैक्रोज़ के साथ नहीं बना रहा है जिसे भाषा विनिर्देश में कहीं भी प्रलेखित किया जाएगा।
"लेकिन हम मैक्रोज़ का उपयोग करने से बच सकते हैं या विनियमित कर सकते हैं जो हमारे कोड में अनुमति दी गई है", आप कहते हैं। बधाई हो, अब आप "कृत्रिम रूप से यह सीमित कर रहे हैं कि आप कौन सी भाषा सुविधाओं का उपयोग करने जा रहे हैं और क्या नहीं", जो कि वास्तव में बब्बलिंग बेवकूफ हैं जो स्काला के क्लोजर का उपयोग कर रहे हैं, जिसका उपयोग स्काला से शुरू होने से बचने के लिए उनके कारण के रूप में किया जाता है।
मुझे वास्तव में स्काला लाइब्रेरी के अधिक दानेदार प्रकार पसंद हैं। ऐसा लगता है कि नए संग्रह पुस्तकालय को अच्छी तरह से सोचा गया था। मुझे यह भी पसंद है कि यह कैसे सरल वर्गों के लिए आवश्यक कोड की मात्रा को कम करता है, और कार्यात्मक अवधारणाओं को जोड़ता है। इसके प्रकार का अनुमान भी बहुत सहायक है। यह प्रशिक्षण पहियों के बिना जावा की तरह लगता है। थोड़ी देर के लिए सी # का उपयोग करने के बाद, स्काला वास्तव में एक प्रतियोगी की तरह महसूस करती है, जावा के साथ अभी भी उपयोगी है लेकिन पीछे छोड़ दिया जा रहा है।
एक जावा प्रोग्रामर के रूप में, मैंने शुरू में स्काला को दिलचस्प पाया। हालांकि, थोड़ी देर के लिए इसके साथ डब करने के बाद (और लगभग सभी सकारात्मक / नकारात्मक जो पहले से ही दूसरों द्वारा सूचीबद्ध हैं) में चल रहे थे, मुझे इसके प्रति बहुत "मेह" महसूस हो रहा था। टूलसेट की कम उपलब्धता से भाषा में सुधार होता है। मैं बस स्विच करने के लिए किसी भी परिभाषित कारण के साथ नहीं आ सका। यह अच्छा है, लेकिन स्विचिंग के लिए मामला बनाने के लिए "बेहतर पर्याप्त" नहीं है। या तो व्यक्तिपरक उत्तेजना कारक नहीं है (जैसे कि क्लीजुर लगता है)।