優れたモダンなC++を書くのに役立つC++ Core Guidelines

CppConで発表されたように、Bjarne Stroustrup氏とHerb Sutter氏がモダンなC++のためのガイドライン集を作り始めた。目標は、開発者の言語の使い方を改善し、タイプセーフでリソースリークのない、できるだけロジックエラーのないコードが書けるようにすることだ。

Stroustrup氏はこう語る

私たちのC++ Core Guidelinesは、他のスタイルで書くよりもコードをシンプルに書けるようにします。安全性は間もなくオープンソースで利用可能になるツールによって検証することができます。

ガイドラインはGitHubにあり、メイン著者の二人によると、CERNやMicrosoftなどの専門家が貢献しているそうだ。ドキュメントのバージョンはまだ “0.6” だが、すでにかなり大きく、印刷すると200ページを超えている。ドキュメントは、個々の言語機能にフォーカスしたもの(インターフェイス、クラス、式など)や(リソース管理、ジェネリックプログラミング、並列処理などの)テクニックを含むセクションで構成されている。ガイドラインには「クラスにデフォルトコンストラクタを与える」 (C.43) や「マジック定数を避ける」(ES.45)といった基本的なことから、「貴重な最適化の機会のためにT&& パラメータとmoveを使う」 (F.25)といった高度なことまで、非常に多岐にわたる指針が含まれている。それぞれのルールには、簡単な説明と正しい実装方法を示したサンプルコードが付いている。

ドキュメントには新しい「Guideline Support Library (GSL)」専用のセクションも含まれている。このライブラリはガイドライン適用を簡単にするために開発されたもので、範囲を表現できる array_view や、null が有効でないという制約を表すのに使える not_null といった共通型を提供する。GSLの初期のポータブルな実装は、Microsoftによって寄贈された

C++ Core Guidelinesで面白いところは、それを強制できるチェックツールを開発していることだ。これも最初の実装はMicrosoftによって寄贈され、この10月にバイナリで利用可能になるはずだ。MicrosoftのPrincipal Software EngineerであるNeil MacIntosh氏は、CppConのセッションでツールについて詳しく説明している。彼によると、モダンな静的解析は lint よりもはるかに優れており、「厄介で複雑なバグを早期に発見し、性能を改善する機会を見つけ、一貫性のあるスタイルおよびライブラリとAPIの適切な利用を促す」という。

InfoQはBjarne Stroustrup氏にコンタクトし、この新しいガイドラインについて質問した。

新しく発表したC++ Core Guidelinesをどう考えていますか? ディスカッションフォーラムで何度も繰り返されるアイデア、「安全」もしくは「使いやすい」言語機能だけを含んだ、C++の制限された定義の土台としてでしょうか。その方向への第一歩になると考えていますか?

サブセット言語にするつもりはありません。そういうのは失敗するものです。一つの理由は、古い機能を使ったC++コードは何十億行もあり、それらがすぐになくなることはないためです。もう一つの根本的な理由は、よりハイレベルな/安全な/使いやすい機能を実装するために、危険な/安全でない/ローレベルな/間違いやすい機能が必要になるためです。ハードウェアを直接扱えるC++の能力を損なってはいけません。

GitHubにあるドキュメントは、現在の形式で印刷すると200ページを超えます。それ自体がC++の避けられない複雑さの証明だ、という批判をどう解決しますか?

どんな言語であっても、総合的なルールを挙げていくと何百ページにもなります。完成するまで、ルールとページはもっと増えるでしょう。CやJavaにこうした総合的なものが欲しければ、おそらくもっとたくさんのルールが必要になったでしょう。私たちは安全性だけを懸念しているのではありません。開発者が開発を加速し、優れた性能を実現し、メンテナンスを簡単にし、ライブラリの利用といったテクニックを取り入れる手助けをしたいのです。すべてのプログラマにすべてのルールが必要なわけではありませんし、すべてのルールを読むことを推奨しているわけでもありません。ツールがルールを知っており、プログラマの破ったルールを指摘します。— その場で、根拠とサンプルを提示して説明します。