C # बनाम F # या F # बनाम C # का उपयोग करने के क्या फायदे हैं? [बन्द है]


93

मैं एक तकनीकी कंपनी के लिए काम करता हूं जो उत्पाद शिपमेंट से अधिक प्रोटोटाइप है। मैंने अभी पूछा कि C # और F # में क्या अंतर है, MS ने F # क्यों बनाया और C # से बेहतर कौन सा परिदृश्य होगा।

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

C # बनाम F # या F # बनाम C # का उपयोग करने के क्या लाभ हैं?


4
मुझे लगता है कि एसओ पर पहले से ही बहुत सारे प्रश्न हैं जो कम से कम आंशिक रूप से आपके प्रश्न का उत्तर देते हैं। क्या आपने "f # कीवर्ड" के बजाय "[F #] कीवर्ड" का उपयोग करके खोजने की कोशिश की है? ("[एफ #] फायदे", उदाहरण के लिए)
बेंजोल

जवाबों:


86

अनिवार्य भाषाओं पर कार्यात्मक प्रोग्रामिंग के सामान्य लाभ:

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

विशेष एफ # नुकसान:

  • अतुल्यकालिक प्रोग्रामिंग -expressions के साथ बेहद आसान और सहज ज्ञान युक्त है - यहां तक ​​कि ParallelFX के साथ, संबंधित C # -code बहुत बड़ा हैasync {}

  • कंपाइलर कंपाइलर और डोमेन-विशिष्ट भाषाओं का बहुत आसान एकीकरण

  • अपनी आवश्यकतानुसार भाषा का विस्तार करना: LOP

  • मापन की इकाई

  • अधिक लचीला वाक्यविन्यास

  • अक्सर छोटे और अधिक सुरुचिपूर्ण समाधान

इस दस्तावेज़ पर एक नज़र डालें

C # के फायदे यह है कि यह अक्सर कार्यात्मक प्रोग्रामिंग भाषा की तुलना में "अपरिमेय" -प्रतिरूपता (उपयोगकर्ता-इंटरफ़ेस, अनिवार्य एल्गोरिदम) के लिए अधिक सटीक होता है, इसका उपयोग करने वाले .NET-फ्रेमवर्क को अनिवार्य रूप से डिज़ाइन किया गया है और यह अधिक व्यापक है।

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


16
वे बहुत अजीब तरीके से गठबंधन करते हैं। उदाहरण के लिए, आप F # में ऑपरेटर को अधिभारित कर सकते हैं। C # डेवलपर्स तब इसका उपयोग कर सकते हैं। हालाँकि, F # डेवलपर्स नहीं कर सकते। यह सही है, F # ऑपरेटर ओवरलोड का उत्सर्जन कर सकता है जो इसका उपभोग नहीं कर सकता है।
जोनाथन एलन

"यह दस्तावेज़" लिंक टूटा हुआ है ...
एडुआर्डो

36

यह पूछने की तरह है कि एक पेचकश पर हथौड़ा का क्या लाभ है। एक उच्च स्तर पर, दोनों अनिवार्य रूप से एक ही काम करते हैं, लेकिन कार्यान्वयन के स्तर पर आप जो हासिल करने की कोशिश कर रहे हैं, उसके लिए इष्टतम उपकरण का चयन करना महत्वपूर्ण है। ऐसे कार्य हैं जो सी # में कठिन और समय लेने वाले हैं लेकिन एफ # में आसान हैं - जैसे कि एक पेचकश के साथ एक कील को पाउंड करने की कोशिश करना। आप इसे कर सकते हैं, निश्चित रूप से - यह सिर्फ आदर्श नहीं है।

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


22
यदि आपके पास एक हथौड़ा है, तो सब कुछ एक नाखून की तरह दिखता है। -मैस्लो
चार्ली साल्ट

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

3
अगर वह तुम्हें नहीं छोड़ेंगे तो मैं करूंगा। : पी +1
स्पेन्सर रूपोर्ट

14
यदि आपके पास एक हथौड़ा है, तो कुछ भी अंगूठे की तरह दिखता है।
एड पॉवर

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

27
  • गणित में F # का C से बेहतर प्रदर्शन है
  • आप सी # के साथ एक ही समाधान में एफ # परियोजनाओं का उपयोग कर सकते हैं (और एक से दूसरे में कॉल करें)
  • एफ # जटिल एल्गोरिथम प्रोग्रामिंग, वित्तीय और वैज्ञानिक अनुप्रयोगों के लिए वास्तव में अच्छा है
  • एफ # तार्किक रूप से समानांतर निष्पादन के लिए वास्तव में अच्छा है (सी # की तुलना में समानांतर कोर पर एफ # कोड निष्पादित करना आसान है)

6
गणित के लिए C # से बेहतर प्रदर्शन करने वाले F # के बारे में: जाहिर है, यह सच नहीं है। विचारशील कोड
Joh

3
@ जो: inlineएक ऐसी चीज़ का स्पष्ट उदाहरण है जो F # में बड़े पैमाने पर प्रदर्शन सुधार प्रदान कर सकता है जो C # व्यक्त नहीं कर सकता है।
JD

@Jon Harrop: मैं विशेष रूप से रिनैट के ब्लॉग प्रविष्टि की चर्चा कर रहा था। ऐसा लगता है कि एफ # के पक्ष में समय उप-इष्टतम सी # कोड के कारण था।
जोह

27

आपके प्रश्न का उत्तर देने के लिए जैसा कि मैं इसे समझता हूं: C # का उपयोग क्यों करें? (आप कहते हैं कि आप पहले से ही F # पर बिक चुके हैं।)

सबसे पहले। यह केवल "कार्यात्मक बनाम ऊ" नहीं है। यह "कार्यात्मक + OO बनाम OO" है। C # की कार्यात्मक विशेषताएं बहुत अल्पविकसित हैं। F # के नहीं हैं। इस बीच, F # लगभग सभी C # के OO फीचर्स करता है। अधिकांश भाग के लिए, F #, C # की कार्यक्षमता के सुपरसेट के रूप में समाप्त होता है।

हालाँकि, कुछ मामले ऐसे हैं जहाँ F # सबसे अच्छा विकल्प नहीं हो सकता है:

  • इंटरॉप। वहाँ पुस्तकालयों के बहुत सारे है कि बस एफ # से बहुत आराम से नहीं जा रहे हैं। हो सकता है कि वे कुछ C # OO चीजों का शोषण करते हैं जो F # समान नहीं करता है, या शायद वे C # कंपाइलर के आंतरिक पर भरोसा करते हैं। उदाहरण के लिए, अभिव्यक्ति। हालांकि आप आसानी से एक अभिव्यक्ति में एक एफ # उद्धरण बदल सकते हैं, परिणाम हमेशा सी # क्या पैदा करेगा नहीं है। कुछ पुस्तकालयों को इससे समस्या है।

    • हां, इंटरोप एक बहुत बड़ा जाल है और इसके परिणामस्वरूप कुछ पुस्तकालयों के साथ थोड़ा घर्षण हो सकता है।

    • मेरा मानना ​​है कि यदि आपके पास एक बड़ा मौजूदा कोडबेस है तो इसमें इंटरोप भी शामिल है। यह सिर्फ एफ # में भागों लिखना शुरू करने के लिए समझ में नहीं आ सकता है।

  • डिजाइन उपकरण। F # के पास कोई नहीं है। इसका मतलब यह नहीं है कि यह कोई भी नहीं हो सकता है, लेकिन अभी आप F # कोडबेहिन्ड के साथ एक WinForms ऐप को व्हिप नहीं कर सकते। यहां तक ​​कि जहां यह समर्थित है, जैसे ASPX पृष्ठों में, आपको वर्तमान में IntelliSense नहीं मिलता है। तो, आपको ध्यान से विचार करने की आवश्यकता है कि आपकी सीमाएं उत्पन्न कोड के लिए कहां होंगी। वास्तव में एक छोटे से प्रोजेक्ट पर जो लगभग विशेष रूप से विभिन्न डिजाइनरों का उपयोग करता है, यह "गोंद" या तर्क के लिए एफ # का उपयोग करने के लिए इसके लायक नहीं हो सकता है। बड़ी परियोजनाओं पर, यह एक समस्या से कम हो सकता है।

    • यह एक आंतरिक समस्या नहीं है। रेक्स एम के उत्तर के विपरीत, मुझे C # या F # के बारे में कुछ भी आंतरिक नहीं दिखता है जो कि उन्हें बहुत सारे म्यूटेबल फ़ील्ड के साथ UI करने के लिए बेहतर बनाते हैं। शायद वह "उत्परिवर्तित" लिखने और उपयोग करने के लिए <- के बजाय = के अतिरिक्त ओवरहेड की बात कर रहा था।

    • इसके अलावा पुस्तकालय / डिजाइनर पर निर्भर करता है। हम सभी नियंत्रकों के लिए एफ # के साथ ASP.NET MVC का उपयोग करना पसंद करते हैं, फिर ASPX डिजाइनरों को प्राप्त करने के लिए एक सी # वेब परियोजना। हम वास्तविक ASPX "कोड इनलाइन" को C # और F # के बीच मिलाते हैं, जो उस पृष्ठ पर हमारी आवश्यकता के आधार पर है। (IntelliSense बनाम F # प्रकार)।

  • अन्य उपकरण। वे केवल C # की अपेक्षा कर रहे होंगे और F # प्रोजेक्ट या संकलित कोड से निपटने के बारे में नहीं जानते होंगे। साथ ही, F # के लाइब्रेरीज़ .NET के हिस्से के रूप में शिप नहीं होते हैं, इसलिए आपके पास जहाज करने के लिए थोड़ा अतिरिक्त है।

  • लेकिन नंबर एक मुद्दा? लोग। यदि आपका कोई भी डेवलपर F # सीखना नहीं चाहता, या इससे भी बदतर, कुछ पहलुओं को समझने में गंभीर कठिनाई है, तो आप शायद टोस्ट हैं। (हालांकि, मैं तर्क देता हूँ कि आप उस मामले में वैसे भी टोस्ट हैं।) ओह, और अगर प्रबंधन कहता है कि नहीं, तो यह एक मुद्दा हो सकता है।

मैंने इस बारे में कुछ समय पहले लिखा था: Why Not F #?


6

आप एक प्रक्रियात्मक भाषा और एक कार्यात्मक भाषा के बीच तुलना करने के लिए कह रहे हैं ताकि मुझे लगे कि आपके प्रश्न का उत्तर यहां दिया जा सकता है: प्रक्रियात्मक प्रोग्रामिंग और कार्यात्मक प्रोग्रामिंग के बीच अंतर क्या है?

जैसा कि MS ने F # क्यों बनाया इसका उत्तर बस है: .Net लाइब्रेरी तक पहुँच के साथ एक कार्यात्मक भाषा बनाना, बस उनके मार्केट बेस का विस्तार करना। और यह देखते हुए कि वाक्य रचना OCaml के लगभग समान कैसे है, यह वास्तव में उनकी ओर से बहुत प्रयास की आवश्यकता नहीं थी।


1
हालांकि मुझे लगता है कि आपका सामान्य उत्तर सही है कि असली सवाल प्रोग्रामिंग प्रतिमानों की तुलना में है और भाषाओं के बारे में नहीं है, मुझे लगता है कि जिस प्रश्न का आप जिक्र कर रहे हैं उसका उत्तर थोड़ा उथला है।
जेरोइन हिनिंक

एक और सवाल करने के लिए स्वतंत्र महसूस करें यदि आपके पास बेहतर है। यह एक Google खोज से मिली सबसे अधिक रेटिंग है।
स्पेंसर रूपोर्ट

1
मुझे लगता है कि वह F # के लिए एक गधे की तरह लग रहा है के बारे में आप की तरह होने की कोशिश कर रहा था # Micrsoft की ओर से बहुत प्रयास की आवश्यकता नहीं है।
मैथ्यू Whited

बाजार आधार टिप्पणी के लिए +1। सरल और इसमें कुछ सच्चाई है।
०४:

1
मैं अपने प्रश्न का उत्तर देने वाले अन्य लिंक में नहीं हूं। C # नए संस्करणों में बहुत सारे कार्यात्मक निर्माणों का समर्थन करता है।
०४

5

यदि आप C #, C ++, VB से इसकी तुलना कर रहे हैं तो F # अभी तक दूसरी-प्रोग्रामिंग-भाषा नहीं है। C #, C, VB सभी अनिवार्य या प्रक्रियात्मक प्रोग्रामिंग भाषाएं हैं। एफ # एक कार्यात्मक प्रोग्रामिंग भाषा है।

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

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


4
-1। F # एक बहु-प्रतिमान (OO + FP) भाषा है। केवल विशुद्ध रूप से कार्यात्मक भाषाओं के साइड-इफेक्ट्स (जैसे हास्केल) नहीं हैं, लेकिन एफ # शुद्ध नहीं है।
मौरिसियो शेफ़र

5

F # मूल रूप से कार्यात्मक प्रोग्रामिंग भाषाओं का C ++ है। वे वास्तव में बेवकूफ भागों सहित ऑब्जेक्टिव कैमल से लगभग सब कुछ रखते थे, और इसे .NET रनटाइम के ऊपर इस तरह से फेंक दिया कि यह .NET से सभी बुरी चीजों में भी लाता है।

उदाहरण के लिए, ऑब्जेक्टिव कैमल के साथ आपको एक प्रकार का नल मिलता है, विकल्प <T>। एफ # के साथ आपको तीन प्रकार के नल मिलते हैं, विकल्प <टी>, अशक्त <टी>, और संदर्भ नल। इसका मतलब है कि यदि आपके पास एक विकल्प है, तो आपको यह देखने के लिए पहले जांच करने की आवश्यकता है कि क्या यह "कोई नहीं" है, तो आपको यह जांचने की आवश्यकता है कि क्या यह "कुछ (अशक्त)" है।

एफ # पुराने जावा क्लोन जे # की तरह है, सिर्फ ध्यान आकर्षित करने के लिए सिर्फ एक कमीने भाषा। कुछ लोग इसे पसंद करेंगे, उनमें से कुछ भी इसका उपयोग करेंगे, लेकिन अंत में यह अभी भी सीएलआर पर 20 साल पुरानी भाषा है।


2
+1, यह ठंडा कठिन सच हो सकता है लेकिन मैं अभी भी काफी खुश हूं कि मैं वी.एस. में एक कार्यात्मक भाषा का उपयोग कर सकता हूं। NET
gradbot

1
मैं मानता हूं कि Nullable <T> के पास कंपाइलर होना चाहिए जो हमारे लिए कुछ जादू कर सके। मुझे यकीन नहीं है कि "कुछ अशक्त" के बराबर होना कोई भी हमेशा काम नहीं करेगा - कुछ इंटरोप कोड इस पर भरोसा कर सकते हैं। लेकिन संदर्भ अशक्त? आप .NET में एक प्रमुख छेद के आसपास कैसे काम करने जा रहे हैं? एक विकल्प में हर संदर्भ प्रकार लपेटें? व्यवहार में, यह केवल कुछ इंटरॉप परिदृश्यों के साथ एक मुद्दा लगता है।
माइकल जीजी

12
एफडब्ल्यूआईडब्ल्यू, मैं कई सालों से एफ # में पेशेवर रूप से कोडिंग कर रहा हूं (दुनिया में लगभग किसी और की तुलना में) और मैंने इस समस्या या कोड को कभी Some nullभी किसी भी एफ # कोड में कहीं भी नहीं देखा है । सभी चीजों के बारे में लोगों के बारे में पकड़ सकता है, इस सूची में नीचे waaay किया जाना है ...
जद

1
F # से C ++ की तुलना करना थोड़ा दूर की कौड़ी है। C ++ के कई भाग अपरिभाषित या अस्पष्ट शब्दार्थ हैं, F # सरल और अच्छी तरह से परिभाषित है। .NET रनटाइम की गुणवत्ता को F # के खिलाफ नहीं रखा जा सकता है, क्योंकि किसी भी .NET भाषा में समान मुद्दे होंगे।
जोह

1
@ Fon की तरह 2 साल से अधिक के पेशेवर F # प्रोग्रामिंग में, मैंने 'कुछ अशक्त' से संबंधित कोई समस्या नहीं देखी है। दूसरी ओर, मैंने .net फ्रेमवर्क की सुविधाओं से काफी प्रभावित किया है।
मार्क सिग्रिस्ट

5

.NET I के कुछ पहलुओं में से एक सबसे ज्यादा पसंद है। यहां तक ​​कि अगर आप एफ # में प्रक्रियात्मक कोड लिखते हैं, तो भी आप प्रकार के अनुमान से लाभान्वित होंगे। यह सामान्य कोड लिखना आसान बनाता है।

C # में, आप डिफ़ॉल्ट रूप से ठोस कोड लिखते हैं, और आपको जेनेरिक कोड लिखने के लिए कुछ अतिरिक्त काम करना होगा।

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

हालांकि ऐसी स्थितियां हैं जहां सी # का उपयोग करना बेहतर है, जो किसी के स्वाद और प्रोग्रामिंग शैली पर निर्भर करता है।

  • C # प्रकारों के बीच घोषणा के आदेश को लागू नहीं करता है, और यह उस क्रम के प्रति संवेदनशील नहीं है जिसमें फाइलें संकलित हैं।
  • C # के कुछ निहितार्थ हैं जो F # टाइप प्रकारण के कारण बर्दाश्त नहीं कर सकते हैं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.