なぜC ++はまだ「ハイブリッド」なのか


16

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

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


これを強制できる既存のコンパイラ/ IDE設定はありますか?
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner私はそれを行うツールを知りません。ただし、これらの機能が標準C ++の一部である場合は、このようなツール(コンパイラ、IDEなど)を記述する方が合理的です。
サキスク

2
C ++の存在理由後方互換性であり、Cで可能であったすべての汚いトリックを使用する可能性です。それが必要な場合は、C#、D、またはJavaだけを使用しないのはなぜですか?
ニキー

5
@nikie:はははは。テンプレート、値型、強参照、決定論的破壊、多重継承、実行速度、メモリ使用量が少ないため、これらはまったく存在しません。
DeadMG

2
@nikie:DもObject例外であり、右辺値や言語で分類された連想配列(なぜ...)のような嫌悪感や、独自のその他の疑わしい設計上の決定があります。また、事実上、他のGCパラダイムと同じGCパラダイムを持っているため、メモリ使用量が少ないことを疑問に思います。
DeadMG

回答:


26

はい、強力な理論的根拠があります。C++コードはほとんどの場合、既存のCコードを呼び出す必要があります。私たちにできることは、良いコードを簡単に書くことです。悪いコードを書くことを不可能にするために言語設計者ができることは何もありません。


1
もちろん、これはレガシコード専用であるため、C ++の新しいバージョンが互換性を維持する必要があるのはなぜですか?従来のコードでは、古いバージョンのC ++を引き続き使用できます。
サキスク

15
@faif、私の仕事では、新しいCコードとのインターフェイスを必要とする新しいC ++コードを常に記述しています。それは単なるレガシーの問題ではありません。
カールビーレフェルト

5
@faif:C ++の新しいバージョンは後方互換性が必要です-古いCコードだけでなく、既存のC ++コードの数億行もサポートするため。あなたは下位互換性が、より良い設計されていない何かをしたい場合は、ここでジョエル・スポルスキの後方互換性のための必要性について本当に良い記事があり、ちなみにD.のような言語に切り替えることは自由です。joelonsoftware.com/items/2008 /03/17.html
Doc Brown

4
The best we can do is make it easy to write good code.-同じC ++について話していますか?
BlueRaja-ダニーPflughoeft

4
@ BlueRaja-DannyPflughoeft:JavaやC#よりもC ++で良いコードを書く方がずっと簡単だと思います。C ++を使用すると、クラスを読み取ることができ、他のすべてのクラスが動作する場合、メモリとリソースがリークしないことがわかります。JavaとC#では、それはできません。他のクラスを調べて、ファイナライズが必要かどうかを確認する必要があります。また、C ++テンプレートを使用すると、Javaで繰り返す必要があるコードを乾燥させることができます。
ケビンクライン

20

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

いいえ、そうではありません。まったく。理由の些細なデモンストレーションとして、エレガントを定義し、それから私は10人があなたに反対するようになることを賭けます。

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

特に、標準の文字列クラスとストリームクラスは実際には悪臭を放ちます。std::stringユニコードのサポートがなく、想像できる最悪の肥大化したインターフェースがあります。ストリームには、非常に大きなオーバーヘッドがあり、デザインが貧弱で、仮想継承、関数ポインター、そしてconst char*そのようないものに頼っています。これらのクラス/クラスグループの両方をカスタムのものに完全に置き換えたとしても、誰にもペナルティを科しません。

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


+1はやや現実的なアプローチ(「エレガントなコード」の会話が停止する場合:/
ルーク

2
「言語に強制されたコーディングスタイルは、本当に、本当に悪いです。」例を挙げていただけますか?Pythonの強制コードインデントのような単純なものでも、コードの可読性が向上すると思います。
サキスク

3
これに同意するかどうかはわかりません。JavaScriptでCoffeeScriptを使用する主な理由は、CoffeeScriptがよりエレガントなコードの記述を強制するように設計されているためです。
user16764

3
これに同意できません。一部の言語設計は、優れた実践を促進することを目的としていますが、C ++の大部分の広大でボルトで固定された性質により、一般的にこれは不可能です。実際、C ++ 11の存在の背後にある主要な動機は、言語を選別し、良い部分を維持し、残りを改善することです。
ロバートハーベイ

1
@Pubby:「動作するいプログラムを作成する方が、何もしない美しいプログラムを作成するよりも優れています。」確かに、私はそれに同意することができます。しかし、この記事はそれをはるかに超えており、さは実際には美徳であると主張しているようです。そしてそれはばかげている。
メイソンウィーラー

8

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

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

次に、まず何を定義する必要があります エレガントの意味。次に、エレガントの定義が、C ++が使用されているすべての問題のあるドメインおよびプラットフォームに適切かどうかを確認する必要があります。Windows用のワードプロセッサの記述に適したコーディングスタイルは、組み込みシステムの記述にはまったく適していません。

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

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


1
もっと同意できませんでした。「C ++は柔軟です」と誰かが言うと、Cよりも多くのパラダイムをサポートするためだと思います。
prelic

5

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

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

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

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


Jon Purdyの素晴らしい引用を追加するつもりです。

それはすべてプラグマティズムとエレガンスに帰着します。私にとっては、正確で美しいコードに執着しているにもかかわらず、機能しないいプログラムを書く方が、何もしない美しいプログラムを書くよりも優れています。

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


プラグマティズムとエレガンスは矛盾していると思いますか?Python、Ruby、Scalaは、実用的でエレガントな言語の良い例だと思います。
サキスク

1
@faif:いいえ。ただし、後方互換性とエレガントさは矛盾しています。これはPythonにも当てはまります(2.xと3.x)。
dan04

4

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

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

同時に、C ++でエレガンスを有効にするだけでなく、これらの機能を使用してより良いコードを書くように人々に教え、導くために、かなりの人が本当に多くの時間と努力を費やしていることに注目する価値があると思います多くのBoost貢献者)。そのため、コードを「クラス付きC」として記述し続ける人々は、とにかくそこにあるものをほとんど無視しています。彼らは過去10年以上にわたってC ++の使用方法について学んだことをすべて無視しているのと同じように、新しいコンパイラを無視するのと同じくらい快適だと思います(たとえば、Modern C ++ Designは11年前に公開されましたが、ほとんどの人はあなたが話しているのはまだ聞いたことがないようで、その最も単純な部分でさえ読んだり理解したりすることはほとんどありません)。


2

あなたのアイデアは、Javaの背後にある設計原理の多くを構成します。Javaは、クラスの使用、パッケージ階層に応じたファイル階層の整理、例外のキャッチなどを強制します。人々は、その中にCのようなコードを書くことに何とかしています。

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


0

C ++には「1つの真の方法」はありません。すべてのアプローチには長所と短所があります。ソリューションは、さまざまな方法で作成できます。

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


0

あなたがリストしたものはすべてオプションであるという事実は、より多くの優雅さの可能性を生み出します。私の目には、不必要に使用されている機能は洗練されていません。

プログラミングを使用して解決する必要がある問題は非常に似ていません。
OOの原則(GUIなど)を使用して十分に解決できるものもあれば、純粋に機能的な処理(数値など)に適しているものもあれば、低レベルの「シリコンに近い」言語で表現するのが最適なものもあります。

多くのソフトウェアは、これらの方法のいずれかで最適に解決されるサブ問題を解決する必要があります。ソリューションを特定の形式に強制すると、目的に合わないコードになります(「エレガントではない」と言うこともあります)。

これが、C ++のハイブリッド性が優れている理由です。現在の定説ではなく、問題に合った方法で膨大な数の問題を解決できます。
もちろん、それは誤用される可能性があります-柔軟なものを持っているときはいつでもそれをひどく曲げる危険があります-しかし、優雅さは、流行が何であれ順守することではなく、慎重な思考と経験から来ます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.