スクリプト用のドメイン固有言語[終了]


12

ほとんどの人が知っているように、LuaやPythonなどの言語の組み込みインタープリターはゲームロジックのスクリプト作成に広く使用されていますが、スクリプトにドメイン固有の言語を使用している人、たとえば小さなロジックスクリプト作成方言の作成に関する情報はあまり見ていません'ゲームの残りの部分で使用される言語の上に、マクロまたは流fluentなプログラミングなどを使用します。

私の質問は次のとおりです。

  • 実際のゲームでそのようなDSLの例を見たことがありますか?
  • どのような問題に遭遇しましたか?
  • 他のゲーム開発者にどのような状況でこのルートをお勧めしますか?
  • ゲーム開発がメタプログラミングに適した言語(Booなど)に移行するにつれて、これがより一般的になると思いますか?

現実世界のDSL使用に関する質問に答えるために、Battlefield 1942はそれらを使用しました。多くのMODがポップアップしましたが、プログラマー(私の)の観点からすると、それは恐ろしく、すぐに興味を失いました。
ジョナサンディキンソン

回答:


6

私のアドバイスは「しない」です。

ゲームデータにドメイン固有のマークアップ言語を使用しました。それは苦痛でした。それを設計するのに何日も費やし、それからさらに1週間か2週間は、機能を追加するために調整する必要がありました。ある時点で、ゲームデータの一部を自動的に生成する必要があることに気付き、最終的にマークアップ言語で入力ファイルを解析し、それらをマッサージし、マークアップ言語でもさまざまなファイルを出力する小さなプログラムを作成しました。

私は正直に何を考えていたのか分かりません。Luaを使用しただけであれば、全体がよりシンプルで、効率的で、バグが発生しにくく、はるかに時間がかかりません。

Lua環境を起動できないような制限されたシステムで作業している場合、おそらくDSLを使用する必要がありますが、苦痛に備えてください。それ以外の場合は、Luaを使用する必要があると固く信じています。Luaはもともと単純なデータマークアップ言語として設計されていたため、そのように使用するのに非常に役立ち、さらに複雑なものが必要だと気付いたとき(もしそうでない場合)には、すでに手に入れました。私の現在のゲーム開発はすべてLuaで行われているので、これまでにないほど効率的になり、バグが少なくなりました。

私はDSLに対して十分強く勧めることはできません。


えー、どうして?Lispを使用したばかりでしたら、もっと楽しい経験になると思います。:) Starcraft IIにはスクリプト言語Galaxyがあり、これは確かに非技術系の人/ギャルを対象としたドメイン固有の言語です。
-jacmoe

3
LispはLuaまたはPython以上のDSLではありません。他の誰かが長い時間をかけて設計した完全に形成された言語であり、あなたが自分で過ごすことを避けることができる時間です。
-coderanger

2

スクリプトにドメイン固有の言語を使用している人に関する情報はあまり見ていません。たとえば、ゲームの残りの部分で使用される言語の上に小さなロジックスクリプト「方言」を作成したり、マクロや流fluentなプログラミングなどを使用したりしています。

スクリプト言語は、ゲームでは高価な提案になる傾向があります。非常に高速なLuaでさえ、ネイティブコードよりも非常に低速です。ゲームチームは、見返りに2つの非常に大きな利点を購入するため、通常はそのヒットを受け入れるだけです。

  1. ゲームを再コンパイルしてリロードすることなくスクリプトを変更する機能。
  2. 非プログラマーがスクリプトを作成する機能。

残念ながら、DSLはそれを提供しません。


私は2)はニシンだと主張します。十分に興味深いスクリプトの場合、非プログラマーは、それよりも多くのハンドヘルドまたはデバッグヘルプを必要とします。助けを必要としない優れたプログラマーデザイナーがいますが、通常のレベルのデザイナーの机の上でLua For Dummiesを平手打ちして、彼らが楽しませてくれることを期待することはできません。
tenpn

同意する。#2は実際にはうまく機能しないと思いますが、スクリプト言語を統合するための表向きの理由として使用されていることを見てきました。
10

Luaスクリプトを記述できる優れたゲームアイデアを持っている人はたくさんいますが、malloc / sprintf /データ構造などを選択する必要のある場所の近くでは決して信用できません。それが本当に#2が意味することです-「悪いプログラマーが最小限の損害を引き起こし、それでも仕事を成し遂げる能力」。

スクリプトでメモリリークを引き起こすことはないかもしれませんが、不良プログラマーは、バグが多く、保守不能で遅いコードを書くことができます。悪いプログラマーをゲームの近くに置いてはいけません。実績のあるスクリプト作成経験のあるデザイナーを雇えば、大丈夫です。
-tenpn

2

実行時にスクリプトをロードし、特に開発者以外の人がDSLでゲームロジックを記述できるようにするために、外部 DSLの使用を推奨するため、あなたの質問が内部 DSLに限定されていることに興味があります。。

たとえば、私の現在のプロジェクトでは、(現時点では)シンプルな外部DSLを使用して、ゲームデザイナーが開発者の介入なしでバランステストをほぼ行えるようにするゲームロジックの一部を指定しています。

もちろん、パーサーを作成する必要があります。そのために、最も推奨されるツールは、かなりの数の言語を対象とするANTLR です。我々がパーサコンビネータルートを行ってきましたけれども、私のプロジェクトにjParsecとの密接な関係のために非常にいいです(私たちのバックエンドは、Javaで、他の言語の変種がある)BNFおそらくあまりよく文書化が。


2

私のアドバイスは次のとおりです

ただし、使用する場合のみ。

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は、ドメイン固有の言語を作成するために使用するのに最適な言語ですが、もちろん他のオプションもあります。ブーのように。

そうすれば、デザイナー/モダーはプログラミングを学ぶ必要がありません。たとえそれがLuaだけであっても、それはまだプログラミング中です。

編集:DSLをスクリプト言語で実装できることを付け加えます-スクリプト言語を使用しないことと同義ではありません。特にLispなどを使用している場合は、ドメイン固有の言語を作成するのに非常に適しているためです。


1

内部dslsは、優れたAPI上の単なる構文上の砂糖です。APIが最も重要です。優れたAPIを作成した後、dslの作成は簡単であり、それほど重要ではありません。


0

おそらくUnrealScriptはDSLです。ゲームのスクリプト言語をそれよりもさらに「ドメイン固有」にすることは可能だと思いますが、仕事は完了したようです。言語の変更の恩恵を受けるドメイン固有の何かがある場合は、DSLを作成することをお勧めします。この領域にはいくつかのアイデアがありますが、現在は完全には形成されていません。

ゲーム開発がメタプログラミングに適した言語(Booなど)に移行するにつれて、これがより一般的になると思いますか?

ただし、言語をサポートするかなり新しいエンジンが、特定の方向にゲーム開発が進んでいる証拠ではないと思います。まだ早い。


0

本当に必要なのが汎用プログラミング言語である場合、独自の言語を展開することは間違いなく間違いです。言語に変数、式の評価、ループ、条件、クラス、関数などが必要な場合は、Lua、Lisp、Python、JavaScriptなどの既知の言語を使用するのが最適です。

ただし、必要なのが主にデータの定義に関するものであれば、おそらく命令的というよりむしろ宣言的です。おそらく状態とルール(GDLなど)を定義します。GP言語が上手くいくもののほとんどを必要としないので、DSLを検討してください。

しかし、注意してください:言語とコンパイラを作成することは非常に難しい場合があり、以前の経験は大きな助けです。EBNF文法(別のDSL)に基づいたPEGパーサー(それ自体はDSL)をお勧めします。それが大きすぎる場合は、試してはいけません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.