dmdとgdcのあれこれ

さて、D言語を書こうと思った時にまず必要なのはコンパイラだ。私の知る限り、D言語コンパイラは3つある。

私はgccやg++に慣れ親しんでいたので、まずgdcを使ってみることにした。Debian系のLinuxなら恐らく以下のコマンドを叩けばよいだろう。

# apt-get install gdc

これですんなりはいってしまうのもgdcの魅力の1つだ。使い勝手はほぼ完全にgccと一緒だ。最も簡単なコンパイル方法は、単に以下のようにすればよい。

$ gdc hoge.d

最適化オプションもgccと同じだし、-gやら-c, -oオプションなんかも同じだ。これは便利!・・・と思っていたのだが、1つ不可解な挙動を見つけた。-cオプションを使うと、なぜかファイル名が微妙に変わってしまうのだ。例えば

$ gdc -c hoge.d

とすると、生成されるファイルはhoge.oであって欲しいのに、なぜかhog.oになる。意味不明である。まあ別に-oでファイル名を指定して出力すればいいだけの話なのだが、どこかでそれをし忘れたりして、のちのち面倒を起こしそうな予感しかしない。そんなわけで、私はおとなしく公式のdmdを使うことにした。

dmdのインストールは、私は公式ファイルから.debファイルをダウンロードしたが、どうやらaptでも入るっぽい。使い方も特段変わったところはなく、単に以下のようにすればよい。

$ dmd hoge.d

最適化オプションが-Oだったり(-O3のように数字はつかない)と、微妙にオプションが違うのでそこは気をつける必要がある。

さて、公式なので大した不具合もないだろうということで安心してdmdを使っていたわけだが、1つ不可解な挙動に気づいた。分割コンパイルをしたときに、一部のファイルを編集してからmakeすると(makeファイルは必須)、なぜだかおかしなバイナリが生成されるのだ。何がおかしいかというと、クラス内の一部のメソッドがなかったかのような扱いを受けるのだ。意味がわからない。実際意味がよくわかってないので、現象の記述がこれで正確なのかもわからない。

結論から言うと、どうもdmdを単なるリンカとして使うとダメらしい。つまり、

$ dmd -c hoge.d
$ dmd -c fuga.d
$ dmd hoge.o fuga.o

のように、最後にオブジェクトファイルだけをリンクするような形で記述すると不具合が出るんだそうな。これも怪しげなソースと経験から導かれた結論なので、詳しくはわからない。

以下のようにすれば問題が回避できる。

$ dmd -c hoge.d
$ dmd hoge.o fuga.d

つまり、最後に一気にまとめてリンクするのではなく、1つだけ.dファイルをその場でコンパイルしてやればよいのだ。今のところ、これで不具合は出ていない。

D言語の思想は素晴らしく、ぜひとも成功して欲しいプロジェクトだが、こういったところで不便を強いられると、ユーザが離れていかないか心配だ。ぜひなんとかして欲しい。

ちなみに、ldcはなかなかイケてるらしいが、aptでインストールしようとすると依存関係が解消出来ずに死んでしまった。ちなみに私の環境はインストールしたばかりのUbuntu 12.04 LTSである。何かが間違っている。しかし、噂によると公式でバイナリが配布されているらしい。dmdに絶望することがあったら試してみよう。

今回はコンパイラの話ばかりだったので、次回からはD言語の中身の話をしたいと思う。