스크립팅을위한 도메인 별 언어 [닫기]


12

아시다시피 Lua 및 Python과 같은 언어의 임베디드 인터프리터는 게임 로직 스크립팅에 널리 사용되지만 스크립트에 도메인 특정 언어를 사용하는 사람들에 대한 정보는 거의 보지 못했습니다. '매크로 나 유창한 프로그래밍 등을 사용하여 게임의 나머지 부분에 사용되는 언어를 기반으로합니다.

내 질문은 다음과 같습니다.

  • 실제 게임에서 이러한 DSL의 예를 보셨습니까?
  • 어떤 문제가 발생 했습니까?
  • 다른 게임 개발자에게 어떤 방법으로이 경로를 추천 하시겠습니까?
  • 게임 개발이보다 메타 프로그래밍 친화적 인 언어 (예 : Boo)로 이동함에 따라 이것이 더 일반적으로 보입니까?

실제 DSL 사용 질문에 대답하기 위해 Battlefield 1942에서 사용했습니다. 많은 개조가 나타 났지만; 프로그래머 (내)의 관점에서 볼 때 그것은 끔찍했고 나는 관심을 매우 빨리 잃었습니다.
Jonathan Dickinson

답변:


6

내 조언은 "하지 마십시오"입니다.

게임 데이터에 도메인 별 마크 업 언어를 사용했습니다. 아 pain어요. 나는 그것을 디자인하는 데 며칠을 보냈고 매주 이틀마다 더 많은 기능을 추가하기 위해 그것을 조정해야했습니다. 어느 시점에서 나는 게임 데이터의 일부를 자동으로 생성해야한다는 것을 깨달았고, 마크 업 언어로 입력 파일을 구문 분석하고, 마사지하고, 마크 업 언어로 다른 파일을 출력하는 작은 프로그램을 작성하게되었습니다.

나는 솔직히 내가 무슨 생각을했는지 전혀 모른다. Lua를 사용했다면 모든 것이 더 간단하고 효율적이며 버그가 발생하지 않으며 훨씬 적은 시간이 걸렸을 것입니다.

Lua 환경을 시작할 수없는 제한된 시스템에서 작업하는 경우 DSL을 사용해야하지만 고뇌를 대비해야합니다. 그렇지 않으면 Lua를 사용해야한다고 확신합니다. Lua는 원래 간단한 데이터 마크 업 언어로 설계되었으며 여전히 이와 같이 사용하는 데 매우 도움이되며, 더 복잡한 것이 필요하다는 것을 알게되면 이미 가지고 있습니다. 현재 게임 개발은 모두 Lua에서 이루어졌으며 더 효율적이거나 버그가 적은 적은 없었습니다.

DSL을 강력하게 권장하지는 않습니다.


어, 왜 안돼? 방금 Lisp를 사용 했습니까? 제 생각에는 훨씬 더 즐거운 경험이었습니다. :) 스타 크래프트 II에는 스크립팅 언어 인 갤럭시 (Galaxy)가 있으며, 이는 실제로 기술이 아닌 사람 / gals를 대상으로하는 도메인 특정 언어입니다.
jacmoe

3
Lisp는 Lua 나 Python 이상의 DSL이 아닙니다. 다른 사람이 디자인하는 데 오랜 시간을 보냈고, 자신을 소비하지 않는 시간은 완전히 형성된 언어 일 것입니다.
coderanger

2

나는 스크립트에 도메인 특정 언어를 사용하는 사람들에 대해 많은 정보를 보지 못했습니다.

스크립팅 언어는 게임에서 비싼 제안입니다. 매우 빠른 Lua조차도 네이티브 코드보다 훨씬 느립니다. 게임 팀은 일반적으로 대가를 치르는 두 가지 큰 이점을 구매하기 때문에 그 히트를 기꺼이 받아들입니다.

  1. 게임을 다시 컴파일하고 다시로드하지 않고도 스크립트를 변경할 수 있습니다.
  2. 프로그래머가 아닌 사람이 스크립트를 작성하는 기능.

불행히도 DSL은 당신에게 그것을 제공하지 않습니다.


나는 2) 빨간 청어라고 주장한다. 흥미롭게도 흥미로운 스크립트의 경우, 비 프로그래머는 가치가있는 것보다 더 많은 핸드 헬드 또는 디버깅 도움말이 필요합니다. 거기에는 도움이 필요없는 훌륭한 프로그래머 디자이너가 있지만, 일반 디자이너의 책상에 Lua For Dummies를 때리고 재미를 내기를 기대할 수는 없습니다.
tenpn

동의한다. 실제로 # 2가 제대로 작동하지 않는다고 생각하지만 스크립팅 언어를 통합 해야하는 이유가 있음을 알았습니다.
munificent

Lua 스크립트를 작성할 수있는 좋은 게임 아이디어를 가진 많은 사람들이 있지만 나는 malloc / sprintf / 데이터 구조 등을 선택해야하는 곳 근처에서는 절대 신뢰하지 않을 것입니다. 이것이 바로 # 2의 의미입니다. "나쁜 프로그래머가 최소한의 피해를 입히고 여전히 작업을 수행 할 수있는 능력"

스크립트로 메모리 누수가 발생하지는 않지만 나쁜 프로그래머는 여전히 버그가 많고 유지 관리가 불가능하고 느린 코드를 작성할 수 있습니다. 나쁜 프로그래머는 게임 근처에서 허용해서는 안됩니다. 검증 된 스크립팅 경험이있는 디자이너를 고용하면 괜찮을 것입니다.
tenpn

2

런타임에 스크립트를로드하고 특히 개발자가 아닌 사람이 DSL에 게임 로직을 작성할 수 있도록 외부 DSL 사용을 권장하기 때문에 귀하의 질문이 내부 DSL로 제한되는 것이 궁금합니다. .

예를 들어, 현재 진행중인 프로젝트는 (현재) 간단한 외부 DSL을 사용하여 게임 디자이너가 대부분 개발자의 개입없이 균형 테스트를 수행 할 수 있도록하는 게임 로직의 일부를 지정하고 있습니다.

물론 파서를 작성해야합니다. 이를 위해, 나는 가장 권장되는 도구입니다 생각 ANTLR 목표 꽤 많은 언어 . 내 프로젝트에서 우리는 jParsec (우리의 백엔드는 Java이며 다른 언어에는 변형이 있음)을 사용 하여 파서 결합기 경로를 갔지만 BNF 와의 밀접한 관계는 좋지만 문서화가 잘되지 않았습니다.


2

나의 충고는 : Do !

그러나 당신이 그것을 사용하는 경우에만.

내부적으로 DSL을 직접 사용하려는 경우 DSL을 만들 필요가 없습니다.

Galaxy는 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

샘플 튜토리얼

Lisp는 도메인 별 언어를 만드는 데 사용할 수있는 완벽한 언어이지만 다른 옵션도 있습니다. 부처럼.

그렇게하면 디자이너 / 모듈러가 프로그래밍을 배울 필요가 없습니다. 단지 루아 일지라도 여전히 프로그래밍입니다.

편집 : DSL을 스크립팅 언어로 구현할 수 있다고 덧붙이겠습니다. 스크립팅 언어를 사용하지 않는 것과 동의어가 아닙니다. 특히 Lisp 또는 이와 유사한 것을 사용하는 경우 도메인 특정 언어를 만드는 데 매우 적합합니다.


1

내부 dsls는 좋은 API의 구문 설탕입니다. API가 가장 중요합니다. 좋은 API를 얻은 후에는 dsl을 만드는 것이 쉽지 않으며 그렇게 중요하지 않습니다.


0

언리얼 스크립트는 DSL입니다. 게임 스크립팅 언어를 그보다 더 '도메인 특정'으로 만들 수 있다고 생각하지만 작업이 완료된 것 같습니다. 언어 변경으로 혜택을 볼 수있는 특정 도메인이있는 경우 DSL을 만드는 것이 좋습니다.이 분야에 대한 몇 가지 아이디어가 있지만 현재 완전히 형성된 것은 없습니다.

게임 개발이보다 메타 프로그래밍 친화적 인 언어 (예 : Boo)로 이동함에 따라 이것이 더 일반적으로 보입니까?

그러나 언어를 지원하는 상당히 새로운 엔진 하나가 게임 개발이 주어진 방향으로 움직 였다는 증거라고 생각하지 않습니다. 아직 초기입니다.


0

실제로 필요한 것이 범용 프로그래밍 언어 인 경우 자신의 언어를 굴리는 것은 거의 실수입니다. 언어에 변수, 표현식 평가, 루프, 조건부, 클래스, 함수 등이 필요한 것 같으면 Lua, Lisp, Python, JavaScript 등과 같은 알려진 언어를 사용하는 것이 가장 좋습니다. [Unreal은 언어를 버렸습니다.]

그러나 필요한 것은 주로 데이터 정의에 관한 것입니다. 아마도 명령이 아닌 선언적 일 것입니다. 아마도 GDL과 같은 상태와 규칙을 정의 할 것입니다. GP 언어의 기능이 거의 필요하지 않은 경우 DSL을 고려하십시오.

그러나 언어와 컴파일러를 만드는 것은 매우 어려울 수 있으며 사전 경험이 큰 도움이됩니다. EBNF 문법 (다른 DSL)을 기반으로 한 PEG 파서 (DSL 자체)를 권장하고, 너무 큰 질문이라면 시도하지 않는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.