独自のスクリプト言語の実装は実行可能ですか?


21

私はC ++でビートゲームをコーディングしており、イベント、トリガー、カットシーンなどのスクリプトを実装するときが来ました。インターネットで読み回して、かなりの情報を得ました。私の最初の選択ソリューションは、Cave Storyのような独自のスクリプト言語を実装することです。私はこれが示唆されているのを見ましたが、ほとんどの人はluaを示唆していますが、それは私のタイプのプログラミングに合わないようです。

独自のスクリプト言語を作成しましたか?既存のものを使用する代わりに、独自のロールを選択したのはなぜですか?開発中にどのリソースに相談しましたか?


43
私の個人的な経験則では、他の人に自分の_____を転がすのが良いかどうかを尋ねる必要がある場合、それは良い考えではありません。
サムホセバー

2
独自の言語を実装する場合、人々はそれを学習し、インタープリターにバグがないことを期待する必要がありますが、Luaのような言語はより一般的であり、バグが発生する可能性がはるかに低いことに注意してください。
ニックキャプリンガー

2
@NickCaplingerは頭に当たります。独自のローリングとは、ドキュメント、コミュニティ、サードパーティのチュートリアル、StackExchangeなどがないことを意味します。何百万人ものファン。
ショーンミドルディッチ

4
ツーリングにも注意してください。これはD、Rust、Dartなどに関する私の問題です。構文はそれ自体では意味がありません。適切なエディター、強調表示、「IntelliSense」(コード補完)、優れた診断、リファクタリングのサポート、インラインドキュメントのサポートなどが必要です。すべての実際の言語機能、統合、効率などは言うまでもありません。
ショーンミドルディッチ

1
C ++プログラマで、LUAが嫌いな場合は、代わりにJavaScriptを試してください。
zeel

回答:


42

いいえ。少なくとも、おそらくそうではありません。

これは、ゲーム開発である車輪を再発明する非常に頻繁なケースであり、間違いはまだ非常に人気があります。

この質問をしている場合、他の人の行動に影響される可能性が非常に高いので、Epic Gamesがアンリアルエンジンで行ったことを見てください。

  • UE3には、カスタマイズされた、奇妙で、最適化されていない、デバッグが難しいUnrealScriptのものがありました。
  • 噂が正しい場合、ホットリロード可能なC ++ DLLを支持して、そのサポートはUE4削除されます。

Epicよりもうまくやれると思いますか?

プログラム言語の作成は、ゲームエンジニアではなくプログラミング言語の作成者に属します。

言語が完全に成熟し、それに付随するツールセット(コンパイラ、リンカ、インタプリタ、デバッガなど)が使用可能になるには何年もかかります。現在、手元には多くのソリューションが用意されているため、少なくともゲームを作成することが目的である場合を除き、新しいことをゼロから始める理由はまったくありません。期間。

サイドの質問に答えるために、いいえ、これらの理由から、私は自分のスクリプト言語を実装したことがありません。しかし、私はいくつかの中途半端なものでたくさん苦しんでいます。彼らは非常に狭い機能セットを念頭に置いて作成されたため、彼らはいつもあなたを夢中にさせるこの小さな非常識な癖を持っています。多くの場合、ゲームを作成するだけでなく、言語の制限を回避しようとすると、ひどく多くの時間を費やすことになります。

言語を作成したい理由が、プログラミングをよく知らない人が使用することを意図しているためである場合、または非常にドメイン固有のものが必要であるために必要だと思われる場合は、これら教えてください悪い理由。関数do_what_they_say_and_say_what_they_do()、およびその基本的な使用法を公開する非常に単純な定型コードを使用して、非常に高レベルのAPIを作成できます。あまり技術的ではないユーザーは、少しプログラミングを学んでうれしく思います。また、実装が不適切な言語に制限されないことをうれしく思います。

したがって、これは少し突然または耳障りに聞こえるかもしれません、理にかなっているケースが1つあると言えます。スクリプト言語の作成方法を学びたい場合です。しかし、もしあなたがそうするなら、どうかお願いします:他人にそれを使わせることはしないでください。

編集

リンクしたCave Storyコマンドリストを見ました。痛い:

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

Cave Storyの背後にいる開発者に無礼を見せたくはありませんが、これは制御不能なカスタムスクリプト言語で変異した単純なコマンドリストの完璧な例です。これは、単一の開発者または非常に小さなチームでも引き続き使用できますが、この段階で、適切なチューリング完全で十分に試行された言語(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理論と数学の量を実感しました。これにより、これらの人々と彼らのスキルセットをさらに感謝しました。彼らは私にゲームを作成させ、私は彼らの邪魔をせずに言語を作成させました。
ディーンナイト

+1、私はluaやカスタムスクリプト言語を知らないが、luaで何が起こっているのか、ユーザビリティが重要なことはまさに明らかだった
-RhysW

1
どちらについても魔法のようなものはなく、両方を学ぶことは不可能です。UnrealはUnrealScriptを削除する可能性がありますが、Kismetを大幅に強化して記入し、有能で完全なビジュアルスクリプト言語にしています。UnrealScriptは失敗したため削除しませんでしたが、非常に難しい機能(ホットリロードC ++、更新されたKismit)によって時代遅れになったため、UnrealScriptを削除しています。私はあなたのポイントに反対を意味し、これを服用しないでください:自分の言語を書くことは時間の巨大な廃棄物、バグの発生源、および大規模な学習曲線の原因、などである
ショーンMiddleditch

2
@ ott--私も怖いわけではありません。私の表記は、この表記法を拡張するとますます複雑になりますが、最初に適切な言語を使用すると長期的には役立つことです。その場合の使いやすさと比較して、オーバーヘッドは重要ではありません。
ローランクーヴィドゥ

1
UnrealScriptがBlueprintsに置き換えられていることに注意してください(ただし、同僚には戻ってくると確信しています)。DLLのホットローディングは、直交機能です。
サムホセバー

9

独自のスクリプト言語を作成しましたが、なぜ既存の言語を使用する代わりに独自のスクリプト言語を使用することにしたのですか?

私は他の言語から構文を借りましたが、持っています。全体として、それは素晴らしい学習体験であり、私の場合は、言語が単純だったのでそれほど難しくはありませんでした。

主に、チームの全員がスクリプトに精通しているため、スクリプトに通常のCスタイルの構文を使用したかったため、これを行いました。

また、プログラミング言語の実装について少し学ぶことに興味があり、非常に単純な機能のサブセット(変数、算術、条件、ループ、ゲーム内の関数またはコルーチンの呼び出し)のみが必要だったため、試してみることにしました。

開発中にどのリソースに相談しましたか?

私の主なリソースはこの本でした:

ここに画像の説明を入力してください

私はこの本から以下を実装するのに十分なことを学べました。

  • レクサー:正規表現を使用することはほとんど簡単で、Regex.Matchを使用してトークンを識別および分割するだけです。
  • 再帰降下パーサー:基本的に、文法の各ルールに1つの関数と、トークンを先読みして消費するヘルパーメソッド。インスピレーションを得るためにC#の文法仕様を見ました。最も難しいのは、無限再帰に入らずに算術演算子と関係演算子の優先順位を処理することでした。
  • ASTインタープリター:ビジターデザインパターンを使用して、パーサーから生成されたツリーを走査し、各命令ノードを再帰的に実行しました。

必要なほとんどすべてが既に機能していたので、1つだけを除いて、そこで停止していました-再帰的なインタープリター内からUnity3Dコルーチンを呼び出して譲ります。その問題を解決するために、私は再帰を取り除く必要があり、再び本に目を向けました。今回、私は追加することになりました:

  • コンパイラ:別のビジターですが、コードを実行する代わりに、ASTの各ノードから小さなアトミック命令のリスト(つまり、単純なスタックベースのカスタムアセンブリ言語)を生成します。whileループやif条件などの操作は、ラベルとgoto-type命令に変換されます。この時点で、コンパイル済みのスクリプトをバイナリファイルとしてディスクに書き込みます。
  • バイトコードインタープリター:単純な命令リストを反復処理します。再帰がなければ、Unity3Dコルーチンと簡単に統合できました。

プロセス全体はゼロ知識から約2週間かかり、とても楽しかったです:)

PS:最後に、ツールにカスタム言語の構文強調表示とインテリセンスを追加したいと考えました。この点で、シンチッラは命の恩人でした。次のラッパーを使用しました。

http://scintillanet.codeplex.com/


5

私はこれを提案しましたが、ほとんどの人はluaを提案していますが、それは私のタイプのプログラミングに合わないようです。

OK、別の角度からこれを試してみましょう:あなたが好きではないLuaについてはどうですか?簡単に修正できるものですか、それとも基本的なものですか?

たとえばthen/do/end、適切なC / C ++スタイルの中括弧ではなく、コードブロックを示すなどのキーワードを使用します。それがあなたの問題なら...それはあなたが修正できるものです必要なのは、Luaの小さな方言を定義し、中括弧構文を実際のLuaに変換する簡単な変換ツールを作成することだけです。

何らかの形で+ =が必要ですか?また、前処理システムで簡単に実行できます。フォームのステートメントをにexpr1 += expr2変換するだけexpr1 = expr1 + expr2です。

確かに、中括弧のペアがテーブルを表すのかペアを表すのかを検出する方法を見つける必要がありますdo/end。そして、、、およびその他の標準Luaライブラリ関数をオーバーライドしてdofile、前処理システムをLuaにフックする必要がありloadstringます。しかし、それはすべて最終的に実行可能です。

そのような小さな問題は、あなたの懸念される、とあなたも、どのようにコードだけの変化に1つのプログラミングスタイルに固執している場合(注:これは一般的にひどいプログラマーとして持っている品質)、これははるかに単純により実行可能な代替案自分の言語を書く。これにはせいぜい数週間かかります。豊富なデバッグサポートなどを使用して、適切な言語に費やす年数と比較してください。

問題がこれよりも大きい場合(グローバルがデフォルトであるためlocal、どこでも使用する必要があります)、これらの一部を管理できます(変更された環境とメタテーブルを使用して、新しいグローバルの宣言をエラーにするだけです)。ファーストクラスのオブジェクト、コルーチン、ガベージコレクション、またはLuaのその他の基本要素としての機能が嫌いな場合は、そうですね。

あなたは本当に、場合と、本当にそれについてのハードコアになりたい、あなたはコンパイルすることを自分自身の言語を記述することができルアに。したがって、少なくとも非常に十分にテストされたLuaランタイム、例外的なLua API、およびその他すべての基本的なLua機能を、すべて!Lua言語から活用することができます。これには時間がかかりますが、それはまだではありません年間あなたが何か他のものに費やすだろう。


私にとっては、Luaを使用する場合は、関数をコーディングするだけのように思えます。私はただコードを動かしているように感じます。
スキッパー

1
@skiperic:それがどういう意味かわかりません。例を挙げていただけますか?
ニコルボラス

上記のLaurentの回答を参照してください。
スキッパー

2
@skiperic:それはあなたが関心を持っていることを実際に説明していません。Luaでコーディングできますか?はい。そして問題は...?
ニコルボーラ

1
@BartekBanachewicz:それがC APIであることを受け入れても、私が見た多くのC ++ベースのスクリプティングAPIよりも優れています。それは、何らかの自動化されたバインダーなしで、実際にrawの使用を検討する唯一のスクリプトAPI です。
ニコルボラス

3

他の答えを補完するために、これは厳密なバイナリオプションではありません。既存のスクリプト言語内で、独自のDomain-specific_languageを作成することもできます。このアプローチの利点は次のとおりです。

  • 実際には、正式な文法、パーサー、カスタムエディターの実装などを台無しにする必要はありません。
  • ゲームに固有の追加の抽象化など、特殊なスクリプト言語を実装することの利点を最大限に活用できます。
  • vs.自作:選択したスクリプト言語に精通しているユーザーは、すぐにDSLを使用できます。
  • 対単純な既存の言語:スクリプト言語に精通していないユーザーは、ゲームを変更するためにDSLの知識のみを必要とします。

主な欠点は、「ベース」言語の制約でDSLを設計することです。


2

それは可能性があなたのゲームの仕組みに応じて、意味をなします。単純なメカニズムを備えた一部のゲームでは、インタープリター言語を使用して、過度に複雑なLua / Pythonコーディングから身を守ることができますが、複雑さの節約はあまり価値がないかもしれません。たとえば、これらのInteractive Novelゲームの1つは、カスタム作成のスクリプトエンジンを簡単に使用できます。

ゲームに物理エンジン、さまざまなゲームコンポーネント、さまざまな複雑なキャラクターや能力が含まれる場合、他の既存のスクリプト言語を検討することを検討する必要があります。そのため、カスタム言語に必要な機能を追加したり、バグを修正したりする必要はありませんそれ。Luaが最も高速である可能性が最も高いのですが、構文についてはもっと気に入っていただけるものが他にもたくさんあり、それらの多くはCとの統合がいかに簡単かを自慢しています。Python、Ruby、およびAngelscriptは少数です。(コメントで他の人を自由に言及してください)

そのような言語が「論理制御」にのみ使用されるようにすれば(つまり、氷の塊に触れるブラストなど、特定のオブジェクトタイプの特定の衝突ケースを処理する)、パフォーマンスはほとんど問題になりません。もちろん、一方で、より多くのルーチンコード(各フレームを実行するカスタムの衝突チェックアルゴリズムを作成する)にそれらを使用すると、動きが取れなくなる可能性が高くなります。


1
Luaは、ゲーム開発で非常に人気のあるスクリプト言語でもあります。
フィリップ

うん、Luaはあちこちで使われていますが、OPは彼がそれをあまり好きではないと指摘しました。コーディングスタイルの設定が重要になる場合があります。
Katana314

1
たとえば、これらのInteractive Novelゲームの1つでは、カスタム作成のスクリプトエンジンを簡単に使用できます。Informを見たことはありません。本当に、テキストの冒険であっても、あなた自身の言語を作る意味はありません。
ニコルボーラス

1
@ Katana314: " コーディングスタイルの好みが重要になる可能性があります。 "正直ところ、プログラマーが "コーディングスタイル"について高い評価を得ると、世界は良くなるでしょう。<優先言語をここに挿入>が他の全員の<優先言語をここに挿入>よりも基本的に優れていると考えるのをやめれば、私たちはすべてより良いプログラマーになるでしょう。ビルドキャラクターの構文が気に入らない言語を使用すると、この種のバグ思考を回避できます。
ニコルボーラス

1

私は言う、それのために行きます。履歴書では、能力の余分なショーになります。ただし、最初にその能力が必要であることに留意してください。簡単なことではなく、かなり難しいことです。このテーマに関する本やオンラインチュートリアルもありますが、最終的にはコンパイラーの動作とコードの解析と翻訳の方法についての理解が得られるでしょう。

シンプルに始めて、頻繁にテストし、理想を保持してください。しかし、LUAがあなたのためにあることを常に覚えておいてください。


1
ここでの質問は、目標がゲームを作ることなのか、履歴書で見栄えの良いものを作ることなのかということだと思います。
Tridus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.