D言語研究室



D言語総評

雑感 - D言語に欲しい機能 - スクリプトとしてのD言語 - D言語 known bug - かきかけ

雑感

少し使ってみた感じですが、C++を知っていてJavaを少しかじったことさえあれば違和感なく使えます。いまのところ逆にすんなり行きすぎて驚いています。better C++として使っていくのも悪くないかな、と思っています。

しかしまあ、速度面、開発効率etcは数万行規模のソースを書いてみて、商用レベルのソフト(or ライブラリ)を作ったときに初めて評価できるものだと思います。

それまで、D言語について結論めいたものを出すのは保留しておきます。

いまのところ、いい感じで使えています。とりあえずはそれだけに留めておきます。

D言語に欲しい機能

リンクするlibの指定

リンクするlibの指定


VC++でソース上でリンクすべきlibファイル(or dll)をpragma指定することがありますが、あれと同じ機能が欲しいと思いました。

スクリプトとしてのD言語


・考え中のアイデア

htmlファイルをDコンパイラに食わせると、codeタグで囲まれた部分のみをプログラムと見なして実行ファイルを生成します。

近年のゲーム開発では、いかにしてターンアラウンド(テスト→コード修正→再実行までのサイクル)を早めるかが課題になっていますが、簡単なスクリプト言語があれば、各マップごとや各敵ごとに異なるスクリプトを用意していくことも可能です。

そこで、D言語自体をスクリプトとして使えばどうでしょうか?

開発段階では、Dコンパイラ経由でスクリプトコードをコンパイルします。コンパイルした結果は実行ファイル(DLL)となりますから、ここで出来たDLLを読み込んでスクリプトコードを実行します。製品リリース時には、Dコンパイラで事前にすべてのスクリプトコードをコンパイルしておきます。

DLL側からEXE側で用意された関数にどうやってアクセスするのかとか、ちょっと問題も無くはないでしょうけれど、そのへんはinterfaceをきっちり決めておけば何とかなるでしょう。

これは、なかなか悪くないアイデアだと思います。特に、DコンパイラはCコンパイラよりプリプロセス等がないせいか、ずいぶんコンパイルが速いという印象を受けます。そういう意味ではスクリプト言語として十分使えるんではないかと思います。

Lua[言語]を使うのも良さそうな選択肢ですね。

D言語 known bug

SDLがコンパイル出来ない - 前方宣言しかしていないクラスを用いてテンプレートを実体化すると落ちる(;´Д`) - 浮動小数を0で割るコードはコンパイルエラーにならない - unionのバグ - class内classのアクセス属性 - naked functionのなかでthisを参照するコードが正しく生成されない

ここでは、DMDコンパイラの既知のバグを紹介しておきます。お気づきの点などありましたら、D言語スレ[管理者:やねうらお]のほうへ書き込みお願いしますm(_ _)m
対象としているDMDコンパイラは、ver 0.76です。0.77がリリースされたので、古い記事は、近々整理します。

SDLがコンパイル出来ない


・ver0.77で確認。

module名とstruct名が同じだとコンパイル中にコンパイラが落ちると判明しました。
SDL_version.dのなかで定義されているSDL_versionというstructが原因です。

とりあえずは、SDL_version.dをSDL_version_.dとリネームして、import SDL_version;と書いているところを import SDL_version_;と書けばokです。

本家news groupに報告しておきました。

http://www.digitalmars.com/drn-bin/wwwnews?D/21027

・ver0.78では未修整。再度報告済。

前方宣言しかしていないクラスを用いてテンプレートを実体化すると落ちる(;´Д`)


・ver0.76

class foo; template X(T) {} instance X(foo) g;


・ver0.78
class foo;
クラスの前方宣言だけで落ちます(;´Д`)
0.79でなおってなければ報告しよっと..。

浮動小数を0で割るコードはコンパイルエラーにならない



void main() {
  int a = 0.1  / 0;    // コンパイルが通る
  stdout.printf("%d\n", a);
}


浮動小数の場合 0 で割ると inf か -inf になるので、エラーにはならないようです。整数に変換した結果は CPU 依存なのかも。とりあえず Pentium III では .min になるようです(C でも確認)。

unionのバグ

union 内で struct を直接作るとおかしくなります。


import std.c.stdio;
union U {
  char c;
  struct { int a; }
}
void main() {
  U u;
  printf("%d\n", (byte*)&u.a - (byte*)&u);
}

<<出力>>
4  (0 になって欲しい)


class内classのアクセス属性


同じmoduleに置かれたclassは暗黙のうちにfriend関係になります。
ところが、class内のclassに対しては、friend関係ではありません。

これがbugなのかどうかはわかりませんが..。

naked functionのなかでthisを参照するコードが正しく生成されない



class Test {
	void	test(){
		m = 1;
		asm {
			naked;
			ret;
		}
	}
	int m;
	void print() { printf("%d\n",m); }
}

int main(){

	Test tt = new Test;
	tt.test();
	tt.print();
	return 0;
}


-debugオプションをつけてコンパイルするとthisがスタック上にあるものとしてコードを吐いるようです。このバグは私が発見して、ロバートさんが以下のように追試してくださいました。


C7 40 08 01 00 00 00 : mov [EAX + 8], 1
C3 : ret

の前に

8B 45 FC : mov EAX, [EBP - 4]

が入っています。このコードの場合は何故か普通に実行できましたが、
[EBP - 4] にたまたまちゃんとした値があっただけでしょうね...。

push EAX; 〜 pop EAX; で挟めば回避できますが、
-g 以外では無意味なコードを埋め込むことになってしまいますね...。
それなら確かに全部アセンブリで書いた方がいいですね。


かきかけ

かきかけって言ったらかきかけなの!
どんどん書くから待ってれ!(`Д´)


Last Updated : 2004-4-19

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