
2026/10/02 8:53
C++ Insights – コンパイラーの目線でソースコードを確認する
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
C++ Insights は、Clang の抽象構文木(AST)を基盤としたソースからソースへの変換ツールで、特殊メンバ関数、暗黙の型変換、ラムダ式、構造化結合、型の推論など、隠されたコンパイラロジックを示すことでその仕組みを解明します。cppinsights.io でオンライン利用が可能ですが、Web 版はローカルビルドに比べて数ヶ月遅れをとることが多く、特に Clang のコンパイルの遅延による Windows サポートなどで顕著です。ただし、ユーザーは Docker、macOS 用の Homebrew、または特定フラグ(ARM64、Windows、Arch Linux 向け)を設定した独自 CMake/Ninja ビルドを通じて、最新結果をローカルで取得できます。本ツールには INSIGHTS_STRIP や INSIGHTS_STATIC などの主要ビルドオプションが設定されており、Cevelop(Eclipse CDT4)、Vim、Neovim、VS Code のマーケットプレイス拡張機能などを含む環境に統合されます。コマンドラインでの使用(
insights <file> -- -std=c++...)では、システム含経路がスクリプトを通じて取得されない限りハードコーディングされており、カスタム GCC 設置時にはツールチェーンパスを指定する必要があります。現代の C++ に追従するには、ローカルインストール、Docker の利用、IDE プラグインの探索などを推奨しており、GitHub を通じた貢献、Issue レポート、またはサポンスルなどの方法でコミュニティ参加を募っています。本文
C++ Insights: コンパイラの「裏側」を可視化するツール
C++ Insights は、Clang ベースのツールであり、ソースコードをコンパイラが生成する別のソースコードに変換します。通常は隠されているコンパイラの処理や、型推論などの「魔法」を目に見える形で確認できます。
概要 (What)
機能と目的
- ソースコード変換: 入力された C++ コードを、コンパイラが内部で行う処理を記号化したコードに変換します。
- 隠れた動作の可視化: コンパイル可能でも意図的に非表示になっている特殊なメンバー関数や型キャストなどを表示します。
実装の例
以下のコードはコンパイル可能ですが、C++ Insights はその背後にある処理を明示的に記述したように見せてくれます。
入力コード:
class Base { }; class Derived : public Base { }; int main() { Derived d; Derived d2 = d; d2 = d; Base& b = d; }
コンパイラによる内部処理(出力):
class Base { public: // inline constexpr Base() noexcept = default; // inline constexpr Base(const Base &) noexcept = default; // inline constexpr Base & operator=(const Base &) noexcept = default; }; class Derived : public Base { public: // inline constexpr Derived() noexcept = default; // inline constexpr Derived(const Derived &) noexcept = default; // inline constexpr Derived & operator=(const Derived &) noexcept = default; }; int main() { Derived d; Derived d2 = Derived(d); // 明示的なコンストラクタ呼び出し d2.operator=(d); // オペレータの直接呼び出し Base & b = static_cast<Base&>(d); // 明示的なキャスト return 0; }
対応する機能
- 特殊メンバー関数: デフォルトコンストラクタ、コピーコンストラクタ、アサインメントオペレータなど。
- アップキャスト: クラス階層を超えた参照変換(例:
からDerived
)。Base& - 型推論:
やauto
の背後にある実際の型を特定できます。decltype
理由 (Why)
開発背景
- 調査の深掘り: C++11/C++14/C++17 の新機能(ラムダ式、範囲ベース for ループ、構文結合など)の研究を通じて、「コンパイラがコードをどのように解釈するか」に興味を抱きました。
- AST ダンプの限界: Clang の AST ダンプや Compiler Explorer は有用ですが、出力がアセンブラや内部表現であり、C++ コードを書き直したいためには不適切でした。
- 教育の必要性: 学生に単に「ここにある」と示すだけでなく、コンパイラの目で C++ を理解できるようにするため、コードスニペットを人間可読なコードに変換するツールの開発を開始しました。
現在の目標と制限
- 対応言語: ラムダ式、範囲ベース for ループ、
の変換などを対象としています。auto - 出力保証: コンパイル可能なコードを生成しますが、すべてのケースで完全に正しく扱っていることを保証しておりません。
- 依存関係: Clang およびその AST 解釈に基づいて動作します(C++20 など新規格への対応は継続中)。
関連情報
- トークンやスライド・ビデオについては オンラインで視聴可能です。
ビルド (Building)
C++ Insights は Clang ソースツリー内でも、独立したプロジェクトとしてビルド可能です。
Windows
- 詳細は
を参照してください。Readme_Windows.md
Arch Linux
extra/clang パッケージを使用する場合の注意が必要です。
- 追加フラグ:
-DINSIGHTS_USE_SYSTEM_INCLUDES=off \ -DCLANG_LINK_CLANG_DYLIB=on \ -DLLVM_LINK_LLVM_DYLIB=on - ライブラリの競合回避:
およびextra/clang
はextra/llvm
を提供します。/usr/lib/{libclangAST.so,libLLVM*.a,libLLVM.so}
はlibclangAST.so
に依存し、ライブラリ同士の競合を避けるためにlibLLVM.so
を指定する必要があります(詳細: Arch Bug #60512)。-DLLVM_LINK_LLVM_DYLIB=on
Clang 外でのビルド
Clang がシステムにインストールされている場合の標準的なビルド手順です。
git clone https://github.com/andreasfertig/cppinsights.git mkdir build && cd build cmake -G"Ninja" ../cppinsights ninja
- 生成されたバイナリは
です。build/insights
Clang 内でのビルド
Clang ソースツリーに C++ Insights を埋め込んでビルドします(推奨)。
git clone https://github.com/llvm/llvm-project.git git clone https://github.com/andreasfertig/cppinsights.git mkdir build && cd build cmake -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DLLVM_EXTERNAL_PROJECTS=cppinsights \ -DLLVM_EXTERNAL_CPPINSIGHTS_SOURCE_DIR=<PATH/TO/cppinsights> \ [INSIGHTS CMAKE OPTIONS] \ ../llvm-project/llvm ninja
macOS 向け ARM ビルド
MacBook Air/M1 など、Apple Silicon 向けのビルドではアーキテクチャを明示する必要があります。
cmake -DCMAKE_OSX_ARCHITECTURES=arm64 ../cppinsights
Cevelop (Eclipse IDE) との連携
IDE で直接編集・実行したい場合の設定例です。
git clone https://github.com/andreasfertig/cppinsights.git mkdir build_eclipse && cd build_eclipse cmake -G"Eclipse CDT4 - Unix Makefiles" ../cppinsights/
- Cevelop で
を選択し、ビルドフォルダを指定します。Import -> General -> Existing Project into Workspace
CMake オプション一覧
| オプション | 説明 | デフォルト |
|---|---|---|
| ビルド後のインサイトへのストリップ処理 (デバッグ情報削除) | ON |
| スタティックリンクの使用 | OFF |
| コードカバレッジの有効化 | OFF |
| テスト用に libc++ の使用 | OFF |
| デバッグモードの有効化 | OFF |
使用方法 (Usage)
ベースコマンド
insights <YOUR_CPP_FILE> -- -std=c++17
の後に C++ コードの標準オプション(例:--
)を指定します。-std=c++17
システムインクルードパス
バイナリにハードコーディングされたシステムインクルードパスと、使用したコンパイラとの不一致を防ぐため、
scripts/getinclude.py を使用します。
./scripts/getinclude.py \ -isystem/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1 \ -isystem/usr/local/include \ -isystem/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.3.0/include \ -isystem/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include \ -isystem/usr/include
- このスクリプトを
コマンドにパイプするか、引数として渡して使用します。insightsinsights <YOUR_CPP_FILE> -- -std=c++17 $(./scripts/getinclude.py)
カスタム GCC インストール
デフォルトのパスに含まれていないカスタム GCC(例:
gcc-11.2.0)を使用する場合、Clang に STL の場所を指定する必要があります。
./cppinsights Insights.cpp -- --gcc-toolchain=${GCC_11_2_0_INSTALL_PATH} -std=c++20
はカスタム GCC のインストールディレクトリです。${GCC_11_2_0_INSTALL_PATH}
Docker コンテナ
最新バージョンを含むコンテナを使用したい場合は、C++ Insights - Docker を利用してください。
プラグイン・拡張機能 (Plugins / Extensions / Packages)
IDE やエディタへの統合方法です。
| 環境 | リンク |
|---|---|
| Vim | vim-cpp-insights |
| Neovim | cxx-tools.nvim |
| VSCode | C++ Insights - VSCode Extension |
| macOS (Homebrew) | |
シェル補完 (Shell autocomplete)
bash、zsh、fish 向けの補完スクリプトが提供されており、C++ Insights のオプションや Clang オプション(
-- 以降)の自動補完をサポートします。
自動インストール
ソースコードからビルドする場合、補完スクリプトは自動的に
share/ サブディレクトリに設置されます。
| シェル | パス |
|---|---|
| bash | |
| zsh | |
| fish | |
手動インストール
既存のビルドディレクトリから個別にダウンロードできます(bash の例):
cd <YOUR_BASH_COMPLETION_DIR> curl -o insights https://raw.githubusercontent.com/andreasfertig/cppinsights/main/scripts/bash-autocomplete.sh
互換性 (Compatibility)
- Clang 対応: リポジトリを最新バージョンの Clang および直前のバージョンでコンパイル可能にするよう努めています。
- ウェブサイト遅延: Web サイトは最新の Clang リリースに合わせて更新されますが、Windows 向けビルドなどの課題により数ヶ月遅れる場合もあります。
YouTube チャンネル
新しい動画を毎月公開しています。
- C++ Insights を使った特定の C++ コンストラクトの解説
- C++ Insights そのものの使い方や機能紹介
予定事項 (ToDo's)
詳細は TODO.md を参照してください。
参加方法 (Get Involved)
プロジェクトへの貢献を検討している場合:
- バグ報告: GitHub Issue を作成してください。
- 機能追加・改善: プルリクエストを送信してください。詳しくは CONTRIBUTING.md を参照してください。
サポート (Support)
プロジェクトを後押ししたい方へ:
- パッチ提出: コード貢献を受け付けています。
- 資金援助: GitHub スポンサーや Patreon のサポーターになることで、開発活動へのサポートが可能です。