2017年11月09日：鶴岡

はじめに

こんにちは、プログラマーの鶴岡です。

今日は普段あまり表に出ることのない、ゲーム開発に使われている開発環境についての紹介をします。

今回紹介するのは、社内製プログラミング言語の「Mint」です。

なんとハル研では、ゲーム開発のために独自のプログラミング言語を仕様策定からコンパイラやVMの実装も含め、自社で開発しているのです。変わってるでしょ？

Mintは以下のような特徴を持っています。

・エラーに気づきやすい静的型付け言語

・C++経験者が理解しやすい言語仕様

・OSに依存しない高速なC#製コンパイラ

・実行環境に依存しないC++の仮想マシン

・C/C++の関数・クラスが簡単にバインド可能

今はオープンな実装の素晴らしいプログラミング言語がたくさんあり、それらを使うメリットも数多くあります。

それでも社内独自の言語を使うのはさまざまな利点があるからです。

一番大きなものは「ハル研の開発スタイルに合わせて言語仕様を変えることができる」ことです！ 開発するゲーム内容やプラットフォームの都合に最適な言語仕様を考えることができます。

今回はその中の1つとしてthis_typeという構文を紹介します。

this_type

自分の型を返す関数ってよくありますが、面倒くさいですよね。

class A_Class { public: static A_Class Create() { return new A_Class(); } }

this_typeを使うと、先ほどのコードを以下のように書くことができます。

class A_Class { public: static this_type Create() { return new this_type(); // A_Classの定義内ではthis_type==A_Classとなる } }

もう少し複雑な例を挙げます。これと似たような(しかもコピーする必要がある)クラスを、 名前を変えながら数十、数百と増やしていくことを想像してみてください。

/// this_typeを使って書くことで、クラス名を変えるときに /// Create()やCreateWithTwo()の修正が不要になります。 /// 地味な改善ですが数が増えるとこれが結構効いてきます。 class A_VeryLongClassNameMadeByHallab { public: static this_type Create() { return new this_type(); } static this_type CreateWithTwo() { return new this_type(2); } static this_type Create(int aValue) { return new this_type(aValue); } this() { } this(int aValue) { mValue = aValue; } private: int mValue; }

this_typeがあるとゲームでよく使われる状態遷移モデルのような仕組みを書くのが大変楽になります。

現場では以下のようなクラスがたくさん作られるため、 面倒な置換作業の削減＆置換忘れによるバグを減らす(これが大切)ことができるのです。

/// 待機状態 struct StateWait { public: static void ChangeState(Obj aObj) { this_type newState(aObj); aObj.stateChanger().setNextState(newState); } void procAnim() { // 状態毎に違う処理 } . . }

まとめ

自社の開発スタイルに合わせて言語を拡張していけるのが、プログラミング言語を自社開発している強みです。

時代と共に変化する様々な環境にも、Mintは対応し続けています。

これ以外にも、ハル研ではよりよいゲームを作るために開発環境に様々な工夫をしていますが、それはまたの機会にぜひ。

それから、今月開催するインターンシップ2017 プログラマーコースでは、実際にこのプログラミング言語を利用してワークショップに取り組みます。参加者のみなさん、ぜひ社内の開発環境を感じてくださいね。