C++ Insights – コンパイラーの目線でソースコードを確認する

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

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
      に依存し、ライブラリ同士の競合を避けるために
      -DLLVM_LINK_LLVM_DYLIB=on
      を指定する必要があります(詳細: Arch Bug #60512)。

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 オプション一覧

オプション説明デフォルト
INSIGHTS_STRIP
ビルド後のインサイトへのストリップ処理 (デバッグ情報削除)ON
INSIGHTS_STATIC
スタティックリンクの使用OFF
INSIGHTS_COVERAGE
コードカバレッジの有効化OFF
INSIGHTS_USE_LIBCPP
テスト用に libc++ の使用OFF
DEBUG
デバッグモードの有効化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
  • このスクリプトを
    insights
    コマンドにパイプするか、引数として渡して使用します。
    insights <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_11_2_0_INSTALL_PATH}
    はカスタム GCC のインストールディレクトリです。

Docker コンテナ

最新バージョンを含むコンテナを使用したい場合は、C++ Insights - Docker を利用してください。


プラグイン・拡張機能 (Plugins / Extensions / Packages)

IDE やエディタへの統合方法です。

環境リンク
Vimvim-cpp-insights
Neovimcxx-tools.nvim
VSCodeC++ Insights - VSCode Extension
macOS (Homebrew)
brew install cppinsights

シェル補完 (Shell autocomplete)

bash、zsh、fish 向けの補完スクリプトが提供されており、C++ Insights のオプションや Clang オプション(

--
以降)の自動補完をサポートします。

自動インストール

ソースコードからビルドする場合、補完スクリプトは自動的に

share/
サブディレクトリに設置されます。

シェルパス
bash
share/bash-completion/completions/insights
zsh
share/zsh/site-functions/_insights
fish
share/fish/vendor_completions.d/insights.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 のサポーターになることで、開発活動へのサポートが可能です。

同じ日のほかのニュース

一覧に戻る →

2026/10/04 7:07

連邦裁判官が「Flock」を「恣意的な大規模監視」と批判

## 日本語翻訳: Tulsa の連邦裁判所は、最近の重要な判決において、シエリフ補佐官が Flock Safety を用いて令状なしに女性のナンバープレートを検索した行為が第四条修正(第 4 条修正)の権利を侵害したと判断し、ヒル判事はその捜索が彼女の車両にカリフォルニア州のナンバープレートがあることのみによる動機付けであるように見ると指摘しました。同判決は拘束力のある先例を確立するものではありませんが、このデータベースに対する自動化された検索が無憲法違反であると宣言する最初の連邦判決の一つとして位置づけられます。ヒル判事は、「公衆の所在を目録化するような恣意的な大規模監視」を「合憲的な問題がある」と非難し、Carpenter v. United States において取り扱われたターゲット指向のアプローチとは区別しました。Flock データを通じてメタン 91 ポンドが発見されたことを受け、ヒル判事は証拠を「有毒の木の果実」として押収 orders の発令しました。この事件は、政治的・法的な反対が高まっている時期に登場しています:Bernie Sanders 上院議員は、連邦機関がそのような自動読み取り装置を使用することを禁ずる Block Flock 法案を導入し、フロリダ州やテキサス州を含む各州ではこの技術の使用を停止する計画を発表しました。これに対し、Flock の CEO の Garretty Langley は、Flock を使用する法執行ユーザーによってストーキングされた女性らに謝罪するとともに、プライバシーと安全との間の妥協点を求める呼びかけを行いました。一方、キャンセルが増える中、同社は従業員への自主的な退職支援(voluntary buyout)を開始し、人員削減を図っています。

2026/10/04 3:06

ホールパンチ:重力場をスリングして宇宙船を操る

## 日本語訳: 提供されたテキストには実質的な情報が含まれておらず、単に特定の項目識別子のみを特定しており、それに関連する文脈が欠落しています。証拠、根拠、または背景の詳細がないため、意味のある物語を構築したり、中心的なメッセージを特定したりすることは不可能です。さらに、入力にはより広いトピックを理解するために不可欠な将来の発展、潜在的な影響、または関連事例について言及されていません。したがって、この断片単体から論理的な要約を導き出すことはできません。有効な概要を作成するには、項目の説明、重要性、および関連する周囲の状況を含む全文書へのアクセスが必要です。現状のままでは、テキストは単に生粋の参照コードとして機能し、コミュニケーションのための文章ではありません。そのような限られたデータを要約しようとすることは、当然ながら推測や捏造を招き、利用可能な事実に基づく正確性の要求に違反します。したがって、唯一妥当な結論は、問題となる項目に関するいかなる主張または討論も支えるのに不十分であるということです。 ## 翻訳元のテキスト: ## Summary: The provided text contains no substantive information because it identifies only a specific item identifier without any accompanying context. Without evidence, reasoning, or background details, it is impossible to construct a meaningful narrative or identify a central message. Furthermore, the input lacks any mention of future developments, potential impacts, or related cases that are essential for understanding a broader topic. Consequently, no logical summary can be derived from this fragment alone. To generate an effective overview, one would need access to the full document containing the item's description, its significance, and any relevant surrounding circumstances. As it stands, the text functions merely as a raw reference code rather than a communicative passage. Attempting to summarize such limited data would inevitably result in speculation or fabrication, which violates the requirement for accuracy based on available facts. Therefore, the only valid conclusion is that the source material is insufficient to support any claim or discussion regarding the item in question.

2026/10/04 3:01

ロダン美術館の3Dスキャン裁判判決での裏切り

## Japanese Translation: Cosmo Wenman は 2026 年 10 月 13 日(CEST 14:00–15:00)に「COMMUNIA Salon: The Rodin Case」にて、オーギュスト・ロダンの彫刻の 3D スキャンを巡る高プロファイルな情報公開に関する事件について検討する。著者が 2017 年にアクセス権の付与を求めた後、市民権活動家の Alexis Fitzjean Ó Cobhthaigh は Communia、Wikimédia France、La Quadrature du Net とともにその代理を務め、CADA(行政裁判所)は 2019 年に著者の側で判決を下した。2023 年 12 月には、パリ行政裁判所がロダン美術館および文化省に対しスキャンの公開を命じるとともに、これらの機関から効果的な上訴を受けられなかった著者に€1,500 の損害賠償を付けた。本案はフランス最高行政法院である Conseil d'État に再審され、2025 年 12 月の判決において、rapporteure publique(公の報告官)はルネ・マジットの『イメージの裏切り』に言及し、スキャンが物理的な原本なしには不可読であると主張した。Conseil d'État は、3D スキャンを物理的な複製と法的に区別できないものと認定し、これを行政文書ではなく譲渡不能な芸術コレクションの一部として分類した。裁判所はパリの判決を破棄し、著者に€3,000 の支払いを命じ、決定について書面による通知を発しなかった。Wenman は、この結局が情報公開(FOI)メカニズムの潜在的な濫用を示している点を分析する。その中で、手続的な動きや技術的な定義を用いて、機関が開示義務から守られることが可能になることを指摘する。