2010-03-16 10 views
6

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

मैं उन्हें प्रोग्राम में संकलित किए बिना नए कार्यों में प्लग करना चाहता हूं। पायथन में यह आसान है, क्योंकि यह सब व्याख्या की गई है, लेकिन मुझे कोई संकेत नहीं है कि सी # के साथ इसे कैसे किया जाए। क्या कोई जानता है कि इसे सी # में कैसे प्राप्त किया जाए? क्या कोई पुस्तकालय, तकनीक आदि हैं?

+2

यह आपके प्रश्न का काफी जवाब नहीं देता है, लेकिन चूंकि आप .NET का उपयोग कर रहे हैं, तो आप अपने ऐप के उस हिस्से के लिए F # का उपयोग कर सकते हैं, क्योंकि इसे रनटाइम – andy

उत्तर

13

यह इस बात पर निर्भर करता है कि आप प्रोग्राम के उपयोगकर्ता को "अनुमत कार्यों को कैसे प्रदान करना चाहते हैं।"

  • यदि उपयोगकर्ता पहले से कार्यान्वित किए गए कार्यों को चुन रहा है, तो आप इन्हें प्रतिनिधियों या अभिव्यक्ति पेड़ के रूप में पास कर सकते हैं।
  • यदि उपयोगकर्ता सी # या किसी अन्य .NET भाषा में अपनी विधियों को लिखने जा रहा है, और उन्हें एक असेंबली में संकलित करें, तो आप उन्हें प्रतिबिंब का उपयोग करके लोड कर सकते हैं।
  • यदि आप चाहते हैं कि उपयोगकर्ता आपके प्रोग्राम में सी # स्रोत कोड टाइप करने में सक्षम हो, तो आप कोडडॉम का उपयोग करके संकलित कर सकते हैं, फिर प्रतिबिंब का उपयोग करके परिणामी असेंबली को कॉल कर सकते हैं।
  • यदि आप उपयोगकर्ता के लिए कस्टम अभिव्यक्ति भाषा प्रदान करना चाहते हैं, उदा। एक साधारण गणितीय भाषा, फिर (मान लीजिए कि आप भाषा को पार्स कर सकते हैं) आप प्रतिबिंब का उपयोग कर सकते हैं। गतिशील असेंबली उत्पन्न करने के लिए प्रवेश करें और इसका उपयोग करके कॉल करें - आपने अनुमान लगाया - प्रतिबिंब। या आप उपयोगकर्ता कोड से एक अभिव्यक्ति वृक्ष बना सकते हैं और संकलित कर सकते हैं कि LINQ का उपयोग करके - आपको कितनी लचीलापन की आवश्यकता है इस पर निर्भर करता है। (और यदि आप प्रतीक्षा कर सकते हैं, .NET 4.0 में अभिव्यक्ति पेड़ 3.5 में से कई सीमाओं को हटाते हैं, तो आप प्रतिबिंब से बचने में सक्षम हो सकते हैं। पूरी तरह से प्रवेश करें।)
  • यदि आप उपयोगकर्ता के लिए प्रवेश करने में खुश हैं पायथन, रूबी या किसी अन्य डीएलआर भाषा का उपयोग करके अभिव्यक्ति, आप डायनामिक लैंग्वेज रनटाइम होस्ट कर सकते हैं, जो आपके लिए उपयोगकर्ता के कोड की व्याख्या करेगा।

डीएलआर (और आयरनपीथन या आयरन रूबी) को होस्ट करना यहां एक अच्छा विकल्प हो सकता है क्योंकि आपको एक अच्छी तरह से परीक्षण किया गया वातावरण और डीएलआर प्रदान करने वाले सभी अनुकूलन मिलते हैं।Here's a how-to using IronPython.

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

+0

मुझे आपके द्वारा उल्लिखित प्रतिबिंब विकल्पों को पसंद है ... वे मेरा सबसे अच्छा विकल्प हो सकते हैं। डीएलआर एक अच्छा विकल्प हो सकता है, क्या एक डीएलआर विधि का आह्वान करते समय एक महत्वपूर्ण प्रदर्शन ओवरहेड है? विधियों को अक्सर बार-बार बुलाया जा रहा है, इसलिए मैं एक ऐसे विकल्प का उपयोग करना चाहता हूं जिसमें जितना संभव हो उतना ऊपरी ओवरहेड हो। – Kiril

+0

मैंने कुछ जानकारी दी है कि डीएलआर दोहराए जाने वाले कोड के साथ प्रदर्शन में सुधार कैसे करता है। मेरे पास मात्रात्मक आंकड़े नहीं हैं, लेकिन आप Google पर कुछ ढूंढ सकते हैं, या यह असफल हो सकते हैं कि डीएलआर की मेजबानी करना और इसे तुरंत चलाना बहुत आसान है। – itowlson

+0

याहू, मैं निष्पादन के दौरान स्रोत कोड को संशोधित करने की योजना नहीं बना रहा हूं, यह शायद एक ही विधि होने जा रहा है लेकिन एक अलग डेटा उदाहरण के साथ, इसलिए डीएलआर एक अच्छा विकल्प हो सकता है। मैं भी ज्ञापन का उपयोग करने जा रहा हूं, इसलिए यदि एक ही पैरामीटर हमेशा एक ही परिणाम उत्पन्न करते हैं, तो विधि को निष्पादित नहीं किया जाएगा। धन्यवाद :)। – Kiril

7

आप Expression Trees बनाने और कुशल बनाने का प्रयास कर सकते हैं। अभिव्यक्ति पेड़ों का मूल्यांकन करने के लिए Linq का उपयोग करें।

+2

पर व्याख्या किया जा सकता है अभिव्यक्ति पेड़ बहुत अधिक हैं एक शुद्ध eval समारोह से बेहतर मार्ग। –

+0

मेरे जीपी में कई व्यक्ति हैं और प्रत्येक व्यक्ति के पास कार्य और स्थिरांक का पेड़ है। पेड़ में एक नोड एक समारोह या स्थिर हो सकता है ... क्या इसका मतलब यह है कि मुझे किसी दिए गए नोड पर अभिव्यक्ति वृक्ष के साथ फ़ंक्शन को प्रतिस्थापित करना चाहिए? उपयोगकर्ता अपने फ़ंक्शन में कैसे प्लग कर सकता है? – Kiril

+0

ध्यान दें कि पेड़ में वास्तव में कोई फ़ंक्शन नहीं होता है, लेकिन एक enum जो फ़ंक्शन की पहचान करता है। जब "निष्पादक" कहा जाता है तो बस enum को देखता है और संबंधित फ़ंक्शन को कॉल करता है। – Kiril

1

आपके पास कोड के भीतर से कंपाइलर तक पहुंच है, तो आप संकलित कोड के उदाहरण बना सकते हैं और एप्लिकेशन को पुनरारंभ किए बिना उनका उपयोग कर सकते हैं। वहाँ चारों ओर

Here

और

Here

दूसरा एक इसके बारे में उदाहरण है एक जावास्क्रिप्ट मूल्यांकनकर्ता लेकिन आसानी से पर्याप्त अनुकूलित किया जा सकता।

1

आप सिस्टम.रफ्लेक्शन पर एक नज़र डाल सकते हैं। आईएल स्तर पर कोड उत्पन्न करने के लिए प्रवेश करें।

या सी # उत्पन्न करें, लाइब्रेरी में संकलित करें और गतिशील रूप से लोड करें। लगभग लचीला नहीं है।

2

आप फ़ंक्शन संकलित और चलाने के लिए कोडडॉम का भी उपयोग कर सकते हैं। निश्चित रूप से आप कुछ उदाहरण देखने के लिए Google पर जा सकते हैं जो आपकी आवश्यकताओं के अनुरूप हो सकते हैं। ऐसा लगता है कि this article "How to dynamically compile C# code" और this article "Dynamically executing code in .Net" आपकी मदद कर सकता है।