私はDについてあまり知りませんが、私が知っている多くの多くのC ++プログラマーはそれを非常に嫌っています。私は個人的に同意しなければなりません-私はDの外観が好きではなく、より近いものを取りません
Dがこれ以上の牽引力を得ていない理由を理解するためには、何が人々をC ++に引き付けるかを理解することから始める必要があります。つまり、一番の理由はコントロールです。C ++でプログラミングすると、プログラムを完全に制御できます。標準ライブラリを置き換えたいですか?あなたはできる。安全でないポインターキャストを行いたいですか?あなたはできる。const-correctnessに違反したいですか?あなたはできる。メモリアロケーターを交換したいですか?あなたはできる。タイプに関係なく生メモリをコピーしたいですか?本当にしたい場合。複数の実装から継承したいですか?それはあなたの葬式です。地獄、Boehmコレクターのようなガベージコレクションライブラリを取得することもできます。次に、パフォーマンスなどの問題があります。これは、制御に密接に追随します。プログラマーの制御が強いほど、プログラムをより最適化できます。
ちょっとした調査をして、それを試した数人の人に話しかけたときに私が見たことがいくつかあります。
統一されたタイプ階層。C ++ユーザーが継承を使用することはほとんどありません。ほとんどのC ++プログラマーは合成を好みます。タイプを継承するのは、そうする理由が十分にある場合にのみ継承を介してリンクする必要があります。オブジェクトの概念は、すべてのタイプをリンクすることにより、この原則に強く違反します。さらに、C ++の最も基本的な原則の1つに違反しているため、必要なものだけを使用します。Objectからの継承についての選択肢が与えられていないこと、およびそれに伴うコストは、プログラマーが自分のプログラムを制御できるという点で、C ++が言語として意味するものに非常に強く反対しています。
関数とデリゲートの問題について聞いたことがあります。どうやら、Dには実行時呼び出し可能関数型として関数とデリゲートの両方があり、それらは同じではありませんが、交換可能です... 私の友人は彼らにいくつかの問題を抱えていました。これは間違いなくC ++からのダウングレードであり、これでstd::function
完了です。
次に、互換性があります。DはC ++と特に互換性がありません。私が意味する、何の言語はC ++ / CLIを除いて、それに直面させ、C ++との互換性がありません不正行為の一種であるが、参入障壁として、言及されるように持っています。
それから、他にもいくつかあります。たとえば、Wikipediaのエントリを読むだけです。
import std.metastrings;
pragma(msg, Format!("7! = %s", fact_7));
pragma(msg, Format!("9! = %s", fact_9));
printf
gets
古いC標準ライブラリのような大きな問題と同じファミリで、これまでに考案された最も安全でない関数の1つです。Stack Overflowで検索すると、誤用に関する多くの質問が見つかります。基本的に、DRYのprintf
違反です-書式文字列で型を指定し、引数を指定したときに再度指定します。DRYの違反で、間違えた場合、非常に悪いことが起こります。たとえば、typedefを16ビット整数から32ビット整数に変更した場合です。また、まったく拡張可能ではありません。誰もが独自の形式指定子を考案した場合にどうなるか想像してください。C ++のiostreamは遅く、演算子の選択は最大でなく、インターフェースは作業を使用できますが、基本的に安全であることが保証されており、DRYは違反されず、容易に拡張できます。これは言えることではありませんprintf
。
多重継承はありません。それは、C ++のやり方ではありません。C ++プログラマは、プログラムを完全に制御できることを期待しており、継承できないものを強制する言語はその原則に違反しています。さらに、デフォルトの実装などを提供するためにインターフェイスからクラスに型を変更すると、突然すべてのユーザーのコードが破損するため、継承(さらに)が脆弱になります。それは良いことではありません。
別の例はあるstring
とwstring
。C ++では、それらの間で変換する必要があり、すでにこのライブラリはUnicodeをサポートしており、この古いCライブラリはのみを使用しconst char*
、必要な文字列引数タイプに応じて同じ関数の異なるバージョンを記述する必要があります。たとえば、Windowsヘッダーには、たとえば、独自のコードを妨害することが多い問題に対処するための非常に刺激的なマクロがいくつかあります。dstring
ミックスに追加しても事態が悪化するだけです。2つの文字列タイプではなく、3つを管理する必要があります。複数の文字列型を使用すると、メンテナンスの負担が増え、文字列を処理する反復コードが導入されます。
スコット・マイヤーズはこう書いている:
Dは、プログラマーが最新のソフトウェア開発の課題に取り組むのを支援するために構築されたプログラミング言語です。これは、正確なインターフェース、緊密に統合されたプログラミングパラダイムの連携、言語によるスレッド分離、モジュール型の安全性、効率的なメモリモデルなどを通じて相互接続されたモジュールを育成することで実現します。
言語によるスレッド分離はプラスではありません。C ++プログラマーは、プログラムを完全に制御できることを期待しており、何かを強制する言語は、医師が注文したものではないことは間違いありません。
また、コンパイル時の文字列操作についても説明します。Dには、コンパイル時にDコードを解釈する機能があります。これはプラスではありません。すべてのベテランC ++プログラマーによく知られているCの比較的限られたプリプロセッサーによって引き起こされる大きな頭痛を考慮して、この機能がどれほどひどく悪用されるか想像してください。コンパイル時にDコードを作成する機能は優れていますが、構文ではなくセマンティックでなければなりません。
さらに、特定の反射が期待できます。Dにはガベージコレクションがあり、C ++プログラマは、哲学でJavaやC#のような言語にかなり直接的に反対する言語に関連付けます。また、構文の類似点もあります。これは必ずしも客観的に正当化できるわけではありませんが、注意すべき点です。
基本的に、C ++プログラマーがまだできないことはそれほど多くありません。Dで階乗メタプログラムを書く方が簡単かもしれませんが、すでにC ++で階乗メタプログラムを書くことができます。おそらくDでは、コンパイル時のレイトレーサーを作成できますが、とにかくそれを実行したい人はいません。C ++哲学の根本的な違反と比較して、Dでできることは特に注目に値しません。
これらが表面上の問題にすぎない場合でも、表面上では、Dが実際にはC ++のように見えないという事実は、おそらく多くのC ++プログラマーがDに移行していない正当な理由であると確信しています。おそらく、Dは自分自身により良い仕事をする必要があります。