자신 만의 스크립팅 언어를 구현할 수 있습니까?


21

나는 C ++에서 비트 업 게임을 코딩하고 있으며 이벤트, 트리거, 컷 장면 등을위한 스크립팅을 구현할 때가되었습니다. 인터넷에서 읽었고 상당히 많은 정보를 얻었습니다. 나의 첫번째 선택 솔루션은 Cave Story 와 같은 나만의 스크립팅 언어를 구현하는 것이다 . 나는 이것을 제안했지만 대부분의 사람들은 루아를 제안하지만 그것은 내 유형의 프로그래밍에 맞지 않는 것 같습니다.

자신 만의 스크립팅 언어를 만들었습니까? 기존의 것을 사용하지 않고 자신의 롤을 선택한 이유는 무엇입니까? 개발 중에 어떤 리소스를 상담 했습니까?


43
나의 개인적인 경험 규칙은 : 당신이 다른 사람에게 당신 자신의 말을 굴리는 것이 좋은지 물어볼 필요가 있다면, 그것은 좋은 생각이 아닙니다.
sam hocevar

2
당신이 당신의 자신의 언어를 구현한다면, 사람들은 그것을 배우고 통역사에 버그가없는 것을 희망해야하는 반면, 루아와 같은 언어는 더 대중적이고 버그가 거의 없을 것입니다.
Nick Caplinger 2016 년

2
@NickCaplinger가 머리에 부딪쳤다. 롤링은 문서, 커뮤니티, 써드 파티 튜토리얼, StackExchange 등이 없음을 의미합니다. 수백만 팬.
Sean Middleditch 2016 년

4
툴링도 염두에 두십시오. 이것은 D, Rust, Dart 등의 내 문제입니다. 구문은 무의미합니다. 실제로 가치가 있으려면 적절한 편집기, 강조 표시, "인텔리 센스"(코드 완성), 우수한 진단, 리팩토링 지원, 인라인 문서 지원 등이 필요합니다. 모든 실제 언어 기능, 통합, 효율성 등은 말할 것도 없습니다.
Sean Middleditch 2016 년

1
C ++ 프로그래머이고 LUA를 싫어하는 경우 대신 JavaScript를 사용해보십시오.
zeel

답변:


42

아뇨 , 적어도 아닐 것입니다.

이것은 바퀴가 게임 개발을 재창조하는 매우 빈번한 사례이며, 여전히 인기있는 실수입니다.

이 질문을한다면, 다른 사람들의 영향을받을 가능성이 매우 높으므로, 에픽 게임즈가 언리얼 엔진으로 무엇을했는지 살펴보십시오 :

  • UE3는 커스텀, 이상하고 최적화되지 않은 디버그하기 어려운 UnrealScript를 가지고있었습니다.
  • 소문이 사실이라면 핫 리로드 가능한 C ++ DLL을 선호하여 UE4에서 지원 이 제거됩니다 .

에픽보다 더 잘할 수 있다고 생각하십니까?

프로그램 언어를 만드는 것은 게임 엔지니어가 아닌 프로그래밍 언어 제작자에게 속합니다 .

언어가 완전히 성숙하고 그에 수반되는 도구 세트 (컴파일러, 링커, 인터프리터, 디버거 등)를 사용하려면 몇 년이 걸립니다. 요즘에는 사용 가능한 솔루션이 많이 있으므로 최소한 게임을 만드는 것이 목표가 아니더라도 처음부터 새로운 것을 시작해야 할 실질적인 이유는 없습니다. 기간.

당신의 부수적 인 질문에 대답하기 위해, 아닙니다. 바로 이런 이유로 나는 필자의 스크립트 언어를 구현 한 적이 없습니다. 그러나 나는 반 구운 빵으로 많은 고통을 겪었습니다. 그것들은 매우 좁은 기능 세트를 염두에두고 만들어 졌기 때문에 항상 당신을 미치게 만드는이 작은 미친 짓을했습니다. 종종 게임을 만드는 대신 언어의 한계를 극복하기 위해 많은 시간을 소비하는 경우가 종종 있습니다.

언어를 만들고자하는 이유가 프로그래밍을 잘 모르는 사람들이 사용하기위한 것이거나 도메인 고유의 것을 원하기 때문에 언어를 필요로한다고 생각되는 경우 이러한 언어 알려 드리겠습니다 나쁜 이유. 함수를 사용하여 매우 높은 수준의 API를 do_what_they_say_and_say_what_they_do()작성하고 기본 사용법을 노출하는 매우 간단한 상용구 코드를 작성할 수 있습니다. 기술이 아닌 사용자는 약간의 프로그래밍을 배우게되어 기쁘고 구현이 잘되지 않는 언어에 의해 제한받지 않게되어 기쁩니다.

그래서 이것이 조금 갑작 스럽거나 거칠게 들릴 있으므로, 스크립트 언어가 어떻게 만들어 지는지 배우고 싶다면 말이 될만한 한 가지 사례 가 있다고 말할 것입니다 . 그러나 제발, 제발, 그렇게한다면, 다른 사람들이 그것을 사용하도록 강요하지 마십시오.

편집하다

방금 연결 한 Cave Story 명령 목록을 보았습니다. 아야:

<ECJx:y      [EC?] Jump           @ Jump to event Y if any npc with ID X is present

Cave Story의 개발자에게 무례 함을 보여주고 싶지 않지만 제어 할 수없는 사용자 지정 스크립팅 언어로 변형 된 간단한 명령 목록의 완벽한 예입니다. 이것은 여전히 ​​단일 개발자 나 아주 작은 팀에서 사용할 수 있지만이 단계에서는 다음과 같이 할 수있는 적절한 Turing-complete 및 잘 시도 된 언어 (예 : Lua)로 전환하는 것이 좋습니다.

if (npc.id == x) then
    jump_to_event(y)
end

예를 들어 더 복잡한 조건이 필요할 때 훨씬 쉽게 작업 할 수 있습니다.

if (npc.id == x) or (npc.type == "enemy") then
    jump_to_event(y)
end

21
+1 "프로그래밍 언어 생성은 게임 엔지니어가 아닌 프로그래밍 언어 제작자에 속합니다." 이 인용문은 더 정확할 수 없습니다. 프로그래밍 언어를 가진 사람이 가르치는 프로그래밍 언어 개념 수업을들은이 사람들은 다른 유형입니다. 한 수업에서 실제 프로그래밍 언어를 만드는 데 필요한 CS 이론과 수학의 양을 알 수있었습니다. 덕분에이 사람들과 그들의 스킬 셋에 더욱 감사하게되었습니다. 그들은 내가 게임을 만들게했고, 나는 그들의 길에서 벗어나 언어를 만들게했습니다.
Dean Knight

+1, 나는 루아 나 커스텀 스크립팅 언어를 모른다. 그러나 루아에서 무슨 일이 있었는지, 그리고 유용성이 중요한 것이
분명

1
둘 중 하나를 배우는 것을 불가능하게 만드는 마법은 없습니다. Unreal은 아마도 UnrealScript를 제거했을 수도 있지만 Kismet을 크게 향상시키고 작성하여 완벽하고 시각적 인 스크립팅 언어가되도록합니다. 언리얼 스크립트는 실패했기 때문에 제거하지 않았고, 훨씬 더 어려운 기능 (핫 리로드 C ++, 업데이트 된 Kismit)으로 인해 낡았 기 때문에 제거하고 있습니다. 내가 당신의 주장에 동의하지 않는다는 것을 의미하지 마십시오. 자신의 언어를 작성하는 것은 많은 시간 낭비, 버그의 원천, 큰 학습 곡선의 원인 등입니다.
Sean Middleditch

2
@ ott-- 나도 두렵지 않다. 내 요점은이 표기법을 확장하면 점점 복잡해 지지만 처음에는 적절한 언어를 사용하면 장기적으로 도움이 될 것입니다. 이 경우 IMHO의 사용 편의성과 비교하여 오버 헤드는 관련이 없습니다.
Laurent Couvidou 2016 년

1
언리얼 스크립트는 블루 프린트로 대체되었습니다 (그러나 동료들에게 돌아올 것이라고 내기했습니다). 핫 로딩 DLL은 직교 기능입니다.
sam hocevar

9

자신 만의 스크립팅 언어를 만들었으며 왜 기존 언어를 사용하지 않고 자신 만의 언어를 사용하기로 선택 했습니까?

다른 언어에서 구문을 빌려 왔지만 대체로 훌륭한 학습 경험이었고 언어는 단순했기 때문에 그렇게 어렵지 않았습니다.

팀의 모든 사람들이 익숙한 것처럼 스크립트에 일반적인 C 스타일 구문을 사용하고 싶었 기 때문에 주로 사용했습니다.

또한 프로그래밍 언어 구현에 대해 조금 배우는 데 관심이 있었고 기능 (변수, 산술, 조건부, 루프 및 게임 내 함수 또는 코 루틴 호출)의 매우 간단한 하위 집합 만 필요했기 때문에 시도해보기로 결정했습니다.

개발 중에 어떤 리소스를 상담 했습니까?

내 주요 리소스는이 책이었습니다.

여기에 이미지 설명을 입력하십시오

나는이 책에서 다음을 구현하기에 충분히 배울 수 있었다.

  • 어휘 분석기 : 정규식을 사용하는 것이 쉽지만 Regex.Match를 사용하여 토큰을 식별하고 분할 할 수 있습니다.
  • 재귀 강하 파서 : 기본적으로 문법의 각 규칙마다 하나의 함수와 토큰을 미리보고 소비하는 몇 가지 도우미 메서드. 영감을 얻기 위해 C # 문법 사양을 살펴 보았습니다. 가장 어려운 부분은 무한 재귀로 가지 않고 산술 및 관계 연산자 우선 순위를 처리하는 것이 었습니다.
  • AST 통역사 : 방문자 디자인 패턴을 사용하여 파서에서 생성 된 트리를 통과하고 각 명령 노드를 재귀 적으로 실행했습니다.

재귀 인터프리터 내에서 Unity3D 코 루틴을 호출하고 생성하는 것 한 가지를 제외하고 내가 필요한 거의 모든 것이 이미 작동했기 때문에 거기서 멈췄을 것입니다. 이 문제를 해결하기 위해 재귀를 제거하고 책을 다시 한 번 돌 렸습니다. 이번에 나는 추가했다 :

  • 컴파일러 : 다른 방문자이지만 코드를 실행하는 대신 AST의 각 노드에서 간단한 원자 명령어 목록 (예 : 간단한 스택 기반 사용자 지정 어셈블리 언어)을 생성합니다. while 루프 나 if 조건과 같은 작업은 레이블 및 goto-type 명령어로 변환됩니다. 이 시점에서 컴파일 된 스크립트를 이진 파일로 디스크에 씁니다.
  • 바이트 코드 인터프리터 : 간단한 명령어 목록을 반복합니다. 재귀없이 Unity3D 코 루틴과 쉽게 통합 할 수있었습니다.

전체 과정은 제로 지식에서 약 2 주가 걸렸으며 많은 재미가있었습니다. :)

추신 : 마지막으로 도구에 사용자 정의 언어에 대한 구문 강조 표시 및 지능을 추가하고 싶었습니다. 신틸라는 이와 관련하여 생명을 구했습니다. 다음 래퍼를 사용했습니다.

http://scintillanet.codeplex.com/


5

나는 이것을 제안했지만 대부분의 사람들은 루아를 제안하지만 그것은 내 유형의 프로그래밍에 맞지 않는 것 같습니다.

좋아, 이것을 다른 각도에서 시도해 보자. 당신이 싫어하는 Lua는 무엇인가? 쉽게 고칠 수있는 것입니까, 아니면 근본적인 것입니까?

예를 들어, then/do/end좋은 C / C ++ 스타일 중괄호 대신 코드 블록을 나타내는 것과 같은 키워드를 사용하십시오 . 그것이 당신의 문제라면 ... 그것은 당신이 고칠 수있는 것 입니다. Lua의 작은 방언을 정의하고 중괄호 구문을 실제 Lua로 변환하는 간단한 변환 도구를 작성하기 만하면됩니다.

어떤 형태로 + =를 원하십니까? 그것은 또한 전처리 시스템에서 쉽게 할 수있는 일입니다. 양식의 진술서를로 expr1 += expr2바꾸십시오 expr1 = expr1 + expr2.

물론, 중괄호 do/end쌍이 테이블을 나타내는 지 또는 쌍을 나타내는지를 감지하는 방법을 찾아야합니다 . 그리고 당신은 대체하여 루아으로 사전 처리 시스템을 후크해야 할 것 dofile, loadstring및 기타 표준 루아 라이브러리 함수. 그러나 그것은 모두 궁극적으로 가능합니다.

이와 같은 작은 문제가 염려되고 코딩 방식을 변경하기 위해 하나의 프로그래밍 스타일에 너무 얽매인 경우 (주 : 프로그래머가 갖는 끔찍한 품질 임), 이는 단순한 것보다 훨씬 더 실용적인 대안입니다. 자신의 언어를 쓰는 것. 아마도 최대 몇 주가 걸릴 것 입니다. 받는 비교해 같은 풍부한 디버깅 지원과 함께, 적절한 언어에 지출 될 것이다.

문제가 이보다 큰 경우 (전역이 기본값이므로 local모든 곳 에서 사용해야 함 ) 일부는 관리 할 수 ​​있습니다 (변경된 환경 및 메타 테이블을 사용하여 새 전역을 오류로 선언하기 만하면됩니다). 퍼스트 클래스 객체, 코 루틴, 가비지 수집 또는 Lua의 다른 기본 요소로 기능을 싫어한다면 ... 자신이 직접 만드는 것입니다.)

당신이 정말로, 만약 정말 그것에 대해 하드 코어가되고 싶어요, 당신은 당신이 컴파일 것을 자신의 언어를 쓸 수 루아에. 따라서 귀하는 최소한 잘 테스트 된 Lua 런타임, 뛰어난 Lua API 및 기타 기본 Lua 기능을! Lua 언어로 활용할 수 있습니다. 이것은 시간이 걸릴 것입니다,하지만 여전히되지 않습니다 당신이 뭔가에 지출하는 것입니다.


나에게 Lua를 사용하면 함수를 코딩 할 수있는 것처럼 보입니다. 코드를 옮기는 것 같습니다.
skiperic

1
@ skiperic : 나는 그게 무슨 뜻인지 모르겠습니다. 예를 들어 줄 수 있습니까?
Nicol Bolas 2016 년

위의 Laurent의 답변을 참조하십시오.
skiperic

2
@ skiperic : 그것은 당신이 걱정하는 것을 실제로 설명하지는 않습니다. 루아로 코딩 할 수 있습니까? 예. 그리고 문제는 ...?
Nicol Bolas

1
@ BartekBanachewicz : 그것이 C API라는 것을 인정하더라도, 내가 본 많은 C ++ 기반 스크립팅 API보다 여전히 우수합니다. 자동화 된 바인더없이 raw을 사용하는 것이 실제로 고려할 수있는 유일한 스크립팅 API 입니다.
Nicol Bolas 2016 년

3

다른 답변을 보완하기 위해 이것은 엄격하게 바이너리 옵션이 아닙니다. 기존 스크립팅 언어 내에서 고유 한 Domain-specific_language를 만들 수도 있습니다 . 이 방법의 장점은 다음과 같습니다.

  • 실제로 공식 문법, 파서, 사용자 정의 편집기 구현 등을 망칠 필요가 없습니다.
  • 특화된 스크립팅 언어, 즉 게임과 관련된 추가 추상화를 구현하면 대부분의 이점을 얻을 수 있습니다.
  • vs. homebrew : 선택한 스크립팅 언어에 익숙한 사용자는 즉시 DSL을 사용할 수 있습니다.
  • 기존 언어와 비교 : 스크립트 언어에 익숙하지 않은 사용자는 게임을 수정하기 위해 DSL에 대한 지식 만 있으면됩니다.

가장 큰 단점은 "기본"언어의 제약 조건으로 DSL을 설계한다는 것입니다.


2

그것은 수있는 게임의 역학에 따라 의미가. 기계가 충분히 간단한 일부 게임은 해석이 복잡한 언어를 사용하여 복잡한 복잡한 Lua / Python 코딩에서 자신을 구할 수는 있지만 복잡성 비용을 크게 절약 할 수는 없습니다. 예를 들어, 대화 형 소설 게임 중 하나는 사용자 정의 스크립트 엔진을 쉽게 사용할 수 있습니다.

게임에 물리 엔진, 다양한 게임 구성 요소 및 다양한 캐릭터와 능력의 복잡성이 포함 된 경우 기존의 다른 스크립팅 언어를 반드시 고려해야합니다. 따라서 사용자 정의 기능에 필요한 기능을 추가하거나 버그를 수정하지 않아도됩니다. 그것. 루아가 가장 빠를 가능성이 가장 높지만 구문에 대해 더 많은 것을 좋아할 수있는 다른 것들이 많이 있으며, 그중 많은 부분이 C와 쉽게 통합되는 것에 대해 자랑합니다. Python, Ruby 및 Angelscript는 몇 가지입니다. (의견에 다른 사람을 언급하지 마십시오)

이러한 언어가 "논리 제어"에만 사용되도록 보장하는 경우 (예 : 얼음 블록에 닿는 화염 블래스터와 같은 특정 객체 유형에 대한 특정 충돌 사례 처리) 성능은 거의 문제가되지 않습니다. 물론 다른 루틴 코드 (각 프레임을 실행하는 사용자 지정 충돌 검사 알고리즘 만들기)에 사용하면 다운 될 가능성이 높아집니다.


1
루아는 또한 게임 개발에서 매우 인기있는 스크립팅 언어입니다.
Philipp

그렇습니다. 루아는 모든 곳에서 사용되지만 OP는 그가 그다지 좋아하지 않는다고 지적했습니다. 코딩 스타일의 환경 설정이 중요 할 수 있습니다.
Katana314

1
" 예를 들어, 대화 형 소설 게임 중 하나는 사용자 정의 스크립트 엔진을 쉽게 사용할 수 있습니다. "당신은 분명히 Inform을 보지 못했습니다 . 실제로 텍스트 어드벤처의 경우에도 자신의 언어를 구성 할 필요가 없습니다.
Nicol Bolas 2016 년

1
@ Katana314 : " 코딩 스타일의 기본 설정이 중요 할 수 있습니다. "솔직히, 프로그래머가 "코딩 스타일"에 대해 높은 평가를 받았을 때 세상은 더 나아질 것입니다. <여기에 선호하는 언어 삽입>이 다른 사람의 <여기에 선호하는 언어 삽입>보다 기본적으로 더 좋다고 생각하지 않으면 우리 모두 더 나은 프로그래머가 될 것입니다. 빌드 구문의 구문이 마음에 들지 않는 언어를 사용하면 이런 종류의 버그를 피할 수 있습니다.
Nicol Bolas

1

말해봐 이력서에서 그것은 능력의 추가 쇼가 될 것입니다. 명심하십시오. 먼저 그 능력이 필요합니다. 쉽지 않을 것입니다, 꽤 어려울 것입니다. 주제에 관한 책과 온라인 자습서도 있지만, 궁극적으로는 컴파일러의 작동 방식과 코드 구문 분석 및 번역 방법에 대한 이해가 필요합니다.

간단하게 시작하고 자주 테스트하며 이상을 유지하십시오. 그러나 LUA가 항상 당신을 위해 있다는 것을 기억하십시오.


1
여기서 문제는 게임을 만들거나 이력서에 어울리는 것을 만드는 것입니다.
Tridus 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.