11月25日、海外の技術ブログ「Here Comes the Moon」が「The two factions of C++」と題した記事を公開した。この記事では、C++の進化を巡る対立や課題について深く掘り下げられており、特に「セーフティプロファイル」や「モジュール機能」といった今後のC++を支える新しい概念にも言及されている。以下、その内容を紹介する。
C++の未来を巡る議論の活発化
C++の未来に関する議論は、オンラインフォーラムや公式な標準化委員会の場を問わず、非常に白熱している。特に、進化作業部会(EWG)が採択した新しい設計方針や、プログラミング言語としてのC++の方向性について意見が割れている。
進化作業部会での合意内容
進化作業部会では、以下のような設計方針が合意された。
- ABI(Application Binary Interface)互換性の維持:過去のC++およびCとのリンク互換性を保持する方針が確認された。
- ウイルス的注釈の不採用:ライフタイム注釈のような要素は、現段階では導入しない決定が下された。
- ゼロオーバーヘッド原則の強化:性能を最優先する設計思想が改めて支持された。
これらの方針は、C++の既存コードとの互換性を重視する一方で、進化を妨げる要因ともなっている。特に、プログラムの安全性を高めるための革新的なアイデアが採用されにくい現状に、開発者コミュニティから不満の声が上がっている。
セーフティプロファイルとは何か
記事では、「セーフティプロファイル」という新しい提案が取り上げられている。これは、既存のC++コードに対して安全性を向上させるための枠組みであり、次の特徴を持つ。
- 既存コードへの影響を最小限に抑える:既存コードの大規模な変更を求めない設計。
- 安全性の追加:型安全性やメモリ安全性を強化する機能を徐々に導入する。
- 後方互換性の重視:レガシーシステムを破壊せずに新しい機能を提供する。
しかし、このアプローチには批判もある。安全性を大幅に向上させる代わりに、既存コードに根本的な変更を要求する大胆な提案(例: Rustのような新言語の設計)を求める声が、特に技術的に進んだ企業から上がっている。
モジュール機能の課題
C++の「モジュール機能」は、コードの可読性や再利用性を向上させることを目的としている。モジュールは、C++の従来のヘッダーファイルと異なり、次の利点がある。
- 依存関係の管理:複雑なヘッダーファイルのインクルード構造を簡素化。
- ビルド時間の短縮:大規模なプロジェクトのコンパイル時間を削減。
- 名前空間の整理:コードの構造を明確化し、バグを減らす。
しかし、この記事では、このモジュール機能がまだ十分に実装されておらず、現実のプロジェクトでの採用が難しい現状が指摘されている。
大手企業の動きと標準化委員会の限界
C++の進化に関する議論は、技術的な側面だけでなく、経済的・文化的な影響も無視できない。例えば、米国政府がC++の使用を控えるよう推奨している一方で、大手企業はRustなどの新しい言語への移行を進めている。
特に注目すべきは、Googleの動きである。Googleは、C++標準化委員会への関与を減らし、独自のC++後継言語の開発に力を入れている。これは、GoogleがC++自体を否定しているわけではなく、むしろC++の進化の遅さに対する不満から来ている。彼らの目指す方向性は以下の通りである。
- 自動リファクタリングツールの活用:数億行に及ぶコードを短時間で更新可能にする技術。
- 統一されたビルドシステム:CMakeのような断片的なツールではなく、完全に整備されたビルド環境の提供。
一方で、C++標準化委員会は、こうしたツールの標準化には消極的であり、言語仕様の整備に専念している。この姿勢がC++の進化を妨げているとする批判も根強い。
二つの文化:現代的C++ vs. レガシーC++
記事では、C++利用者が二つの大きなグループに分かれることが指摘されている。一つは、現代的なツールや手法を採用し、効率的にコードを運用する企業群。もう一つは、古いライブラリやビルド環境に依存し、変化に対応できない組織だ。
前者の例としてGoogleが挙げられるが、彼らは高度な自動化技術と膨大なリソースを駆使し、巨大なコードベースを管理している。一方で後者は、1990年代の遺物のような環境で、いまだに手動でコードを管理している場合が多い。
これら二つの文化の対立が、C++の進化を複雑にしている。現代的C++を推進する勢力は革新的な変化を求める一方で、レガシーC++に依存する勢力は、互換性の維持を最優先している。
結論:C++はどこへ向かうのか
C++が直面する課題は、進化と後方互換性という相反する要素の調整にかかっている。セーフティプロファイルやモジュール機能といった新しい取り組みが進められているものの、それらが大規模に採用されるには時間がかかると予想される。
詳細はThe two factions of C++を参照していただきたい。