अप्रबंधित भाषाओं के बावजूद, एफ # वास्तव में गणित को लागू करने के लिए सी # से बेहतर है? और अगर ऐसा है, तो क्यों?क्या # # गणित के लिए सी # से वास्तव में बेहतर है?
उत्तर
मुझे लगता है कि महत्वपूर्ण बिंदुओं में से सबसे पहले से ही किसी और के द्वारा उल्लेख किया गया था:
- एफ # आप एक तरह से गणितज्ञों उनके बारे में लगता है कि
- उच्च क्रम कार्यों के लिए धन्यवाद में समस्याओं को हल करने की सुविधा देता है, तो आप सरल उपयोग कर सकते हैं अवधारणाओं मुश्किल समस्याओं को हल करने
- सब कुछ डिफ़ॉल्ट रूप से अपरिवर्तनीय है, जो कार्यक्रम आसान बना देता है समझने के लिए (और यह भी parallelize करने के लिए आसान)
यह निश्चित रूप से सच है कि आप सी # 3.0 में कुछ एफ # अवधारणाओं का उपयोग कर सकते हैं, लेकिन सीमाएं हैं। आप किसी भी रिकर्सिव कंप्यूटेशंस का उपयोग नहीं कर सकते हैं (क्योंकि सी # में पूंछ-रिकर्सन नहीं है) और इस तरह आप कार्यात्मक/गणितीय तरीके से आदिम संगणना लिखते हैं। साथ ही, सी # में जटिल उच्च ऑर्डर फ़ंक्शंस (जो तर्क के रूप में अन्य कार्यों को लेते हैं) लिखना मुश्किल है, क्योंकि आपको स्पष्ट रूप से प्रकार लिखना है (एफ # में, प्रकारों का अनुमान लगाया जाता है, लेकिन स्वचालित रूप से सामान्यीकृत भी होता है, इसलिए आपको स्पष्ट रूप से बनाना नहीं है एक समारोह जेनेरिक)।
इसके अलावा, मुझे लगता है कि मार्क Gravell से निम्न बिंदु एक वैध आपत्ति नहीं है:
एक रखरखाव कोण से, मैं विचार है कि उपयुक्त रूप से नामित गुण आदि का उपयोग करना आसान हैं की कर रहा हूँ (पूर्ण से अधिक जीवन चक्र) tuples और सिर/पूंछ सूचियों की तुलना में, लेकिन यह सिर्फ मुझे हो सकता है।
यह निश्चित रूप से सच है। हालांकि, एफ # के बारे में बड़ी बात यह है कि आप tuples & हेड/पूंछ सूचियों का उपयोग करके प्रोग्राम लिखना शुरू कर सकते हैं और बाद में विकास प्रक्रिया में इसे ऐसे प्रोग्राम में बदल सकते हैं जो .NET IENumerables और गुणों के साथ प्रकारों का उपयोग करता है (और इस तरह मैं सामान्य F # प्रोग्रामर काम करता है *)। टुपल्स इत्यादि। और एफ # इंटरैक्टिव डेवलपमेंट टूल्स आपको त्वरित प्रोटोटाइप समाधानों के लिए एक शानदार तरीका प्रदान करते हैं (और जब कुछ गणितीय करते हैं, तो यह आवश्यक है क्योंकि अधिकांश विकास केवल तब प्रयोग कर रहे हैं जब आप सबसे अच्छे समाधान की तलाश में हैं)। एक बार आपके पास प्रोटोटाइप हो जाने के बाद, आप सरल स्रोत कोड ट्रांसफॉर्मेशन का उपयोग कोड को एक एफ # प्रकार में लपेटने के लिए कर सकते हैं (जिसे सामान्य कक्षा के रूप में सी # से भी इस्तेमाल किया जा सकता है)। एफ # आपको प्रदर्शन के संदर्भ में कोड को अनुकूलित करने के कई तरीके भी प्रदान करता है।
यह आपको लैंगुग (उदाहरण के लिए पायथन) का उपयोग करने में आसान बनाता है, जो कई लोग प्रोटोटाइप चरण के लिए उपयोग करते हैं। हालांकि, एक बार जब आप एक कुशल भाषा (जैसे सी ++ या शायद सी #) का उपयोग करके प्रोटोटाइप के साथ किए जाते हैं, तो आपको पूरे कार्यक्रम को फिर से लिखना नहीं पड़ता है, क्योंकि एफ # दोनों "उपयोग करने में आसान" और "कुशल" है और आप आसानी से स्विच कर सकते हैं इन दो शैलियों के बीच।
(*) मैं इस शैली का उपयोग अपने functional programming book में भी करता हूं।
मुझे यकीन नहीं है कि यह बेहतर या बदतर है लेकिन दृष्टिकोण में निश्चित रूप से एक अंतर है। यह निर्धारित करने के लिए स्टेटिक भाषाएं कैसे हल की जाएंगी। F # या Haskell जैसी कार्यात्मक भाषाएं ऐसा नहीं करती हैं और गणितज्ञ किसी विशेष समस्या को हल करने के तरीके के बारे में अधिक अनुरूप होते हैं। तब आपके पास this जैसी किताबें हैं जो कि पाइथन पर अच्छा होने के लिए कहती हैं। यदि आप प्रदर्शन के दृष्टिकोण से बात कर रहे हैं तो कुछ भी नहीं हरा सकता है। यदि आप पुस्तकालयों से बात कर रहे हैं तो मुझे लगता है कि फंक्शनल लैंगुगेस (एफ # और पसंद), फोर्टन (हाँ अभी तक मर चुका नहीं है), पायथन के पास गणित के लिए उत्कृष्ट पुस्तकालय हैं।
एफ # एक स्थिर रूप से टाइप की गई भाषा भी है - इसमें उत्कृष्ट प्रकार की अनुमान और अन्य क्षमताएं हैं जो इसे हल्के तरीके से समस्या निर्दिष्ट करने की अनुमति देती हैं। –
> कुछ भी सी को हरा सकता है - क्या आप इसे साबित कर सकते हैं? –
@SargeBorsch: मुझे इसे साबित करने की आवश्यकता नहीं है। मेरा मतलब यह नहीं था कि अगर आप बकवास सी कोड लिखते हैं तो यह तेज़ होगा। यह उल्लेख की गई भाषाओं में एच/डब्ल्यू के करीब है। – Perpetualcoder
इस पोस्ट में लगता है कि यह प्रासंगिक हो सकता है: http://fsharpnews.blogspot.com/2007/05/ffts-again.html
इसके अलावा: C#/F# Performance comparison
शुद्ध गणित के लिए सबसे बड़ा लाभ यह क्या PerpetualCoder कहा, एफ # अधिक एक गणित की समस्या की तरह लग रहा है, तो यह आसान होने जा रहा है लिखने के लिए एक गणितज्ञ। जब मैंने इसे देखा तो यह मुझे बहुत सारे MATLAB याद दिलाता था।
मैं गणित की पृष्ठभूमि से हूं, और एफ # को देखा है, लेकिन मैं अभी भी अधिकांश उद्देश्यों के लिए सी # पसंद करता हूं। ऐसी कुछ चीजें हैं जो F # आसान बनाती हैं, लेकिन आम तौर पर मैं अभी भी बड़े मार्जिन से सी # पसंद करता हूं।
कुछ touted F # लाभ (अपरिवर्तनीयता, उच्च-आदेश फ़ंक्शन इत्यादि) अभी भी सी # (बाद में प्रतिनिधियों आदि का उपयोग करके) में किए जा सकते हैं। लैम्बडा समर्थन के साथ सी # 3.0 का उपयोग करते समय यह और भी स्पष्ट है, जो कार्यात्मक कोड घोषित करने के लिए बहुत आसान और अभिव्यक्तिपूर्ण बनाता है।
रखरखाव कोण से, मुझे लगता है कि उपयुक्त नाम आदि गुणों का उपयोग करना आसान है (पूर्ण जीवन चक्र से) टुपल्स और सिर/पूंछ सूचियों की तुलना में, लेकिन यह सिर्फ मुझे हो सकता है।
उन क्षेत्रों में से एक जहां सी # गणित के लिए खुद को छोड़ देता है जेनेरिक और ऑपरेटरों के लिए उनका समर्थन है। तो मैं इसे संबोधित करने में कुछ समय बिताता हूं ;- मेरे परिणाम MiscUtil में उपलब्ध हैं, अवलोकन here के साथ।
कार्यात्मक भाषाओं के महान फायदों में से एक यह तथ्य है कि वे बहु-प्रोसेसर या बहु-कोर सिस्टम पर चल सकते हैं, बिना किसी कोड को बदलने के लिए समानांतर में। इसका मतलब है कि आप कोर जोड़कर अपने एल्गोरिदम को तेज कर सकते हैं।
अच्छा, यह कार्यात्मक * कोड * पर लागू होता है, न केवल कार्यात्मक * भाषा *। सी # में * बिल्कुल * करने के लिए समांतर एक्सटेंशन देखें। समानांतर एक्सटेंशन (IIRC) @ T.P .NET 4.0 –
एफ # units of measure का समर्थन करता है, जो गणित के काम के लिए बहुत उपयोगी हो सकता है।
यह भौतिकी से संबंधित किसी भी चीज़ के लिए एक जीवन बचतकर्ता है! – Benjol
@ बेंजोल इस सुविधा ने मुझे गेम विकास में काफी मदद की है।
@gradbot, यह मेरी मदद करता है क्योंकि डेटा अक्सर एमएम/एम/किमी के मिश्रण में आता है, और आंतरिक प्रतिनिधित्व (माना जाता है कि कम से कम) सभी प्रारूपों में फिर से आउटपुट होने से पहले। क्या यूओएम हंगेरी नोटेशन के प्रति विरोधी हो सकता है? :) – Benjol
एफ # गणितीय कार्यक्रमों के संदर्भ में अधिक सी # कई भारी लाभ हैं:
एफ # इंटरैक्टिव सत्र आप तुरंत और even visualize them परिणाम प्राप्त करने के लिए मक्खी कोड चलाते हैं, निर्माण और निष्पादित करने के लिए बिना एक पूरा आवेदन।
एफ # कुछ विशेषताएं है कि गणित के संदर्भ में बड़े पैमाने पर प्रदर्शन में सुधार प्रदान कर सकते हैं समर्थन करता है। सबसे विशेष रूप से,
inline
और उच्च-आदेश फ़ंक्शंस का संयोजन गणितीय कोड को प्रदर्शन को प्रतिकूल रूप से प्रभावित किए बिना सुंदर ढंग से फैक्टर करने की अनुमति देता है। सी # यह व्यक्त नहीं कर सकता है।एफ # कि यह संभव गणितीय अवधारणाओं कहीं अधिक स्वाभाविक रूप से की तुलना में सी # में प्राप्त किया जा सकता लागू करने के लिए बनाने के कुछ सुविधाओं का समर्थन करता। उदाहरण के लिए, पूंछ कॉल आसानी से और भरोसेमंद संबंधों को पुनरावृत्ति संबंधों को लागू करना अधिक आसान बनाता है। सी # यह भी व्यक्त नहीं कर सकता है।
गणितीय समस्याओं अक्सर अधिक परिष्कृत डाटा संरचनाओं और एल्गोरिदम के उपयोग की आवश्यकता। जटिल समाधान व्यक्त बेहद सी # की तुलना में एफ # के साथ आसान है।
आप एक मामले का अध्ययन करना चाहते हैं, मैं QR अपघटन के एक कार्यान्वयन System.Double
से अधिक 2kLOC से सी # के बदल दिया। एफ # कोड की केवल 100 पंक्तियां थीं, 10 × से अधिक तेजी से चलती हैं और संख्या के प्रकार पर सामान्यीकृत होती है, इसलिए यह न केवल float32
, float
और System.Numerics.Complex
पर काम करती है लेकिन प्रतीकात्मक परिणामों को प्राप्त करने के लिए प्रतीकात्मक मैट्रिस पर भी लागू की जा सकती है!
FWIW, I write books इस विषय के साथ-साथ वाणिज्यिक सॉफ्टवेयर पर भी।
वाह, बस अपनी किताब देखी। लेकिन जीपीबी 125 ... आदमी, आप बहुत से लोगों को गंभीरता से मूल्यवान कर रहे हैं। –
@ डिमिट्री: हां, अगर आप एफ # कोड लिखकर बहुत पैसा कमा सकते हैं तो इसका एकमात्र मूल्य है। :-) –
एक सेकंड पर पकड़ो ... मैं * * एफ # कोड लिखकर बहुत सारा पैसा कमाता हूं। :) क्या कोई नमूना अध्याय या कुछ ऐसा है? –
- 1. वास्तव में SplFixedArray सरणी से बेहतर प्रदर्शन करता है?
- 2. सरल जावास्क्रिप्ट दिनांक गणित ... वास्तव में
- 3. cacert.pem के लिए वास्तव में क्या है?
- 4. एक तेज सी या उद्देश्य-सी गणित पार्सर क्या है?
- 5. गणित में # मतलब क्या है?
- 6. बेहतर प्रोग्रामर बनने के लिए मेरे गणित कौशल में सुधार कैसे करें
- 7. # वास्तव में क्या शामिल है?
- 8. गणित नौसिखिया के लिए गेम प्रोग्रामिंग के लिए गणित सीखना शुरू करना कहां है?
- 9. सी सी कास्ट वास्तव में क्या करता है?
- 10. वास्तव में PLINQ क्या है?
- 11. क्या जागरूक वास्तव में है?
- 12. पायथन से elasticsearch पूछने के लिए बेहतर क्या है?
- 13. क्या 'के लिए' वास्तव में क्लोजर में आलसी नहीं है?
- 14. क्या सी # कंपाइलर वीबी.नेट कंपाइलर से बेहतर है?
- 15. क्या बंडल भंडार में से किसी के मुकाबले टेक्स्टमेट के लिए बेहतर पायथन बंडल है?
- 16. आप गणित (या गणित) को सी # में MaxValue से बड़ी संख्या के साथ कैसे करते हैं?
- 17. सी ++ में वास्तव में संदर्भ गणना क्या है ?,
- 18. प्रदर्शन के मामले में बेहतर क्या है?
- 19. क्या जीसीसी में सी स्रोत कोड के अंदर गणित पुस्तकालय से लिंक करना संभव है?
- 20. सी # में "बेस" कीवर्ड का उद्देश्य वास्तव में क्या है?
- 21. सी या उद्देश्य सी में गणित प्रश्न
- 22. आईफोन गेम के लिए सी में सबसे तेज़ वेक्टर/मैट्रिक्स गणित लाइब्रेरी क्या है?
- 23. सी में FILE कीवर्ड वास्तव में क्या है?
- 24. सी # या .NET में एक असेंबली वास्तव में क्या है?
- 25. जावा वास्तव में क्या है?
- 26. वास्तव में "COM इंटरऑप के लिए रजिस्टर" क्या करता है?
- 27. वेक्टर गणित के लिए ओपन सोर्स सी ++ लाइब्रेरी
- 28. गणित में, @@@ का क्या अर्थ है?
- 29. रॉम वास्तव में क्या है?
- 30. कंप्यूटर विज्ञान के लिए गणित
में बोल्ट की जाएगी .: मैं (है, जो सी # में याद आ रही है, जैसा कि हम जानते हैं) पूंछ प्रत्यावर्तन के बारे में उत्सुक हूँ। क्या यह वास्तव में असली दुनिया परिदृश्य में एक बड़ी समस्या है? मुझे लगता है कि यह सिर्फ अनुकूलन का मामला है। इसके अलावा मैं जानना चाहता हूं कि क्या आपको अभी भी लगता है कि आज उच्च आदेश कार्यों का उपयोग करने में समस्या है जब हमारे पास l # में lambdas है। मैं अक्सर lambdas का उपयोग करें। –
@Al Kepp: जितना अधिक आप एक कार्यात्मक रास्ते में प्रोग्राम लिखने, उतना ही आप प्रत्यावर्तन का उपयोग करते हैं और अधिक आप पूंछ-प्रत्यावर्तन की जरूरत है। इसलिए, जब आप "कार्यात्मक" सी # में लिख सकते हैं, लेकिन जब पुनरावर्ती संरचनाओं प्रसंस्करण या पुनरावर्ती कार्यों लेखन, आप अनिवार्य रास्ता एफ # में के रूप में ही दक्षता प्राप्त करने के लिए इसे लिखने की आवश्यकता होगी। हालांकि, भेड़ के बच्चे खुद को पूंछ-रिकर्सन के बिना ठीक काम करते हैं (जब तक कि आप निरंतर चलने वाली शैली जैसी उन्नत चाल का उपयोग नहीं करना चाहते)। –