मैं वर्तमान में रुबी में एक टेक्स्ट-आधारित गेम इंजन पर काम कर रहा हूं, ऐप में रुबी कोड में/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
मैं तीन चार विकल्प को देखा है, लेकिन मुझे यकीन है कि जो लेने के लिए सबसे अच्छा तरीका है नहीं कर रहा हूँ:
रूबी स्क्रिप्टिंग का उपयोग करें, लेकिन किसी प्रकार के सैंडबॉक्स में।
पेशेवर: रुबी से बहुत परिचित, "गोंद" कोड या भाषाओं के बीच वस्तुओं को एकीकृत करने की कोई आवश्यकता नहीं है।
विपक्ष: सुरक्षा मुद्दों या सैंडबॉक्सिंग से बहुत परिचित नहीं है, फिट होने वाले किसी भी आउट-ऑफ-द-बॉक्स समाधान नहीं मिला है।
लागूएम्बेड एक और पटकथा भाषा, उदा लुआ।सकारात्मक: रूबी और लुआ, सी-आधारित हैं, इसलिए बाइंडिंग यथोचित सरल होना चाहिए। लुआ एक उचित लोकप्रिय भाषा है, इसलिए यदि मैं बाद में मुद्दों में भाग लेता हूं तो सहायता उपलब्ध है। सुरक्षित, क्योंकि किसी भी कार्यक्षमता जिसे मैं विशेष रूप से बाध्य नहीं करता, स्क्रिप्ट से अनुपलब्ध होगा।
विपक्ष: मौजूदा रूबी-लुआ बाइंडिंग एक-तरफा, पुरानी और खराब रखरखाव, या दोनों प्रतीत होती है। एक और स्क्रिप्टिंग भाषा के अंदर एक स्क्रिप्टिंग भाषा एम्बेड करने के लिए एक पतंग dodgy लगता है।
रुबी दुभाषिया के साथ एक कस्टम स्क्रिप्टिंग भाषा लागू करें। मैं Treetop के साथ प्रयोग कर रहा हूं, और स्क्रिप्ट के लिए पर्याप्त सरल व्याकरण बनाने के लिए यह बहुत कठिन नहीं होना चाहिए।
सकारात्मक: अन्य भाषा एम्बेड करने के लिए कोई ज़रूरत नहीं। केवल विशेष रूप से कार्यान्वित कार्यक्षमता स्क्रिप्ट के लिए उपलब्ध होगी।
विपक्ष: ओवरकिल। सिंड्रोम "यहां नहीं बनाया गया"। शायद होने वाली प्रतीक्षा कीड़े की भयानक घोंसला।
रूबी में पूरी तरह से डेटा फ़ाइलों को लागू करें, डोमेन विशिष्ट भाषा का प्रयोग।
सकारात्मक: सरल और आसान।
विपक्ष: कोई उपयोगकर्ता द्वारा निर्मित डेटा विश्वसनीय नहीं है।
मैं उस सूची पर अन्य सुझावों के लिए भी खुला हूं जिनके बारे में मैंने सोचा नहीं है। डेटा फ़ाइलों में एम्बेडेड स्क्रिप्ट को सुरक्षित रूप से कार्यान्वित करने का सबसे अच्छा समाधान क्या है?
संपादित करें 2011 年 12 月 23 日: डीएसएल के साथ चौथा विकल्प जोड़ा गया, अतिरिक्त विचार/संदर्भ के साथ शीर्ष पर "अनुपूरक" जोड़ा गया।
हम्म, मैं गेम स्क्रिप्टिंग से इतना परिचित नहीं हूं, लेकिन वी 8 और जावास्क्रिप्ट का उपयोग क्यों नहीं करते? यह बिजली तेज है और अधिकांश लोग जेएस के साथ काम करने में सहज महसूस करेंगे। – omninonsense
मुबारक छुट्टियां, हर कोई! –
यह वास्तव में इस बात पर निर्भर करता है कि आप क्या हासिल करना चाहते हैं, यदि प्लगइन रूबी में हैं तो उनमें से एक को कोर क्लास को फिर से खोलने से रोकना मुश्किल होगा और वे जिस तरह से चाहते हैं, वैसे ही रेल प्लगइन पर रूबी कुछ भी कर सकता है । इसके अलावा प्लगइन भाषा के रूप में किसी भी अन्य भाषा का उपयोग करना अधिक है, आप खेल के मुकाबले ज्यादा काम करेंगे;) – Schmurfy