जावा का प्राथमिक ध्यान क्या है? नई सुविधाएँ प्राप्त करने में इतना समय क्यों लगता है?


11

मैं JDK8 में नए फीचर्स तलाश रहा हूं, जैसे लैम्ब्डा एक्सप्रेशन, एक्सटेंशन के तरीके और नई स्ट्रीम API।

जाहिर है कि इन सुविधाओं में से कोई भी प्रोग्रामिंग दुनिया में नया नहीं है और इससे आश्चर्य होता है कि अब तक जावा में ये सभी चीजें क्यों मिल रही हैं।

लिम्फ (1958), एसएमएल (1973), हास्केल (1990), पायथन (1991), जावास्क्रिप्ट (1994), रूबी (1995), स्काला (2003), सी # (2007) और 55 साल बाद लिम्बा अभिव्यक्ति में हमबिस्तर हुए थे। व्यावहारिक रूप से हर कोई, जावा (2013) में।

और मैंने एसआईसी (1996) में धाराओं के बारे में पढ़ा था ।

मैं सोच रहा था कि अब क्यों? सबूत बताते हैं कि अन्य भाषाओं के साथ प्रतिस्पर्धा प्रेरणा नहीं है।

ऐसा लगता है कि जावा के इस रिलीज में सभी शांत नई विशेषताएं समानता को लागू करने का सिर्फ एक उप-उत्पाद हैं। हमारे पास लंबोदर हैं क्योंकि वे समानांतर एल्गोरिदम को सरल बनाते हैं, और हमारे पास विस्तार विधियां हैं क्योंकि हमें उन परिवर्तनों के लिए समर्थन देने की आवश्यकता है जो लंबोदर अभिव्यक्ति की आवश्यकता है, आदि, आदि।

तो, मेरा सवाल यह है: क्या हम सुरक्षित रूप से पुष्टि कर सकते हैं कि जावा की आगामी रिलीज में मुख्य विषय वास्तव में समानता है? या हम अब तक जावा में पुस्तक में सबसे पुरानी चाल की उपस्थिति के अन्य कारणों को सही ठहरा सकते हैं?


4
यह सब बदल सकता है जावा के पीछे-बार-नेस के बारे में एक चकाचौंध है।
माइकल के

5
The evidence suggests- कृपया अपना शोध साझा करें।

2
कोई भी या तो जावा में या JVM में या JRE में सुविधाओं की कभी नए थे। और यहां तक ​​कि सुविधाओं का संयोजन नया नहीं है, एफिल में 1985 (जीसी, ओओ, प्रकार-सुरक्षा, यहां तक ​​कि जेनरिक जो 2003 तक नहीं मिला था) के सभी थे। वास्तव में, यह बहुत कुछ नया नहीं पेश करने के लिए जावा डिजाइनरों का एक एक्सप्रेस लक्ष्य रहा है ।
जोर्ग डब्ल्यू मित्तग

2
@MichaelK - मैं मानता हूं कि यह एक लौ युद्ध में बदल सकता है। यह सूर्य के चुनौतीपूर्ण इतिहास के बारे में एक वैध उत्तर में बदल सकता है; सन और जावा के ओरेकल का अधिग्रहण; और जावा के वर्तमान अनुरक्षक कैसे भाषा को चलाने की कोशिश कर रहे हैं। मेरी आशा है कि उत्तर इस प्रश्न के रचनात्मक पहलुओं पर ध्यान केंद्रित करेंगे।

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

जवाबों:


12

जब जावा को पहली बार डिज़ाइन किया गया था तो इसे गुमनाम कार्यों को छोड़ना उचित माना गया था। मैं दो कारणों के बारे में सोच सकता हूं (लेकिन वे आधिकारिक लोगों से अलग हो सकते हैं):

  1. जावा को कार्यों के बिना एक वस्तु-उन्मुख भाषा के रूप में डिज़ाइन किया गया था, इसलिए बिना कार्यों के किसी भाषा में अनाम कार्य करना बहुत स्वाभाविक नहीं था। या कम से कम, इसने भाषा के डिजाइन को बहुत प्रभावित किया होगा।
  2. बेनामी फ़ंक्शंस प्रोग्रामर समुदायों में लोकप्रिय नहीं थे कि जावा को आकर्षित करने के लिए था (सी, सी ++, पास्कल?)। अब भी, कई जावा प्रोग्रामर इन विशेषताओं को काफी विवादास्पद मानते हैं (लेकिन यह संभवतः जावा 8 के साथ बहुत जल्दी बदल जाएगा)।

बाद के वर्षों में, जैसा कि रॉबर्ट हार्वे ने बताया है, सूर्य की नीति हमेशा जावा को पिछड़े और बहुत स्थिर रखने की थी।

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

प्रतिस्पर्धी भाषाओं ने जावा को दो कारणों से दबाव में रखा है:

अभिव्यंजक शक्ति

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

वैसे भी, पिछले कुछ वर्षों में जावा के प्रतियोगियों ने बहुत सारी नई सुविधाएँ जोड़ी हैं जो जावा के पास नहीं थीं, और इसे एक फायदा माना जा सकता है।

प्रचार

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

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

तो कुछ समय के लिए आईएमओ जावा के बीच पकड़ा गया है

  • भाषा स्थिरता और डिजाइन सादगी की मूल नीति, एक हाथ पर एक विशाल कोड आधार और डेवलपर समुदाय, और
  • प्रतिस्पर्धा करने वाली भाषाओं का दबाव जो जावा प्रोग्रामर, सी # को पहली बार आकर्षित कर सकता है, और फिर स्काला, क्लोजर, एफ # (मैं जिन लोगों के बारे में जानता हूं, उनका नाम हो सकता है)।

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

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

तो, हाँ, कई (सभी) जावा 8 सुविधाओं को पहले से ही अच्छी तरह से जाना जाता था, लेकिन एक भाषा में एक सुविधा को क्यों और कब जोड़ा जाता है यह कई कारकों पर निर्भर करता है: दर्शकों, मौजूदा समुदाय, मौजूदा कोड आधार, प्रतियोगियों, विपणन, आदि।

संपादित करें

"... मैंने SIC (1996) में धाराओं के बारे में पढ़ा था" के बारे में एक संक्षिप्त टिप्पणी। क्या आपका मतलब है कि धाराओं को लागू करने के लिए आपको जावा 8 लैम्ब्डा की आवश्यकता है? वास्तव में आप अनाम आंतरिक कक्षाओं का उपयोग करके उन्हें लागू कर सकते हैं।


+1 और मैं चाहता हूं कि मैं आपको अधिक अंक दे सकूं क्योंकि यह प्रश्न का अब तक का सबसे अच्छा उत्तर है।
एडलोरोज़ो

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

और यह लेख वास्तव में जावा के लिए इस एक और क्लोजर को संदर्भित करता है ।
एडलोरेजो

1
आपके द्वारा भेजे गए लिंक से मैंने पाया कि यह ibm.com/developerworks/java/library/j-jtp03048/index.html#4.0 है , जिसमें कहा गया है कि जावा अनाम आंतरिक कक्षाओं का उपयोग कर सकता है, लेकिन ये बहुत क्रिया हैं। फिर भी, जावा 8 बंद अनाम आंतरिक वर्गों के लिए सिर्फ वाक्यात्मक चीनी नहीं हैं। तो अब जावा में TWO (शब्दार्थ) विभिन्न प्रकार के क्लोजर होंगे: अनाम आंतरिक कक्षाएं और लैम्ब्डा अभिव्यक्ति।
जियोर्जियो

11

जावा ने समय के साथ फोकस बदल दिया है। सबसे पहले इसे "शक्तिशाली जटिल" C ++ की प्रतिक्रिया के रूप में एक सरल शक्तिशाली भाषा के रूप में डिजाइन किया गया था। कुछ विशेषताएं जो C ++ में थीं, उन्हें जानबूझकर छोड़ दिया गया था, जैसे ऑपरेटर ओवरलोडिंग, टेम्प्लेट, एनम, जो कि सी युग के बहुत जटिल या अवशेष माने जाते थे, और OOP अपनी लोकप्रियता के चरम पर था, सब कुछ एक एकल में एक वस्तु बना दिया गया था। प्रतिमान विश्वदृष्टि। इस समय में लैम्ब्डा को केवल जावा 1.1 में अनाम / आंतरिक कक्षाओं की शुरूआत के बाद से "आवश्यक नहीं" माना जाता था। तथ्य यह है कि वाक्यविन्यास कहीं अधिक क्रियात्मक था लगभग एक विशेषता माना जाता था ।

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

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

निष्कर्ष में, जावा 8 मुख्य विषय क्या है? मुझे नहीं लगता कि भाषा संस्करण में कोई विषय है। C ++ 11 के रूप में, Java 8 के राशन डीट्रे को भाषा में उन चीजों को पेश करके प्रतिस्पर्धा में बने रहना है, जो अब अधिक से अधिक प्रोग्रामर ले रहे हैं। लिस्प में 1958 से लैंबडा हो सकता है, इसकी लोकप्रियता अब दशकों से है और हाल ही में कार्यात्मक प्रोग्रामिंग को "मुख्यधारा" प्रोग्रामिंग (बेहतर शब्द की कमी के लिए) के लिए गंभीरता से माना गया है।


"लिस्प में 1958 से लेम्बडा हो सकता है, इसकी लोकप्रियता अब दशकों से है और हाल ही में कार्यात्मक प्रोग्रामिंग को" मुख्यधारा "प्रोग्रामिंग" के लिए गंभीरता से माना गया है: किसी भाषा की लोकप्रियता इसके प्रभाव के लिए एक अच्छा संकेतक नहीं लगती है। कई वर्षों से कार्यात्मक प्रोग्रामिंग की वकालत की गई है, लेकिन उद्योग के अधिकांश लोग इसे उस तरह का सामान मानते हैं, जिस पर अपने पीएचडी थीसिस लिखने के लिए खेलना पसंद करते हैं। अब अचानक उद्योग जाग रहा है और इसे एक मौका दे रहा है, शायद इसलिए कि अब ओओपी मुख्यधारा है जिसे वे अगली बड़ी चीज की तलाश में हैं।
जियोर्जियो

1
मूल कारण जावा में मूल रूप से शामिल नहीं थे: क्लोज़र डिबेट को समझना । वहाँ जेम्स गॉस्लिंग ने कहा: "कुछ समय की तुलना में समय के दबाव के कारण शुरू में क्लोज़र्स को जावा से बाहर छोड़ दिया गया था। जावा के शुरुआती दिनों में क्लोज़र की कमी काफी दर्दनाक थी, और इसलिए भीतर के वर्ग पैदा हुए: एक असहज समझौता जिसने बचने का प्रयास किया। कई कठिन मुद्दे। लेकिन जैसा कि कई डिज़ाइन मुद्दों में सामान्य है, सरलीकरण वास्तव में किसी भी समस्या को हल नहीं करते हैं, वे बस उन्हें स्थानांतरित कर देते हैं। "
एडलोरेजो

"जावा में लंब्बास को शामिल करने की चर्चा उस समय से की जाती है और यह केवल कार्यात्मक प्रोग्रामिंग के लिए वर्तमान प्रवृत्ति से बढ़ा-चढ़ाकर पेश किया गया है।": मुझे यह दिलचस्प लगता है कि कुछ समुदायों (C ++, Java, ...) में "लंबोदा का उपयोग करते हुए" अक्सर इसका मतलब है " कार्यात्मक प्रोग्रामिंग कर रहा है ”।
जियोर्जियो

8

जाहिर है कि इन सुविधाओं में से कोई भी प्रोग्रामिंग दुनिया में नया नहीं है और इससे आश्चर्य होता है कि अब तक जावा में ये सभी चीजें क्यों मिल रही हैं।

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

कंट्रास्ट कि अन्य भाषाओं के साथ और आप या तो एक उदार तानाशाह, या भाषा डिजाइनरों की एक छोटी समिति पाएंगे जो एक साथ मिलकर काम करते हैं और कॉर्पोरेट हितों से बंधे नहीं हैं।

कम्बाइन करें कि जावा कोड की लाखों पंक्तियों के एक स्थापित कोड बेस के साथ, जो पीछे की ओर संगत है, और आपके पास ग्लेशियल गति से परिवर्तन के लिए सभी सामग्री है।


1
OTOH, तुम भी वास्तव में मजबूत और व्यापक रूप से स्वीकार किए जाते हैं मानकों के लिए सामग्री है। PHP के लिए स्थिति के साथ कंट्रास्ट उदा जेपीए, जहां हर वेब फ्रेमवर्क का अपना आधा-गधा ORM है।
माइकल बोर्गवर्ड

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

@AndresF। हां, लेकिन मैं कल्पना करता हूं कि हास्केल कमेटी में बैठी बड़ी, अखंड कंपनियां आपके पास नहीं हैं। यहां टिप्पणियों में वार्तालाप भी देखें ।
रॉबर्ट हार्वे

1

मैं कहूंगा कि एक प्रोग्रामिंग भाषा का सबसे महत्वपूर्ण उद्देश्य उपयोग किया जाना है; वर्तमान में C और Java में लैम्बडा एक्सप्रेशन नहीं हैं और वे सबसे ज्यादा इस्तेमाल की जाने वाली भाषाएं हैं (उदाहरण के लिए TIOBE के अनुसार)।

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


मैं आपसे सहमत हूं (+1): मैं जावा को बहुत महत्व देता हूं (एक भाषा के रूप में और इसके विशाल पारिस्थितिकी तंत्र के लिए) लेकिन मुझे जावा 6 में भाषा को फ्रीज करना अधिक उचित लगा। 6. मैं सीखने में कोई कसर नहीं छोड़ रहा हूं। जावा 7 या 8 जब तक मुझे मजबूर नहीं किया जाता है (कुछ बहुत ही रोचक परियोजना जिसमें जावा 7 या 8 एक जरूरी है), मैं अपना समय स्काला और क्लोजर सीखने में बिताता हूं।
जियोर्जियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.