BiomeとOxcのアーキテクチャ比較
JavaScript/TypeScript用の2つのRustツール、BiomeとOxcのアーキテクチャ分析と比較
現代のJavaScript/TypeScript開発の世界では、Biome ↗とOxc ↗はリンティングとフォーマットにおいて高いパフォーマンスを提供する2つの注目すべきRustツールです。どちらもRustで書かれていますが、設計哲学とアーキテクチャが異なります。この記事では、各ツールのアーキテクチャを深く掘り下げ、比較します。
Biomeとは?#
BiomeはWebプロジェクトのための包括的なツールチェーンで、CLIとLSPを通じて使用可能なフォーマッターとリンターを提供します。PrettierとESLintをより高いパフォーマンスで置き換えるように設計された単一の統合パッケージです。
Biomeのアーキテクチャ#
Biomeはサーバー-クライアントアーキテクチャを使用し、バックグラウンドで実行されるデーモンを持ちます:
graph TB
subgraph "Biome Architecture"
CLI[CLI Interface]
LSP[LSP Server]
Daemon[Daemon Process]
Workspace[WorkspaceServer]
Handlers[Language Handlers]
Foundation[Foundation Layer]
end
CLI --> Daemon
LSP --> Daemon
Daemon --> Workspace
Workspace --> Handlers
Handlers --> Foundation
アーキテクチャレイヤー#
-
Foundation Layer (
biome_rowan,biome_parser,biome_formatter,biome_analyze)- 再利用可能なプリミティブを提供
- Rowanベースのパースインフラストラクチャ
- 共通フォーマットIR
-
Language Layer (言語別クレート)
biome_js_parser,biome_js_formatter,biome_js_analyzebiome_json_parser,biome_json_formatter,biome_json_analyze- CSS、HTML、GraphQLも同様
-
Service Layer (
biome_service)WorkspaceServerを通じて操作を調整- 状態とキャッシュを管理
-
Interface Layer (
biome_cli,biome_lsp,biome_wasm)- 複数の消費方法を提供
Biomeのフォーマッター#
Biomeは2段階フォーマットシステムを使用します:
graph LR
CST[CST from Parser] --> Lowering[Lowering Stage]
Lowering --> IR[FormatElement IR]
IR --> Printer[Printing Stage]
Printer --> Output[Formatted Text]
- Lowering Stage: CSTを言語に依存しないIR(
FormatElement)に変換 - Printing Stage: プリンターがIRを消費し、オプションに基づいてレイアウトと改行を決定
Oxcとは?#
Oxc(The Oxidation Compiler)は、Rustで書かれた高性能なJavaScript/TypeScriptツールのコレクションです。独立して、または一緒に使用して完全なツールチェーンを構築できるモジュールで構成可能なコンパイラコンポーネントのセットとして設計されています。
Oxcのアーキテクチャ#
Oxcはレイヤー設計を使用し、モジュラーコンポーネントを持ちます:
graph TB
subgraph "Oxc Architecture"
Apps[Applications]
Core[Core Libraries]
Foundation[Foundation Libraries]
end
Apps --> Core
Core --> Foundation
Apps --> oxlint[oxlint]
Apps --> LSP[Language Server]
Apps --> NAPI[NAPI Bindings]
Core --> Parser[Parser]
Core --> Semantic[Semantic]
Core --> Linter[Linter]
Core --> Transformer[Transformer]
Core --> Minifier[Minifier]
Core --> Codegen[Codegen]
Foundation --> AST[AST]
Foundation --> Allocator[Allocator]
Foundation --> Diagnostics[Diagnostics]
Foundation --> Span[Span]
Foundation --> Syntax[Syntax]
アーキテクチャ原則#
- Zero-Copy: ゼロコピーオペレーション用にアロケーター(
oxc_allocator)を使用 - Visitor Pattern: 自動訪問者生成を伴うASTトラバーサル
- Shared Foundation: 共通エラー報告、ソース位置、構文定義
Oxcのリンター#
Oxlintは並列実行アーキテクチャとデュアルブランチ戦略を使用します:
graph TB
LintService[LintService] --> Runtime[Runtime]
Runtime --> process_source[process_source]
process_source --> Parser[Parser]
Parser --> AST[AST]
AST --> LintContext[LintContext]
LintContext --> Linter[Linter]
Linter --> execute_rules[execute_rules]
execute_rules --> strategy1[Strategy 1: nodes → rules]
execute_rules --> strategy2[Strategy 2: rules → nodes]
strategy1 --> RULE_BUCKETS[RULE_BUCKETS]
strategy2 --> RULE_BUCKETS
- Dual Branch Strategy: ファイルサイズに基づいて(ノード→ルール)または(ルール→ノード)を切り替え
- Parallel Execution: rayonを使用した並列ファイル処理
- Type-Aware Linting: 型認識リンティングをサポート
Oxcのフォーマッター(oxfmt)#
Oxcフォーマッターは3段階フォーマットシステムを使用します:
graph LR
AST[AST from Parser] --> IRGen[IR Generation]
IRGen --> IR[FormatElement IR]
IR --> Transform[IR Transformation]
Transform --> sort_imports[sort_imports]
sort_imports --> Printer[Printing]
Printer --> Output[Formatted Text]
- IR Generation:
Formatトレイトを使用したASTトラバーサル - IR Transformation:
sort_importsなどの変換を適用 - Printing: プリンターがIRを消費し、最終出力をレンダリング
[!NOTE] OxcフォーマッターコアはBiomeの
biome_formatterクレートから移植されていますが、完全に言語に依存しない設計になっています。
詳細な比較#
1. 設計哲学#
| 特徴 | Biome | Oxc |
|---|---|---|
| 目標 | Prettier + ESLintを置き換えるオールインワンツールチェーン | 独立して使用可能なモジュラーコンポーネント |
| マルチ言語 | JS/TS、JSON、CSS、HTML、GraphQLをサポート | JS/TSに重点を置き、拡張計画あり |
| デプロイメント | IDE統合用デーモンプロセス | NAPIバインディング付き従来のCLI |
2. メモリ管理#
| 特徴 | Biome | Oxc |
|---|---|---|
| アロケーター | Rowanベースインフラストラクチャ | アリーナアロケーター(oxc_allocator) |
| Zero-Copy | はいだが明示的ではない | はい、コア設計原則として |
| ASTストレージ | Rowan構文木 | アリーナベースASTノード |
3. パフォーマンス最適化#
| 特徴 | Biome | Oxc |
|---|---|---|
| 並列実行 | はい、WorkspaceServer経由 | はい、rayonを使用 |
| キャッシュ | デーモンプロセスキャッシュ | LintService内のランタイムキャッシュ |
| ルール実行 | 順次実行 | ファイルサイズに基づくデュアルブランチ戦略 |
4. 拡張性#
| 特徴 | Biome | Oxc |
|---|---|---|
| プラグインシステム | プラグインをサポート | ESLint互換性用JSプラグイン(アルファ) |
| 言語サポート | ExtensionHandlerパターン | 言語別モジュールクレート |
| カスタムルール | biome設定経由 | ルール設定経由 |
5. フォーマットアーキテクチャ#
| 特徴 | Biome | Oxc |
|---|---|---|
| 段階 | 2段階(Lowering + Printing) | 3段階(IR Gen + Transform + Printing) |
| IR設計 | biome_formatter内のFormatElement | oxc_formatter_core内のFormatElement |
| コメント処理 | フォーマッターに統合 | カーソルベースコメントシステム |
| Prettier互換性 | はい、テスト付き | はい、設計目標として |
どちらを使用すべきか?#
Biomeを選ぶ場合:#
- PrettierとESLintの両方を置き換えるオールインワンソリューションが必要
- マルチ言語サポート(CSS、HTML、GraphQL)が必要
- より良いIDE統合のためのデーモンプロセスが必要
- チームがシンプルな設定で統一ツールチェーンを望む
Oxcを選ぶ場合:#
- 独立して使用できるモジュラーコンポーネントが必要
- CI/CD環境で最大のパフォーマンスが必要
- TypeScriptセマンティクスによる型認識リンティングが必要
- コンポーネントからカスタムツールチェーンを構築中
使用例#
Biome#
# インストール
npm install -D @biomejs/biome
# ファイルをフォーマットとリント
biome check src/file.ts
# プロジェクト全体をフォーマットとリント
biome check .
# 開発用ウォッチモード
biome check --watch .bashOxc#
# oxlintをインストール
npm install -D oxlint
# ファイルをリント
oxlint src/file.ts
# 並列実行でプロジェクト全体をリント
oxlint src/
# 型認識リンティング
oxlint --tsconfig tsconfig.json src/bash結論#
BiomeとOxcの両方は、高いRustパフォーマンスを持つJavaScript/TypeScriptツールリングの未来を表しています。Biomeはマルチ言語サポートを備えたオールインワンエクスペリエンスに優れ、Oxcはモジュラーデザインと最大パフォーマンスに優れています。
2つのツールの選択は、プロジェクトの特定のニーズに依存します:統一ツールチェーン vs 柔軟なコンポーネント、マルチ言語サポート vs JS/TS重点、IDE統合 vs CIパフォーマンス。