दिलचस्प पोस्ट
जावास्क्रिप्ट में बेस64 में स्ट्रिंग को कैसे एन्कोड कर सकते हैं? टाइप की सूची से एक IDataReader प्राप्त करें Moment.js: किसी विशिष्ट समयक्षेत्र में प्रारूप की तारीख सीएसएस संक्रमण प्रभावों को अस्थायी रूप से अक्षम करने का सबसे साफ तरीका क्या है? क्या "कुछ 0 >>" मतलब है? जीआईटी संस्करण नियंत्रण प्रणाली का प्रयोग करके बाइनरी फ़ाइलों को लॉक करना दो से अधिक स्ट्रिंग्स से सबसे लंबे समय तक सामान्य सबस्ट्रिंग – पायथन स्ट्रिंग से एक क्लास का एक उदाहरण बनाएं MySQL: पिछले महीने से सभी पंक्तियां प्राप्त करने के लिए प्रश्न स्विफ्ट में दृश्य नियंत्रकों के बीच डेटा पास करना एक्सएमएल में एचटीएमएल-फ़ॉर्मेट स्ट्रिंग संसाधन से टेक्स्टव्यू टेक्स्ट सेट करें अजगर कोड से शेल स्क्रिप्ट को कैसे कॉल किया जाए? एएसपी.नेट में फ़ाइलों को स्ट्रीम करने का सर्वोत्तम तरीका क्या इनलाइन वर्चुअल फ़ंक्शन वास्तव में एक अज्ञानता है? ऑफ़लाइन होने पर OKHttp के साथ रेट्रोफ़िट कैश डेटा का उपयोग कर सकते हैं

पूंछ कॉल पुनरावृत्ति के लिए क्यों नहीं नेट / सी # ऑप्टिमाइज़ करता है?

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

एक कंक्रीट मामले के लिए, यह विधि एक पाश ( दृश्य स्टूडियो 2008 32-बिट, यदि वह मायने रखती है) में अनुकूलित क्यों नहीं है ?:

private static void Foo(int i) { if (i == 1000000) return; if (i % 100 == 0) Console.WriteLine(i); Foo(i+1); } 

वेब के समाधान से एकत्रित समाधान "पूंछ कॉल पुनरावृत्ति के लिए क्यों नहीं नेट / सी # ऑप्टिमाइज़ करता है?"

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

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

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

कुछ विवरणों के लिए इस ब्लॉग पोस्ट को देखें (काफी संभवत: अब हालिया जेआईटी परिवर्तनों के अनुसार) ध्यान दें कि सीएलआर 4.0 के लिए बदलता है x86, x64 और ia64 इसका सम्मान करेंगे ।

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

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

जो सभी ने कहा, हम इसे देखना जारी रखते हैं, और हम संकलक के भविष्य के रिलीज में कुछ पैटर्न ढूंढ सकते हैं, जहां यह उत्सर्जित करने के लिए समझ में आता है।

वैसे, जैसा कि इसे बताया गया है, यह ध्यान देने योग्य है कि पूंछ के पुनरावर्तन को x64 पर अनुकूलित किया गया है।

सी # पूंछ कॉल पुनरावर्तन के लिए अनुकूल नहीं है क्योंकि यह वही है जो F # के लिए है!

परिस्थितियों पर कुछ गहराई के लिए, जो सी # संकलक को पूंछ-कॉल अनुकूलन करने से रोकती है, इस आलेख को देखें: जेआईटी सीएलआर पूंछ-कॉल की स्थिति ।

सी # और एफ # के बीच इंटरऑपरेबिलिटी

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

प्रतिनिधि इंटरऑपरेबिलिटी के लिए, यह आलेख देखें: एफ #, सी # और विज़ुअल बेसिक के बीच प्रतिनिधि प्रतिनिधिता

सी # और एफ # के बीच सैद्धांतिक और व्यावहारिक मतभेद

यहाँ एक लेख है जिसमें कुछ मतभेद शामिल हैं और C # और F # के बीच पूंछ-कॉल पुनरावर्ती के डिज़ाइन के अंतर को बताते हैं: सी # और एफ # में टेल-कॉल Opcode जनरेट करना

यहाँ सी #, एफ # और सी ++ \ CLI में कुछ उदाहरणों वाले लेख हैं: सी #, एफ #, और सी ++ \ सीएलआई में टेल रिकर्सन में एडवेंचर्स

मुख्य सैद्धांतिक अंतर यह है कि सी # को छोरों के साथ डिज़ाइन किया गया है जबकि एफ # को लम्बा कैलकुस के सिद्धांतों पर डिज़ाइन किया गया है। लैम्ब्डा कैलकुस के सिद्धांतों पर एक बहुत अच्छी किताब के लिए, यह मुफ्त किताब देखेंः संरचना और इंटरप्रिटेशन ऑफ़ कम्प्यूटर प्रोग्राम, एबेलसन, Sussman, और Sussman द्वारा ।

एफ # में पूंछ कॉल पर बहुत अच्छा परिचयात्मक लेख के लिए, यह आलेख देखें: एफ # में टेल कॉल की विस्तृत जानकारी । अंत में, यह एक ऐसा लेख है जो गैर-पूंछ पुनर्कथन और पूंछ-कॉल पुनरावर्ती (एफ #) में अंतर को कवर करता है: टेलर-रिकर्सन बनाम गैर-पूंछ पुनर्रचना F तेज में ।

मुझे हाल ही में कहा गया था कि 64 बिट के लिए सी # कम्पाइलर को पलता पुनरावर्तन को अनुकूलित करता है

सी # भी यह लागू करता है कारण यह हमेशा क्यों लागू नहीं होता है, यह है कि नियमों को लागू करने के लिए पूंछ पुनर्कलन लागू होता है बहुत सख्त है।

आप सी # (या जावा) में पूंछ-पुनरावर्ती कार्यों के लिए ट्रम्पोलिन तकनीक का उपयोग कर सकते हैं। हालांकि, बेहतर समाधान (यदि आप केवल स्टैक उपयोग के बारे में ध्यान रखते हैं) एक ही रिकर्सिव फ़ंक्शन के कुछ हिस्सों को लपेटने के लिए इस छोटे सहायक पद्धति का उपयोग करना है और फंक्शन को पठनीय रखने के दौरान इसे पुनरावृत्त करना है।