英語版
このページの英語版を見る

ベターC

リンクする

Cの関数やライブラリをDプログラムにリンクするのは簡単である。 しかし、D関数やライブラリをCプログラムにリンクするのは簡単ではない。

Dプログラムには一般的に

  1. Dランタイム・ライブラリがリンクされていること。 コア言語の多くの機能がランタイム・ライブラリのサポートを必要とするからである。
  2. 必要なランタイム・ライブラリ・サポートが適切に初期化されるように、main() 。 必要なランタイム・ライブラリのサポートが適切に初期化されるようにする。

D関数とライブラリをCプログラムにリンクするには、Cのランタイム・ライブラリがリンクされている必要がある。 Cランタイム・ライブラリがリンクされている必要がある。これは、次のように定義することで実現できる。 BetterC と呼ばれるD言語のサブセットを定義することによって達成される。

より良いC

実装定義: BetterC は通常-betterC コマンドラインフラグを設定することで有効になる。

BetterCバージョン D_BetterC を条件付きコンパイルに使うことができる。

Cmain() 関数を提供することで、プログラム全体をBetterC :

extern(C) void main()
{
    import core.stdc.stdio : printf;
    printf("Hello betterC\n");
}
> dmd -betterC hello.d && ./hello
Hello betterC

プログラムをこのランタイム機能のサブセットに限定することは、次のような場合に役立つ。 このような機能を使用することが現実的でない、あるいは不可能な制約のある環境をターゲットとする場合に有効である。 をターゲットとする場合に有効である。

BetterC によって、既存の大規模プロジェクトへのDライブラリの組み込みが容易になる:

  1. ビルドシステムレベルでの統合プロセスを簡素化する。
  2. ライブラリの呼び出し時にDruntimeが適切に初期化されていることを確認する必要がなくなる。 初期化ステップが実行されない場合や、ライブラリが使用される前に初期化ステップを挿入することが困難な場合のために 初期化ステップが実行されないか、ライブラリが使用される前に挿入することが困難な場合のために、Druntimeがライブラリ呼び出し時に適切に初期化されるようにする必要性を取り除く。
  3. メモリ管理ストラテジー(GC + 手動メモリ管理)を混在させることは厄介である。 それゆえ、D's GCを方程式から外すことは、時には価値があるかもしれない。
注釈:BetterCとImportCは大きく異なる。 ImportCは実際のCコンパイラである。BetterCはDのサブセットで、C標準ライブラリの存在だけに依存している。 のサブセットである。

保持される機能

ほぼ全言語が使用可能である。ハイライトは以下の通り:

  1. コンパイル時機能の無制限使用
  2. 完全なメタプログラミング機能
  3. 入れ子関数、入れ子構造体、デリゲート、ラムダ
  4. メンバ関数、コンストラクタ、デストラクタ、演算子オーバーロードなど。
  5. 完全なモジュールシステム
  6. 配列スライシング、配列境界チェック
  7. RAII(例外なしで動作可能)
  8. scope(exit)
  9. メモリ安全性保護
  10. C++とのインターフェイス
  11. COMクラスとC++クラス
  12. assert 失敗はCランタイム・ライブラリに導かれる
  13. switch 文字列
  14. final switch
  15. unittest
  16. printf フォーマット検証

でunittestを実行する。-betterC

テストは-betterC フラグなしでも実行できるが、-betterC でテスト・スイートも実行したい場合がある。 unittest ブロックは getUnitTestsでリストすることができる:
unittest
{
   assert(0);
}

extern(C) void main()
{
    static foreach(u; __traits(getUnitTests, __traits(parent, main)))
        u();
}
> dmd -betterC -unittest -run test.d
dmd_runpezoXK: foo.d:3: Assertion `0' failed.
しかし、-betterCassert 式はDruntimeのassertを使わず、代わりにCランタイム・ライブラリからassert に誘導される。

使用できない機能

BetterC で利用できないD機能:

  1. ガベージコレクション
  2. タイプ情報と ModuleInfo
  3. クラス
  4. 組み込みのスレッド(例えば core.thread)
  5. 動的配列(ただし、静的配列のスライスやポインタは動作する)
  6. 連想配列
  7. 例外
  8. synchronized そして core.sync
  9. 静的モジュールのコンストラクタやデストラクタ