本セッションの登壇者
セッション動画(YouTubeチャンネル登録もお願いします。)
こんにちは。C++のトレンドについて、5分で紹介します。
発表の担当は、鈴木遼です。C++フレームワーク、Siv3Dの開発や、C++に関する教育/出版/技術発表などをしています。
C++ってどんな言語?
そもそも今の時代、C++はどこで使われているのでしょう。まず、OS、Webブラウザ、最近だと一部のコードをRustにするという動きも出ていますが、まだ大部分はC++です。コンピュータグラフィクスもC++の得意分野です。WordやExcelにもC++が使われています。ゲームエンジンの内部も大半がC++です。コンシューマゲームもC++が使われているものが多いですね。
あと、WebサービスのバックエンドもC++で動いています。組み込み、ロボット、自動運転車などの分野も。金融関連もC++が多いです。ちなみに、C++の生みの親のストラウストラップ(Bjarne Stroustrup)は、今、モルガン・スタンレーに雇われています。網羅的ではありませんが、こういったところが現在の身近なC++の活用ケースです。
C++を学ぶ人は増えているのでしょうか? このところ、AtCorderを中心に、競技プログラムに挑戦する人が増えていて、C++の学習熱が高まっています。競技プログラミングは歴史的にC++がデファクトスタンダードで、問題の解説や、アルゴリズム、データ構造の文献は、C++で書かれていることが多いです。中高生が目標としている情報オリンピックでは、参加者は全員、C++で問題を解きます。最近、出版が続いている競技プログラミング関連本も、C++を前提に書かれています。
昔と比べてこんなに進化!
C++の開発体験はどうなっているのでしょうか。昔からあるIDEは順当に進化を続けています。最近は、オンラインのC++コンパイラも使われる機会が増えました。代表的なものが、Compiler ExplorerとWandboxです。いろいろな種類、もしくはバージョンのコンパイラ、オプションでコンパイル結果を確認したり、もしくは自分の書いたコードがちゃんと効率のよい機械語になっているかを簡単にオンラインで比較/チェックできます。
C++は「落とし穴が多くて大変」と言われてきましたが、それも昔の話になりつつあります。スマートポインタと呼ばれる機能のように、言語自体の改良も進んでいますし、最近ではコードの静的解析ツールの性能が向上していて、C++で起こりがちなミスに対して指摘してくれるようになっています。
Visual Studioはエディタ上でコードの問題を表示してくれますし、PVS-Studioというツールは、C++の言語の使い方の間違いに限らず、このサンプルコードのように、プログラムのタイプミスも検出してくれて、「ここ間違っていませんか?」と教えてくれます。これは、rgbaに対して最後はgetA()が来るべき場面ですね。このようにコーディングをサポートしてくれるエコシステムがC++まわりで活発に発展しています。
C++ Core Guidelinesの整備も重要なトピックです。これは C++ の”べき/べからず集”です。専門家によってオープンソースでメンテされていて、最新のC++にも対応した約500項目が揃っています。500項目といっても全部頭に入れなきゃいけないということではなくて、中にはあたりまえのことも多いですし、ジャンル分けされているので、迷ったときに辞書のように参照できます。昔、『 Effective C++ 』といった本があったのですが、(C++ Core Guidelinesは)その現代版です。ガイドラインの多くは静的解析ツールでも検証ができるようなルールになっているので、自分の書いたコードがガイドラインに沿っているかをツールにチェックしてもらうこともできます。
規格もぞくぞく更新中
C++ の言語の進化はどうなっているのでしょうか。C++は3年ごとに規格をアップデートをしていて、西暦から取って「C++17」「C++20」のように呼んでいます。
今日2022年5月時点での状況ですが、C++17の規格発行からは4年が経過しました。主要なC++コンパイラは、ほとんどC++17に対応していて、業務でもC++17を使うところが増えています。
C++20からは1年半が経ちました。Visual Studio が一番乗りでC++20の規格に完全対応し、残りのコンパイラも大部分の対応が終わっています。C++20の機能を実験的に使うようなプロジェクトも増えています。
そして来年発行予定なのがC++23です。最新版のコンパイラでは、一部機能が先取り実装されています。これからSNSでもC++23に関する話題が増えていくと思います。
ではC++17から順番に、それぞれの規格アップデートでの注目ポイントを紹介していきます。
C++17ではファイルシステムに関する標準ライブラリの追加、そして、オプショナル型を表現できる型、型安全な共用体を表現できるvarianrt型、tupleや構造体などによって返された値を分解して複数の変数にバインドする文法、戻り値無視に警告を出せる[[nodiscard]]属性、所有権をもたない文字列クラスなどが大きなアップデートです。
C++20では、ヘッダのincludeの仕組みを置き換えるModules、テンプレートの型制約を柔軟/簡潔にするためのConcepts、Python風のテキストフォーマット、新しく作った型に対する比較演算の定義の簡略化、コルーチン用の文法、コンパイル時計算の拡大、ビット演算用の関数の追加がありました。
C++23で予定されている機能としては、添え字演算子の複数引数対応、スタックトレース取得の関数、標準ライブラリのModules対応、printfの進化版であるstd::printなどがあります。とくに後半2つは重要で、これまで20年以上変化がなかったC++のHello worldプログラムががらりと変わるポテンシャルを持っています。意外と大きな変更です。
参考資料
ここまで5分でC++のトレンドを紹介しました。C++の情報をもっと知りたい場合は、以下のWebサイトがお役に立ちます。
日本語
英語
以上です。