web-dev-qa-db-ja.com

C ++がまだ「ハイブリッド」である理由

関連 の質問で、C++が多くの点でCと互換性がない理由が明確になりました。ただし、C++は依然として「ハイブリッド」*言語です。そして残念なことに、多くのプログラマーはC++を「ストリームと組み込み文字列を備えたC」と見なしています。その結果、C++でもCでもない、非常に悪いコードが作成されます。言語/コンパイラがある程度プログラマに強制して、より洗練されたコードを書くようにした方がよいでしょう。それでは、最新のC++(たとえばC++ 0xと将来のバージョン)をハイブリッドに保つための根拠はありますか?

*ハイブリッドとは、標準の文字列とストリーム、クラス、デフォルト以外の名前空間などを使用するかどうかをプログラマが決定することを意味します。

16
sakisk

はい、強い根拠があります。C++コードはほとんどの場合、既存のCコードを呼び出す必要があります。最善の方法は、優れたコードを簡単に作成できるようにすることです。言語設計者が悪いコードを書くことを不可能にするためにできることは何もありません。

26
kevin cline

私見、言語/コンパイラがある程度のプログラマに、より洗練されたコードを書くことを強制した方がいいでしょう。

いいえ、そうではありません。全然。理由の簡単なデモンストレーションとして、エレガントを定義してください。そうすれば、10人の人々があなたに反対することになるでしょう。

言語強制コーディングスタイルは本当に、本当に悪いです。壊れるすべてのレガシーコードは言うまでもありません。

特に、標準の文字列とストリームクラスは実際にはsuckです。 std::stringは、Unicodeをサポートしておらず、想像できる最悪の肥大化したインターフェースを備えています。ストリームには、恐ろしいオーバーヘッドと貧弱な設計があり、仮想継承、関数ポインター、const char*とそのような醜い。これらのクラス/クラスグループの両方をカスタムクラスに完全に置き換えることで、誰にもペナルティを課しません。

クラスや名前空間を使用しないことは、ホワイトボードスタイルのコードには問題ありません。また、クラスにはない関数を提供する多くのライブラリがあります。強制クラスは本当に悪い考えです。

20
DeadMG

C++は、Cスタイルのコードを記述できるためではなく、手続き型、オブジェクト指向、汎用などのいくつかのプログラミングパラダイムをサポートするため、ハイブリッドです。さまざまなパラダイムを使用するとさまざまな問題をより簡単に解決できるため、C++は1つの方法で強制することはありません。それが強みです。

私見、言語/コンパイラがある程度のプログラマに、より洗練されたコードを書くことを強制した方がいいでしょう。

次に、最初にelegantの意味を定義する必要があります。次に、エレガントの定義が、C++が使用されているすべての問題のあるドメインとプラットフォームに適しているかどうかを確認する必要があります。 Windows用のワードプロセッサを作成するためのエレガントなコーディングスタイルは、組み込みシステムの作成にはまったく適さない場合があります。

DSPで実行するC++コードの作成を検討してください。まず、そのDSPのC++コンパイラは、ストリームなどの特定のC++機能をサポートしない場合があります。第2に、CPU速度、および場合によってはメモリの制約が厳しいため、一部のC++機能は単にパフォーマンスを低下させる可能性があります。たとえば、速度を上げるために仮想関数を避ける必要がある場合があります。そのような考慮事項は、PCで使用するものと比較して、プログラミングスタイルを根本的に変更し、C++ではそれを可能にします。

要約すると、C++は多くの機能を備えた巨大で複雑な言語です。これらの機能のサブセットが特定のプロジェクトに適用されない理由は多数あります。速度、移植性、コンパイラーのサポート、さらにはプログラマーの経験と親しみやすさです。そのため、言語が特定の機能を他の機能とは対照的に特定の機能に使用することを開発者に強制することは悪い考えです。 Javaについて考えてみましょう。Javaでは、すべての関数はクラスのメソッドでなければならないことを義務付けています。メソッドをラップするためだけにクラスを作成するのは厄介で不必要な場合が多くありますが、言語が強制するため、そうする必要があります。

8
Dima

私見、言語/コンパイラがある程度のプログラマに、より洗練されたコードを書くことを強制した方がいいでしょう。

誰もforcing C++を最初から使用する人はいません。言語があなたに合わない場合は、別の言語を使用してください-「CなしのC++」として請求される多くの言語があります。

C++の設計哲学は、プログラマーに決定させることです。彼らが自分の足を撃ちたければ、放っておいてください。これにより、多くの悪いことを行うことができますが、柔軟性も大幅に向上します。たとえば、BoostがJavaのような言語で記述される可能性は低いです。これは、一般的に避けられている言語の機能と実践を利用しているためです。C++が今日のように大きくなることもほとんどありません。 -広大なCライブラリにアクセスできることは、大きなメリットです。

C++のCとの互換性は、間違いなくその最も弱い点の1つですが、最大の1つであることも覚えておいてください。


私は非常に関連があると思うジョン・パーディによる素晴らしい引用を付け加えます:

それはすべて実用主義と優雅さの両方に帰着します。私にとって、正確で美しいコードへの執着にもかかわらず、機能する醜いプログラムを書くことは、何もしない美しいプログラムを書くことよりも優れています。

ハイブリッドを削除すると、エレガントさが向上する可能性がありますが、機能が妨げられます。

5
Pubby

委員会が人々にもっとエレガントな言語(誰かの考え)を使用するように強制しようとした場合、それはおそらく無視されます。人々は自分たちがやりたいことを続け、コンパイラベンダーは市場をフォローします(ただし、コンパイラベンダーはこれを防ぐのに十分な委員会の代表を持っています)。

とにかくあなたが主張していることの多くは、とにかく問題領域に基づいた判断の問題です。 (一例として)名前空間を必要としない小さなプログラムがたくさんあります。 30行のテキストフィルターを作成しているときに名前空間を使用するように強制しようとすると、愚かで傲慢になります。 X行以上のコード、Y関数、または何が関係する場合にのみ適用することを決定したとしても、それは一般的に逆効果です。名前空間は、特定の問題を防止/解決するために、ある理由のために設計されました。これらの問題がない状態で強制的に使用しようとしても、だれにとっても何の役にも立ちません。

同時に、C++でエレガンスを有効にするだけでなく、それらの機能を使用してより良いコードを書くように人々を指導し導くために、多くの人が実際に多くの時間と労力を費やしていることに注目する価値があると思います(たとえば、多くのBoostコントリビューター)。そのため、「クラスを使用したC」としてコードを書くことを主張し続ける人々は、とにかくそこにあるものをほとんど無視しています。彼らは、過去10年間以上にC++を使用する方法について学んだすべてを無視しているのと同じように、新しいコンパイラーを無視するのと同じくらい快適だと思います(たとえば、Modern C++ Designは11年前に発行されました-しかし、あなたが話している人のほとんどは、まだそれについて聞いたことがないようで、最も単純な部分でさえ、読んだり理解したりすることはほとんどありません)。

4
Jerry Coffin

あなたのアイデアは、Javaの背後にある設計の根拠の多くを構成しています。 Javaは、クラスの使用、パッケージ階層によるファイル階層の編成、例外のキャッチなどを強制します。人々はまだそれにCのようなコードを書いています。

プログラマーとして、最良の解決策が技術的な解決策ではないことを忘れることがあります。この場合、ピアレビューが最もよく知られているソリューションです。

2
Karl Bielefeldt

あなたが挙げたものはすべてオプションであるという事実は、moreエレガンスの可能性を生み出します。不必要に使われている機能は私の目には優雅ではありません。

プログラミングを使用して解決する必要がある問題は非常に似ていません。
一部はOO原理(例:GUI))を使用してうまく解決され、一部は純粋に機能的な処理(例:数値)に適していますが、一部は低レベル「シリコンに近い」言語。

多くのソフトウェアは、これらの方法のいずれかで最もよく解決される部分問題を解決する必要があります。ソリューションを特定の形式に強制しても、その目的にあまり適さないコードにつながるだけです(「エレガントさに欠ける」とさえ言うかもしれません)。

これが、C++のハイブリッド性がgoodである理由です。これにより、現在の教義ではなく、問題に適した方法でさまざまな問題を解決できます。
もちろん、それは誤用される可能性があります-柔軟なものがあると、それが悪い方向に曲がるリスクがあります-しかし、エレガンスは慎重な思考と経験に由来し、流行の日記に固執することに由来するのではありません。

0
molbdnilo

C++には「真の方法」はありません。どのアプローチにも長所と短所があります。ソリューションは100通りの方法で記述できます。

ソフトウェア開発者は、現在のタスクに最適なアプローチを決定する必要があります。

0
Coder