こんにちは、yoshiです。
今回は直接的な技術の話ではありませんが、C++の情報を集めるにあたって筆者が参考にしているWebサービスを紹介しようと思います。
筆者の独断により重要だと思う情報から並べていきますが、どのサービスも異なる方向に特化しているので優劣を付けられるわけではありません。何を重要視するかで変わると思います。
⚓1. Wandbox
どんなプログラム言語でも、まずは実行してみるということが一番大事だと筆者は考えています。という訳でまず紹介するのは、多様な言語に対応したオンラインコンパイラです。
C、C++の他にも、C#、Java、JavaScript、Go、Rustなど様々な言語のコードをサンドボックス環境で実行してくれます。
特筆すべきは、過去の複数のバージョンや開発中バージョンまで使えるようになっていることで、これにより特定のバージョンで発生する問題や、最新の実装されたばかりの機能などを試すことができるようになっています。
また、これは他のオンラインコンパイラでもそうですが、初心者が試しに触ってみるといった用途にも使用可能なので、入門一日目の人からエキスパートの人まで誰にとっても便利なサービスです。C++を続けるなら覚えておいて損はありません。
⚓2. cppreference.com
実行してみるのももちろん大事ですが、正しく安全なプログラムを作るにはある程度言語仕様を理解しておかなければなりません。という訳で、2番目に紹介するのはリファレンスです。
C++に関するリファレンスサイトは色々ありますが、一番詳しく最新の情報が集約されているのはこのWikiだと思います。更新も活発で、最新の規格の内容の反映も早いです。
日本語版もあるのですが、こちらは機械翻訳的なページも多く、情報の更新もされていないことがあるので、できるだけ英語版を見たほうが良いと思います。
どうしても英語が苦手で読めない、という方は、後で紹介するcpprefjpの方が良いかもしれません。
おすすめはC++ compiler supportのページです。現在情報が公開されている多種のC++実装がどの機能をカバーしているのか一覧でわかるようになっています。
現在ドラフト段階に入っている機能についても載っているので、筆者はここをチェックして新機能を試したりしています。
⚓3. Compiler Explorer
これもオンラインコンパイラなのですが、こちらは一風変わった仕組みで、コンパイルしたコードを実行せずに、逆アセンブルを表示してくれます。
複数のコンパイラを同時に試すことも可能なので、出力結果を比較してみるのも面白いでしょう。
もちろんこれを読むのはある程度アセンブリ言語の知識が必要になるのですが、元のソースコードがどの部分に対応しているのかなど色分けで表示してくれるので、多少の知識があればなんとなく読めると思いますし、逆にアセンブリ言語を学ぶにも良い教材になると思います。
C++は速さが売りの一つなので、しばしばどういう書き方をすれば速くなるのか、という議論が起こります。
最近のコンパイラは強力な最適化機能を持っているので、重箱の隅をつつくような議論の場合、実際はどのような書き方をしても同じ、といったことも起こり得ます。
ああすれば速いこうすれば速い、ということを論じるときは、このサイトで逆アセンブルを確認してみることと、実際に最適化オプションを付けて時間計測をしてみると、無意味な最適化テクニックに振り回されることはなくなると思います。
⚓4. 14882: Contents
正式なWebサイト名がこれで合っているのかどうか分からない(<title>
要素まで含めて変換ツールで生成されていると思われるため)のですが、ページのタイトルを紹介します。14882というのはISO/IEC規格においてC++に割り当てられた番号です。例えば最新のC++17の規格は「ISO/IEC 14882:2017 Programming Languages -- C++」というものが正式名称になります。
このサイトでは、C++標準化委員会のGitHubリポジトリに公開された規格書のドラフトが、HTMLで読めるように変換して公開されています。
規格書は誰もが読まなければいけないような物ではないと思いますが、厳密な仕様に関して議論する時は、最終的に参照されるのは規格書になります。もしあなたがC++の深淵に興味があるのなら、覗いてみるのもいいでしょう。
各所にリンクを貼れるように配慮されているので、規格書を振り回してマサカリを投げたい時には正確なリンクと一緒にどうぞ。
また、こちらのサイトは最新のドラフト内容が常に更新されていますが、こちらのGitHubリポジトリにあるリンクには同じ仕組みで変換した過去のドラフト(ISO規格として発行されたものとほぼ同じ内容のバージョン)が公開されています。こちらも合わせて利用すると良いでしょう。
ただし内容はもちろん英語です。
⚓5. cpprefjp
こちらは日本語のC++リファレンスです。情報の量はcppreference.comほどではありませんが、英語を読みたくないならここが一番良いサイトでしょう。国内のC++erが頑張って更新してくれています。
もっとも、このサイトやcppreference.comはC++の機能やライブラリの情報を検索すればすぐ出てくるので、ここで紹介せずともいずれ出会うとは思いますが。
⚓6. 江添亮の詳説C++17
C++17の各機能に関しての詳しい解説です。
規格書は英語なので読みたくないという方や、規格書を読んでみたけどよく理解できなかった、という時はこちらも読んでみると良いでしょう。
なお、この解説はオープンソースで公開されていますが、同じ内容で紙書籍としても販売されています。
また、同じく江添さんが書いた「C++11の文法と機能」という解説と、C++14についての追加の解説もあります。これらの解説で「江添亮の詳説C++17」で扱われていない部分を補完することができます。
これらの解説も、まとめて「C++11/14コア言語」というタイトルの紙書籍として発行されています。
著者の江添さんは C++ 標準化委員会の委員で、おそらく日本で一番C++に詳しい方です。
江添さんの個人ブログ本の虫は雑多な内容が扱われていますが、時々C++標準化委員会で扱われた新しい提案内容などが解説されることもあるので、チェックしておくと良いかもしれません。
⚓7. Standard C++
ISO C++標準化委員会の公式サイトです。
規格の公開スケジュールや進捗状況、会議で提案された論文の情報、カンファレンスなどイベント情報や委員会メンバーの発信する記事、便利なツールの紹介など、C++に関する色々な情報を得ることができます。
C++を詳しく勉強したい方は一度覗いてみるといいかと思います。