1998年の初めての標準化以前、C++は1979年からBell LabsでBjarne Stroustrupによって、C言語の拡張として開発されていました。彼はCに似た効率的で柔軟な言語を求めていたからです。
1983年、「C with Classes」は「C++」に改名され、仮想関数、関数名と演算子のオーバーロード、参照、定数、型安全なフリーストアメモリ割り当て(new/delete)、改善された型チェックなどの新機能が追加されました。
1990年代はC++の黄金時代でした。非常に人気があり、特にOOP革命の後、多くのプロジェクトがそれで開発されました。しかし1998年以降、C++は長年停滞しました。そして2000年から2010年の間、言語の進化を支援する大企業はありませんでした。Microsoftは新しい.NETテクノロジーにより注力していました。
驚くべきことに、2010年以降、人々は「C++ルネサンス」について語り始めました。Microsoftがこの動きの主要なプレーヤーであったことを認めなければなりません。Craig SymondsとMohsen Agsenがそれについて議論したこの ビデオ を覚えています。
2011年、Microsoftは多くの記事でC++の復活を発表し、Herb SutterのようなMicrosoft C++エキスパートは、C++が復活した理由を説明する多くの講演を行い、主にモダンC++の使用を推奨しました。同時期にC++11標準が承認され、私たちはC++を新しい言語として語り始めました。
しかし、2011年の時点で、C++にはすでに30年以上の歴史がありました。新しいC++がC++の苛立たしい側面の多くを簡素化し、C++コードを改善する新しいモダンな方法があることを開発者に納得させるのは容易ではありません。
例としてメモリ管理を取り上げましょう。おそらくC++で最も批判されているメカニズムです。長年にわたり、オブジェクトの割り当てはnewキーワードで行われ、開発者はコードのどこかでdeleteを呼び出すことを忘れないようにしなければなりませんでした。「モダンC++」はこの問題に対処し、共有ポインタの使用を推進しています。
しかし残念ながら、活発なC++コミュニティと著名なエキスパートのすべての努力は十分ではありませんでした。この物語の教訓: 誰かに言語やツールで何かを行う可能性を与えたら、彼らが実際にそれを行っても驚かないこと。
それがC++で起こったことです。私たちは依然としてnewとdeleteを使用する可能性を持っており、もちろん多くの理由からこの可能性を取り除くことはできません。モダンC++が長年スマートポインタの使用を推進してきたにもかかわらず、newによるオブジェクトの割り当ては今後何年も使われ続けるでしょう。
C++の過去は、新しく作成されたプロジェクトでさえ、その使われ方に大きく影響しており、多くの開発者は依然としてこの言語が非常に複雑だと考えています。
C++の過去は言語にどのように影響しているのでしょうか?
それを調べるために、テストをしてみましょう。ウェブで「C++ object allocation」を検索して結果を見てください。最初のページのほぼすべてのリンクがnew/delete、あるいはmallocについて語っています。
もう一つの興味深いテストは、大学の図書館に行ってC++の本を借り、オブジェクト割り当ての章を読むことです。そこでは主にnewキーワードについて語られています。
要約すると、新しいC++開発者がそれを学ぼうとすると、モダンC++よりも「C with classes」に関するリソースの方が多く見つかるでしょう。
C++の過去の影響を制限するにはどうすればよいでしょうか?
魔法のソリューションはありません。C++コンパイラが、古い文字列操作関数(strcpy、strcatなど)のような非推奨の慣行について警告を発することで助けてくれることを期待できます。しかし、このソリューションだけではあまり影響はないでしょう。モダンC++は、学び実践すべき新しいイディオムに関するものだからです。
もう一つのソリューションは、C++が名前を変えて「モダンC++」になったと考えることです。このソリューションは非常にシンプルですが、結果は非常に興味深いものです。そして納得するために、前と同じウェブ検索をしてみましょう。今回は「Modern C++」object allocationで検索します。最初のリンクはスマートポインタについて語っています。
新しいC++開発者へのアドバイス:C++は名前を変えたと考え、ウェブでのすべての検索で常にC++ではなく「Modern C++」を使用してください。結果はまったく異なります。C++だけで検索すると、主に古い慣行に関する情報が返ってくるからです。
