概要
gotreesitter は、CGoやCツールチェーン不要の 純粋なGo実装 のtree-sitterランタイム。 既存のtree-sitter文法を 再コンパイルなし で利用可能。 CGoバインディングよりも 全てのワークロードで高速、特にインクリメンタル編集で90倍のパフォーマンス。 クロスコンパイルやCI環境 での導入が容易。 205言語 に対応、エディタ・解析ツール開発に最適。
gotreesitter:Pure-Go Tree-sitterランタイムの特徴
- CGo不要、Cツールチェーン不要、WASM対応
- go get とビルドのみで利用可能、全プラットフォーム・全ターゲットサポート
- クロスコンパイルが容易(例:GOOS=wasip1, GOARCH=arm64など)
- tree-sitter互換のパーステーブル形式 を実装
- 既存の文法ファイルを 再コンパイルなし でそのまま利用可能
- CGoバインディングより圧倒的に高速
- インクリメンタル編集で 約90倍高速
- ノー編集時の再パースは 14,000倍高速
- C実装の呼び出しオーバーヘッドを完全排除
- CIやローカル開発環境がシンプル
- Cツールチェーン不要、gcc未導入ユーザーでも go install が失敗しない
- レースディテクタやファジング、カバレッジツールとの相性向上
クイックスタート
- インポート例
- import ( "fmt" "github.com/odvcencio/gotreesitter" "github.com/odvcencio/gotreesitter/grammars" )
- 基本的な使い方
- 文法取得: lang := grammars.GoLanguage()
- パーサ生成: parser := gotreesitter.NewParser(lang)
- パース: tree := parser.Parse(src)
- インクリメンタル編集: tree2 := parser.ParseIncremental(newSrc, tree)
- ファイル名から文法自動選択
- grammars.DetectLanguage("main.go") で自動判定
クエリ・シンタックスハイライト・タグ抽出
- S式クエリ言語 対応(predicates・カーソルストリーム含む)
- シンタックスハイライト
- NewHighlighter と Highlight でハイライト範囲抽出
- シンボルタグ抽出
- NewTagger と Tag で定義・参照位置抽出
- 全ての主要なtree-sitterクエリ機能をサポート
- #eq? #match? #any-of? #not-eq? #lua-match? #has-ancestor? など
インクリメンタル編集
- 変更領域のみ再パース
- 未変更部分はサブツリーを 自動再利用 しパフォーマンス向上
- 1バイト編集時の再パースが 1.38μs(CGoは124μs)
パース品質管理
- Qualityフィールド でパース信頼度を表示
- full:完全サポート(外部スキャナ含む)
- partial:一部サポート(外部スキャナ未実装)
- none:未サポート
ベンチマーク
- CGoバインディングとの比較
- フルパース: 約1.5倍高速
- インクリメンタル編集: 約90倍高速
- ノー編集再パース: 約14,000倍高速
- メモリ使用量 や アロケーション数 も最適化
対応言語と文法
- 205言語 に対応
- 204言語はfullサポート、1言語(norg)はpartialサポート
- 195 DFA、9 token_source、111言語はGo製外部スキャナ実装
- 言語セットのカスタマイズ
- ビルドタグと環境変数で組み込み・外部文法の切り替え、キャッシュ制御
- GOTREESITTER_GRAMMAR_SET でランタイム登録言語を制限可能
アーキテクチャ
- パーサ :テーブル駆動LR(1)、GLRサポート
- インクリメンタル再利用 :カーソルベース、未変更領域のスキップ
- アリーナアロケータ :GC負荷軽減
- DFAレキサ :文法テーブルから自動生成
- 外部スキャナVM :バイトコード解釈
- クエリエンジン :S式パターンマッチング
- ハイライタ/タグ抽出 :クエリベース
テスト・品質保証
- 全205文法のスモークテスト
- 20言語のゴールデンテスト
- ハイライト・クエリ・パーサの単体/統合テスト
- ファジング による堅牢性検証
- go test ./... -race でレース検出対応
今後のロードマップ
- クエリエンジンの互換性強化
- dfa-partial言語の外部スキャナ追加
- Parse()のエラー返却対応
- C tree-sitterとの自動パリティテスト
- ファジングの多言語展開
gotreesitterを活用したプロジェクト例
- TUIエディタ向けツール群 :https://github.com/odvcencio/gts-suite
- 次世代バージョン管理システム Got :https://github.com/odvcencio/got
- 今後はGotHubという統合プロジェクトも計画中
gotreesitter は、レガシーアーキテクチャを含むあらゆるGoアプリケーションに 高速かつ簡易にtree-sitterのパワーを導入 できるソリューション。 エディタや言語サーバ、コード解析ツール開発者に特におすすめ。