जावा 8 में फ़ंक्शन प्रकारों को हटाने के कारण


12

मैं यह समझने की कोशिश कर रहा हूं कि जेडीके 8 लैंबडा एक्सपर्ट ग्रुप (ईजी) ने जावा प्रोग्रामिंग लैंग्वेज में नए फंक्शन टाइप को शामिल नहीं करने का फैसला क्यों किया।

मेलिंग सूची में जाने से मुझे फ़ंक्शन के प्रकारों को हटाने के बारे में चर्चा के साथ एक धागा मिला ।

कई बयान मेरे लिए अस्पष्ट हैं, शायद संदर्भ की कमी के कारण और कुछ मामलों में टाइप सिस्टम के कार्यान्वयन पर मेरे सीमित ज्ञान के कारण।

हालाँकि, कुछ ऐसे प्रश्न हैं जो मुझे विश्वास है कि मैं इस साइट में सुरक्षित रूप से तैयार कर सकता हूं जिससे मुझे बेहतर तरीके से समझने में मदद मिल सके कि उनका क्या मतलब है।

मुझे पता है कि मैं मेलिंग सूची में प्रश्न पूछ सकता हूं, लेकिन धागा पुराना है और सभी निर्णय पहले से ही हैं, इसलिए संभावना है कि मुझे नजरअंदाज कर दिया जाएगा, ऊपर से यह देखकर कि ये लोग पहले से ही अपनी योजनाओं में देरी कर रहे हैं।

फ़ंक्शन प्रकारों को हटाने के समर्थन में और सैम प्रकारों के उपयोग का समर्थन करने के अपने जवाब में, ब्रायन गोएट्ज़ कहते हैं:

कोई पुनरीक्षण नहीं। फ़ंक्शन के प्रकारों के लिए यह कितना उपयोगी होगा, इस बारे में एक लंबा सूत्र था। संशोधन के बिना, फ़ंक्शन प्रकार हॉबल्ड हैं।

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

क्या वे दोनों एक ही संशोधन की समस्याओं के अधीन नहीं हैं? क्या किसी को समझ में आता है कि किस तरह के फ़ंक्शन प्रकार पैराट्राइज्ड एसएएम प्रकारों से भिन्न होते हैं?

एक अन्य टिप्पणी में गोएत्ज़ कहते हैं:

टाइपिंग के दो बुनियादी दृष्टिकोण हैं: नाममात्र और संरचनात्मक। एक नाममात्र की पहचान उसके नाम पर आधारित है; एक संरचनात्मक प्रकार की पहचान इस बात पर आधारित होती है कि यह किससे बना है (जैसे "int का अंतर, int" या "int to float से फ़ंक्शन"।) अधिकांश भाषाएँ ज्यादातर नाममात्र या अधिकतर संरचनात्मक चुनती हैं; ऐसी बहुत सी भाषाएं नहीं हैं जो "किनारों के आसपास" को छोड़कर नाममात्र और संरचनात्मक टाइपिंग को सफलतापूर्वक मिलाती हैं। जावा लगभग पूरी तरह से नाममात्र है (कुछ अपवादों के साथ: सरणियाँ एक संरचनात्मक प्रकार हैं, लेकिन नीचे हमेशा एक नाममात्र तत्व प्रकार होता है; जेनेरिक में नाममात्र और संरचनात्मक का भी मिश्रण होता है, और यह वास्तव में कई के स्रोत का हिस्सा है जेनेरिक के बारे में लोगों की शिकायतें।) जावा पर एक संरचनात्मक प्रकार प्रणाली (फ़ंक्शन प्रकार) को तैयार करना ' नाममात्र प्रकार की प्रणाली का अर्थ है नई जटिलता और किनारे के मामले। क्या फ़ंक्शन प्रकार का लाभ इसके लायक है?

आप में से जो टाइप सिस्टम के कार्यान्वयन में अनुभव रखते हैं। क्या आप इन जटिलताओं या किनारे के मामलों के किसी भी उदाहरण को जानते हैं जिसका वह यहां उल्लेख करते हैं?

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

मुझे गलत मत समझो, मैं यह नहीं कह रहा हूं कि फ़ंक्शन प्रकार एसएएम प्रकारों से बेहतर होना चाहिए। मैं सिर्फ यह समझना चाहता हूं कि उन्होंने यह फैसला क्यों लिया।


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

3
"सरल और आसान जावा का उपयोग सी ++ सीखने के लिए जटिल और कठिन जैसा हो जाता है": दुर्भाग्य से, मुख्यधारा की प्रोग्रामिंग भाषाओं के साथ एक समस्या यह है कि उन्हें पिछड़ी संगतता बनाए रखना पड़ता है और इसलिए वे बहुत जटिल हो जाते हैं। तो IMHO (C ++ और Java दोनों के साथ कई वर्षों का अनुभव रखने वाले) इस कथन में कुछ सत्य है। मुझे अक्सर यह एहसास होता है कि जावा को जमे हुए होना चाहिए और इसके बजाय एक नई भाषा विकसित करनी चाहिए। लेकिन ओरेकल ऐसा जोखिम नहीं ले सकता।
18-09 को जियोर्जियो

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

2
जैसा कि मैंने जावा में SAMbdas से समझा है , इसका एक कारण यह है कि कुछ पुस्तकालयों (संग्रहों) को आगे की संगत रखना समस्याग्रस्त होगा।
पेट्र पुडलक

जवाबों:


6

एसएएम दृष्टिकोण वास्तव में कुछ हद तक वैसा ही है जैसा कि स्काला (और सी ++ 11) अनाम कार्यों के साथ करता है (स्काला के =>ऑपरेटर या सी ++ 11 के []()(लैम्ब्डा) सिंटैक्स के साथ बनाया गया)।

जावा पक्ष पर जवाब देने के लिए पहला सवाल यह है कि क्या लैम्बडा स्टेटमेंट का रिटर्न टाइप एक नया प्राइमिटवे टाइप है, जैसे intया byteकिसी प्रकार का ऑब्जेक्ट टाइप। स्काला में, वहाँ रहे हैं कोई आदिम प्रकार - यहां तक कि एक पूर्णांक वर्ग की एक वस्तु है Int- और कार्यों अलग नहीं, वर्ग की वस्तुओं की जा रही हैं Function1, Function2और इसी तरह, तर्क की संख्या के आधार पर समारोह लेता है।

C ++ 11, रूबी और पाइथन में समान रूप से लैम्ब्डा अभिव्यक्ति होती है जो एक ऐसी वस्तु को लौटाती है जो स्पष्ट या अंतर्निहित तरीके से कॉल करने योग्य होती है। लौटी हुई ऑब्जेक्ट में कुछ मानक विधि होती है (जैसे कि #callइसे फ़ंक्शन के रूप में कॉल करने के लिए उपयोग किया जा सकता है। C ++ 11, उदाहरण के लिए, एक std::functionप्रकार का उपयोग करता है जो ओवरलोड करता है operator()ताकि ऑब्जेक्ट की कॉल विधि के कॉल भी फ़ंक्शन कॉल की तरह दिखें , पाठिक रूप से। :-)

जहां जावा के लिए नया प्रस्ताव गड़बड़ हो जाता है, संरचनात्मक टाइपिंग का उपयोग किसी अन्य ऑब्जेक्ट को इस तरह की विधि को असाइन करने की अनुमति देता है, जैसे कि एक अलग नाम के साथ एकComparator एकल मुख्य विधि है । हालांकि यह कुछ तरीकों से वैचारिक रूप से icky है, इसका मतलब यह है कि परिणामी वस्तु को मौजूदा कार्यों के लिए पारित किया जा सकता है जो एक कॉलबैक, एक तुलनित्र और इसी तरह का प्रतिनिधित्व करने के लिए एक वस्तु लेता है, और एक अच्छी तरह से परिभाषित एकल कॉल करने में सक्षम होने की उम्मीद करता है विधि जैसे या । C ++ की ओवरराइडिंग की C ++ की चाल ने इस मुद्दे को C ++ 11 से पहले ही चकमा दे दिया , क्योंकि इस तरह के सभी कॉलबैक विकल्प कॉल करने योग्य थे, और इस तरह STL को C ++ 11 लैम्ब्डा का उपयोग करने की अनुमति देने के लिए कोई समायोजन की आवश्यकता नहीं थी।#compare#callbackoperator()sortऔर इसी तरह। जावा, अतीत में ऐसी वस्तुओं के लिए एक मानक नामकरण का उपयोग नहीं कर रहा है (शायद इसलिए कि ऑपरेटर की तरह कोई चाल किसी एकल दृष्टिकोण को स्पष्ट नहीं करता है), इतना भाग्यशाली नहीं है, इसलिए यह हैक उन्हें संपूर्ण मौजूदा एपीआई को बदलने से रोकता है। ।


1
विडंबना यह है कि विभिन्न, असंगत प्रकारों के असंख्य होने पर समस्या, सभी "फ़ंक्शन जैसी चीज़" का प्रतिनिधित्व करने वाले सभी, पुस्तकालय में मानक फ़ंक्शन प्रकारों को प्रारंभिक रूप से जोड़ने से बड़े करीने से बचा सकते हैं, उनके निर्माण के लिए वास्तविक शाब्दिक वाक्य रचना होने से स्वतंत्र। यदि java.util.Function2<T1, T2, R>जावा 1.0 में ए था , तो कोई Comparatorइंटरफेस नहीं होगा , इसके बजाय उन सभी तरीकों को एक ले जाएगा Function2<T1, T2, int>। (ठीक है, वहाँ Function2TT_int<T1, T2>आदिमता के कारण इंटरफेस की एक पूरी तरह से होगा , लेकिन तुम मेरी बात हो।)
Jörg W Mittag
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.