少し使ってみた感じですが、C++を知っていてJavaを少しかじったことさえあれば違和感なく使えます。いまのところ逆にすんなり行きすぎて驚いています。better C++として使っていくのも悪くないかな、と思っています。
しかしまあ、速度面、開発効率etcは数万行規模のソースを書いてみて、商用レベルのソフト(or ライブラリ)を作ったときに初めて評価できるものだと思います。
それまで、D言語について結論めいたものを出すのは保留しておきます。
いまのところ、いい感じで使えています。とりあえずはそれだけに留めておきます。
・考え中のアイデア
htmlファイルをDコンパイラに食わせると、codeタグで囲まれた部分のみをプログラムと見なして実行ファイルを生成します。
近年のゲーム開発では、いかにしてターンアラウンド(テスト→コード修正→再実行までのサイクル)を早めるかが課題になっていますが、簡単なスクリプト言語があれば、各マップごとや各敵ごとに異なるスクリプトを用意していくことも可能です。
そこで、D言語自体をスクリプトとして使えばどうでしょうか?
開発段階では、Dコンパイラ経由でスクリプトコードをコンパイルします。コンパイルした結果は実行ファイル(DLL)となりますから、ここで出来たDLLを読み込んでスクリプトコードを実行します。製品リリース時には、Dコンパイラで事前にすべてのスクリプトコードをコンパイルしておきます。
DLL側からEXE側で用意された関数にどうやってアクセスするのかとか、ちょっと問題も無くはないでしょうけれど、そのへんはinterfaceをきっちり決めておけば何とかなるでしょう。
これは、なかなか悪くないアイデアだと思います。特に、DコンパイラはCコンパイラよりプリプロセス等がないせいか、ずいぶんコンパイルが速いという印象を受けます。そういう意味ではスクリプト言語として十分使えるんではないかと思います。
→
Lua[言語]を使うのも良さそうな選択肢ですね。
ここでは、DMDコンパイラの既知のバグを紹介しておきます。お気づきの点などありましたら、
D言語スレ[管理者:やねうらお]のほうへ書き込みお願いしますm(_ _)m
対象としているDMDコンパイラは、ver 0.76です。0.77がリリースされたので、古い記事は、近々整理します。
・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では未修整。再度報告済。
void main() {
int a = 0.1 / 0; // コンパイルが通る
stdout.printf("%d\n", a);
}
|
浮動小数の場合 0 で割ると inf か -inf になるので、エラーにはならないようです。整数に変換した結果は CPU 依存なのかも。とりあえず Pentium III では .min になるようです(C でも確認)。
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 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 以外では無意味なコードを埋め込むことになってしまいますね...。
それなら確かに全部アセンブリで書いた方がいいですね。
|