C #, Java और Scala से Closures / Lambdas /… के दृष्टिकोण में क्या लाभ और नुकसान हैं?


30

मुझे आश्चर्य है कि सी # और स्काला के बीच तकनीकी कार्यान्वयन अंतर क्या हैं और दोनों समाधान ब्रायन गोएत्ज़ द्वारा ईमेल पीक पास्ट लैम्ब्डा में लगाए गए कार्यान्वयन विचारों और चिंताओं की तुलना कैसे करते हैं , प्रोजेक्ट लैम्ब्डा (जेएसआर 335) की मेलिंग सूची को भेजा गया है ?

ईमेल से:

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

और आगे:

संसार के लम्बदास-वस्तु-दृश्य इस संभावित भविष्य के साथ टकराव करते हैं। दुनिया के लैंबडास-ए-फ़ंक्शंस दृश्य नहीं है, और इस लचीलेपन को संरक्षित करना, वस्तु-नेस की उपस्थिति के साथ लैम्ब्डा को बोझ नहीं करने के पक्ष में एक बिंदु है।

निष्कर्ष:

लंबोदर-ए-फ़ंक्शन दरवाजे खोलता है। लम्बदास-वस्तुएं उन्हें बंद कर देती हैं।
हम उन दरवाजों को खुला छोड़ना पसंद करते हैं।

और Reddit थ्रेड पर एक व्यक्ति की कुछ टिप्पणी कहती है:

मैंने वास्तव में नील गैटर को इस बारे में और उसके स्पष्टीकरण C # की मेरी सीमित समझ के बारे में ई-मेल किया है और वर्तमान जावा डिज़ाइन काफी हद तक समान है कि डेलीगेट्स वास्तव में ऑब्जेक्ट हैं और फ़ंक्शन प्रकार नहीं हैं। ऐसा लगता है जैसे वह मानता है कि जावा को C # के लैंबडास के नुकसानों से सीखना चाहिए और उनसे बचना चाहिए (बहुत कुछ जैसे C # जावा के नुकसान से सीखा और शुरुआत में उनसे परहेज किया)।

"लैम्ब्डा-ए-फ़ंक्शंस" दृष्टिकोण भविष्य में "लैम्ब्डा-एज़-ऑब्जेक्ट्स" की तुलना में अधिक अवसरों को क्यों सक्षम करता है? क्या कोई समझा सकता है कि क्या अंतर मौजूद हैं और वे कैसे प्रभावित करेंगे कि कोड कैसे लिखा जाएगा?

स्काला "बस काम" में उस चीज़ को देखकर, मैं सोचता रहता हूं कि मैं C # / Java (8) में प्रस्तावित / प्रस्तावित दृष्टिकोणों के बारे में कुछ याद कर रहा हूं, शायद यह पिछड़े-अनुकूलता के बारे में चिंताओं से संबंधित है?


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

कार्यों को कुछ इंटरफ़ेस के उदाहरण नहीं चाहिए? उनमें ऐसा क्या खास है?
सामाजिक

Lisp / Scheme / Clojure ऑब्जेक्ट्स को मॉडल कर सकता है जबकि Java / C # कार्यों के मनमाने तरीके से मॉडल नहीं बना सकता है। पाइथन को लगता है कि दोनों दुनिया के सर्वश्रेष्ठ हैं।
जॉब

जवाबों:


15

मुझे लगता है कि वस्तुओं बनाम कार्यों के संबंध में चर्चा एक लाल हेरिंग है। यदि सवाल है, "क्या एक मेमना एक कार्य या एक वस्तु है?" जवाब हां होना चाहिए ।

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

स्काला एक रैपर ऑब्जेक्ट का उपयोग करके इसे पूरा करता है, जिसमें एक विधि होती है, जिसे applyबस के साथ लागू किया जा सकता है (), यह एक विधि कॉल की तरह दिखता है। यह शानदार ढंग से काम करता है; बहुत समय आपको यह भी ध्यान रखने की आवश्यकता नहीं है कि आपके पास कोई विधि है या फ़ंक्शन ऑब्जेक्ट के आवेदन को बुला रहा है।


9

मैं जो समझता हूं, वह इस बारे में अधिक है कि प्राथमिक भाषा के स्तर पर लैम्ब्डा कैसे माना जाता है। जैसा कि ईमेल कहता है,

आप सोच सकते हैं कि वर्तमान डिजाइन लैंबडास के लिए एक वस्तु बॉक्स से कसकर बंधा हुआ है - एसएएम प्रकार - उन्हें वैसे भी प्रभावी ढंग से ऑब्जेक्ट बनाते हैं। लेकिन इसे सतह क्षेत्र से सावधानीपूर्वक छिपाया गया है ताकि भविष्य में हम 'नग्न' लैम्बदास पर विचार कर सकें, या लैम्ब्डा के लिए अन्य रूपांतरण संदर्भों पर विचार कर सकें, या लैम्बडा को नियंत्रण निर्माण में और अधिक मजबूती से एकीकृत कर सकें। हम अब ऐसा नहीं कर रहे हैं, और हमारे पास ऐसा करने के लिए कोई ठोस योजना भी नहीं है, लेकिन भविष्य में संभवतः ऐसा करने की क्षमता डिजाइन का एक महत्वपूर्ण हिस्सा है।

मुझे लगता है कि आपके सवाल को काफी अच्छी तरह से समझा जाता है। यदि आप घोषित करते हैं कि "लंबोदर वस्तुएं हैं", तो वे सिर्फ एक विशेष वर्ग की वस्तु हैं और आप उसी के साथ फंस गए हैं। दूसरी ओर, यदि आप घोषित करते हैं कि "लंबोदा कार्य हैं", तो शब्दार्थ आपके पास बहुत अधिक समृद्ध खेल का मैदान है। जावा 1.7 उन्हें वस्तुओं के लिए संकलित कर सकता है, इसलिए वे उस बिंदु पर व्यावहारिक रूप से समान हैं।

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


प्रतिनिधियों में C #! = में लामदास। कंपाइलर के पास उन्हें डेल्गेट्स या एक्सप्रेशन पेड़ों को संकलित करने का विकल्प है। दोनों वास्तव में ऑब्जेक्ट ग्राफ़ हैं, लेकिन वे एक "विशेष वर्ग" के लिए संकलित नहीं हैं और न ही एक विशेष वंशानुक्रम के पेड़ का एक वर्ग
रूण FS

अगर मैं सही तरीके से समझूं, तो लैम्ब्डा को नीचे की वस्तु के आंतरिक वर्ग में संकलित करता है, जो उस वस्तु से जुड़ा होता है, इसलिए भविष्य में यदि जावा उच्च-क्रम के कार्यों (वस्तुओं के समान स्तर पर कार्य) को शुरू करता है तो आप आंतरिक-वर्ग कार्यान्वयन का उपयोग नहीं कर सकता है, और एक असंगति होगी। मुझे नहीं लगता कि जावा में कभी भी उच्च-क्रम के कार्य होंगे।
mwolfetech

@mwolfetech: जहां तक ​​मुझे पता है, वे पहले से ही जावा 8 के लिए डिफेंडर विधियों के साथ योजनाबद्ध हैं। वे तरह बातें जोड़ना चाहते हैं foreach, map, filterसंग्रह करने के लिए।
सामाजिक

@ एसओसी गुड पॉइंट, जेएसआर की संख्या के साथ रखने के लिए इसकी कड़ी मेहनत और क्या वे वास्तव में जेडीके का एक लक्षित संस्करण पूरा करेंगे और बना सकते हैं। ऐसा लगता है कि डिफेंडर तरीके उसी JSR का हिस्सा हो सकते हैं। इस JSR के संबंध में , मैंने पाया कि लैंबडा पोस्ट के ब्रायन गोएट्स स्टेट सहायक हैं- सैम के प्रकार और लंबोदर के भावों को लागू करने के लिए वर्तमान विचार बताते हैं।
mwolfetech

"वर्तमान विचार" mhhh, 2010 से वह पोस्ट अब अप्रचलित नहीं है?
सामाजिक

5

अधिकतर, वह बस कुछ करने के लिए जल्द ही प्रतिबद्ध नहीं करना चाहता है। मुझे उनके द्वारा प्रस्तुत किए गए युग से परे कोई कारण दिखाई नहीं देता है, लेकिन यह वास्तव में एक बहुत मजबूत कारण है।

मुझे फ़ंक्शन प्रकार पसंद नहीं हैं - मुझे फ़ंक्शन प्रकार पसंद हैं - लेकिन यह फ़ंक्शन प्रकार जावा प्रकार सिस्टम के एक मौजूदा पहलू के साथ बुरी तरह से लड़ता है, मिटाता है। मिटाए गए फ़ंक्शन प्रकार दोनों दुनिया के सबसे खराब हैं।

स्काला में इन तरीकों पर विचार करें Regex:

def replaceAllIn (target: CharSequence, replacer: (Match)  String): String
def replaceSomeIn (target: CharSequence, replacer: (Match)  Option[String]): String

यह सरल होगा यदि वे बस यही थे:

def replace (target: CharSequence, replacer: (Match)  String): String
def replace (target: CharSequence, replacer: (Match)  Option[String]): String

दुर्भाग्य से, यह संभव नहीं है, क्योंकि उन दो कार्यों को मिटाए जाने के तहत समान हैं । लेकिन, ठीक है, ये फ़ंक्शन कुछ अलग चीजें करते हैं, इसलिए एक अलग नाम काफी उचित हो सकता है।

हालाँकि, Matchयह कुछ बहुत उपयोगी है, लेकिन अधिकांश समय आप या तो मिलान Stringया उपसमूह की सूची चाहते हैं । हम यह करना चाहेंगे:

def replaceAllIn (target: CharSequence, replacer: (String)  String): String
def replaceAllIn (target: CharSequence, replacer: (Seq[String])  String): String
def replaceAllIn (target: CharSequence, replacer: (Match)  String): String

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

और, तब, मानिए कि स्केला का पैटर्न मिलान और जावा instanceofप्रभावी रूप से बेकार होने के कारण बेकार है।

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


ठीक है, अगर टाइप इरैसेचर एकमात्र समस्या है, तो वे क्या करने की योजना बनाते हैं? इस ग्रह पर हर कोड को तोड़कर जावा 5 के लिए पहले से ही एक गैर-विकल्प का फैसला किया गया था ...
सामाजिक

@ मुझे बहुत खुशी है कि मैं उनके जूतों में नहीं हूँ! लेकिन वह सूर्य था, यह ओरेकल है। ओरेकल को कभी भी अपने मुख्य उत्पाद के प्रमुख - और यहां तक ​​कि मामूली - संस्करणों के बीच परिवर्तन करने में कोई कंपीटिशन नहीं मिला है।
डेनियल सी। सोबरल

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

@ जियोर्जियो थोड़ा व्यर्थ होगा। ठीक है, लोग हैं, जो क्या जावा आज के लिए जिम्मेदार हैं में से कुछ ऐसा ही किया, लेकिन, जैसा कि आप ने कहा, कर रहे हैं विकल्प। लेकिन जावा के लिए जिम्मेदार लोगों को स्वयं जावा को सुधारना होगा - वे इसके लिए जिम्मेदार हैं , आखिरकार। एकमात्र विकल्प केवल जावा को गिराना है, और इसके परिणामस्वरूप होने वाले सभी लाभों को नियंत्रित करना है।
डैनियल सी। सोबरल

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