blog.dopana

Back

現代のJavaScript/TypeScript開発の世界では、BiomeOxcはリンティングとフォーマットにおいて高いパフォーマンスを提供する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

アーキテクチャレイヤー#

  1. Foundation Layer (biome_rowan, biome_parser, biome_formatter, biome_analyze)

    • 再利用可能なプリミティブを提供
    • Rowanベースのパースインフラストラクチャ
    • 共通フォーマットIR
  2. Language Layer (言語別クレート)

    • biome_js_parser, biome_js_formatter, biome_js_analyze
    • biome_json_parser, biome_json_formatter, biome_json_analyze
    • CSS、HTML、GraphQLも同様
  3. Service Layer (biome_service)

    • WorkspaceServerを通じて操作を調整
    • 状態とキャッシュを管理
  4. 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]

アーキテクチャ原則#

  1. Zero-Copy: ゼロコピーオペレーション用にアロケーター(oxc_allocator)を使用
  2. Visitor Pattern: 自動訪問者生成を伴うASTトラバーサル
  3. 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. 設計哲学#

特徴BiomeOxc
目標Prettier + ESLintを置き換えるオールインワンツールチェーン独立して使用可能なモジュラーコンポーネント
マルチ言語JS/TS、JSON、CSS、HTML、GraphQLをサポートJS/TSに重点を置き、拡張計画あり
デプロイメントIDE統合用デーモンプロセスNAPIバインディング付き従来のCLI

2. メモリ管理#

特徴BiomeOxc
アロケーターRowanベースインフラストラクチャアリーナアロケーター(oxc_allocator
Zero-Copyはいだが明示的ではないはい、コア設計原則として
ASTストレージRowan構文木アリーナベースASTノード

3. パフォーマンス最適化#

特徴BiomeOxc
並列実行はい、WorkspaceServer経由はい、rayonを使用
キャッシュデーモンプロセスキャッシュLintService内のランタイムキャッシュ
ルール実行順次実行ファイルサイズに基づくデュアルブランチ戦略

4. 拡張性#

特徴BiomeOxc
プラグインシステムプラグインをサポートESLint互換性用JSプラグイン(アルファ)
言語サポートExtensionHandlerパターン言語別モジュールクレート
カスタムルールbiome設定経由ルール設定経由

5. フォーマットアーキテクチャ#

特徴BiomeOxc
段階2段階(Lowering + Printing)3段階(IR Gen + Transform + Printing)
IR設計biome_formatter内のFormatElementoxc_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 .
bash

Oxc#

# 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パフォーマンス。

参考文献#