Improve this page Github へのログインが必要です。 簡単な修正は、ここから fork、オンライン編集、pull request ができます。 大きな修正については、 通常の clone で行って下さい。 Page wiki 関連するWikiページを参照・編集 English このページの英語版(原文)

比較

To D, or not to D.

William Nerdspeare

この表は、よく他の言語と比べられる機能に関して、 D のさまざまな特徴をリストアップしてみた結果です。 どの言語も標準ライブラリによって得られる機能を多く持っていますが、 ここでは言語そのものに組み込まれた特徴にのみ着目することにします。 その理由

D言語機能 比較表
機能 D
ガベージコレクション Yes
関数
関数デリゲート Yes
関数オーバーロード Yes
出力パラメータ Yes
ネストした関数 Yes
関数リテラル Yes
クロージャ Yes
型安全な可変個引数 Yes
遅延関数引数評価 Yes
コンパイル時関数評価 Yes
配列
Lightweightな配列 Yes
可変サイズ配列 Yes
組み込みの文字列 Yes
配列のスライシング Yes
境界チェック Yes
配列リテラル Yes
連想配列 Yes
強い typedef Yes
文字列によるswitch Yes
型の別名定義 Yes
オブジェクト指向プログラミング
オブジェクト指向 Yes
多重継承 No
インターフェイス Yes
演算子オーバーロード Yes
モジュール Yes
動的なクラスのロード No
ネストしたクラス Yes
内部(アダプタ)クラス Yes
共変の戻り値型 Yes
プロパティ Yes
パフォーマンス
インラインアセンブラ Yes
ハードウェアへの直接アクセス Yes
Lightweightなオブジェクト Yes
明示的なメモリ割り当て制御 Yes
VM 非依存 Yes
ネイティブコードの直接生成 Yes
総称プログラミング
クラステンプレート Yes
関数テンプレート Yes
暗黙の関数テンプレートインスタンス化 Yes
部分・明示特殊化 Yes
値テンプレート引数 Yes
テンプレートテンプレート引数 Yes
可変個テンプレート引数 Yes
テンプレート制約 Yes
ミックスイン Yes
static if Yes
is式 Yes
typeof Yes
foreach Yes
暗黙の型推論 Yes
信頼性
契約プログラミング Yes
単体テスト Yes
静的オブジェクトの初期化順保証 Yes
初期化済み保証 Yes
RAII(自動デストラクタ) Yes
例外処理 Yes
スコープガード Yes
try-catch-finally ブロック Yes
スレッド同期プリミティブ Yes
互換性
C言語風構文 Yes
列挙型 Yes
Cの全ての型のサポート Yes
80bit 浮動小数点数 Yes
複素数, 虚数 Yes
Cへの直接アクセス Yes
既存のデバッガを利用可能 Yes
構造体のアラインメント Yes
標準的なオブジェクトファイルの生成 Yes
マクロテキストプリプロセッサ No
その他
条件コンパイル Yes
Unicodeソースファイル Yes
ドキュメント化コメント Yes

注釈

オブジェクト指向
これは、クラスやメンバ関数、継承、 仮想関数によるディスパッチに対応していることを示しています。

インラインアセンブラ
多数のC/C++コンパイラがインラインアセンブラをサポートしてはいますが、 これは言語の標準の一部となってはいません。 各コンパイラ毎に構文はバラバラで、実装の質も統一されていません。

インターフェイス
C++のインターフェイスへの対応は、IDL(インターフェイス定義言語) が開発されねばならなかった事実が示しているように、不十分です。

モジュール
多くの人がC++は正確にはモジュール機構を持っていない、と言うでしょう。 しかし、C++の名前空間は、ヘッダファイルと組み合わせることで、 モジュールの持つ機能の多くをカバーしています。

ガベージコレクション
Hans-Boehm のガベージコレクタをC/C++プログラムでも用いることは可能ですが、 これは言語の標準規格ではありません。

暗黙の型推論
これは、 宣言の型をその初期化子から取ってくる機能を指しています。

契約プログラミング
Digital Mars C++ コンパイラは拡張として 契約プログラミング をサポートしています。 契約プログラミングを行うための C++ でのテクニック とDとを比較してみてください。

可変サイズ配列
C++の標準ライブラリの一部として可変長配列が実装されていますが、 言語そのものの一部ではありません。 規格に適合したフリースタンディグ処理系 (C++98 17.4.1.3) でも、 これらのライブラリを提供する必要は必ずしもありません。

組み込みの文字列
C++の標準ライブラリの一部として文字列(std::string)が実装されていますが、 言語そのものの一部ではありません。 規格に適合したフリースタンディグ処理系 (C++98 17.4.1.3) でも、 これらのライブラリを提供する必要は必ずしもありません。

強いtypedef
強いtypedefは、型を構造体でラップすることで、C/C++でも擬似的に実現することはできます。 しかしこの方法では非常に煩雑なプログラミングを強いられることになるため、 C/C++は強いtypedefに対応していない、と言えるでしょう。

既存のデバッガを利用可能
これは、実行ファイル内のよくあるデータ形式を扱うことのできる、 汎用デバッガの利用を意味しています。 特定の言語を扱う場合にのみ役に立つ専用デバッガは必要となりません。

構造体のアラインメント
大多数の C/C++ コンパイラは構造体メンバのアラインメントを制御する pragma を備えていますが、標準規格ではなく、 コンパイラ毎に互換性がありません。
C# 標準規格である ECMA-334 25.5.8 では、 構造体メンバの整列については次のように述べられているのみです: "The order in which members are packed into a struct is unspecified. For alignment purposes, there may be unnamed padding at the beginning of a struct, within a struct, and at the end of the struct. The contents of the bits used as padding are indeterminate." それゆえ、Microsoft は特定のメンバの整列を拡張としてサポートしているかもしれませんが、 それは公式なC#標準の一部ではないのです。

Cの全ての型のサポート
C99 で、C++にない多くの型が追加されました。

80bit 浮動小数点数
CとC++の規格ではlong double型について定められているにもかかわらず, 実際には80bit(以上)の浮動小数点数を実装したコンパイラはあまりありません。 (Digital Mars C/C++ を除いては。)

ミックスイン
Mixinは、言語ごとに実に様々な定義をされています。 D のミックスイン は、 任意の種類の宣言を取り出し、それらを現在のスコープへ挿入(ミックス)します。 グローバル、クラス、構造体、ローカルの どのレベルでも宣言をMixinすることが可能です。

C++ でのミックスイン
C++ の Mixin は、二つの異なった意味のテクニックを指しています。 一つ目は、Dのインターフェイスクラスに似た物です。二つ目は、 次の形式のテンプレートを作ることです:
template <class Base> class Mixin : public Base
{
    ... mixin 本体 ...
}
DのMixinとは異なります。

static if
C や C++ のプリプロセッサの #if は、D の static if と同じ物と思えるかもしれません。しかし、これらの間には大きく決定的な違いがあります - #if は、プログラム内の定数や型、その他のシンボルにアクセスできません。 #if が扱えるのはプリプロセッサのマクロのみです。 この例 をご覧下さい。

is 式
is式 によって、型の性質に基づいた条件コンパイルが可能になります。 これは、テンプレート引数パターンマッチという方法を用いると C++ でも同じようなことが可能です。二つの異なるアプローチの比較については、 この例 をご覧下さい。

内部(アダプタ)クラス
ネストしたクラス というのは、 定義が別のクラスのスコープの内側にあるもののことを指します。 内部クラス は、ネストしたクラスであって、 外側のクラスのメンバを参照することができるもののことです。 外側クラスの'this'ポインタを保持していると考えてもよいかもしれません。

ドキュメント化コメント
ドキュメント化コメントとは、 特別な形式のコメントを使ってソースコードからドキュメントを生成する、 標準化された方法のことを指しています。

間違い

もしこの表について何か間違いがありましたら、お知らせ下さい。 修正します。