Skip to content

[BIG PROJECT] 識別子の抽出をバンドル時解析 + 内容ハッシュキャッシュへ移行する検討 #105

Description

@TwoSquirrels

構想

識別子・実装先の抽出を、登録時 (生ソースの tree-sitter 解析 → tags.json) からバンドル時 (プリプロセス出力の解析 + 内容ハッシュキャッシュ) へ移す。

  1. プリプロセス出力を linemarker で出所ごとに束ね直し、非維持ライブラリのファイル片を再構成する (追跡機構は linemarker::Tracker として既存)。
  2. 各ファイル片の sha256 をキーに解析キャッシュを引く。ヒットすれば定義識別子・実装先をそのまま使い、ミスした片だけ tree-sitter で解析してキャッシュに書く。
  3. 以降の逆引き・-M・削除は現行と同じ。

得られるもの

解決しないもの

  • 自己完結性の限界はそのまま。namespace ラッパーのファイル片は namespace mylib {\n} に再構成されて名前ゼロのまま消えるし、関数分割も壊れたまま。compatibility.md の大半は有効で、書き換わるのは X-macro の節だけ。
  • 自由関数の演算子だけのファイルも従来どおり救えない (特殊コメントで定義識別子・実装先を明示できるようにする #95 の特殊コメント案の意義は残る)。

実測 (WSL2, Intel Core 7 240H, release ビルド, Nyaan's Library 405 ヘッダー)

項目 時間
現行のバンドル 1 回 (8 include の解答) ~0.09–0.10 s
ファイル片の tree-sitter 解析: 現実的な解答 (展開後 35 KB・12 片) +0.02 s
同: 全部 include テンプレの上限 (911 ファイル・1.8 MB) +1.1–1.6 s
linemarker の束ね直し (上限ケース) ~10 ms
ファイル片の sha256 (上限ケース、キャッシュキー計算) ~2 ms
参考: 現行の登録 1 回 (405 ヘッダー) 1.68 s
  • キャッシュ無しの素朴なバンドル時解析は、看板ユースケース (全部 include テンプレ) で毎回 +1 秒超となり不成立。
  • キャッシュ有りなら、温かいバンドルの追加コストは上限ケースでも ~12 ms (束ね直し + ハッシュ)。ライブラリを触った直後の 1 回だけ解析を払う — 現行の「登録時に償却」と同じ償却構造を、明示的な update なしで実現できる。

論点

  • キャッシュの置き場所と世代管理 ($LOCAL 配下。内容ハッシュキーは伸び続けるので、ファイルパスをキーにハッシュを添える形にすれば自然に上書きされて有界になる)。
  • 展開はフラグに依存するため、同じヘッダーでもバンドルごとに別フラグメントになり得る (それで正しい。キャッシュはフラグ違いを別エントリとして持つだけ)。
  • include ガードの無いファイルが同一バンドル内で複数回展開された場合、出所ごとの連結で名前は和集合になる (過剰検出側なので安全)。
  • spec・architecture・compatibility の大幅改訂を伴う。tags.json スキーマ v3。実装規模的にメジャーバージョン (v3.0.0) 級。
  • 現行設計の正当化 (「列挙を登録時に行うのはホットパスへの償却のため」) は、この issue の帰結が出るまでの間も architecture.md に明文化しておく価値がある。

🤖 Generated with Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions