C++ 11とC++ CXの導入によって、この言語に多くの新たな興味が湧いてくる。そして多くの開発者、とりわけWindows開発者は、C#やJavaをおいて、C++を取るべきか迷っている。John Sonmez 氏はnoという意見である。
Why C++ Is Not ‘Back’と題する彼の記事の中で、彼はC++を使う理由は、わずかに3つしか無い、と主張している。
- あなたは絶対的に、あなたのソフトウェアからあらゆる可能なパフォーマンスを引き出す必要があり、それをオブジェクト指向抽象をサポートする言語でやりたい。
- あなたは、生のハードウェアと直接インターフェースするコードを書いている(例えば、低レベルのドライバーを書いている)。
- メモリコントロールとタイミングが絶対に重要であり、そのためあなたは、あなたのシステムで完全に決定論的な動きを把握し、手動でメモリを管理する機能を持つ必要がある。(機械の動いている部分をコントロールする、リアルタイムの組込み用オペレーティングシステムを考えて欲しい)。
Herb Sutter氏は、この記事を非常に賞賛して、「心のこもった、嘘のない意見」を提供するために、以下をリストに加えた。
- サービスする。これは実行環境に依存する時に、より難しくなる。
- テストする。なぜならあなたは、あなたのアプリケーション全体をテストする能力を失うからである(全て静的ないしほとんど静的なリンクを行うのと、あなたのアプリケーションを多くの場合エンドユーザーのマシン上で始めて、コンパイル/ジットさせるのとを比べて欲しい)。
John Sonmez氏がC++を学習することに反対する、理由の一つはこの言語の純粋な複雑さである。たとえC++11が開発を容易にするとしても、それはプログラマに対してC++コードを書くあらゆる古い方法を学ぶ、言い訳にはならない。「あなたは、20年前とは違うC++コードに出くわし、それは、全く違う言語のように見えるでしょう。」彼の主張を強化するために、彼はC++開発者のポジションを求めている候補者に尋ねる36ケの質問を上げた。
1. C++でプリミティブなデータ型を初期化するには何通りあり、それらはどのようなものですか?
12. コピーコンストラクターとは何であり、いつ使われますか。特に equalオペレータと比較して。
16. C++で参照によって値を返すのがいい考えであるのは、いつで、良くないのはいつですか?
33. なぜデストラクタ内で例外を投げるべきではないのでしょうか?
C++に反対する別の議論は、「プログラミング言語は本当により単純になる必要があり、抽象レベルを増す必要があります。下げてはいけません。」そして彼は更に以下のように言う。
いつも低レベルなコードの必要性は常にありますが、我々が今日書くコードの大部分は、ずっと高レベルなものです。
私は何年も前にC++の船から飛び降りましたが、それは遂にC#よりC++での方がアプリを早く開発できる、ということができなくなった時です。
私は長い間、私がC++に投資した全ては、失われていない、と信じようとしていることを言わずにいた。しかしC#が物事をあまりに単純化してくれるので、C++が私にくれた余力は、必要以上の責任に値するものではない、とわかりました。
John Sonmez氏は、C++を学ぶことは、一般にいかにコンピュータが動くかを理解するのに尚役に立つ、「しかし近いうちにC++がカンバックを果たすとは思わないし、それはいいことだ。」と結論している。
Alo氏がこれに加えている。
私はC++から始めて、キャリアの最初の4年間は、C++のみでした。その経験は、完全に自分にとって、極めて価値がありました。なぜならあなたが指摘しているように、C++を充分なレベルで一旦学べば、他の言語を非常に早く理解でき、ソフトウェアがより低レベルでどのように動いているかをより深く理解できます。より高レベルな言語から始めると、このような知識を得るのはずっと難しくなります。まさにこの理由で、プログラマはJavaから始める、という考えをいつも疑問に感じています。
Richard Dunks氏は対抗して以下のように言う。
私は、プログラミングクラスへの最初の学期の導入やデータ構造を教えるためにC++を使うのは、役に立たないと思います。実装するのにあまりに時間がかかり、生徒は多くの場合、複製しようとしている構造を見失います。私はC++で上達したことを嬉しく思いますが、コストに値するとは思っていませんし、絶対に、一つであらゆる教育的言語に適したものではありません。
Stephen Cleary氏は再利用性についてコメントしている。
私は以前C++マスターで、市場のプレッシャのために2,3年前にC#開発者になりました。私は「確かに」C#を使ったほうが生産性が高いですが、簡単にはC++のテンプレートと同じレベルのコードの再利用を達成するのは、可能ではありません。
古典的な例は、コンテナ、イテレータ、アルゴリズムの三頭政治です。C++では、どのコンテナでも動くアルゴリズムを作成でき、コンパイル時に、必要であればランダムアクセスを利用するように自己調整できます。C#でそれをやろうとしてみてください。私は「新C++」のことを話しているのではありません。今日のC#ができるよりも、C++は1998年にもっとコードの再利用をできました。
パフォーマンスに関して Herb Sutter氏がちょっとしたアドバイスを与えている。
どの言語でも、もしあなたがパフォーマンスについて真剣であれば、配列を多く使うでしょう(「いつも」ではなく、単に「たくさん」)。ある言語では、そのことがより簡単にでき、一般にレイアウトそして特に配列に関するコントロールがずっと簡単にできます。一方、他の言語/環境では、それがもっと難しい(可能だが、より難しい)、そしてあなたは、ポインタ追跡する、ノードベースのデータ構造に対する言語/実行環境の強い好みを「見合わせる」か「しのぐ」かしなければならない。
Herb Sutter と John Sonmez両氏のそれぞれのブログに対する多くの良質なコメントに加えて、 RedditのProgrammingとCodingのサブグループから多くのことが学べる。