Jak większość z was wie, wbudowane interpretery języków takich jak Lua i Python są szeroko stosowane w logice gier skryptowych, ale nie widziałem zbyt wielu informacji na temat ludzi, którzy używają języków specyficznych dla domeny dla swoich skryptów, np. Budując mały dialekt logiki skryptowej ”oprócz języka używanego przez resztę gry, przy użyciu makr lub płynnego programowania lub czegokolwiek innego.
Więc moje pytania są następujące:
- Jakie przykłady takich DSL widziałeś w grach w świecie rzeczywistym?
- Jakie problemy zostały napotkane?
- Czy poleciłbyś tę trasę innym twórcom gier iw jakich okolicznościach?
- Czy widzisz, że staje się to coraz częstsze, gdy rozwój gier zmierza w kierunku języków bardziej przyjaznych dla metaprogramowania, np. Boo?
Odpowiedzi:
Moją radą byłoby „nie”.
Użyłem specyficznego dla domeny języka znaczników dla danych gry. To był ból. Spędziłem dni projektując go, a następnie co tydzień lub dwa musiałem go ulepszyć, aby dodać więcej funkcji. W pewnym momencie zdałem sobie sprawę, że muszę automatycznie wygenerować część moich danych gry, i ostatecznie napisałem mały program do analizowania plików wejściowych w języku znaczników, masowania ich i wysyłania różnych plików również w języku znaczników.
Naprawdę nie mam pojęcia, o czym myślałem. Wszystko byłoby prostsze, wydajniejsze, mniej podatne na błędy i znacznie mniej czasochłonne, gdybym tylko użył Luy.
Jeśli pracujesz na tak ograniczonym systemie, że nie możesz uruchomić środowiska Lua, być może powinieneś użyć DSL, ale bądź przygotowany na agonię. W przeciwnym razie mocno wierzę, że powinieneś po prostu użyć Lua. Lua została pierwotnie zaprojektowana jako prosty język znaczników danych i nadal jest wyjątkowo sprzyjająca do używania jako takiego, a kiedy (nie jeśli) zdasz sobie sprawę, że potrzebujesz czegoś bardziej skomplikowanego, już to masz. Całe moje obecne tworzenie gier odbywa się w Lua i nigdy nie byłem bardziej wydajny ani mniej podatny na błędy.
Nie mogę zdecydowanie polecić przeciwko DSL.
źródło
Języki skryptowe bywają kosztowną propozycją w grach. Nawet Lua, która jest dość szybka, wciąż jest znacznie wolniejsza niż kod natywny. Drużyny gry zazwyczaj chętnie przyjmują to trafienie, ponieważ daje im w zamian dwie bardzo duże korzyści:
DSL niestety tego nie dają.
źródło
Ciekawe, że moje pytanie ogranicza się do wewnętrznych DSL, ponieważ wolałbym używać zewnętrznego DSL, aby uzyskać możliwość ładowania skryptów w czasie wykonywania, a zwłaszcza, aby umożliwić osobom niebędącym programistami pisanie logiki gry w DSL .
Na przykład, mój obecny projekt wykorzystuje (na razie) prostą zewnętrzną DSL do określenia części logiki gry, która pozwala projektantom gier na przeprowadzanie testów równowagi głównie bez interwencji deweloperów.
Oczywiście musisz napisać analizator składni; w tym celu uważam, że najbardziej polecanym narzędziem jest ANTLR, który jest ukierunkowany na kilka języków . W moim projekcie wybraliśmy trasę kombinatora parserów z jParsec (naszym backendem jest Java, istnieją warianty w innych językach), co jest całkiem miłe ze względu na bliski związek z BNF, ale być może gorzej udokumentowane.
źródło
Moja rada brzmiałaby: Zrób !
Ale tylko jeśli masz do tego zastosowanie.
Nie musisz tworzyć DSL, jeśli zamierzasz go używać samodzielnie - wewnętrznie.
Galaxy to język skryptowy, którego używa edytor Startcraft II. Jest to doskonały przykład języka specyficznego dla domeny.
Jest skierowany raczej do projektantów gier niż programistów:
Przykładowy samouczek
Lisp to idealny język do tworzenia języków specyficznych dla domeny, ale są oczywiście inne opcje. Jak Boo.
W ten sposób twoi projektanci / moddery nie muszą uczyć się programowania, nawet jeśli to tylko Lua, to wciąż programowanie.
Edycja: Dodaję, że DSL może być zaimplementowany w języku skryptowym - to nie jest równoznaczne z niestosowaniem języka skryptowego. Zwłaszcza jeśli używasz Lisp lub podobnego, ponieważ nadaje się on bardzo dobrze do tworzenia języków specyficznych dla domeny.
źródło
Wewnętrzne dsls to po prostu cukier składniowy na dobrym API. Najważniejszy jest interfejs API. Po dobrym API tworzenie DSL jest banalne i nie jest tak ważne.
źródło
Prawdopodobnie UnrealScript jest DSL. Wygląda na to, że zadanie zostało wykonane, choć myślę, że możliwe jest, aby języki skryptów gry były jeszcze bardziej „specyficzne dla domeny”. Poleciłbym utworzenie DSL, jeśli jest coś specyficznego dla domeny, która skorzysta na zmianach językowych - mam kilka pomysłów w tej dziedzinie, ale obecnie nic nie zostało w pełni sformułowane.
Nie sądzę jednak, aby jeden całkiem nowy silnik obsługujący język był dowodem rozwoju gry w danym kierunku. Jeszcze wczesne dni.
źródło
Jeśli to, czego naprawdę potrzebujesz, to język programowania ogólnego zastosowania, wówczas zwijanie własnego jest prawie na pewno błędem. Jeśli twój język wydaje się potrzebować zmiennych, oceny wyrażeń, pętli, warunków, klas, funkcji i tym podobnych, najlepiej trzymaj się znanego języka, takiego jak Lua, Lisp, Python, JavaScript itp. [Unreal porzucił swój.]
Ale jeśli potrzebujesz przede wszystkim zdefiniowania danych; jest raczej deklaratywny niż imperatywny; być może definiuje stany i reguły (jak GDL); i nie potrzebuje większości tego, co robi język GP, a następnie rozważ DSL.
Ale uwaga: tworzenie języków i kompilatorów może być bardzo trudne, a wcześniejsze doświadczenie jest dużą pomocą. Poleciłbym parser PEG (sam DSL) oparty na gramatyce EBNF (inny DSL), a jeśli to zbyt duże pytanie, lepiej nie próbować.
źródło