एफ # भाषा के रूप में भाषा दुभाषियों या कंपाइलर्स लिखने के लिए बहुत अच्छा है, हालांकि, एक चीज हमें मारती रहती है जहां हम इसे नहीं चाहते हैं: StackOverflowException।भाषा दुभाषियों में स्टैक ओवरव्लो को रोकना
यह अच्छी तरह से ज्ञात है कि एक एसओ-अपवाद पकड़ा नहीं जा सकता है और इसे पुनर्प्राप्त नहीं किया जा सकता है। इस तरह के अपवाद को रोकने के लिए एक स्पष्ट तकनीक है जब आप साथ जाते हैं तो ढेर की गहराई को गिनना। ओवरहेड, हाँ, लेकिन काम करने योग्य और शायद हर समारोह में आवश्यक नहीं है।
एफ # के साथ, यह तकनीक हालांकि अधिक लाभ नहीं लाती है। हम दुभाषिया के ऑन-द-फ्लाई जेनरेटेड एक्सप्रेशन में पूंछ-कॉल अनुकूलन तकनीकों का बहुत अधिक उपयोग करते हैं। एसओ-अपवादों के साथ हमें जिन समस्याओं का सामना करना पड़ता है वे हैं:
- हम वर्तमान उपयोगकर्ता को क्रैश करने के बजाय, उनके उपयोगकर्ता को कैसे सूचित कर सकते हैं?
- यदि हम स्टैक-गहराई की गिनती के लिए जाते हैं, तो हम कैसे जानते हैं कि कोई कार्य TCO'ed है या रेखांकित है, इसलिए हमें गिनने की आवश्यकता नहीं है?
- यदि हम किसी अन्य दृष्टिकोण के लिए जाते हैं (जैसे गहराई से अंतराल पर ढेर का निरीक्षण करना), क्या प्रदर्शन करने में गंभीरता से बिना किसी ज्ञात तरीके से ऐसा करने का कोई तरीका है?
बस स्टैक-साइज को बढ़ाने में काफी मदद नहीं मिल रही है, हम उपयोगकर्ता को लॉगिंग योग्य त्रुटि देना चाहते हैं, जो कॉलिंग एप्लिकेशन द्वारा अधिमानतः आकर्षक है। इसके लिए हमें अपवाद को हाथ से फेंकने में सक्षम होना चाहिए, जो इसे पकड़ने योग्य बनाता है। लेकिन हम सही पल कैसे निर्धारित करते हैं?
अद्यतन:
हंस पासेंट सही ढंग से भविष्यवाणी का सुझाव देता है। हालांकि, इस डीएसएल का उपयोग करने वाले प्रोग्रामर उम्मीद करते हैं कि (निश्चित) कॉल टीसीओ प्राप्त करें, इसलिए वे एक मजबूत स्टैक-सीमा नहीं चाहते हैं। वे जानते हैं वे क्या कर रहे हैं। फिर भी, उनके कार्यक्रमों को कम से कम विस्तार करने की आवश्यकता है, कम से कम विस्तार करने के लिए कि किसी भी कॉलिंग एप्लिकेशन (यानी, हमारे पुस्तकालयों का उपयोग कर एक सी # प्रोग्राम) को नुकसान नहीं पहुंचाया जाता है।
@ हंसपैसेंट, कूदने के लिए धन्यवाद। यह इस तरह से हल करने के लिए हमारे दिमाग को पार कर गया है, लेकिन यह एक स्लेज हथौड़ा के साथ एक छोटी सी समस्या को हल करने की तरह लगता है कि हमने अभी तक इसका प्रयास नहीं किया है। इसके अलावा, हमारे कंपाइलर को एक मेजबान भाषा के भीतर से लाइब्रेरी के रूप में कॉल करने योग्य होना चाहिए और प्रत्येक बार जब एक छोटे स्निपेट को संकलित किया जाता है, तो प्रक्रिया बहुत अधिक हो जाती है। – Abel
ओह, आपने अपनी टिप्पणी अपडेट की है। यहां समस्या भविष्यवाणी है। डीएसएल में कई कार्य हो सकते हैं जो टीसीओ प्राप्त करेंगे, एक कठोर सीमा निर्धारित करते हैं (जो वर्तमान में हमारे पास है) बहुत कठोर प्रतीत होता है, क्योंकि हम किसी भी कल्पनाशील तरीके से उस सीमा की गणना नहीं कर सकते हैं। – Abel
@ हंसपैसेंट: हमारा प्रोग्राम संकलित अभिव्यक्तियों में एक और भाषा का अनुवाद करता है और फिर परिवर्तनीय इनपुट के विरुद्ध चलता है। जटिल चीजों को आगे बढ़ाने के लिए, भाषा परिभाषा में एक मूल्यांकन-कार्य होता है। बढ़ते ढेर आकार केवल एक निश्चित स्तर पर काम करते हैं, मुझे नहीं पता क्यों, लेकिन एक निश्चित सीमा के बाद यह कार्यक्रम को घोंघा-गति में लाता है। एक के लिए, हमारे कार्यक्रम को आईडीई (हमारे नहीं) से बुलाया जाएगा, जिससे आईडीई नीचे आ जाएगा क्योंकि हमारे पास एसओएस विनाशकारी होगा। AppDomains के साथ एक रास्ता था, लेकिन मुझे विश्वास है कि अब और संभव नहीं है। – Abel