D言語研究室



D言語への招待

D言語が必要となる背景 - D言語の特徴 - D言語の現在の様相 - yaneSDK4Dの制作

D言語が必要となる背景

C++もいい加減嫌になってきたので言語を自作しようかと思っていました。

新しい言語を作る前に、JavaとC#での開発はどうなんだと聞かれそうです。

Javaはnativeコードを吐けないので論外でしょう。
仮にnativeコードを吐くようなコンパイラを作って、これがJavaコンパイラだと言おうものなら、本家のほうから訴えられかねません。

そもそもJavaの言語仕様はC#と比べれば遙かに劣るので、Javaコンパイラだと公言できないJavaコンパイラなど作るだけの魅力がないのです。

C#は言語仕様としては、かなり私の理想に近いです。Linux上でもコンパイラが動作しており、Microsoftが作っているということもあって、ある程度将来性も約束されています。しかし、.NET Frameworkをインストールしていないと動かないという時点で、実行ファイルの配布には向かないと判断しました。そもそもC#を推奨しているMicrosoft自体がDDK等のサンプルソースをC#で書いてないですし。

私が欲しいのは、nativeコードを吐ける、小さな実行バイナリを生成できる、ゲームに使えそうな、こまわりの利く、それでいて少なくともJava、欲を言うならC#レベルの抽象度で記述できる言語です。

無ければ自分で作るしかありません。

そんな中、かつてから注目していたD言語のことを思い出したのです。

D言語の設計者と言えば、あのWalter Bright氏。(低価格/高速コンパイラで名を馳せた Datalight C。世界初のnative-C++コンパイラ Zortech C++、そしてその後継であるSymentec C++、Java開発環境 Cafeすべて彼の手がけた作品です。)

言語仕様は以前ちらっと見たものの、実装(コンパイラ)がなかったのでそのまま気にもとめてなかったのですが、最近、ある程度コンパイラが動くようになってきたようなので、これゲームに使えないかなぁ、と思いました。

D言語の特徴

D言語の特徴を見ていきましょう。

Java,C#に見られるような
・GC(Garbage Collector)標準装備。
・delegateや無名関数
・全てのクラスがObjectから派生
・final属性

C++に搭載している機能で言えば
・テンプレート
・例外

細かい機能で言えば、
・switchで文字列比較が出来る
・stringや連想配列が内蔵型である
foreach構文
・コンストラクタ名が this
・配列のスライシング。
・nested 関数。

いまどきの機能で言えば
・DbC(Design by Contract:契約による設計)
・unitテスト機能(まだ発展途上っぽい)
・auto属性によるRAII

と..まあ、欲しいものは一通りあります。

現在なさそうなものは、
・namespace的なもの

C++から不要なものを省いて、いまどきの言語機構を追加したような感じで、内容的にはC#か、あるいはDbCやテンプレートが使えるという面ではC#よりさらに一歩前を行っている印象を受けます。

GCは非同期で動作するためゲームを作成する上でフレーム落ちの原因になったりしてGC内蔵の言語はゲームには向かないというのが通説ですが、マシンがある程度速い or GCのタイミングをある程度制御できるのであれば、ほとんど気にならない程度になるのではないかと思っています。

また、GC付き言語だと遅くなるのではないかとも言われていますが、いまどきのGCはメモリのコンパクション(使っていないメモリを詰めること)を行ない、ワーキングセットを縮小するので、CPU cacheにヒットしやすくなり、むしろ高速化が期待できます。(でも実際試してないのでわかりません。のちのち調べていきたいと思います。)

あと、D言語は実用を重視した言語です。何とインラインアセンブラを言語レベルでサポート(?)しています。正確に言うと、CPUごとに定義されています。例えば、x86系のDコンパイラならば、必ず同じ構文が使えるということです。

つまり、Win32版の D Compiler の Intel Pentium 向けインラインアセンブラは、Linux版のIntel Pentium 向けのものと同じ構文なのです。

D言語のインラインアセンブラ + SDL[ライブラリ](Win32とLinuxで動作するゲーム用のライブラリ)を用いれば、がりがりアセンブラで Win32とLinux上で動くプログラムが書けてしまいます。なんだか楽しそうですね。

少し使った感想は、C++よりはるかに楽、C++を知っている人ならほとんど習得に時間を要しません。言語仕様はC++より洗練されていますし余分な贅肉がない分だけ覚えるのも楽です。最初はbetter C++として使っていけばいいんじゃないかと思います。

D言語の現在の様相


まだコンパイラ自体は発展途上で、コンパイラのバグやライブラリに関しては未実装の部分もあるようですが、少なくともDigitalMarsのDコンパイラでOpenGLを使ったり、SDLやDirectX9を呼び出すなどは出来ています。→D言語用サンプルプログラム関係

私は、openGLのメガデモであるglExcessをD言語用に移植してみました。

glExcessをDに移植する

比較的簡単に移植でき、問題なく動いていることから、C/C++の代わりに使っていけそうです。

そこで、ゲーム開発に使えなくはないと思います。少なくともD言語で書かれたサンプルプログラムがこれだけ動いているのを目の当たりにして、これでD言語でゲームが作れないとか言おうものなら、「お前は阿呆か」と言われそうです。そうです。間違いなく、D言語でゲームは作れます。ただ、商用で使うのはまだ怖すぎるというだけです。

あとは、統合環境やオープンなD言語の実装も欲しいところですが、そのへんは時間の問題でしょう。

裏を返せば統合環境が整備されるまでは、VisualC++.2003のほうがはるかに開発効率がいいというのは事実だと思います。(D言語とC++の開発環境とを比較するのはナンセンスだとは思いますが、現実的にソフトウェアを作っていかなければならないので参考までに。)

現状で、私が理解しているD言語の問題点を列挙しておきます

・デバッグ環境が整っていないこともあって、あまり大きな規模な開発になると辛いかも知れません。VisualStudioを持っていれば、シンボリックデバッグを行なうことが出来ます。→ デバッガで追いかける

・D言語に付属のライブラリ側には細かいバグがいろいろあるようです。SDLやOpenGLを呼び出す分には何ら関係ありませんが。

・コンパイラがαバージョンということもあって、今後仕様変更になる可能性もあり、それに伴いソース変更を余儀なくされかねません。実際のゲーム開発ならばライブラリを呼び出すようにして、極力ライブラリ側で言語の仕様変更を吸収する形となるでしょう。

・namespaceに相当するものがmoduleという概念しかないので、大きなライブラリを作る時に問題となるかも知れません。→ ひとつのファイルが名前空間を持つので、そんなに問題にならないようです。

・D言語からC++で書かれたライブラリやコードの呼び出しは比較的簡単に行なえます。ただし、WindowsAPIを呼び出そうとすると、APIすべてがportingされているわけではないので都度自分でportingする必要が出てくる場合があります。

以上を踏まえて、「それでもD言語、やってみる?」ということです。

新しい言語を作ろうと思っていた私にとって、もうすでに実装が出来あがっていることや、OpenGL,SDL[ライブラリ],DirectX9を呼び出せるということだけでもう十分。あとは足りないものは、私が作る!という意気込みで始めました。

幸いにして、DigitalMars社のDコンパイラの実装には、コンパイラ部分のソースがついています。(コンパイルするためにはファイルがいくつか足りないようですが)

ソースはDコンパイラ本体が1M、ライブラリのほうが500k程度です。比較的短くて読みやすいソースなので何か疑問に思うことがあればソースを追いかけることも出来そうです。

最終的にはD言語を用いてフリーの環境だけで商用ゲームのプログラムを作ります。ある意味チャレンジャーですが..ただ、私はコンパイラのバグがあるなら、別にソースがついているのですから自分で(コンパイラのバグを)徹底的にデバッグするという気はあります。そこまでは覚悟を決めています。

yaneSDK4Dの制作

そんなわけでテストを兼ねてまずはD言語用のゲームライブラリを制作していきます。
名付けて、yaneuraoGameSDK for D。略してyaneSDK4D。

さて、構想はと言いますと、

・当然フリーで公開する
SDL[ライブラリ]をOO(ObjectOriented)にwrapする → これにより Win32 と Linuxの両方で動くライブラリにする
・yaneuraoGameSDK2nd/3rdに存在するクラスの移植

ここまで進めば、そのあとyaneSDK4Dで実際に商用ゲームを作ってみようと思っています。(Windows or Linuxのゲーム制作のお仕事くださいm(_ _)m)

また、開発環境一式という形で配布も考えています。→ 実際には転載に際して何かと問題があるかも知れないので、指定したファイルを指定したURLから落としてくるインストーラーを用意して、ワンタッチでDコンパイラ〜SDL、それからyaneSDK4Dまでセットアップしてくれるようなものを考えています。

そうすれば、「初心者でも無料で簡単にゲームが作れる」というのに一歩近づくと思います。


Last Updated : 2004-4-19

written by yaneurao
http://bm98.yaneu.com/dlang/