जावा पर स्केल का उपयोग क्यों करें


16

मैं पूरी तरह से भाषा के रूप में स्काला में हूं ... और फिर भी मैं इस बात से जूझता हूं कि किसी भी कंपनी को जावा से स्काला में स्विच क्यों करना चाहिए। क्या Scala सिर्फ JVM के शीर्ष पर सुव्यवस्थित चीनी है या जावा पर स्केल में मूलभूत सुधार हैं जो वास्तविक विश्व अनुप्रयोगों में सुधार करेंगे?


4
यह मिल गया एक नकली कहीं है।

2
ऐसा लगता है कि आपने इसका इस्तेमाल किया है (स्काला) बहुत (अच्छी तरह से, मुझसे ज्यादा) - आपने अपने व्यक्तिगत अनुभवों में क्या पाया है?
FrustratedWithFormsDesigner

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

1
@delnan, कम से कम SO पर: stackoverflow.com/questions/6073517/… । @DakotahNorth, कृपया एसई साइटों के बीच पोस्ट को पार न करें - फोरम को अपने प्रश्न के अनुकूल सबसे अच्छा चुनें और केवल वहीं पोस्ट करें। अन्य साइटों पर, आपका पोस्ट वैसे भी बंद हो जाएगा, जैसा कि एसओ पर उस एक के साथ हुआ था।
पेइटर टॉर्क

1
यहाँ एक और है, एसओ पर लगभग सटीक डुप्लिकेट, उत्कृष्ट उत्तरों के साथ: stackoverflow.com/questions/2683914/…
Péter Török

जवाबों:


19

डिस्क्लेमर: मैं कोई स्काला गुरु नहीं हूं।

स्काला दो चीजें बहुत अच्छी तरह से करता है जो जावा (वर्तमान में) नहीं करता है।

कार्यात्मक समस्याओं को हल करें

  • सबसे बुनियादी स्तर पर, स्काला ने संग्रह समर्थन के साथ पूरी तरह से बंद कर दिया है। इसका मतलब है कि अब आपको बॉयलर प्लेट कोड नहीं लिखना होगा, जैसे (बेशर्मी से एक डीज़ोन पोस्ट को बंद कर दिया गया)

    public List<Item> bought(User user)
    {
        List<Item> result = new ArrayList();
        for (Item item : currentItems)
        {
            if (user.bought(item))
            {
                result.add(item);
            }
        }
        return result;
    }

लेकिन इसके बजाय कुछ लिखें:

def bought(user: User) = items.filter(user bought _)
  • अधिक कार्यात्मक प्रेम है, लेकिन मैं इसके बारे में बात करने के लिए योग्य नहीं हूं क्योंकि मैं अभी भी कार्यात्मक प्रोग्रामिंग में चूसता हूं :)

सुरक्षित तरीके से संगामिति हल करें

  • स्काला में एक एक्टर्स मॉडल (+ कुछ अन्य अच्छाई) है जो कि स्वाभाविक रूप से थ्रेड मॉडल पर जावा के उत्परिवर्तनीय डेटा + लॉक की तुलना में अधिक सुरक्षित है (कोई फर्क नहीं पड़ता कि कितना अच्छा हित मिल रहा है, जावा अभी भी भाषा द्वारा बाधित है)।

मैं ईमानदारी से बहुत अधिक के बारे में सोच नहीं सकता है जो कि जावा के ऊपर स्काला स्टैंड सिर और कंधे बनाता है। बहुत छोटे लाभ और हां में सुधार, लेकिन साथ ही अपने आप को लटकाने के लिए अधिक रस्सी भी। YMMV

HTH थोड़ा


3
मैं बताना चाहूंगा कि अक्का (अभिनेता मॉडल) स्काला और जावा दोनों के लिए उपलब्ध है। Akka.io
जियोर्जियो

5
मुझे स्काला पसंद है और मैं इसे जावा से माइग्रेट कर रहा हूं। फिर भी यह मुझे तब पेशाब करता है जब जावा और स्काला की तुलना की जाती है और स्काला डेवलपर्स संभव के रूप में वर्बोज़ और मल्टी लाइन जावा कोड लिखने की कोशिश करते हैं और स्केल वन लाइनर के साथ इसे बदलने की बहुत कोशिश करते हैं। जावा कोड के ऊपर पठनीयता के नुकसान के बिना 5 लाइनों में फिट हो सकते हैं, 12 नहीं
मैट

2
"बहुत छोटे लाभ और हां में सुधार, लेकिन साथ ही अपने आप को लटकाने के लिए अधिक रस्सी भी।" +1
रोब

@lucek विशेष रूप से क्योंकि स्निपेट जावा के बजाय सी के घुंघराले ब्रेस सम्मेलन का उपयोग करता है: पी
एंड्रेस एफ।

@robjb: "बहुत छोटे लाभ और हां में सुधार, लेकिन साथ ही अपने आप को फांसी देने के लिए बहुत अधिक रस्सी।" मैं इस बात से सहमत नहीं हूं कि स्काला आपको अपने साथ घूमने के लिए अधिक रस्सी देता है। कम से कम, उत्तर में इस कथन के लिए कोई स्पष्टीकरण नहीं है और मैं खुद को नहीं देख सकता। इसके अलावा, स्काला केवल एक OO भाषा (जैसे सी # और जावा 8) के शीर्ष पर कुछ कार्यात्मक मुहावरों को पेश नहीं करता है, यह OOP और FP को एक प्रतिमान में एकीकृत करने की कोशिश करता है। IMHO यह "छोटे सुधार" नहीं है, बल्कि एक प्रतिमान स्विच है।
जियोर्जियो

9

कि "बस वाक्यविन्यास चीनी" की आपकी परिभाषा पर निर्भर करता है। उदाहरण के लिए, जावा किस तरह से मशीन कोड पर केवल सिंटैक्टिक चीनी से अधिक है?

कोई भी भाषा मशीन कोड से कम कर सकती है , लेकिन कोई भी भाषा अधिक नहीं कर सकती है।

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

लेकिन सिर्फ अन्य दो को देखते हुए, जावा पर अभी भी स्काला के फायदे हैं।

बिंदु पर विश्वास नहीं करने के लिए, लेकिन क्लोजर होने के कारण कोड रास्ता क्लोजर नहीं होने से अधिक संयोजनीय होता है। और जब जावा 7 क्लोजर नामक कुछ जोड़ देगा , तो वे नहीं होंगे - वे सिर्फ अनाम कार्य होंगे।

अधिक त्रुटियों को पकड़ने के लिए, स्केला के विचरण की बेहतर हैंडलिंग इस बात का प्रमाण है कि यह पर्याप्त है। इसके अलावा, अपरिवर्तनीयता पर इसका जोर भी सभी प्रकार की त्रुटियों को रोकता है - ऐसा नहीं है कि जावा अपरिवर्तनीय नहीं कर सकता है, लेकिन यह सिर्फ ऐसा करने के लिए पुस्तकालय के साथ नहीं आता है।


4
वास्तव में जावा के 'क्लोजर' जावा 8 तक नहीं आ रहे हैं
मार्टिज़न वर्बर्ग

1
@Martijn सुधार के लिए धन्यवाद। इस बिंदु पर, मुझे वास्तव में कोई परवाह नहीं है।
डैनियल सी। सोबरल

1
मैं कहूंगा कि सिंटैक्टिक शुगर मौजूदा सिमेंटिक्स के शीर्ष पर सिर्फ वैकल्पिक सिंटैक्स है। के बाद से मशीन कोड के शब्दों वस्तुओं, कक्षाओं, आदि शामिल नहीं है, मुझे लगता है कि जावा नहीं है सिर्फ मशीन कोड से अधिक वाक्यात्मक चीनी। शब्दार्थ और प्रोग्रामिंग प्रतिमान अलग है।
जियोर्जियो

@Martijn Verburg: जावा में पहले से ही बंद का एक रूप है (अनाम आंतरिक वर्गों के रूप में)। इसमें जो कमी है वह है अनाम फ़ंक्शंस (जो कि बिल्कुल एक विधि और कुछ विशेष सिंटैक्स के साथ विशेष अनाम कक्षाओं के रूप में सोचा जा सकता है)।
जियोर्जियो

@ जियोर्जियो - सच है, लेकिन आने वाले इनवॉकेन्निक आधारित कार्यान्वयन की तुलना में आंतरिक आंतरिक वर्ग खराब प्रदर्शन कर रहा है और यह अच्छी तरह से है, स्रोत कोड बदसूरत आईएमओ :-)
मार्टिजेन वर्बर्ग

2

मार्टिज़न के उत्तर के शीर्ष पर मैं यह जोड़ना चाहूंगा कि स्काला जावा की तुलना में अधिक अभिव्यंजक है और लाभ यह है कि (1) यह आपको अधिक उत्पादक बनाता है (2) उसी समस्या को हल करने के लिए कम कोड लिखने का मतलब है कि आप अपने बग को कम कर सकते हैं कोड (IMHO बग-फ्री कोड एक मिथक है)।


0

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

<T> CollectionUtils.filter(Predicate<T>...)

या जैसे बंद का उपयोग करें

<T> CollectionUtils.forAllDo(..., Closure<T>)

लेकिन निश्चित रूप से अधिक क्रिया। मैं हालांकि प्रकार के अनुमान को पसंद करता हूं। जैसा कि आप स्कैला सीखते हैं, आप महसूस करेंगे कि यह संभवत: वैसे भी है जैसे कि अंडर-द-हड। मेरी राय में, प्रत्येक भाषा + ve और -ve के साथ आती है।


-3

सूची समझ, समझ के लिए।

उदाहरण के लिए जावा में आप लिखते हैं:

int myVar;
if (condition) {
  myVar = //some value
}
else {
 myVar = //some other value
}

स्काला में, समान कोड, बहुत अधिक सुरुचिपूर्ण ढंग से लिखा गया है (जैसे अजगर):

int myVar = (//some value) if (condition) else // other value;

और हो गया।

इतना कुछ है कि स्कैला प्रदान करता है कि जावा नहीं है। बस कोई तुलना नहीं है। एकमात्र समस्या यह है कि लोग जावा (b / c जो कि वे CS कक्षाओं में पढ़ाते हैं) से अधिक परिचित हैं और स्काला प्रतिमान के साथ अभी तक कुशल नहीं हैं।

स्काला में पूंछ पुनरावृत्ति है, यह ट्यूपल्स (कुछ ऐसा है जो जावा 8 मुझे लगता है कि हो सकता है) में वापस आ सकता है।

यह कोई तुलना नहीं है। स्काला का विकास मार्टिन ऑर्डर्सकी द्वारा किया गया था, जिन्होंने जावा जेनरिक के लिए कोर टीम में काम किया था।

स्काला सिर्फ एक श्रेष्ठ भाषा है। यही सब है इसके लिए। जो लोग अन्यथा कहते हैं कि उन्होंने स्काला को बेहतर जानने के लिए पर्याप्त खोजबीन नहीं की है।

ऊपर, मेरा कहने का मतलब था कि पूंछ पुनरावृत्ति अनुकूलन (जो कि JVM उस तरह से नहीं कर सकता जैसा कि स्काला के कंपाइलर कर सकते हैं)।

स्काला जेवीएम एप्स की तुलना में तेजी से संकलन और रन करता है (हां, यह सच है)। रूपरेखाओं का उल्लेख नहीं। हम उदाहरण के लिए टॉमकैट का उपयोग करते हैं और REST को संभालने के लिए कुछ सर्वलेट्स तैनात करते हैं।

एक चीज़ जो टॉमकैट नहीं कर सकता है, वह एसिंक्रोनस ऑपरेशन है जिसे गैर-अवरोधक I / O की आवश्यकता होती है। इसके लिए, जेएवीए डेवलपर्स ने आमतौर पर एक संदेश कतार का उपयोग करके एक वर्कअराउंड का आविष्कार किया है (संदेश को कतार में भेजें, और कुछ अन्य प्रक्रिया या थ्रेड इसे उठाता है और पृष्ठभूमि में आप जो भी चाहते हैं)।

दुर्भाग्य से, यह विधि cr * p है, और टॉमकैट पर जावा सर्वलेट्स को तैनात करने की सीमाओं पर एक हैक है।

जाओ बाहर देखो एक्का + स्प्रे। इसमें scala के Actors का उपयोग किया गया है (Actors थ्रेड्स की तरह हैं, सिवाय इसके कि वे जिस तरह से संवाद कर सकते हैं, वह संदेशों के माध्यम से है)।

और किया, अतुल्यकालिक आरईएस कॉल आसान बना दिया। लंबे समय से चल रहा बैकग्राउंड टास्क? कोई दिक्कत नहीं है। बस आग और भूल जाते हैं, और यह जाँचने के लिए कुछ रीस्ट पोलिंग करते हैं कि यह हर बार सामने वाले से एक बार में स्थिति है।

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


4
यह एक सूची समझ का उदाहरण नहीं है। और जावा में आप लिखते हैं:int myVar = condition ? someValue : otherValue
केविन क्लाइन

1
आपको उन //some value //other valueटिप्पणियों को /*some value*/शैली या किसी चीज़ में संपादित करना चाहिए । यह वर्तमान में आपके सिंटैक्स हाइलाइटिंग को गड़बड़ कर रहा है: p
KChaloux
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.