C++はその誕生以来、継続的に進化し、C with Classesから新しい標準の登場まで、多くの大きなマイルストーンに到達してきました。C++の進化の次のステップは何でしょうか?まず、C++が長年にわたってどのように進化してきたかを見てみましょう。
第一世代のC++:C with Classes
1998年の初めての標準化以前、C++は1979年からBell LabsでBjarne Stroustrupによって、C言語の拡張として開発されていました。彼はCのようなパフォーマンスを持つ、効率的で柔軟な言語を求めていたからです。
1983年、「C with Classes」は「C++」に改名され、仮想関数、関数名と演算子のオーバーロード、参照、定数、型安全なフリーストアメモリ割り当て(new/delete)、改善された型チェックなどの新機能が追加されました。
第一世代のコードの一部を次に示します。
WriteFraction(n) long n;
{
unsigned short i, low, digit; unsigned long k;
putchar(n < 0 ? '-' : ' '); n = abs(n);
putchar((n>>fractionBits) + '0'); putchar('.');
low = k = n << (longBits-fractionBits); /* align octal point at left */
k >>= 4; /* shift to make room for a decimal digit */
for (i=1; i<=8; ++i)
{
digit = (k *= 10L) >> (longBits-4);
low = (low & 0xf) * 10;
k += ((unsigned long) (low>>4)) - ((unsigned long) digit << (longBits-4));
putchar(digit+'0');
}
}
これは、最近 コンピュータ歴史博物館に寄贈公開された「Microsoft Word 1.1」の別のコードスニペットです。

第二世代のC++:OOP革命
1989年にC++ 2.0がリリースされ、続いて1991年に『 The C++ Programming Language 』の改訂第2版が出版されました。2.0の新機能には、多重継承、抽象クラス、静的メンバー関数、constメンバー関数、protectedメンバーが含まれていました。1990年には『 The Annotated C++ Reference Manual 』が出版され、この著作は将来の標準の基礎となりました。1990年代、OOPは非常に人気になり、多くの開発者がこのパラダイムを採用しました。Herb Sutterは彼の 記事で、OOPの採用を革命と表現しています。
人々は少なくとも1960年代後半のSimulaの時代からオブジェクト指向プログラミングを行ってきたことを思い出してください。しかし、OOが革命となり、主流で支配的になったのは1990年代になってからでした。なぜその時だったのでしょうか?革命が起こった主な理由は、私たちの業界が、ますます大きな問題を解決し、利用可能になりつつあるますます大きなCPUとストレージリソースを活用する、ますます大規模なシステムを書くという要件に駆り立てられていたからです。抽象化と依存関係管理におけるOOPの強みは、経済的で信頼性があり、再現可能な大規模ソフトウェア開発を実現するために不可欠なものでした。
第三世代のC++:ジェネリクスとメタプログラミング
テンプレートは1991年に導入されましたが、当時、ジェネリックプログラミングパラダイムに関心を持っていたC++の専門家はわずかで、それについて議論する出版物も少なかったのです。
Alexander Stepanovは、ジェネリックプログラミングの可能性を探求し、C++プロジェクト開発へのモダンなアプローチを提供した先駆的なC++の専門家でした。
これは興味深い 文書 で、「Algorithm-Oriented Generic Libraries」と題され、1993年にAlexander A. StepanovとDavid R. Summerによって発表されました。
著者らが説明する、この文書の動機は次のとおりです。
We outline an approach to construction of software libraries in which generic algorithms (algorithmic abstractions) play a more central role than in conventional software library technology or in the object-oriented programming paradigm. Our approach is to consider algorithms first, decide what types and access operations they need for efficient execution, and regard the types and operations as formal parameters that can be instantiated in many different ways, as long as the actual parameters satisfy the assumptions on which the correctness and efficiency of the algorithms are based. The means by which instantiation is carried out is language dependent; in the C + + examples in this paper, we instantiate generic algorithms by constructing classes that define the needed types and access operations. By use of such compile-time techniques and careful attention to algorithmic issues, it is possible to construct software components of broad utility with no sacrifice of efficiency.Alexander Stepanov、David Musser、Meng Lee、そしてC++標準化委員会の努力と素晴らしい仕事のおかげで、STLの最初のリリースが1994年に公開されました。
STLはC++開発者にとって新鮮な風でした。C++コードをモダナイズするための多くの便利な機能を提供し、C++のアルゴリズム実装をC言語の対応物とは大きく異なるものにしました。
1998年、 C++ライブラリリポジトリウェブサイトの提案 がBeman G. Dawesによって投稿され、Boostの開発につながりました。
Boostは、C++プログラミング言語向けのライブラリセットで、線形代数、疑似乱数生成、マルチスレッディング、画像処理、正規表現、単体テストなどのタスクや構造のサポートを提供します。80を超える個別のライブラリが含まれています。
第四世代のC++:新しい標準
1991年から2011年まで、言語はゆっくりと進化し、その進化はSTLやBoostのようなライブラリからもたらされました。2011年以降、多くの機能が標準に追加されました。C++11、C++14、C++17、そして今後のC++20です。
これは、新しい標準の機能を広範に活用しているFollyライブラリのコードスニペットです。

第五世代のC++:レガシーC++との決別
C++は現在、非常に速いペースで進化しています。多くの興味深い新機能が追加され、他の機能は非推奨になっています。おそらく今こそ、既存のコードを壊すことになっても、一部の言語機能を削除する時期かもしれません。
これまで、標準化委員会は以前のC++機能に破壊的変更を加えないことを選択してきました。しかし、このアプローチは近い将来変わる可能性があります。実際、最近更新されたこの 提案 は、言語の安定性について議論し、次の問いに答えようとしています。
- C++はエキサイティングな新機能の言語でしょうか?
- C++は長期間にわたる優れた安定性で知られる言語でしょうか?
- 新しい言語バージョンへのアップグレードは苦労なく行えるべきだと考えますか?
- もしそうなら、その苦労のないアップグレードと言語を進化させる実際の必要性をどのように両立させますか?
- 逆に、何よりも安定性を優先する場合、正しいと確信でき、将来の修正が決して必要ないと確信できるときにのみ変更を加えるという、ゆっくりとした進行を余儀なくされるのでしょうか?
この提案から、次の示唆が得られます。
委員会は、既存のコードの動作変更やコンパイル失敗を引き起こす可能性がある場合でも、提案の設計と品質を検討する意欲を持つべきです。
おそらく第五世代は、Cから受け継いだレガシー機能の一部を削除することによる、レガシーC++との決別となるでしょう。
