Języki specyficzne dla domeny dla skryptów [zamknięte]


12

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?

Aby odpowiedzieć na pytanie dotyczące rzeczywistego użytkowania DSL, wykorzystało je Battlefield 1942. Chociaż pojawiło się wiele modów; z perspektywy programisty (mojej) było to okropne i bardzo szybko straciłem zainteresowanie.
Jonathan Dickinson

Odpowiedzi:


6

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.


Eee, czemu nie? Właśnie używałeś Lisp, myślę, że byłoby to znacznie przyjemniejsze doświadczenie. :) Starcraft II ma język skryptowy Galaxy, który w rzeczywistości jest językiem specyficznym dla domeny skierowanym do nietechnicznych facetów / dziewczyn.
jacmoe,

3
Lisp nie byłby DSL bardziej niż Lua lub Python. Byłby to w pełni ukształtowany język, który ktoś inny poświęcił na projektowanie, czas, którego można uniknąć.
coderanger

2

Nie widziałem wiele informacji na temat ludzi, którzy używają języków specyficznych dla domeny dla swoich skryptów, np. Budowanie małego „dialektu” logiki na języku używanym przez resztę gry, używanie makr lub płynne programowanie itp.

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:

  1. Możliwość zmiany skryptów bez konieczności ponownej kompilacji i ponownego ładowania gry.
  2. Możliwość pisania skryptów przez osoby niebędące programistami.

DSL niestety tego nie dają.


Twierdziłbym, że 2) to czerwony śledź. W przypadku każdego wystarczająco interesującego skryptu osoba niebędąca programistą będzie potrzebować więcej pomocy przy trzymaniu lub debugowaniu, niż jest to warte. Są dobrzy programiści-projektanci, którzy nie potrzebują pomocy, ale nie możesz uderzyć Lua For Dummies na biurko zwykłego projektanta poziomu i oczekiwać, że będą się dobrze bawić.
tenpn

Zgadzam się. Nie sądzę, aby # 2 działało dobrze w praktyce, ale widziałem to jako pozorny powód integracji języka skryptowego.
hojny

Jest mnóstwo ludzi z dobrymi pomysłami na gry, którzy potrafią pisać skrypty Lua, ale nigdy nie ufałbym w pobliżu malloc / sprintf / innego miejsca, w którym musieli wybrać strukturę danych / etc. To właśnie oznacza numer 2 - „Zdolność złych programistów do wyrządzania minimalnych szkód i wykonywania pracy”.

Mogą nie powodować wycieków pamięci za pomocą skryptu, ale zły programista może nadal pisać błędny, niemożliwy do utrzymania i powolny kod. Źli programiści nie powinni mieć dostępu do Twojej gry. Zatrudnij projektantów ze sprawdzonym doświadczeniem w pisaniu skryptów, a wszystko będzie dobrze.
tenpn

2

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.


2

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:

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

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.


1

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.


0

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.

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?

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.


0

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ć.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.