F # में इंटरेक्टिव मोड क्यों है लेकिन C # नहीं है?


32

एफ # एक इंटरैक्टिव REPL के साथ बॉक्स से बाहर आता है। C # में कुछ भी नहीं है और वास्तव में थोड़े मुश्किल है कि एक पूरी परियोजना स्थापित किए बिना आसपास खेलना मुश्किल है (हालांकि LINQpad काम करता है और इसके शक्तियां के माध्यम से भी संभव है)।

क्या ऐसी भाषाओं के बारे में मौलिक रूप से कुछ अलग है जो एफ # को इंटरैक्टिव कंसोल रखने की अनुमति देता है लेकिन इसे सी # के लिए लागू करना मुश्किल बनाता है?


चूंकि कई सालों बाद भी लोग इस सवाल पर आ रहे हैं, मुझे ध्यान देना चाहिए कि अब कई विकल्प हैं। आप .net फ्रेमवर्क के साथ खेलने के लिए पॉवरशेल (हर आधुनिक विंडोज़ मशीन पर पूर्व-स्थापित) का उपयोग कर सकते हैं। या आप मनमाने ढंग से c # कोड को प्रोटोटाइप करने के लिए LINQpad का उपयोग कर सकते हैं । या आप ScriptCs का उपयोग कर सकते हैं या आप ऑनलाइन jsfiddle- प्रकार के वातावरण जैसे Complify.net या Jsil का उपयोग कर सकते हैं । बहुत सारे विकल्प।


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


मुझे याद है कि प्रोजेक्ट रोसलिन डेमो रिलीज़ सर्बा 2012 में VS2010 के लिए इसमें REPL था
James

@DanielHakimi: इस टिप्पणी के लिए धन्यवाद, मेरे पास कोई सुराग नहीं था इसे VS2015 में शामिल किया गया था, मैंने केवल सोचा था कि आप डिबगिंग करते समय तत्काल विंडो का उपयोग कर सकते हैं। VS2015 में अब सी # इंटरएक्टिव टूल विंडो शामिल है, जो व्यू -> अन्य विंडोज -> सी # इंटरएक्टिव के माध्यम से सुलभ है, जो डिबगिंग के माहौल से अलग एक पूर्ण रोजलिन आधारित आरईपीएल लगता है।
लू

जवाबों:


56

क्या ऐसी भाषाओं के बारे में मौलिक रूप से कुछ अलग है जो एफ # को इंटरैक्टिव कंसोल रखने की अनुमति देता है लेकिन इसे सी # के लिए लागू करना मुश्किल बनाता है?

हाँ।

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

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

दूसरा, वे भाषाएं साइड इफेक्ट्स के साथ प्रोग्रामिंग को हतोत्साहित करती हैं, इसलिए आप बिना किसी चिंता के मूल्यांकन कर सकते हैं कि आप वैश्विक स्थिति को गड़बड़ाने वाले हैं।

तीसरा, अधिकांश कार्य आप उन भाषाओं में करते हैं जो "शीर्ष स्तर पर" हैं; आम तौर पर कोई "वर्ग" या "नाम स्थान" या अन्य संदर्भ नहीं होता है।

इसके विपरीत, C # साइड इफेक्ट्स पैदा करने वाले बयानों के साथ प्रोग्रामिंग नियंत्रण प्रवाह पर जोर देता है, और ये कथन हमेशा कई नेस्टेड कंटेनरों में होते हैं - एक नाम स्थान, एक वर्ग, एक विधि, और इसी तरह।

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

F # में इंटरेक्टिव मोड क्यों है लेकिन C # नहीं है?

क्योंकि F # टीम ने तय किया कि REPL लूप होना उनके लिए प्राथमिकता-एक परिदृश्य था। ऐतिहासिक रूप से C # टीम नहीं है। सुविधाओं को तब तक लागू नहीं किया जाता है जब तक कि वे बजट में फिट होने वाली सर्वोच्च प्राथमिकता वाली सुविधाएँ न हों; अब तक, एक C # REPL हमारी सूची में सबसे ऊपर नहीं रहा है।

रोसलिन परियोजना में C # REPL है (और अंततः VB REPL भी होगा, लेकिन यह अभी तक तैयार नहीं है।) आप इसका पूर्वावलोकन पूर्वावलोकन डाउनलोड करके देख सकते हैं कि आपको यह कैसा लगा।

http://www.microsoft.com/en-us/download/details.aspx?id=27746


7
पायथन में एक अच्छा REPL है, और इसमें कथन, दुष्प्रभाव और नाम स्थान हैं। और इसलिए जावास्क्रिप्ट, बैश, इत्यादि कई भाषाएं जो आपके मानदंड का उल्लंघन करती हैं, उनकी प्रतिक्रिया ठीक है।
रेयान

2
आपका स्वागत है एरिक! मुझे उम्मीद है कि हम आप से अधिक जवाब देख रहे होंगे।
SolutionYogi

16
@ LieRyan मुझे लगता है कि आपने पूरे बिंदु को याद किया। एक इंटरैक्टिव REPL लूप के लिए एकमात्र "मानदंड" है कि किसी ने बैठकर एक लिखा; F # में यह उच्च प्राथमिकता और अपेक्षाकृत आसान था, C # में यह कम प्राथमिकता और अपेक्षाकृत कठिन था, इस प्रकार F # को एक जल्दी मिल गया और C # को नहीं मिला।
कुटुलुमाइक

दिलचस्प। मुझे लगता है कि VS2010 (मैं चार C #, चार VB.NET, दो J # और दो C ++ / CLI की गणना से पहले .NET फ्रेमवर्क के लिए इतने सारे कंपाइलरों के निर्माण का अनुभव प्राप्त किया है) ने प्रभावित किया होगा कि कैसे एक नया कंपाइलर एकदम नया .NET भाषा बनाया गया था। मुझे यकीन है कि यह रोसलिन-एस्क शैली में बहुत सारे विचार के साथ बनाया गया था कि कंपाइलर-ए-ए-सर्विस परिदृश्य को कैसे सक्षम किया जाए, जो ऐसा लगता है कि जिस दिशा में आप सभी भावी .NET कंपाइलर और कंपाइलर संशोधन विकसित कर रहे हैं। मेरे लिए ऐसा लगता है कि जिस युग में एफ # पैदा हुआ था, उसने अनिवार्य रूप से एक भूमिका निभाई थी कि उसका कंपाइलर कैसे लिखा गया।
एलोन गुरिलनेक

बहुत बढ़िया जवाब। पायथन बनाम सी # के बारे में: {} वाक्य रचना भाषाएँ REPLs के लिए अच्छी तरह से झुकती नहीं हैं, इंडेंटेशन आधारित भाषाओं का यहां बहुत अच्छा अग्रिम है। कभी नहीं सोचा था कि मैं कभी सोचूंगा या यह कहूंगा: इंडेंटेशन सिंटैक्स {} सिंटैक्स से बेहतर है। REPLs के लिए और साथ ही कोड की पठनीयता के लिए। तो जब तक कोई C # metasyntax नहीं है जो {} के साथ इंडेंटेशन को प्रतिस्थापित करता है, REPL का अनुभव F # या पाइथन में उदाहरण के लिए उतना सहज नहीं होगा।
सिटीकीड

22

मोनो में C # उत्तर है: http://www.mono-project.com/CsharpRepl

यहां तक ​​कि इसमें एक GUI संस्करण भी है जो आपको ग्राफिक्स ऑब्जेक्ट्स को सीधे हेरफेर करने या Gtk # विगेट्स बनाने की अनुमति देता है:

यहाँ छवि विवरण दर्ज करें


यकीन है, और निश्चित रूप से संभव है, लेकिन क्या सी # के बारे में कुछ ऐसा है जो इसे कठिन बनाता है?
जॉर्ज मौअर

2

मेरा मानना ​​है कि यह ज्यादातर एक ऐतिहासिक चीज है। आरईपीएल वातावरण हमेशा कार्यात्मक भाषाओं, एमएल पारिवारिक भाषाओं को शामिल किया गया है, और एफ # उस परंपरा के लिए सच है। ध्यान रखें कि इंटरैक्टिव वातावरण एक ऐसी चीज है जो कार्यात्मक पृष्ठभूमि से आने वाले उपयोगकर्ताओं को दी जाती है, इस तरह की सुविधा की कमी के कारण वीएस और - को विस्तार से - एफ #, एक नुकसान में डाल दिया जाएगा।

दूसरी ओर, ओओपी समुदाय में ऐसी कोई विशेषता आम नहीं है।

हालाँकि कई गैर-कार्यात्मक भाषाओं के लिए उपलब्ध REPLs हैं, जिनमें C, Java या C # शामिल हैं। इसके अलावा यह एक पूर्ण REPL से दूर रो रहा है, वी.एस. में ऑटो रिक्शा यह दर्शाता है कि यह निश्चित रूप से सी # के साथ संभव है।


1
यह सबसे प्रशंसनीय स्पष्टीकरण मैंने देखा है। शुरुआत में, फोरट्रान था और लिस्प था, और लिस्प्स ने उत्तर दिया था। लिस्प बेगट ... ठीक है, आपको विचार मिलता है। लिस्प वंशावली भाषाओं में उत्तर थे, और फोरट्रान वंश नहीं था।
हारून

@ ऐरन LISP 1959 है, लेकिन REPL को LISP मशीनों, 1973 के लिए जिम्मेदार ठहराया गया है। तब तक, कई, कई भाषाएँ पहले से ही आसपास थीं। विशेष रूप से पास्कल और स्मालटाक।
स्प्रैग

1

मेरा मानना ​​है कि C # मुख्य रूप से ऑब्जेक्ट ओरिएंटेड है। सबसे सरल कोड लिखने के लिए, आपको इसे कई वर्गों में विभाजित करना चाहिए। REPL का उपयोग करने के लिए, आपको बहुत सारे कोड लिखने होंगे।

एफ # मुख्य रूप से कार्यशील होने के कारण यह समस्या नहीं होती है और आप आसानी से सरल कोड में भी जटिल कोड लिख सकते हैं और बाद में इसे ऑब्जेक्ट में बदल सकते हैं।

फंक्शन की सिंगल लाइन लिखने से ज्यादा आसान है क्लास लिखना, जो कई लाइन फैलाती है।


1
REPL कथनों में बाहरी फ़ाइलों में परिभाषित फ़ंक्शन / कक्षाओं का उपयोग करने से आपको कोई रोक नहीं सकता है। तथ्य यह है कि OOP अधिक क्रिया है, REPL कार्यक्षमता को अपने आप से बाधित नहीं करता है।
स्क्रैप्टप

1
पायथन, काफी ऑब्जेक्ट-ओरिएंटेड है और विशेष रूप से महत्वपूर्ण लाइनब्रेक की विशेषता है, एक सभ्य REPL है। स्काला, सांख्यिकीय रूप से टाइप किया जा रहा है, संकलित किया गया है, बल्कि ऑब्जेक्ट-ओरिएंटेड है, एक REPL है। आरईपीएल छोटी चीज़ों के लिए सबसे उपयोगी है जैसे मौजूदा कक्षाएं आयात करना और कुछ तरीकों को कॉल करना; भाषा की वाचालता कोई चिंता का विषय नहीं है। Eg SQL काफी वर्बोज़ है लेकिन हर SQL डेटाबेस REPL (एक 'क्वेरी टूल') के साथ आता है।
9000
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.