D vs その他の言語
To D, or not to D. -- Willeam NerdSpeare
この表は、 よく他の言語と比べられる機能に関して、 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 | ||||
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) でも、
これらのライブラリを提供する必要は必ずしもありません。
ここにC++のstringとDの組み込みの文字列との 比較 があります。
- 強い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 は、
任意の種類の宣言を取り出し、それらを現在のスコープへ挿入(ミックス)します。
グローバル、クラス、構造体、ローカルの
どのレベルでも宣言を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++ でも同じようなことが可能です。
二つの異なるアプローチの比較については、
この例 をご覧下さい。
- Adaとの比較
- James S. Rogers が Adaとの比較表 を書いています。
- Delphiとの比較
- D言語研究のWikiで Delphiとの比較 があります。
- 内部(アダプタ)クラス
- ネストしたクラス というのは、
定義が別のクラスのスコープの内側にあるもののことを指します。
内部クラス は、ネストしたクラスであって、
外側のクラスのメンバを参照することができるもののことです。
外側クラスの'this'ポインタを保持していると考えてもよいかもしれません。
- ドキュメント化コメント
- ドキュメント化コメントとは、 特別な形式のコメントを使ってソースコードからドキュメントを生成する、 標準化された方法のことを指しています。
間違い
もしこの表について何か間違いがありましたら、お知らせ下さい。 修正します。