2009-03-09 12 views
18

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

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

तो ऐसा लगता है कि मुझे वास्तव में कुछ प्रकार के एम्बेडेड रुबी दुभाषिया की आवश्यकता है कि मैं केवल रूबी विधियों को कॉल करने के बजाय नियंत्रण की एक निश्चित डिग्री का उपयोग कर सकूं। या क्या मैं बस कुछ खो रहा हूं और कुछ खो रहा हूं?

मैं माइक्रोसॉफ्ट विजुअल सी ++ में काम कर रहा हूं, इसलिए आदर्श रूप से कोई भी समाधान अच्छा और आसानी से संकलित करेगा।

उत्तर

4

आप सही रास्ते पर हैं। आपके द्वारा पोस्ट किए गए लिंक में Embedding Concepts पर अनुभाग के समान कुछ करना है। सरल शब्दों में यह थोड़ा और अधिक से अधिक:

ruby_init(); 
ruby_script("some_script"); 

आप main.c से सभी #ifdef सामान पर कॉपी करने के लिए सब कुछ काम कर प्राप्त करने की आवश्यकता हो सकती है। तब से यह आपके सी ++ कार्यों के लिए एक एपीआई बनाने का विषय है जिसे आप बेनकाब करना चाहते हैं, और आपके डिज़ाइन के आधार पर, चीज़ को बहु-थ्रेडिंग करना।

+0

यह अभी भी सवाल नहीं है कि आप स्क्रिप्ट मोड में जाने के लिए उन स्क्रिप्ट्स में से एक कैसे प्राप्त करते हैं, उदाहरण के लिए - चीजों का शेड्यूलिंग पक्ष। – andygeers

4

आप स्क्रिप्ट इंजन को मूल स्क्रिप्टिंग प्रतिमानों के साथ काम करने की कोशिश करने के बजाय स्क्रिप्ट इंजन के अनुरूप काम करने के तरीके को फिर से डिज़ाइन कर सकते हैं।

तो, अगर आप इस था:

proc: 
    action 1 
    action 2 
    sleep a bit 
    action 3 
end 

जो स्क्रिप्ट की आवश्यकता होगी नींद लाइन पर निलंबित किया जाना है, ऐसा करते हैं:

proc 
    action1 
    action2 
    set timer (time, callback_proc) 
end 

callback_proc 
    action3 
end 

जो स्क्रिप्टिंग इंजन खत्म प्रत्येक विधि बड़े करीने से की सुविधा देता है । इसे होस्टिंग पक्ष में कई बदलावों की आवश्यकता नहीं होगी - प्रत्येक संस्करण को इवेंट सिस्टम के कुछ रूप की आवश्यकता होती है जो स्क्रिप्ट इंजन को पुनरारंभ कर सकता है।

3

एक C12+ एप्लिकेशन में रूबी को एम्बेड करने के तरीके के बारे में guide है। यह सहायक हो सकता है। अन्यथा Ruby documentation पर जाएं। Embed Ruby in C आलेख भी सहायक हो सकता है।

+2

भावी पाठकों के लिए, सी ++ गाइड वाली वेबसाइट को पुनर्गठित किया गया है। नया यूआरएल है: http://aeditor.rubyforge.org/ruby_cplusplus/index.html – Iain

+3

दुर्भाग्य से दोनों रूबी फोर्ज और मेरे ओपेरा बंद कर दिए गए हैं, इसलिए न तो मार्गदर्शिका या आलेख अभी भी उपलब्ध है। –

0

मुझे लगता है कि आप क्या करना चाहते हैं रूबी के धागे का उपयोग करना है। मैंने रूबी थ्रेडिंग कोड के माध्यम से खुदाई करने का एक उचित हिस्सा किया है और मुझे पता है कि (जहां pthreads उपलब्ध है) नींद को pthread_cond_timedwait का उपयोग करके एक गैर-अवरुद्ध फैशन में लागू किया जाता है। यह दुभाषिया को अनब्लॉक करता है ताकि अन्य धागे निष्पादन जारी रख सकें।

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

28

त्रुटि प्रबंधन सहित एक उदाहरण यहां दिया गया है।

#include <iostream> 
#include <ruby.h> 

using namespace std; 

int main(void) 
{ 
    ruby_init(); 
    ruby_init_loadpath(); 
    int status; 
    rb_load_protect(rb_str_new2("./test.rb"), 0, &status); 
    if (status) { 
    VALUE rbError = rb_funcall(rb_gv_get("$!"), rb_intern("message"), 0); 
    cerr << StringValuePtr(rbError) << endl; 
    }; 
    ruby_finalize(); 
    return status; 
} 
+0

धन्यवाद, सबसे अच्छा जवाब यहां :) – Cynede

+1

यह आंशिक उत्तर है, लेकिन जहां तक ​​मैं यह कह सकता हूं अभी भी निलंबित स्क्रिप्ट के प्रश्न से जुड़ा हुआ नहीं है? – andygeers

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