概要
Tree-sitter は高速でエラー耐性のあるパーサ生成器であり、主に構文ハイライトに利用 Language Server はコード解析とインテリジェントな支援をエディタに提供 両者は役割が異なり、Tree-sitterは構文解析、Language Serverは意味解析が得意 LSP(Language Server Protocol)によりエディタとサーバ間の連携が標準化 Rustなど一部言語ではLanguage Serverによる高度なハイライトも可能
Tree-sitterとは何か
- Tree-sitter は パーサ生成器
- プログラミング言語の 文法記述 を入力し、 構文解析プログラム を自動生成
- 高速動作 と 構文エラー耐性 が特徴
- テキストエディタでの 構文ハイライト 用途に最適
- 入力途中の 不完全なコード でもハイライトが崩れにくい
- 従来の 正規表現ベース のハイライトはエラー時に壊れやすい
- クエリ言語 を使い、構文木に対して 特定要素の検索 が可能
- EmacsのCitar拡張などで Typst サポートに活用
- 言語実装 に忠実なハイライト実現
- 単なるパターンマッチではなく 言語エンジン同等の解析 が可能
Language Serverとは何か
- Language Server は プログラム解析サービス
- エディタに 記号の定義位置 や 補完候補 などを提供
- Language Server Protocol(LSP) でエディタとサーバが JSONメッセージ で通信
- オープン標準 であり、任意の言語・エディタで利用可能
- N×M問題 の解消
- 以前は言語数N×エディタ数M分の個別実装が必要だった
- LSPにより 各言語は1つのLanguage Server、 各エディタはLSP対応 で済む
- ランタイムやコンパイラとの連携 により 意味的に正確な解析 が可能
- 例:同名関数popが複数ある場合、 どのモジュールのものか正確に特定
- dumb-jump のような単純ツールは スコープ判定が弱い が、Language Serverは強力
構文ハイライトにおけるLanguage Serverの活用
- Language Server でも 構文ハイライト は可能
- ただし、 Tree-sitterより複雑かつ重い 場合が多い
- Emacsの eglot-semantic-tokens-mode でLSPベースのハイライト対応
- Rustコードでの使用例あり
- Tree-sitterベースのハイライト で十分なため、特別な理由がなければそちらを利用
- Rust-analyzer など一部Language Serverは 変数のmutability (可変・不変)を区別してハイライト可能
- 通常の構文ハイライトでは不可能な 詳細情報の可視化 が可能
まとめと所感
- 本記事は Ashton Wiersdorf による 完全な人間執筆
- LLM(大規模言語モデル)は 翻訳や単純作業の自動化 には有用
- 複雑な部分は 自分で書いた方が速い 場合も多い
- LLM生成文も役立つが、 本記事は人間の思考と意図を込めて執筆
- 本物の意味を持つ文章 の価値と、それを作る楽しさ