
2026/08/22 4:16
Rust Glancer
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Rust Glancer は、rust-analyzer などの既存のツールと比較してメモリ消費量を大幅に削減する言語サーバープロトコル(LSP)サーバーを提供することで、Rust の開発における大きな進歩を表します。その核心的な革新は、変更されていないコードに対して重い依存関係解析を回避し、代わりに軽量な
.rmeta ファイルとレイジーな処理戦略に依存することにあります。このアーキテクチャの転換は重要であり、現代のワークスペースにはアイドル状態でも完全なボディ解析を必要としない数千もの関数が含まれているためです。プロシージャルマクロの実際のコード展開実行を回避(高コストなプロセス)し、IntelliJ の PSI アーキテクチャに似たプラグインインターフェースを利用することで、Rust Glancer はヒントの誤配置やファイルウォッチングの不安定さといった一般的な問題を軽減します。このアプローチは必然的に複雑なビルドスクリプトやフルな proc macro 効果のサポートを制限しますが、メモリ使用量がボトルネックとなる大規模プロジェクトにおいて効率的な代替手段を提供します。究極的には、このプロジェクトは「rmeta-transparent」モデルを採用し、重厚な計算資源をローカルのソースコード上のアクティブなエディティングセッションのみで留めることで、本質的な開発者フィードバックを損なうことなく最適パフォーマンスを実現することを目的としています。本文
Rust Glancer:メモリ効率とアーキテクチャの革新への道筋
2026 年 8 月 21 日、Rust Glancer は約 256 分の 1(約 2 オクターブ) のメモリ削減を実現した機能型 LSP サーバーとして注目されています。これは非常に有望なプロジェクトです。
本稿では、lobste.rs コメント欄で論じられていた考察を整理し、Rust Glancer や既存ツールとの比較、今後のアーキテクチャへの提案について解説します。
1. Rowan とその代替案の検討
現在の構文木(AST)処理における課題と見直しポイントです。
- 現状の実装状況
では、構文木の表現に Rowan が使用されています。rust-analyzer- ただし、Rowan はこの用途には適さないと考えられています。
- インクリメンタルパーシングや DOM の変異(refactoring)といった高度な操作のみを想定しています。
- 必要なアーキテクチャの見直し
- 99% のユースケース: 依存関係が複雑なコード全体に対しては、浅く解析する必要があるためです。
- 1% のユースケース: Rowan のような詳細な構造が必要なのは限定的な場面だけです。
- 基本的な目標: インクリメンタルツールであることの本質は「改変(refactoring)」にあるが、メインの AST 構造自体は単純な配列のリストであるべきです。
- 参考資料: より詳細な議論については、以下の動画をご参照ください。
https://youtu.be/G93oYL1ry70
2. Rust ワークスペースとインデックス化戦略
Rust のワークスペースには数千もの関数、構造体、トレイト、およびその関係性が含まれるため、適切な管理が不可欠です。
- 必須の処理
- 関数の本体やステートメントなど、すべての情報を解析し、記憶する必要があります。
- 「参照箇所をすべて見つける」機能を実現するには、手を抜くことは不可能です。
- Rust Glancer のアプローチ
- 各関数の本体処理は想定されていますが、オーバーヘッドを増やさず**遅延処理(lazy)**が可能であると考えられています。
- 全項目をインデックス化しつつ、現在は開いているファイルのみを対象とすることで両者の良さを兼ね備えます。
- Rust Rover との比較
- IDE の GUI を除いた場合、メモリ使用量では Rust Rover (RR) がよりコンパクトである可能性が高いです。
3. サポート外機能への対応(プロシージャルマクロなど)
ビルドスクリプトやプロシージャルマクロ(Proc Macro)はサポート対象外ですが、代替案が存在します。
- 課題と原因
- プロシージャルマクロの展開が遅く、通常の IDE 的「チート(最適化)」が実行できません。
- マクロは大量のコードを生成するため、
バイナリの 30% が JSON パース用コードに割り当てられるなどの非効率が生じます。rust-analyzer
- 解決策:Sorbet のトリック
- メタプログラミング自体を実行せず、プラグインインターフェースを通じて「影響範囲」を説明する仕組みを導入します。
- 実装例:
を実際に実行する代わりに、空の本体を持つserde
を注入するためのシム(中継コード)を追加する方法です。impl Serialize for T {}
4. 埋め込みヒントと一貫性の維持
LSP サーバーにおけるデータ同期とファイルウォッチングの不安定性に関する考察です。
- 埋め込みヒント(Inlay Hints)の問題
- コード編集時、ヒントが配置からずれてしまう現象があります。
は厳密なシリアライズ可能な世界観を共有するはずですが、推論ベースのものになりがちです(Dart Analyzer のサウンドデータ同期に劣ります)。rust-analyzer
- ファイルウォッチングの不具合
- 2 つのバックエンド選択肢が存在します:
- エディタにウォッチを任せる
- サーバーサイドでウォッチを行う
- ネイティブウォッチャーの API は本質的に競合(race)問題を抱えています。プラットフォーム固有の複雑な作業を行わずに対応できていません。
- 2 つのバックエンド選択肢が存在します:
5. アーキテクチャの提案:IntelliJ の PSI API に学ぶ
rust-analyzer が「半分しか描かれていない馬」に見えないよう、IntelliJ IDE の成功体験を踏まえたアーキテクチャが必要です。
- IntelliJ の多段階バックエンド戦略
- アクティブ編集ファイル: PSI は具体的な構文木(AST)で裏打ちされます。
- プロジェクト内の他のファイル: PSI は「Stub Tree(コンパイル済みの最小表現)」で裏打ちされ、外部に見える部分のみを格納します。ナビゲート時に自動的に AST に切り替わります。
- 依存関係: PSI は
で生成したjavac
ファイルで裏打ちされ、IDE が自動逆コンパイルを行います。.class
- Rust への適用案
- 現状の問題: 未確認の依存関係(6666 など)に対して全般的にサルスァ(salsa)を使用せず、非効率です。
- 理想のアプローチ:
が生成したrustc
ファイル を使用すべきです。.rmeta- ユーザーが
内でいじくり始めた場合に限り、透明にサルスァへ切り替えます。~/.cargo/registry/src
- 前提条件:抽象的なアクセス API の定義
- プリコンパイルされた
ファイルを入力として受け付ける必要があります。.rmeta - ソースコードが利用できない crates への対応も考慮が必要です。
- 関連計画のドキュメントは以下の通りです:
https://hackmd.io/ytd82QNiT_Ku2XFr1EAtiQ
- プリコンパイルされた
6. 結論:Glancer アナライザーの将来性
- 世界への分割
- 氷山の「尖ったインクリメンタル部分」と、
- ディスク上に存在する「主に読み取り専用でコンパクトな大部分」に分けるべきです。
- 展望
- このように設計された Glancer アナライザーアーキテクチャ は素晴らしいものです。
- サプライチェーン攻撃に対して安全かつ効率的な分析環境を実現できるでしょう。