
2026/01/22 23:47
**Tree‑sitter 対 言語サーバー**
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
概要:
Tree‑sitter と Language Server Protocol(LSP)は、モダンなコードエディタにとって相補的なツールです。Tree‑sitter はソースファイルを高速かつ許容的に解析し、正確な言語要素を抽出するためにクエリ可能な構文木を生成します―これが高速で正確なシンタックスハイライトに最適です。一方 LSP はエディタと各プログラミング言語ごとの単一サーバー間の JSON ベースの通信チャネルを定義し、定義検索・オートコンプリート・診断・セマンティックトークン(可変性などの情報を含むハイライト)といった機能を可能にします。Emacs の Eglot は現在 LSP ベースのセマンティックハイライト(
eglot-semantic-tokens-mode)をサポートしており、Rust の rust-analyzer などはこれらのトークンを使用して可変性を表示します。Tree‑sitter は依然として構文描画のデフォルトであり続けますが、LSP は言語サーバーがより豊富なコンテキストやファイル横断的解析を提供できる場合に有用です。LSP が進化するにつれ、ハイライト品質で Tree‑sitter に匹敵または上回る可能性があり、エディタと開発者は複数の言語固有ツールを必要とせずに恩恵を受けられるでしょう。本文
2026年1月21日
本日、良い質問をいただきました。「Tree‑sitter と言語サーバーの違いは何ですか?」
どちらも深く掘り下げて理解しているわけではないので、観察可能で実践的な視点から説明します。
Tree‑sitter
Tree‑sitter は パーサージェネレーター です。
プログラミング言語の仕様を与えると、その言語を解析するプログラムを生成してくれます。
Tree‑sitter の特徴:
- 高速 – パースが素早い。
- 構文エラーに強い – 文法的に不正な入力も許容できるため、コードが一時的に無効でも編集しやすい。
これらの性質はテキストエディタのシンタックスハイライトエンジンに最適です。入力中に文法上間違っていても、単純な正規表現ベースのハイライターだと崩れたりちらついたりしますが、Tree‑sitter はそれを回避できます。また、パーサツリーを検索するクエリ言語も備えており、私の Emacs パッケージ(Citar で Typst をサポート)では正規表現より安全かつ堅牢に特定構文オブジェクトを取得しています。
要するに、Tree‑sitter は「実際に言語実装がパースする方法」に忠実なシンタックスハイライトを提供し、偶発的な正規表現マッチに頼りません。
言語サーバー
言語サーバー はプログラムを解析して、テキストエディタへ有用情報を Language Server Protocol(LSP)経由で送信します。
LSP はエディタとサーバ間の JSON 形式メッセージを定義したオープンスタンダードですので、どんな言語でも LSP に対応すれば任意のエディタが利用できます。
主なサービス:
- シンボル定義の位置検索
- カーソル位置での補完候補提示
- 診断情報やリファクタリング提案など
言語サーバーは「(N \times M)」問題を解決します。すなわち、各エディタごとに N 個の解析器を書く代わりに、1 つの言語用サーバを作れば、LSP をサポートする任意のエディタで利用できます。
さらに強力なのは、言語のランタイムやコンパイラツールチェーンにフックして、意味的に正確な回答を返せる点です。たとえば
pop 関数が 2 つ存在(スタックライブラリ用とヒープライブラリ用)すると、Emacs の単純ジャンプパッケージはどちらへ飛ぶか混乱します。しかし言語サーバーなら完全なスコープ情報を持っているので、その問題は起きません。
ハイライトに言語サーバーを使う
LSP を利用してシンタックスハイライトを行うことも可能です。Tree‑sitter より優れている理由があるわけではなく、むしろ LSP から得られる情報(例えば変数参照が可変かどうか)を活用できる点だけが差異です。
Emacs の組み込み LSP クライアント Eglot は最近
eglot-semantic-tokens-mode を追加しました。Rust コードで試したところ動作は良好でしたが、Tree‑sitter で十分にハイライトできるため、特別な理由がない限り Tree‑sitter にこだわります。
本文について
上記の文章はすべて私自身で執筆しました。LLM は一切使用していません。ブログで何かを読むときは 100 % 私(アシュトン・ウィアーズド)の手作業です。
AI に反対ではありません。翻訳や定型コード生成には LLM を活用していますが、ほとんどの場合は自分で素早く書けるため、今回の内容も私自身の思考と努力の直接的な成果です。
どうぞお楽しみください。そしてさらに創作を続けてください!