2010-07-11 12 views
14

मुझे अभी तक llvm या clang के साथ कोई अनुभव नहीं है। जो मैंने पढ़ा है उससे क्लैंग आसानी से एम्बेड किया जा सकता है Wikipedia-Clang, हालांकि, मुझे यह हासिल करने के तरीके के बारे में कोई ट्यूटोरियल नहीं मिला। तो क्या एक सी ++ एप्लिकेशन को उपयोगकर्ता को जेआईटी संकलन और रनटाइम पर उपयोगकर्ता परिभाषित कोड निष्पादित करने के साथ स्क्रिप्टिंग-शक्तियों के साथ प्रदान करना संभव है? क्या अनुप्रयोगों को अपने वर्गों और विधियों को कॉल करना और वस्तुओं को साझा करना संभव होगा?सी ++ कोड में स्क्रिप्ट दुभाषिया के रूप में क्लैंग को एम्बेड करने के लिए कोई ट्यूटोरियल?

संपादित करें: मैं पटकथा भाषाओं का के लिए एक सी की तरह वाक्य रचना (या यहां तक ​​कि सी ++ में ही)

उत्तर

10

मैं किसी भी ट्यूटोरियल के बारे में पता नहीं है पसंद करते हैं, लेकिन वहाँ बजना स्रोत में एक उदाहरण सी दुभाषिया है यह सहायक हो सकता है। आप इसे यहां पा सकते हैं: http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/clang-interpreter/

यदि आप इस मार्ग पर जाते हैं तो आपके पास शायद आपकी स्क्रिप्टिंग भाषा के लिए वाक्यविन्यास का विकल्प नहीं होगा। क्लैंग केवल सी, सी ++, और उद्देश्य सी का विश्लेषण करता है। यदि आप कोई बदलाव चाहते हैं, तो हो सकता है कि आप अपने काम को अपने लिए काट लें।

+0

धन्यवाद। इसे उठाने और चलाने के लिए मुझे थोड़ी देर लग गई - मूल रूप से क्योंकि मुझे निष्पादन योग्य नहीं मिला :) अब इसे देखने के बाद मैं कहूंगा कि यह आधा रास्ता है। अब मुझे यह पता लगाने की जरूरत है कि गैर-जूट वाले भाग में परिभाषित कार्यों को कैसे कॉल करें। ... इसके बारे में कोई विचार? – FFox

+0

मुझे यकीन नहीं है कि आपका क्या मतलब है। आपको संकलित किए गए किसी भी फ़ंक्शन के लिए पॉइंटर प्राप्त करने में सक्षम होना चाहिए। शायद यह सामान्य एलएलवीएम ट्यूटोरियल उपयोगी होगा: http://llvm.org/docs/tutorial/ (अध्याय 4, विशेष रूप से)। मुझे उम्मीद नहीं है कि आप इस दुभाषिया का उपयोग करने में सक्षम होंगे, लेकिन यह आपको अपने आवेदन में सी/सी ++ दुभाषिया को एम्बेड करने का विचार देना चाहिए। (मैंने इसे स्वयं भी इस्तेमाल नहीं किया है; मुझे बस इसे देखकर याद आया।) –

+1

ठीक है, मैंने यह किया है: http://lists.cs.uiuc.edu/pipermail/cfe-dev/2010-July/009836.html ... और यह वास्तव में सीएफ-देव मेलिंग सूची से अच्छे लोगों की मदद से काम किया। आपको क्यों लगता है कि इस दुभाषिया को ऐप में उपयोग नहीं किया जा सकता है? – FFox

0

मैं बजना के बारे में पता नहीं है, लेकिन आप चौधरी को देखने के लिए चाहते हो सकता है:

http://www.softintegration.com/

यह किसी एम्बेड करने के रूप में वर्णन किया गया है या स्टैंड-अलोन C/C++ दुभाषिया। वहाँ इसे यहाँ embedding के उदाहरण के साथ एक डॉ डोब्स लेख है:

http://www.drdobbs.com/architecture-and-design/212201774

मैं एक से अधिक इसके साथ खेलने नहीं किया है किया है लेकिन यह एक स्थिर और परिपक्व उत्पाद हो रहा है। यह वाणिज्यिक, बंद स्रोत है, लेकिन "मानक" संस्करण को व्यक्तिगत और वाणिज्यिक दोनों उपयोगों के लिए स्वतंत्र रूप से वर्णित किया गया है। हालांकि, लाइसेंस को देखते हुए ऐसा लगता है कि "वाणिज्यिक" में केवल आंतरिक कंपनी का उपयोग शामिल हो सकता है, जो उस उत्पाद में एम्बेड नहीं किया जाता है जिसे बेचा या वितरित किया जाता है। (मैं वकील नहीं हूं, इसलिए स्पष्ट रूप से लाइसेंस शर्तों के कुछ होने के लिए सॉफ्ट इंटीग्रेशन के साथ जांच करनी चाहिए।)

5

आप अन्य उत्तरों द्वारा बताए गए अनुसार जेआईटी संकलन को लागू करने के लिए लाइब्रेरी के रूप में क्लैंग का उपयोग कर सकते हैं। फिर, आपको संकलित मॉड्यूल को लोड करना होगा (कहें, एक .so लाइब्रेरी)।

इसे पूरा करने के लिए, आप इसे लोड करने के लिए मानक डलोपेन (यूनिक्स) या लोड लाइब्रेरी (विंडोज़) का उपयोग कर सकते हैं, फिर डायलिसिम (यूनिक्स) का उपयोग गतिशील रूप से संकलित कार्यों के संदर्भ में करें, "स्क्रिप्ट" मुख्य() - जैसे फ़ंक्शन कहें जिसका नाम ज्ञात है। ध्यान दें कि सी ++ के लिए आपको उलझन वाले प्रतीकों का उपयोग करना होगा। एक पोर्टेबल विकल्प उदा। जीएनयू का libltdl

वैकल्पिक रूप से, "स्क्रिप्ट" मॉड्यूल इनिट फ़ंक्शंस को कार्यान्वित करके या कुछ स्थैतिक कोड डालने के द्वारा लोड समय पर स्वचालित रूप से चलाया जा सकता है (सी ++ वैश्विक रूप से परिभाषित ऑब्जेक्ट का कन्स्ट्रक्टर तुरंत कहा जाएगा)।

भारित मॉड्यूल सीधे मुख्य एप्लिकेशन में कुछ भी कॉल कर सकता है। निश्चित रूप से प्रतीकों को उचित मुख्य ऐप की शीर्षलेख फ़ाइलों का उपयोग करके संकलन समय पर जाना जाता है।

यदि आप आसानी से अपने प्रोग्राम में सी ++ "प्लगइन्स" जोड़ना चाहते हैं, और घटक इंटरफेस को प्राथमिकता से जानते हैं (कहें कि आपका मुख्य एप्लिकेशन मॉड्यूल में लोड होने से पहले लोड किए गए वर्ग का नाम और इंटरफेस जानता है।), आपके द्वारा लाइब्रेरी को गतिशील रूप से लोड करने के बाद कक्षा का उपयोग करने के लिए उपलब्ध है जैसे कि यह स्थिर रूप से जुड़ा हुआ था। बस सुनिश्चित करें कि आप अपने मॉड्यूल को dlopen() से पहले क्लास ऑब्जेक्ट को तुरंत चालू करने का प्रयास नहीं करते हैं।

स्थिर कोड का उपयोग करके अच्छी स्वचालित प्लगइन पंजीकरण तंत्र को भी लागू करने की अनुमति मिलती है।

0

मुझे यकीन है कि एक सी या सी ++ संकलक embedding तरह Clang आपके मामले में एक अच्छा विचार है नहीं कर रहा हूँ। क्योंकि "स्क्रिप्ट", वह (सी या सी ++) कोड खिलाया जाता है (रनटाइम पर!) मनमाने ढंग से हो सकता है ताकि पूरे एप्लिकेशन को क्रैश करने में सक्षम हो। आप आमतौर पर दोषपूर्ण उपयोगकर्ता इनपुट को अपने एप्लिकेशन को क्रैश करने में सक्षम नहीं होना चाहते हैं।

यदि आप एक दुभाषिया को एम्बेड करना चाहते हैं, तो उस उद्देश्य के लिए डिज़ाइन किया गया कुछ चुनें, जैसे Guile या Lua, और सावधान रहें कि स्क्रिप्ट में त्रुटियां पूरे एप्लिकेशन को क्रैश नहीं करती हैं। दुभाषिया एम्बेडिंग की एक और विस्तृत चर्चा के लिए this answer देखें।

संबंधित मुद्दे

 संबंधित मुद्दे