今日のC ++の役割は何ですか?


41

現在、私はITの学生であり、今日のC ++で今でも重要なのは何なのか、それは何のために使用されているのでしょうか?私は大学で基本的なC ++コースを修了しましたが、どこで知識を活用でき、どの方向でC ++を学習すべきか想像できません。

言い換えれば、成功したC ++プログラマになるために何を学ぶ必要がありますか?

現在、私は、C ++が今日どの分野で役立つ可能性があるのか​​明確に分からないという理由だけでJavaを学んでいますが、Javaプログラマーとしてどのような仕事をするのかを明確に知っています。しかし、私はまだC ++が死んでいないことを願っています。


2
これが私の視点です。C ++は、リアルタイムの状況(およびビデオゲーム)で非常に便利です。パフォーマンス上の理由から、デスクトップアプリケーションにもC ++を使用しています(Qtを忘れないでください)。
細巻

1
@stign IMOは、おそらく現在使用されているハードウェアが大幅に変更されたために、今日のすべての言語が時代遅れになる時期が来るため、最終的には死ぬ可能性があります。
ケネス

17
C ++は決して死んでいません(私は毎日新しいコードを書いています)。COBOLが何らかの兆候であるなら、私はこれから何年も仕事を続けるでしょう。
マイケルコーネ

2
プログラミング言語ビーコンを見て、あなた自身の結論ますlextrait.com/vincent/implementations.html
ネマニャTrifunovic

1
最近、マイクロソフトのチャンネル9で興味深いビデオを見ました。マイクロソフトは数百万ドルを市場調査に費やしており、その調査に基づいてC ++ルネッサンスについて話している。このビデオをご覧ください。
-grokus

回答:


57

C ++のキラー機能は、スコープにバインドされたリソース管理、SBRM(より一般的には「RAII」として知られています)です。これは、この概念に基づいて構築された唯一の産業用プログラミング言語です。C ++では、すべてのオブジェクトの存続期間が正確に既知であり、(十分に記述された)C ++プログラムは、リソースが完全に決定論的な方法で取得および解放されることを保証します。これに対して、ガベージコレクションまたはその他の方法で管理された言語では、このような保証は提供されません。実際、これらの言語のオブジェクトは、その寿命の終了後も存続する場合があります。

これが、C ++が金融、ビデオゲーム、高性能な組み込みおよびリアルタイムシステム、輸送、製造、および決定性と精度が重要なその他の業界で使用される理由です。代替手段はありません。

確かに、これはこれよりもはるかに多くのタスクに使用され、それらのタスクはC#やPythonなどのより適切な言語に失われていますが、それはコアニッチに影響を与えていません。


20
C ++でmallocを使用している人は誰でも、ハードオブジェクトで頭を打ちたいです。また、new配置と呼ばれるC ++ の演算子のあまり知られていない機能があります。現在占有されているメモリ空間を再利用できます。そのため、誰かが断片化を回避(または最小化)したい場合は、理論的には可能です。そして、予測可能性は同じ決定論的ではありません。
タマスシェレイ

4
@Apalala C ++には参照カウントもありますが、オブジェクトライフタイム管理の点ではSBRMよりもはるかに悪いです。ハードRTの決定論についてだけでなく、オブジェクトモデルの決定論的な動作についても話します。
-Cubbi

4
C ++を学んだとき、RAIIはそれほど広く知られていませんでした。私は新しいことを学び、脳ベースのポインター管理を削除しました。したがって、「コンセプトに基づいて構築されている」とみなすことはできないと思います。現在使用されているライブラリおよびその他のサポート構造には、コア言語または構文はありますが、コア言語または構文はありません。
jprete

7
@jprete C ++の多くの長所が設計されたものではなく発見されたことは確かです。この投稿は、2005年以降の言語に関するものです。
-Cubbi

5
RAII C ++に組み込まれました。しかし、ほとんどのC ++プログラマーはCを書き続け、mallocをnewに、freeをdeleteに置き換えました。
ケビンクライン

40

CとC ++にはいくつかの市場があります(私の理解は限られていますが)

  1. 既存のコード。CおよびC ++には、既存の最大のコードベースがいくつかあります。「次のホットな新しい言語」が登場したという理由だけで、このサイズのコードを単純に捨てることはできません。Cバインディングはほとんどのプラットフォームでの言語間相互作用の標準であるため、CまたはC ++で(少なくとも)ラッパーライブラリを作成できると便利です。
  2. 高性能アプリケーション(例:高周波ファイナンス)。CおよびC ++は、他のほとんどのプログラミング言語よりも全体的なパフォーマンスが向上しています。C ++で最も重要なことは、テンプレートのようなコンパイラ専用のもので抽象化を構築することです。これにより、ランタイムからコンパイル時間に計算が移動します(アプリ全体が高速になります)。
  3. (2と同様)低遅延アプリケーション。CLRやJVMなどで実行される言語は、アプリケーションによってはC ++とほぼ同じ速度になることがよくありますが、プログラムを実行する前にCLRまたはJVM自体をメモリにロードする必要があります。ハードスタートアップの要件がある場合、これは重要です。コメントからの編集:その点については、ここで説明のハードレイテンシ要件が重要です。ガベージコレクションなどの実行は決定的なプロセスではないため、仮想マシンで実行される言語がハードタイム制限を提供することはほとんどありません。
  4. 組み込みシステム。一部の組み込みシステムには、実行するハードウェアがあります。たとえば、JVM(GoogleのAndroid(実際にはJVMではありませんが、近い)、RIMのBlackberry)またはCLR(Windows Phone)ですが、ほとんどの組み込みシステムには、 CまたはC ++に必要なランタイムサポートよりも多くのランタイムサポートを必要とする言語を実行します(ランタイムサポートはほとんどありません)。
  5. 展開に制約のあるアプリケーション。プログラム全体が数百KBしかない場合、JVMまたはCLRのインストールが必要になることがあります。(例えば、私が取り組んでいるプログラムのほとんどは、いかなる種類のインストーラーまたはそのようなもののない単一のファイルとしてデプロイされなければなりません.EXE ;このための代替手段はありません)

2
スタートアップの遅延だけが関係する遅延の種類ではありません。ハードリアルタイムの要件は、はるかに大きな問題になる可能性があります。
greyfade

1
特定のメーカーにロックされたくないもの(C#またはObjective-C)を追加したり、あなたの言語が訴訟に巻き込まれたくない(Java)
Martin Beckett

@greyfade:それは私が(2)が意味するものの一種ですが、私はそれが明確ではないことに同意します。編集済み。@Martin:これはC ++の長所だと思いますが、C ++が一般的に使用されている市場である質問に答えるとは思いません。また、<S> BSD </ S>(OOPS:It's LGPL)ライセンス版のCLRが存在する場合(モノ)、特定のメーカーにロックされたC#を呼び出すとは思いません。
ビリーONeal

1
5.オペレーティングシステムとコアフレームワーク。仮想マシンで多くのことを実行できますが、仮想マシンはCまたはC ++で実装する必要があります。
ジャン・ヒューデック

1
@Jan:はい、そうです。リフレクションや友人のようなものが問題2-4を引き起こします。ガベージコレクターを実際に記述する必要があるのは、物理メモリを表すオブジェクトだけです。
ビリーONeal

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