2005年10月 6日
D言語のGCCフロントエンド
D言語のGCCフロントエンド (GDC) があると知ったので試してみました。
インストール
Debian パッケージにはまだなっていないようなので、GDC 0.15 を GCC 3.4.4 とともにソースからビルドしてインストールしました。自分では試していませんが、 cygwin の場合は GDC はパッケージ化されていて簡単にインストールできるそうです。
% wget ftp://ftp.ring.gr.jp/pub/GNU/gcc/gcc-3.4.4/gcc-3.4.4.tar.bz2 % tar jxf gcc-3.4.4.tar.bz2 % cd gcc-3.4.4/gcc % wget http://home.earthlink.net/~dvdfrdmn/d/gdc-0.15.tar.bz2 % tar jxf gdc-0.15.tar.bz2 % cd .. % gcc/d/setup-gcc.sh % mkdir build % cd build % ../configure --enable-languages=c,d,c++ --prefix=/usr/local/gcc-3.4 % make % sudo make install
hello, world
次に hello, world をコンパイルして実行しました。
% cat hello.d import std.cstream; int main(char[][] args) { dout.writeLine("hello, world"); return 0; } % /usr/local/gcc-3.4/bin/gdc -o hello hello.d % ./hello hello, world
デマングリング (demangling)
hello のサイズは 520KB ほどになりました。 nm a.out を実行すると何やらたくさんシンボルが含まれています。 「_D3std6stream10ishexdigitFaZb」といったシンボル名は c++filt ではデマングリングできないので別の規則に従っているようです。
調べてみると
dfilt.d というそれらしいものが見つかりました。そのままではコンパイルが通らなかったので、少々修正してコンパイルしてから nm hello | ./dfilt と実行すると、さきほどのシンボル名は bit std.stream.ishexdigit(char) と復元されました。
日本語の情報源
D言語についての日本語の情報は充実しています。D言語はとりわけゲーム開発によく使われているようです。
dfilt.d へのパッチ
このパッチは本家に 取り込んでもらえたので、もはや不要です。
% diff -u dfilt.d.orig dfilt.d |escapehtml --- dfilt.d.orig 2004-09-12 19:06:11.000000000 +0900 +++ dfilt.d 2005-10-07 00:42:51.000000000 +0900 @@ -1,4 +1,4 @@ -private import std.stream; +private import std.cstream; private import std.regexp; private import std.string; private import std.ctype; @@ -39,13 +39,13 @@ char[] all = ""; try { int c; - while ((c = ins.getc()) != -1) { + while ((c = ins.getc()) != char.init) { all ~= cast(char)c; } } catch (Error e) {} - char[][] lines = all.split("\n"); + char[][] lines = std.string.split(all, "\n"); foreach (char[] line; lines) { for (int i = 0; i < line.length-1; i++) { if (line[i..i+2] == `_D` && (i == 0 || !issym(line[i-1]))) { @@ -88,7 +88,7 @@ } else { // @@@ is it ok? - int sep = rfind(now, "_"); + int sep = std.string.rfind(now, "_"); if (sep > 0) { try { int dummy = 0; @@ -280,7 +280,7 @@ else { int main(char[][] args) { Demangle d = new Demangle(); - d.run(std.stream.stdin, std.stream.stdout); + d.run(din, dout); return 0; }