2009-07-21 22 views
14

मेरे पास एक सी एप्लीकेशन है और मैं कुछ कार्यक्षमताओं को स्क्रिप्ट में रखने के लिए एक स्क्रिप्टिंग भाषा शामिल करना चाहता हूं। मुझे इसके साथ कोई अनुभव नहीं है और यह नहीं पता कि कहां से शुरू करना है (अभी भी सी सीखना और एप्लिकेशन को समझने की कोशिश कर रहा है)।सी अनुप्रयोग में एक स्क्रिप्टिंग भाषा को कैसे कार्यान्वित करें?

मेरे ऐप और स्क्रिप्ट के बीच एम्बेडिंग और संचार वास्तव में कैसे काम करता है? मुझे लगता है कि मुझे पुस्तकालय के रूप में स्क्रिप्टिंग भाषा के लिए दुभाषिया की आवश्यकता है (विंडोज़ या सी स्रोत कोड पर .dll जिसे मेरे आवेदन में संकलित किया जा सकता है)? और फिर मैं कुछ कर सकता हूं जैसे

interpreter->run("myscript", some_object); 

स्क्रिप्ट को ऑब्जेक्ट के गुणों के बारे में कैसे पता चलेगा? कहें मेरी स्क्रिप्ट कुछ_object-> some_field को पढ़ना या संशोधित करना चाहता है?

क्या ऐसी कोई भी स्क्रिप्टिंग भाषाएं हैं जो एम्बेडिंग के लिए अनुकूलित हैं? मुझे पता है कि लुआ जो गेम देव में लोकप्रिय है, और पाइथन, पर्ल, पीएचपी या रूबी जैसी भाषाओं को स्टैंड-अलोन एप्लिकेशन के रूप में अधिक लक्षित माना जाता है, लेकिन गहरे आर्किटेक्चर में मेरा ज्ञान अधिक शिक्षित अनुमानों की अनुमति नहीं देता है :) (टैग की गईं लुआ और पायथन क्योंकि वे मेरे पसंदीदा होंगे, लेकिन जब तक यह x86 विंडोज, लिनक्स और मैक ओएस एक्स पर चलता है, तब तक मैं अन्य स्क्रिप्टिंग भाषाओं के लिए खुला हूं जब तक कि वे सी अनुप्रयोग में लागू करना आसान हो)

+0

बस उत्सुक होना: क्या आप अपनी प्रेरणा के बारे में कुछ कह सकते हैं? क्या आप अलग-अलग (बेहतर, आसान, ...) वाक्यविन्यास के लिए एक और भाषा एम्बेड करते हैं (क्योंकि वहां एम्बेड करने योग्य दुभाषिया हैं जो वास्तव में सी को अपनी भाषा के रूप में उपयोग करते हैं)? या यह आपके आवेदन के लिए कुछ प्रोग्राम करने योग्य इंटरफ़ेस होने के बिना पुन: संकलित करने की आवश्यकता के बिना है? या यह अंत उपयोगकर्ता अनुकूलन के लिए है ...? – ThomasH

+0

यह कुछ गेम लॉजिक है, मुख्य रूप से एक भूमिका-खेल वाले गेम के लिए संवाद और क्वेस्ट जो मैं वर्तमान में योजना बना रहा हूं। –

उत्तर

7

यहाँ अजगर 2.6 एम्बेड करने के लिए अजगर वेबसाइट से दस्तावेज है ...

http://docs.python.org/extending/embedding.html

+3

मुझे पाइथन का उपयोग करने के लिए वास्तव में सरल होने के लिए एकीकरण मिला, FWIW। मैं आधे दिन में कुछ उपयोगी और कामकाजी (मेरे सी कोड में कस्टम रूटीन सहित) बनाने में सक्षम था। – Joe

+3

सी में स्क्रिप्टिंग भाषाओं को एम्बेड करने में मेरा अनुभव केवल पर्ल, पायथन, लुआ और टीसीएल शामिल है। सीखने की अवस्था (एक कामकाजी कार्यक्रम होने के लिए खरोंच से समय) के मामले में, मैं लूआ को 1, टीसीएल ए 2, पायथन 5, और पर्ल को 35 9, 000 दे दूंगा। लेकिन फिर, मैंने पाइथन के साथ काम करने के बाद लुआ और टीसीएल के साथ काम किया, जबकि मैंने पाइथन को केवल पर्ल को जानने के लिए एम्बेड किया, इसलिए मेरे अनुभव से लुआ और टीसीएल दोनों की तुलना में आसान लग सकता है। लेकिन मैं जो के साथ सहमत हूं - इसे पाइथन के साथ समझने में लगभग आधे दिन लगते हैं, और लुआ के साथ बाहर निकलने में लगभग 20 मिनट लगते हैं। लुआ एम्बेड करना बहुत आसान है। –

+3

मैं इसे "लुआ का उपयोग करें" के ऊपर स्वीकार कर रहा हूं! जवाब क्योंकि मैं एक पत्थर से दो पक्षियों को मार सकता हूं (मैं फिर भी पायथन सीखना चाहता था) और क्योंकि यह काम करता है। प्रिय बेनामी रीडर जो Google से इस प्रश्न पर आया: अन्य सभी उत्तरों को भी पढ़ें, वे सभी उत्कृष्ट हैं। –

17

लुआ। यह बहुत छोटा पदचिह्न है, बल्कि तेज़ है, और मैंने इसे पाया (विषयपरक रूप से) सी

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

आपके एम्बेड किए गए दुभाषिया में पेश किए गए डिफ़ॉल्ट पुस्तकालयों की मात्रा पर छोटे कोड बेस और कड़े नियंत्रण का अर्थ यह भी है कि आप सुरक्षा पर उचित धारणाएं कर सकते हैं।

एकमात्र विषम भाग 1-आधारित सरणी संख्या है, हालांकि, यह संकेतक के अस्तित्व को देखते हुए, मैंने जो सोचा था उससे तुलना में यह सौदा बड़ा नहीं था।

सी के साथ एकीकृत कैसे करें: लूआ के लिए वितरण टैरबॉल में कुछ बहुत अच्छे उपयोगी उदाहरणों के साथ एक निर्देशिका "आदि" है जो आपको जल्दी से शुरू करनी चाहिए। विशेष रूप से - आदि/min.c दिखाता है कि एक दुभाषिया कैसे शुरू करें, इसे फ़ाइल की व्याख्या करें, और इसे सी फ़ंक्शन (उस मामले में 'प्रिंट') कहें। वहां से आप लुआ दस्तावेज और वितरण के साथ शामिल मानक पुस्तकालयों के स्रोत को पढ़कर जा सकते हैं।

+1

मैंने इसके लिए लुआ का उपयोग किया है, और यह बेहद अच्छा है। यह अन्य प्रणालियों में एम्बेड करने के लिए डिज़ाइन किया गया है। निश्चित रूप से 1-आधारित सरणी के साथ Concur; प्रत्येक भाषा में ब्राइंडमेज के छोटे टुकड़े होते हैं, और यह लुआ में से एक है, लेकिन यह copable है। –

3

लुआ इस उद्देश्य के लिए डिज़ाइन किया गया है, और साथ काम करने में काफी आसान है।

QtScript पर देखने लायक एक और चीज होगी, जो जावास्क्रिप्ट आधारित है, हालांकि इसमें आपके ऐप को "qt-ify" में कुछ काम शामिल होगा।

1

अधिकांश पटकथा भाषा आप करने के लिए अपने सी कोड से कुछ वस्तुओं या यहाँ तक कि कार्यों का पर्दाफाश करने के लिए अनुमति देने के सी में एम्बेड करने की अनुमति है और आमतौर पर लिपि ताकि यह वस्तुओं को कुशल बना सके और कार्यों को कॉल कर सके।

के रूप में कहा लुआ इस उद्देश्य एम्बेडिंग के उद्देश्य से बनाया गया है, दुभाषिया का उपयोग कर आप सी से स्क्रिप्ट और कॉल lua कार्यों के लिए वस्तुओं का पर्दाफाश कर सकते हैं, सी में एम्बेडिंग lua के लिए खोज और आप जानकारी का एक बहुत कुछ मिल जाना चाहिए, यह भी डॉन लू मैनुअल सेक्शन "The Application Programming Interface"

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

16

कुछ उपयोगी लिंक्स:

मैं अजगर से परिचित हूँ। पायथन एक बहुत समृद्ध भाषा है, और इसमें बड़ी संख्या में पुस्तकालय उपलब्ध हैं।

3

तुम भी SWIG पर एक नज़र लेने के लिए चाहते हो सकता है, सरलीकृत आवरण और इंटरफेस जेनरेटर। जैसा कि कोई अनुमान लगाएगा, यह आपके सी/सी ++ कोड को स्क्रिप्टिंग इंजन में इंटरफेस करने के लिए बॉयलर प्लेट कोड का अधिकतर उत्पादन करता है (जो मैन्युअल रूप से करने के लिए काफी बोझिल हो सकता है)।

यह पायथन और लुआ (आपकी वरीयताओं) और कई अन्य भाषाओं का समर्थन करता है। एक मॉड्यूल उत्पन्न करना काफी आसान है जो स्क्रिप्टिंग भाषा को बढ़ाता है। और एम्बेडिंग, जो आप चाहते हैं, को थोड़ा और प्रयास करना पड़ता है।

2

आप Game Scripting Mastery पर एक नज़र डाल सकते हैं। चूंकि मुझे कंप्यूटर गेम के उच्च स्तरीय पहलू में दिलचस्पी है क्योंकि इस पुस्तक को मुझे अक्सर अनुशंसा की गई है।

दुर्भाग्य से पुस्तक प्रिंट से बाहर (कम से कम यूरोप में) हो रहा है।

8

लुआ पूरी तरह से इस तरह के एम्बेडिंग के लिए अनुकूलित है। एक अच्छा प्रारंभिक बिंदु रॉबर्टो इरुसलिस्की की पुस्तक लुआ में प्रोग्रामिंग है; आप previous edition free online प्राप्त कर सकते हैं।

आपकी स्क्रिप्ट को आपके सी ऑब्जेक्ट के गुणों के बारे में कैसे पता चलता है?

एक पल अपने वस्तु इस तरह परिभाषित किया गया है के लिए कल्पना कीजिए:

typedef struct my_object *Object; 
Object some_object; 

क्या आपके सी कोड है कि वस्तु के गुणों के बारे में पता है? लगभग कुछ भी नहीं, यही है। आप सब कुछ कर सकते हैं

  • किसी ऑब्जेक्ट पर पॉइंटर्स के आस-पास पास करें, उन्हें डेटा संरचनाओं में रखें।

  • कॉल फ़ंक्शन जो वास्तव में जानते हैं कि struct my_object के अंदर क्या है। कार्यों के माध्यम से परोक्ष रूप से:

लुआ बिल्कुल उसी तरह सी वस्तुओं के लिए उपयोग हो जाता है

  • आपको API लुआ के ढेर पर ऑब्जेक्ट को एक सूचक डाल करने के लिए कॉल करें, जिसमें से यह लुआ ब्रह्मांड में लुआ डेटा संरचनाओं, चर, या कहीं और में जा सकते हैं।

  • आप कार्यों कि वस्तु की आंतरिक के बारे में पता परिभाषित करते हैं, और आप लुआ को उन कार्यों निर्यात करें।

  • "सहायक पुस्तकालय" में सामान का एक बहुत मदद करने के लिए नहीं है। इसे नजरअंदाज मत करो!

यह सब रॉबर्टो की पुस्तक के तीसरे भाग में क्रिस्टल स्पष्टता के साथ समझाया गया है, जिसमें उदाहरण शामिल हैं। एक ठीक बिंदु

  • है आप स्मृति अपने आप को ("प्रकाश userdata") का आवंटन या लुआ स्मृति को आबंटित होने के विकल्प नहीं है। लुआ को स्मृति आवंटित करना आम तौर पर बेहतर होता है क्योंकि यह अब ऑब्जेक्ट को स्वचालित रूप से तब खाली कर सकता है जब इसकी आवश्यकता नहीं होती है, और आप लुआ मेटाटेबल से भी जुड़ा हो सकते हैं, जो आपको ऑब्जेक्ट को मानक में भाग लेने की अनुमति देने के लिए (अन्य चाल के बीच) की अनुमति देता है लूआ ऑपरेशंस फ़ील्ड को देखने की तरह, केवल कॉल कॉल नहीं।

एक अंतिम ध्यान दें: हालांकि यह सी और लुआ कनेक्ट करने के लिए कोड जनरेट करने का प्रयास करने के लिए बड़ा घूँट या toLua या अन्य उपकरणों का उपयोग करना संभव है, मैं तुम्हें कोड अपने आप को लिखने के लिए, हाथ से आग्रह करता हूं। यह वास्तव में काफी आसान है, और यह समझने का एकमात्र तरीका है कि वास्तव में क्या चल रहा है।

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