2011-12-23 11 views
15

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

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

नमूना स्क्रिप्ट (पाठ्यक्रम विषय की वाक्य रचना समाधान के आधार पर बदल के लिए):

--- 
Location: 
    observers: 
    on_door_open: | 
     monster = spawn_monster(:goblin); 
     monster.add_item(random_item()); 
     monster.hostile = true; 

एक सुरक्षा के दृष्टिकोण से, यह आदर्श हो सकता है अगर पटकथा था सख्ती से ऑप्ट में, शायद एक छोटे से एक शामिल mixin के माध्यम से डीएसएल, जैसे:

class Frog 
    include Scriptable 

    def jump; ... ; end # this can be called from a script 
    allow_scripting :jump 

    def ribbit; ... ; end # this cannot be called from a script 
end 

मैं तीन चार विकल्प को देखा है, लेकिन मुझे यकीन है कि जो लेने के लिए सबसे अच्छा तरीका है नहीं कर रहा हूँ:

  1. रूबी स्क्रिप्टिंग का उपयोग करें, लेकिन किसी प्रकार के सैंडबॉक्स में।

    पेशेवर: रुबी से बहुत परिचित, "गोंद" कोड या भाषाओं के बीच वस्तुओं को एकीकृत करने की कोई आवश्यकता नहीं है।

    विपक्ष: सुरक्षा मुद्दों या सैंडबॉक्सिंग से बहुत परिचित नहीं है, फिट होने वाले किसी भी आउट-ऑफ-द-बॉक्स समाधान नहीं मिला है।

  2. लागू एम्बेड एक और पटकथा भाषा, उदा लुआ।

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

    विपक्ष: मौजूदा रूबी-लुआ बाइंडिंग एक-तरफा, पुरानी और खराब रखरखाव, या दोनों प्रतीत होती है। एक और स्क्रिप्टिंग भाषा के अंदर एक स्क्रिप्टिंग भाषा एम्बेड करने के लिए एक पतंग dodgy लगता है।

  3. रुबी दुभाषिया के साथ एक कस्टम स्क्रिप्टिंग भाषा लागू करें। मैं Treetop के साथ प्रयोग कर रहा हूं, और स्क्रिप्ट के लिए पर्याप्त सरल व्याकरण बनाने के लिए यह बहुत कठिन नहीं होना चाहिए।

    सकारात्मक: अन्य भाषा एम्बेड करने के लिए कोई ज़रूरत नहीं। केवल विशेष रूप से कार्यान्वित कार्यक्षमता स्क्रिप्ट के लिए उपलब्ध होगी।

    विपक्ष: ओवरकिल। सिंड्रोम "यहां नहीं बनाया गया"। शायद होने वाली प्रतीक्षा कीड़े की भयानक घोंसला।

  4. रूबी में पूरी तरह से डेटा फ़ाइलों को लागू करें, डोमेन विशिष्ट भाषा का प्रयोग।

    सकारात्मक: सरल और आसान।

    विपक्ष: कोई उपयोगकर्ता द्वारा निर्मित डेटा विश्वसनीय नहीं है।

मैं उस सूची पर अन्य सुझावों के लिए भी खुला हूं जिनके बारे में मैंने सोचा नहीं है। डेटा फ़ाइलों में एम्बेडेड स्क्रिप्ट को सुरक्षित रूप से कार्यान्वित करने का सबसे अच्छा समाधान क्या है?

संपादित करें 2011 年 12 月 23 日: डीएसएल के साथ चौथा विकल्प जोड़ा गया, अतिरिक्त विचार/संदर्भ के साथ शीर्ष पर "अनुपूरक" जोड़ा गया।

+0

हम्म, मैं गेम स्क्रिप्टिंग से इतना परिचित नहीं हूं, लेकिन वी 8 और जावास्क्रिप्ट का उपयोग क्यों नहीं करते? यह बिजली तेज है और अधिकांश लोग जेएस के साथ काम करने में सहज महसूस करेंगे। – omninonsense

+0

मुबारक छुट्टियां, हर कोई! –

+1

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

उत्तर

4

आप Shikashi gem, जो आप सैंडबॉक्स बना सकते हैं और अनुमति दी विधि की एक श्वेत सूची को परिभाषित करने की अनुमति देता है विचार कर सकते हैं अलग-अलग वस्तुओं पर कॉल करता है।

+0

शिकाशी यहां मेरे मूल इरादे की तर्ज पर बहुत दिलचस्प लग रहा है। क्या आप (किसी को भी) का कोई अनुभव, युद्ध कहानियां, सुझाव, या सामान्य टिप्पणियां हैं? –

+0

उत्तर के रूप में चुना गया है क्योंकि यह मूल रूप से उस प्रश्न का सबसे अच्छा जवाब देता है जिसे मैंने मूल रूप से दिमाग में रखा था। –

+0

क्या शिकाशी मणि रेल 5 बीटा रूबी 2.3 के साथ काम करता है?यह मेरे लिए स्थापित नहीं है। – abrocks

1

रूबी के बजाय jRuby उपयोग पर विचार करें। जावा को मूल रूप से मोबाइल कोड (सेट-टॉप दिनों में वापस) का समर्थन करने के लिए कार्यान्वित किया गया था और इसका एक अच्छी तरह से परीक्षण किया गया security model/implementation है, जो मुझे संदेह हो सकता है कि उपयोगकर्ता स्क्रिप्ट/कक्षाओं को बाकी गेम सिस्टम के साथ विनाश बनाने से रोकने के लिए पर्याप्त जरुबी लपेटें । jRuby embedding का समर्थन करता है, साथ ही, जो उपयोगकर्ता अनुप्रयोगों से गेम कोर को अलग करने में मदद कर सकता है, हालांकि मुझे नहीं पता कि इस समय कितना मजबूत है।

और, ज़ाहिर है, jRuby रूबी है!

+0

jruby के साथ अच्छा विचार। लेकिन jruby और jsr 223 के साथ किए गए परीक्षण वास्तव में सफल नहीं हैं (परिवर्तनीय उत्तीर्ण)। उम्मीद है कि यह भविष्य में बदल जाएगा। – plang

+0

इस तथ्य को छोड़कर (और मुझे एहसास है कि मुझे समय या मेरी टिप्पणी में अतिरिक्त 2 वर्षों के हिंद पक्ष का लाभ है), कि जावा सैंडबॉक्स-ब्रेकिंग सुरक्षा छेद के साथ छेड़छाड़ की गई है। बेशक यह वास्तव में जावा समस्या नहीं है - किसी की मशीन पर चलने वाले कोड की सुरक्षा एक ट्रस्ट दुःस्वप्न है, क्योंकि यह अंततः अन्य प्रोग्रामर के विश्वास के लिए नीचे आती है। सैंडबॉक्स पर भरोसा करना क्योंकि इसे किसी सैंडबॉक्स के रूप में विज्ञापित किया गया है, शायद किसी को भी अविश्वास करने से बेहतर नहीं है, लेकिन यह अभी भी भरोसा है। – jefflunt

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