स्क्रिप्टिंग के लिए डोमेन-विशिष्ट भाषाएँ [बंद]


12

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

तो मेरे प्रश्न इस प्रकार हैं:

  • ऐसे DSLs के क्या उदाहरण आपने वास्तविक दुनिया के खेलों में देखे हैं?
  • किन समस्याओं में भाग लिया गया?
  • क्या आप अन्य गेम डेवलपर्स के लिए और किन परिस्थितियों में इस मार्ग की सिफारिश करेंगे?
  • क्या आप इसे अधिक सामान्य होते हुए देखते हैं क्योंकि खेल का विकास अधिक रूपक-अनुकूल भाषाओं की ओर बढ़ता है, जैसे कि बू?

वास्तविक दुनिया के डीएसएल उपयोग प्रश्न का उत्तर देने के लिए युद्धक्षेत्र 1942 ने उनका उपयोग किया। हालांकि बहुत सारे मॉड पॉप अप हुए; एक प्रोग्रामर (मेरे) के दृष्टिकोण से यह भयानक था और मैंने बहुत जल्दी ब्याज खो दिया।
जोनाथन डिकिंसन

जवाबों:


6

मेरी सलाह "नहीं" होगी।

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

मुझे ईमानदारी से पता नहीं है कि मैं क्या सोच रहा था। अगर मैं सिर्फ लुआ का उपयोग करता तो पूरी बात सरल, अधिक कुशल, कम बगप्रोन और अब तक कम समय लेने वाली होती।

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

मैं DSLs के खिलाफ जोरदार सिफारिश नहीं कर सकता।


एर, क्यों नहीं? क्या आपने अभी लिस्प का उपयोग किया है, मुझे लगता है कि यह अधिक सुखद अनुभव होगा। :) Starcraft II में स्क्रिप्टिंग भाषा गैलेक्सी है जो वास्तव में गैर-तकनीकी लोगों / लड़कियों पर लक्षित एक डोमेन विशिष्ट भाषा है।
जैकोमो

3
लिस्प लुआ या पाइथन से ज्यादा डीएसएल नहीं होगा। यह एक पूरी तरह से बनाई गई भाषा होगी जिसे किसी और ने लंबे समय तक डिजाइन करने में बिताया है, समय आप खुद खर्च करने से बच सकते हैं।
कोडरंगर

2

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

स्क्रिप्टिंग भाषाओं में खेलों का एक महंगा प्रस्ताव है। यहां तक ​​कि लुआ, जो काफी तेज है, अभी भी देशी कोड की तुलना में बहुत धीमी है। खेल टीमें आम तौर पर केवल उस हिट को लेने के लिए तैयार होती हैं क्योंकि यह उन्हें बदले में दो बहुत बड़े लाभ देता है:

  1. खेल को फिर से जोड़ने और पुनः लोड किए बिना स्क्रिप्ट को बदलने की क्षमता।
  2. गैर-प्रोग्रामर के लिए स्क्रिप्ट लिखने की क्षमता।

DSL आपको दुर्भाग्य से, ऐसा नहीं करते हैं।


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

मैं सहमत हूँ। मुझे नहीं लगता कि # 2 अभ्यास में अच्छी तरह से काम करता है, लेकिन मैंने देखा है कि एक स्क्रिप्टिंग भाषा को एकीकृत करने के लिए एक अस्थिर कारण के रूप में उपयोग किया जाता है।
उदार

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

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

2

मुझे यह उत्सुक लगता है कि आपका प्रश्न स्वयं को आंतरिक DSLs तक सीमित करता है , क्योंकि मैं रनवे पर स्क्रिप्ट लोड करने की क्षमता प्राप्त करने के लिए बाहरी DSL का उपयोग करने की वकालत करता हूं और विशेष रूप से गैर-devs को DSL में गेम लॉजिक लिखने की अनुमति देता हूं ।

उदाहरण के लिए, मेरी वर्तमान परियोजना खेल तर्क का एक हिस्सा निर्दिष्ट करने के लिए एक (अभी के लिए) सरल बाहरी डीएसएल का उपयोग कर रही है जो गेम डिजाइनरों को ज्यादातर देव हस्तक्षेप के बिना संतुलन परीक्षण करने की अनुमति देता है।

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


2

मेरी सलाह होगी: करो !

लेकिन केवल तभी जब आपके पास इसका उपयोग हो।

अगर आप सिर्फ इसे खुद इस्तेमाल करने जा रहे हैं तो आंतरिक रूप से डीएसएल बनाने की जरूरत नहीं है।

गैलेक्सी स्क्रिप्टिंग लैंग्वेज है, जिसे Startcraft II एडिटर इस्तेमाल कर रहा है। यह एक डोमेन विशिष्ट भाषा का एक प्रमुख उदाहरण है।

यह प्रोग्रामर के बजाय गेम डिजाइनरों को लक्षित करता है:

Timer - Start Raise Lava Timer as a One Shot timer that will expire in 20.0 Game Time seconds
Variable - Set Raise Lava Timer = (Last started timer)
Timer - Create a timer window for (Last started timer), with the title "Lava will raise in: ", using Remaining time (initially Visible)
Variable - Set Lava Timer Window = (Last created timer window)
Timer - Show (Last created timer window) for (All players)
Variable - Set Lava Death? = false

नमूना ट्यूटोरियल

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

इस तरह से आपके डिजाइनरों / मॉडर्स को प्रोग्रामिंग सीखना नहीं है, भले ही यह सिर्फ लुआ हो, यह अभी भी प्रोग्रामिंग है।

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


1

आंतरिक dsls एक अच्छे API पर सिर्फ वाक्य रचना चीनी हैं। एपीआई वह है जो सबसे महत्वपूर्ण है। आपके पास एक अच्छा एपीआई बनाने के बाद dsl तुच्छ है, और यह महत्वपूर्ण नहीं है।


0

तर्क से अवास्तविक एक डीएसएल है। ऐसा लगता है कि काम पूरा हो गया है, हालांकि मुझे लगता है कि खेल की स्क्रिप्टिंग भाषाओं को इससे अधिक 'डोमेन विशिष्ट' बनाना संभव है। मैं एक डीएसएल बनाने की सिफारिश करूंगा यदि डोमेन के लिए कुछ विशिष्ट है जो भाषा परिवर्तनों से लाभान्वित होगा - मेरे पास इस क्षेत्र में कुछ विचार हैं लेकिन वर्तमान में पूरी तरह से कुछ भी नहीं है।

क्या आप इसे अधिक सामान्य होते हुए देखते हैं क्योंकि खेल का विकास अधिक रूपक-अनुकूल भाषाओं की ओर बढ़ता है, जैसे कि बू?

मुझे नहीं लगता है कि किसी भाषा का समर्थन करने वाला एक नया इंजन खेल विकास का एक दिए गए दिशा में बढ़ने का प्रमाण है, हालाँकि। अभी शुरुआती दिन हैं।


0

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

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

लेकिन सावधान रहना: भाषा और संकलक बनाना बहुत कठिन हो सकता है और पूर्व अनुभव एक बड़ी मदद है। मैं एक ईबीएनएफ व्याकरण (एक और डीएसएल) के आधार पर एक पीईजी पार्सर (खुद को एक डीएसएल) की सिफारिश करूंगा, और अगर यह बहुत बड़ा है, तो कोशिश करने के लिए बेहतर नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.