D 1.0   D 2.0
About Japanese Translation

Last update Tue Feb 8 21:27:10 2011

dmd - Linux D Compiler

必要なもの

  1. Dコンパイラのダウンロード
  2. 32 bit x86 Linux OS (64bit Linux でも動くようです)
  3. Gnu C compiler (gcc)

ファイルリスト

/dmd/src/phobos/
D ランタイムライブラリのソース。
/dmd/src/dmd/
D コンパイラフロントエンドのソース。GPL もしくは Artistic License のデュアルライセンスです。
/dmd/html/d/
ドキュメント
/dmd/samples/d/
サンプル
/dmd/linux/bin/dmd
D コンパイラ実行ファイル
/dmd/linux/bin/dumpobj
Elfファイル出力ツール
/dmd/linux/bin/obj2asm
Elfファイル逆アセンブラ
/dmd/linux/bin/shell
シンプルなコマンドラインシェル
/dmd/linux/bin/dmd.conf
コンパイラの共通設定ファイル (/etc/dmd.confへコピーする)
/dmd/linux/lib/libphobos.a
Dランタイムライブラリ (/usr/lib/libphobos2.aへコピーする)

インストール

  1. 書庫をホームディレクトリへunzipで展開します。 ~/dmd ディレクトリが作られ、 全てのファイルがその中に入っています。 ツールは全てコンソールから利用するコマンドライン用ツールです。
  2. dmd.conf/etc へコピー:
    cp /dmd/linux/bin/dmd.conf /etc
    
  3. 環境変数 PATH/dmd/linux/bin を追加するか、 Linux版の実行ファイルを /usr/local/bin へコピー。
  4. 最後に、ライブラリファイルを /usr/lib へコピーします:
    cp /dmd/linux/lib/libphobos2.a /usr/lib
    

64bit Linux への dmd のインストール

dmd は 32bit コンパイラなので、32bit のGNUライブラリのインストールが必要です:

sudo apt-get install gcc-multilib g++-multilib libc6-i386 libc6-dev-i386

ia32-libs パッケージには更に多くの 32bit ライブラリが収納されているので、 追加でインストールしても構いません:

sudo apt-get install ia32-libs

簡易インストールのために .deb パッケージを使っている場合、 i386 専用なのでエラーが発生するかもしれません。強制インストールするには、

sudo dpkg -i --force-architecture dmd_X.XXX-0_i386.deb

とします。X.XXX にはパッケージのバージョン番号が入ります。

コンパイラの引数とスイッチ

dmd files... -switch...
files...
拡張子 ファイルの種類
none D言語のソース
.d D言語のソース
.dd Ddoc のソース
.di D インターフェイスファイル
.o リンクしたいオブジェクトファイル
.a リンクしたいライブラリファイル
@cmdfile
cmdfile が環境変数の名前であれば、 その環境変数から、 コンパイラへの引数とスイッチを読み込みます。 それ以外の場合、 テキストファイル cmdfile から引数とスイッチを読み込みます。
-c
コンパイルのみ。リンクはしません
-cov
コードカバレッジ解析 を有効にする
-D
ドキュメント生成
-Dddocdir
ドキュメントファイルを docdir ディレクトリに出力
-Dffilename
ドキュメントファイルを filename に出力
-d
非推奨(deprecated)な機能を有効化
-debug
デバッグ用にコンパイル
-debug=level
指定したデバッグレベル以下のコードを全てコンパイル
-debug=ident
デバッグ識別子を指定してコンパイル
-debuglib=libname
デバッグ情報つきのコンパイル時に、libphobos.a の代わりに libname をデフォルトライブラリとしてリンクします
-defaultlib=libname
デバッグ情報なしのコンパイル時に、libphobos.a の代わりに libname をデフォルトライブラリとしてリンクします
-deps=filename
モジュールの依存関係をテキストで filename に書き込みます
-fPIC
位置独立コード(Position Independent Code)を生成
-g
ZeroBUGS 等のデバッガ向けに Dwarf シンボリックデバッグ情報を D extensions として付加。
-gc
gdb 等のデバッガ向けに Dwarf シンボリックデバッグ情報を C形式で付加。
-H
Dインターフェイスファイルの生成
-Hddir
Dインターフェイスファイルの出力ディレクトリ dir の指定
-Hffilename
Dインターフェイスファイルのファイル名 filename の指定
--help
ヘルプメッセージを出力
-inline
関数のインライン展開を有効にします。 これによってパフォーマンスは向上しますが、 デバッグが難しくなります。
-Ipath
import されたモジュールを検索するパスの指定。path; で分かち書きしたパスのリストとします。複数回 -I を使うことも可能で、 その場合は -I と同じ順でモジュールが検索されます。
-ignore
非対応pragmaを無視します
-Jpath
ImportExpression で指定したファイルを探すパス。このスイッチは ImportExpression を使う際に必須となります。 path には ; で区切ったパスのリストを指定します。 複数の -J スイッチを指定することも可能で、 パスは指定された順番に検索されます。
-Llinkerflag
-L-M などとして、 linkerflag をリンカへ渡します。
-lib
オブジェクトファイルの代わりにライブラリファイルを出力します。 コンパイルされたソースファイルおよび、 引数で指定されたオブジェクトファイルやライブラリが、 まとめて出力ライブラリに格納されます。 粒度を上げるために、コンパイルされたソースモジュールはライブラリ内で 別々のオブジェクトへと分割して格納されることがあります。 ライブラリの名前は、最初に渡されたソースファイルの名前から取られます。 これは、 -of スイッチによる上書きが可能です。
-m32
32bit実行ファイルにコンパイルします。これがデフォルトです。
-m64
64bit実行ファイルにコンパイルします。
-man
BROWSER 環境変数に指定されたブラウザでこのページを開きます。 BROWSER が未定義の場合、 x-www-browser を実行します。
-O
生成コードを最適化。 最高速の出力を得るには、-O -release -inline を使用してください
-o-
オブジェクトファイルを生成させない
-odobjdir
オブジェクトファイルをカレントではなく objdir からの相対で出力
-offilename
出力ファイル名を filename に設定。出力ファイルは、 他のスイッチに応じてオブジェクトファイル、実行ファイル、 あるはライブラリファイルのいずれかになります。
-op
オブジェクトファイルの名前を決める際、通常は ソースファイル名のディレクトリ名部分を削りますが、 -op はこれを残します。
-profile
生成したコードの実行パフォーマンスを測定する Profiling 用の情報を追加
-quiet
重要でないコンパイラのメッセージを抑制
-release
リリース用にコンパイル つまり、契約、assert、配列の境界チェックのコードを入れずにコンパイルします。
-run srcfile args...
ソース srcfile のコンパイル、リンクを行い、 生成されたプログラムに残りのコマンドライン引数 args... を渡して起動します。 .o や実行ファイルを後に残すことはありません。
-unittest
単体テスト用コードをコンパイルし、assertを有効にします。 また、unittestバージョン識別子を有効にします。
-v
メッセージを冗長に出力
-version=level
指定したバージョン番号以上のコードを全てコンパイル
-version=ident
バージョン識別子を指定してコンパイル
-w
警告を有効にします
-wi
情報表示のみの警告 (つまり、 警告が出てもコンパイル・リンクは継続する) を有効にします

リンク

リンク処理は dmd コンパイラによって、 コンパイルが成功した後自動的に実行されます。これを禁止するには、 -c スイッチを使用します。

実際のリンク処理は gcc が行います。このため、 gcc でコンパイルされたモジュールとの互換性が保証されます。

環境変数

Dコンパイラ dmd は以下の環境変数を使用します:
CC
dmd は、通常はリンカとして gcc を環境変数 PATH から探します。特定のリンカを指定したい場合は、 CC 環境変数を設定します。例:
set CC=gcc
BROWSER
-man スイッチでこのマニュアルページを開く時のブラウザの指定に使用されます。 デフォルトは x-www-browser です。
DFLAGS
dmd は、コマンドラインの最後に DFLAGS の内容が追加されたかのように動作します。

dmd.conf 初期設定ファイル

設定ファイル dmd.conf はWindowsでの sc.conf と同じもので、違うのは名前だけです。 WindowsとUnix系システムで同じ設定ファイルを 変更なしで共有することが出来ます。

dmd は初期設定ファイル dmd.conf を、 以下のディレクトリから順番に探します:

  1. カレントディレクトリ
  2. HOME 環境変数で指定されたディレクトリ
  3. dmd のあるディレクトリ
  4. /etc/

dmd.conf が見つかった場合、 このファイルで設定された環境変数が既存の設定を上書きします。 他のプログラムの環境変数による設定との衝突を避け、 dmd の設定を独立させる簡単な方法となっています。

環境変数は [Environment] セクションのヘッダの後ろに続けて、 NAME=value という組の形で記述します。 NAME は常に大文字扱いになります。 コメントは行頭の ; から始める行です。例としては:

; dmd.conf file for dmd
; %% で囲まれた部分はすでに設定された環境変数の名前とみなして
; その場に展開されます。特殊記法 %@P% は、
; dmd.confファイルが存在するパスへと置き換えられます。
[Environment]
DFLAGS=-I%@P%/../src/phobos

Windows版とLinux版の違い


D インターフェイスファイル

Dのソースコード中の import 宣言が処理される際には、 コンパイラは、その import に対応するDのソースファイルを検索し、 見つかったファイルから import に必要な情報を取り出します。 これとは別に、コンパイラは対応する D インターフェイスファイル を探して使うこともできます。 D インターフェイスファイルはそのモジュールの実装全てではなく、 importに必要な情報だけが記述されたファイルです。

Dのソースファイルではなくインターフェイスファイルを import に使用することの利点は:

D インターフェイスファイルは、コンパイラに -H スイッチを指定することで、 D ソースファイルから生成します。 D インターフェイスファイルの拡張子は .di です。 コンパイラが import 宣言を解決する際には、まず .di D インターフェイスファイルを検索し、次に D ソースファイルを探します。

D インターフェイスファイルは、ある意味で C++ のヘッダファイルによく似ています。 しかし、C++のヘッダファイルのような意味で必要になるわけでもなければ、 Dという言語の一部でもありません。 これは、コンパイラの機能の一つで、 ビルド処理の最適化のためだけに使用されます。

実行ファイルのビルド

dmd は、コンパイル対象のソースコードを一度にコマンドラインでまとめて指定する方が、 ずっと高速に実行ファイルを生成できます。

dmd の一度の起動に複数のソースファイルをまとめて渡すもう一つの利点は、 それによって、モジュールを超えたインライン展開などの最適化を dmd が行える可能性があることです。

ライブラリのビルド

ライブラリのビルド方法は3種類あります。例として、コンパイルするソース foo.dbar.d、 既存のオブジェクトファイル bar.o、そして既存のライブラリ def.a を全てまとめて、foo.lib というライブラリをビルドする場合を考えてみましょう:

  1. それぞれを個別にコンパイルし、ライブラリ化コマンドを実行:
    dmd -c foo.d
    dmd -c bar.d
    rm -f foo.a
    ar -r foo.a foo.o bar.o abc.o def.a
    rm foo.o bar.o
    
    この方法は、makefile などを使うことで、 モジュールの余計な再コンパイルを避ける時などに適しています。
  2. 一括でコンパイルを行い、ライブラリ化コマンドを実行:
    dmd -c foo.d bar.d
    rm -f foo.a
    ar -r foo.a foo.o bar.o abc.o def.a
    rm foo.o bar.o
    
  3. dmd で、コンパイルとライブラリ作成を一発で実行:
    dmd -lib foo.d bar.d abc.o def.a
    
    オブジェクトファイルがディスクに書き出されることはなく、全ての中間処理はメモリ上で行われます。 -lib のもう一つの利点としては、一つのモジュールが一つのオブジェクトファイルに対応するのではなく、 さらに細かく分割して複数のオブジェクトとして格納されることです。 これによって、モジュールを手で分割することなしに 粒度を上げることができます。

dmd のコンパイル

dmd コンパイラのビルドに必要なソースは全て提供されています。 以下の手順でビルドが可能です:

cd ~/dmd/src/dmd
make -f .mak

Phobos のコンパイル

Dのランタイムライブラリである Phobos ビルドに必要なソースは全て提供されています。 以下の手順でビルドが可能です:

cd ~/dmd/src/phobos
make -f .mak DMD=~/dmd/bin/dmd