Rubyの父まつもとゆきひろ氏が、自らAnthropic社のClaude Open 4.7と協働してRubyのAhead-Of-Time(AOT)コンパイラ「Spinel」を構築し、RubyKaigi 2026の基調講演で公開した。RubyのソースコードをC言語に変換し、GCC/Clangで単一ネイティブバイナリにする3段階のパイプラインで、CRuby比で最大87倍の実行速度を実測値として叩き出している。
Claude Codeの実務活用の全体像は Claude Codeベストプラクティスガイド2026年版 を参照してほしい。本記事はSpinelの内部構造と他言語AOTとの比較に集中する。
注目すべきは、Matz氏自身が「3年前から構想はあったが、実装はわずか数週間で集中的に行った」と語り、ソースの大半にco-authored by: Claudeの注記が残されていることだ。GitHubに公開されたmatz/spinelは2万行超のコンパイラバックエンドを自己ホスト(Self-hosting)し、Prismパーサ→静的型推論→C言語生成→ネイティブビルドの単純な構造で実用域のRubyサブセットをカバーしている。
この記事では、Spinelのアーキテクチャ、CRuby/YJIT/ZJITとの性能差、Python・Java・.NET・Goといった他言語のAOT/JITとの比較、そしてRuby 4.x以降の言語進化におけるSpinelの位置づけを、公式リポジトリと一次ソースをベースに整理する。
01. Spinelとは — RubyをC経由でネイティブ化するAOTコンパイラ
Spinelは、Rubyソースコードを読み込んで最適化されたC言語コードを生成し、システム標準のCコンパイラ(GCC/Clang)を用いてスタンドアロンのネイティブバイナリを構築するAhead-Of-Timeコンパイラだ。インタプリタ言語として認知されてきたRubyに、実行時VMを必要としない単一バイナリ配布の道を開く試みである。
Spinelのコンパイルパイプラインは「Prismパーサ→spinel_codegen(静的型推論+C生成)→GCC/Clangでネイティブビルド」の3段階で構成される。生成バイナリの実行時依存はlibcとlibmだけで、VM起動オーバーヘッドもJITウォームアップも存在しない。最初の命令から最高速で動作するため、CLIツールやサーバーレス関数のようなコールドスタートが効くシナリオで圧倒的に有利になる。
「Spinel」という名称は、ルビー(紅玉)と歴史的に混同されてきた鉱物スピネル(尖晶石)に由来する。同時に、漫画『カードキャプターさくら』に登場するキャラクター「ルビー・ムーン」と対になる「スピネル・サン」、Matz氏の愛猫の名前でもあるという。遊び心のあるネーミングとは裏腹に、内部アーキテクチャはきわめて実用的だ。
・公開時期:RubyKaigi 2026(2026年4月、函館)の基調講演
・GitHub:matz/spinel(MITライセンス)
・実装規模:spinel_codegen本体は2万行超のRubyコード
・自己ホスト:spinel_codegen自身をSpinelでネイティブ化可能
・実行時ライブラリ:sp_runtime.h + libspinel_rt.a(静的リンク)
・ベンチマーク:CRuby比7〜87倍、フィボナッチでYJIT有効CRubyの18%処理時間
01-1. Prismを基盤にした最新パーサ採用
第一段階で使われるPrismは、Ruby 3.3以降で標準パーサとして取り込まれている新世代のRubyパーサだ。従来のparse.yに比べて高速・堅牢・移植性が高く、複数のRuby実装(CRuby・JRuby・TruffleRuby・mruby)から共通基盤として利用されている。Spinelがゼロからパーサを書き起こさずPrismをそのまま採用したことは、現代のRubyエコシステムが共通基盤として整備されてきた成果でもある。
ASTを取り出した後の第二段階spinel_codegenでは、プログラム全体に対して静的型推論を実行する。動的型付け言語であるRubyのコードを、明示的な型注釈なしに型情報まで導出する点がSpinelの工学的なハイライトだ。配列に整数を入れたら以後も整数だけが入る、メソッドの戻り値型は1種類に統一される、といった「コンパイラが推論しやすい書き方」を要求する代わりに、型注釈の追加コストを開発者に強いない設計になっている。
第三段階では、生成されたC言語ソースをGCCまたはClangでビルドする。SpinelはRuby固有の言語機能を表現するための小さなランタイムsp_runtime.hと静的ライブラリlibspinel_rt.aを埋め込み、配列・文字列・例外・GCといった必要最小限の機構をネイティブバイナリに組み込む。
02. なぜRubyにAOTが必要だったのか — 配布と速度の二大課題
Rubyは長年「インタプリタ言語」として進化してきた。CRubyのバイトコードVM、JRubyのJVM上実行、TruffleRuffeのGraalVM JIT、mrubyの組み込み向けバイトコード実行など、ランタイム多様化の歴史は豊富だ。それでも「単一バイナリで配布する」という1点だけは長らく実現できていなかった。
実行速度の壁も依然として存在する。YJITはRuby 3.2以降のWebアプリで実用化され、Ruby 3.4でインタプリタ比約92%の高速化を達成したが、JIT本来の特性として「ウォームアップ期間」を要する。短命プロセス、CLIツール、サーバーレス、AIエージェントから呼び出されるヘルパーといった用途では、JITコンパイルが完了する前にプロセスが終わってしまうこともある。
配布形態とコールドスタート速度。この2つを同時に解決するのがAOTコンパイラの存在意義だ。 既存のRubyコミュニティ向けには、長く議論されてきた潜在的なニーズに対する回答がSpinelである。
02-1. CLIツールがGo/Rustに流れていた構造
これまでインフラ管理ツール、CIヘルパー、開発者向けCLIの多くがGoやRustで書き直されてきた背景には、Rubyランタイムの存在を前提にできない配布上の制約があった。gem installできない環境にツールを届けるには、ランタイム+全Gem+アプリケーション本体をパッケージングする必要があり、現実的な選択肢は限られていた。
Bundlerによる依存解決の精緻化、bundle execの整備、rubygems.orgの安定運用といった環境整備は進んだものの、最終的に「実行環境にRubyがインストールされている前提」からは逃れられなかった。Spinelの登場は、この前提自体を取り払う最初の本格的な試みである。
02-2. AIエージェント時代のヘルパー需要
2025〜2026年に急速に普及したAIコーディングエージェントは、リポジトリのメタデータ抽出、ログのJSON変換、設定ファイルの差分計算といった「小さく明確な責務を持つヘルパープログラム」を大量に必要とする。これらのヘルパーは起動・実行・終了が秒単位で完結するため、JITウォームアップを許容できない。
Rubyランタイムを持たないコンテナや軽量ランタイム上でもRuby資産を活用したい、というニーズに対し、Spinelは事前コンパイル済みのネイティブバイナリで応える。Matz氏自身がClaudeで実装したという開発プロセスそのものが、AIエージェントとの相互運用を見据えた選択にも見える。
03. Spinelのアーキテクチャ — 3段パイプラインの全体図
Spinelの内部構造は、複雑な動的言語処理系としては驚くほどシンプルだ。Prismが第1段、spinel_codegenが第2段、Cコンパイラが第3段。3段それぞれが独立した責務を持ち、中間表現としてAST→C言語ソースという「人間にも読める2形態」だけを採用する。
file.rb] --> B[Prism
Parser] B --> C[AST
抽象構文木] C --> D[spinel_codegen
静的型推論
+C生成] D --> E[C Source
file.c] E --> F[GCC / Clang] G[sp_runtime.h
libspinel_rt.a] --> F F --> H[Native Binary
libc + libm only] style A fill:#fef3c7,color:#000 style H fill:#bbf7d0,color:#000 style D fill:#dbeafe,color:#000
03-1. spinel_codegenの自己ホスト構造
注目すべきは、spinel_codegen自体がRubyで書かれている点だ。2万行超のコンパイラバックエンドが、自らをSpinelでコンパイルしてネイティブバイナリ化される。一般にコンパイラの自己ホスト化(Self-hosting)はその言語サブセットが「実用的なプログラムを書ける水準に達した」ことの強い証拠となる。
C言語のセルフホスト、Goのセルフホスト、Rustのセルフホストと並ぶ意味を、Rubyのサブセット言語が獲得した瞬間がSpinelの公開だと言える。実装言語が表現力豊かなRubyのまま、ターゲットがネイティブコードという二重のアドバンテージは、コンパイラ実装のメンテナンス性を大きく押し上げる。
03-2. C構造体マッピングとGC負荷の軽減
Spinelが性能を稼ぐ核となる仕掛けは、Rubyのクラス構造をC言語の構造体(struct)に直接マッピングし、可能な限り値型として扱う点にある。動的にハッシュテーブルとして管理されてきたインスタンス変数を、コンパイル時に確定したフィールド配置に置き換えることで、ヒープ割り当てと参照解決が劇的に減少する。
多くのオブジェクトが値型として扱われることで、ガベージコレクション負荷が大幅に軽減され、大規模なメモリ割り当てにおいてもC言語と同等の効率的なメモリ管理が実現する。これは静的型付け言語の設計思想を動的言語に持ち込んだトレードオフの結果であり、後述するサブセット仕様の制約と表裏一体である。
# Spinelが推奨する書き方の例
class Point
def initialize(x, y)
@x = x # Integerに統一
@y = y # Integerに統一
end
def distance_to(other)
dx = @x - other.x
dy = @y - other.y
Math.sqrt(dx * dx + dy * dy) # 戻り値はFloat固定
end
attr_reader :x, :y
end
このコードはSpinelの静的型推論が問題なく解釈できる。@xと@yは常にIntegerとして扱われ、distance_toの戻り値はFloatに固定される。生成されるC言語コードでは、Pointがstruct sp_Point { int64_t x; int64_t y; }相当の値型として展開される可能性が高い。
03-3. ランタイムは2ファイルだけ
Spinelの実行時環境はsp_runtime.h(公開ヘッダ)とlibspinel_rt.a(静的ライブラリ)の組み合わせで構成される。配列・文字列・例外処理・GC・IOといったRuby固有の機構を、最小限の実装で提供する小さなランタイムだ。
CRubyに比べて切り詰められたランタイムだが、コンパイル後のバイナリは外部の動的ライブラリに頼らずlibc/libmだけで動作する。Dockerコンテナのscratchベースイメージや、軽量Alpine Linuxにそのまま放り込んでも動作する設計になっている点は、配布の観点で大きな利点である。
04. 衝撃のパフォーマンス — CRuby比7〜87倍、YJIT有効でも5倍
Spinelの公開リポジトリには各種ベンチマーク結果が掲載されている。データ処理・計算処理を中心とした項目で、従来のCRubyに対し7倍〜最大87倍の速度向上が記録された。フィボナッチ数列演算では、YJIT無効CRuby 4.0.2比でわずか3%、YJIT有効状態でも18%の処理時間で完了している。
・YJIT無効CRuby 4.0.2比:処理時間3%(≒33倍)
・YJIT有効CRuby 4.0.2比:処理時間18%(≒5.6倍)
・MiniRuby(Ruby 4.1.0開発版)比:約11.6倍
・データ処理・計算系全般:CRuby比7〜87倍
※いずれもMatz氏の公開ベンチマーク(2026年4月時点)
04-1. 高速化の3要因
Spinelがこれだけの高速化を達成できる要因は3つある。第1にC言語ソースとして展開されることでGCC/Clangの強力な最適化(関数インライン化、ループ展開、デッドコード削除、定数畳み込み)がそのまま適用される点だ。第2にクラスをC構造体にマッピングすることでメモリアクセスがキャッシュに乗りやすくなる点だ。第3にGC負荷の大幅軽減である。
JITコンパイラはホットパスを検出して動的に最適化するが、AOTはコンパイル時に全コードを最適化するため、コールドコードでも最高速で動く。一発勝負のCLIツール用途では、AOTの優位性が顕著に現れる。
04-2. ZJIT/YJITとの位置づけの違い
Matz氏自身が明言している通り、SpinelはYJIT/ZJITと競合するものではなく相補関係にある。動的評価やメタプログラミングを多用する大規模Webアプリは引き続きCRuby+YJIT/ZJITの世界で稼働し、配布性とコールドスタートが求められる領域にSpinelが対応する、という二刀流の構図だ。
ZJITは2025年12月リリースのRuby 4.0でデフォルト同梱された実験的JITで、メソッド単位の「教科書的」最適化を採用している。YJITが基本的なベンチマークで優位を保つ一方、ZJITは最適化の上限が高く、特定ワークロードでYJITを上回り始めている。
| 比較項目 | CRuby(YJIT有効) | ZJIT(Ruby 4.0) | Spinel |
|---|---|---|---|
| 実行モデル | バイトコードVM+JIT | バイトコードVM+JIT | AOTネイティブ |
| ウォームアップ | 必要(Lazy Basic Block Versioning) | 必要(メソッド単位) | 不要(事前最適化済み) |
| 配布形態 | Ruby+Gem+アプリ | Ruby+Gem+アプリ | 単一ネイティブバイナリ |
| 動的機能 | フル対応 | フル対応 | 制限付き(サブセット) |
| 主用途 | Rails等の長命Webアプリ | Rails等の長命Webアプリ | CLI・サーバーレス・組み込み |
| 開発状況 | 安定(プロダクション) | 実験(オプトイン) | 実験(プロトタイプ) |
05. サポートする言語仕様と意図的な制限
Spinelは「Rubyのサブセット」を対象にコンパイル可能性を担保している。動的機能の制限は意図的な設計判断であり、これによってコンパイラが事前にプログラムの全体像を把握できるようにしている。
05-1. サポートされる機能
公式リポジトリのドキュメントによれば、以下の機能はSpinel上で完全に動作する。
・クラス・継承・Mix-in・Struct・アクセサメソッド
・ブロック・Proc・Lambda・yield
・パターンマッチング(in式)・case/when・case/in
・例外処理(begin/rescue/ensure)
・Enumerableモジュール(each/map/select/reduce等)
・Fibers(軽量並行処理)
・FFI(外部Cライブラリ呼び出し)
・主要な組み込みクラス(Integer/Float/String/Array/Hash/Symbol等)
特に重要なのはFFIサポートだ。SQLite3など外部Cライブラリへの直接バインディングが既に動作しており、データベースを使うCLIツールも構築できる。Fibers対応により、軽量な並行処理を表現可能で、サーバ的な使い方への足がかりも残されている。
05-2. サポートされない機能
一方で、以下のRubyの特徴的な動的機能は意図的に切り落とされている。
| 制限カテゴリ | 具体的な未サポート機能 | 理由 |
|---|---|---|
| 動的コード評価 | eval / class_eval / instance_eval(文字列形式) | 事前解析と相反 |
| メタプログラミング | send / method_missing / 動的define_method | 静的呼び出し解決と相反 |
| 並行処理 | Thread / Mutex(ネイティブスレッド) | 当面はFibersで代替 |
| 文字エンコーディング | UTF-8以外(EUC-JP/Shift_JIS等) | ランタイムサイズ抑制 |
| ObjectSpace | ObjectSpace全般 | 動的メモリ走査と相反 |
「Rubyらしさの根幹」を構成してきた動的機能を削ぐ判断は、軽くはない。しかし、これらを残したまま型推論ベースの最適化を成立させるのは不可能に近く、Matz氏は明確に「型推論可能なRubyサブセット」というポジショニングを取った。Railsや動的Gem群は引き続きCRuby+YJIT/ZJITで動かす、という二刀流の前提が貫かれている。
05-3. Spinelで書きやすいコードの例
# Spinelが型推論しやすい書き方
def fibonacci(n)
return n if n < 2
fibonacci(n - 1) + fibonacci(n - 2)
end
puts fibonacci(35)
この単純な再帰関数は、引数も戻り値もInteger固定、呼び出しは静的に解決可能、という条件を満たすためSpinelの最適化が最大限効く。GCCの末尾呼び出し最適化と組み合わさると、Cで書いたフィボナッチ実装と遜色ない速度に近づく。
# 配列処理の例(Enumerableも対応)
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
total = numbers.select { |n| n.even? }.map { |n| n * n }.sum
puts total
逆に、@items = []に異なる型を混在させる、メソッドが条件によって全く違う型を返す、define_methodで動的にメソッドを生やす、といった書き方はコンパイルエラーになる。
06. 他言語のAOT/JITとの徹底比較
SpinelをRuby単独の文脈ではなく、各言語のコンパイラ戦略の中に位置づけてみよう。動的言語に静的コンパイルを持ち込む試みは、Pythonでは長い歴史があり、TypeScriptでは2024〜2026年に活発化した。Java/.NETは商用バックの大規模実装が成熟し、Go/Rustは最初から静的コンパイル一択である。
06-1. 言語別AOT/JIT実装一覧
主要言語のAOTコンパイラ・JITコンパイラを横並びにすると、Spinelが置かれた位置が明確になる。
| 言語 | 主要AOT実装 | JIT実装 | Spinelとの近接度 |
|---|---|---|---|
| Ruby | Spinel(NEW) | YJIT・ZJIT・MJIT | — |
| Python | Cython・Nuitka・Codon・mypyc | PyPy・CPython 3.13 JIT・Numba | 高(型推論アプローチ近似) |
| TypeScript | Perry(LLVM)・Static Hermes | Bun・Node.js V8 JIT | 中(ネイティブバイナリ目標が一致) |
| Java | GraalVM Native Image・Excelsior JET | HotSpot C1/C2・OpenJ9 | 中(自己ホスト構造が共通) |
| Kotlin | Kotlin/Native | Kotlin/JVM HotSpot | 中 |
| .NET | NativeAOT・ReadyToRun | RyuJIT・Mono JIT | 中 |
| Go | 標準コンパイラ(AOT専用) | — | 低(静的言語) |
| Rust | rustc(LLVMバックエンド) | — | 低(静的言語) |
| Swift | swiftc | — | 低(静的言語) |
| Lua | LuaJIT・mruby(バイトコード) | LuaJIT | 中(小さなランタイム志向) |
06-2. PythonコンパイラとSpinelの比較
最も思想が近いのはPythonのAOTコンパイラ群である。CythonはPythonにC言語的な型注釈を付加してCに変換し、99〜124倍の高速化と引き換えに「数日のC知識を要する移植コスト」を支払う。Nuitkaは型注釈なしでもPythonをC++経由でビルドするが、最適化幅は限定的だ。
Codonは型推論ベースで型注釈なしに高速化する点でSpinelの思想に最も近い。2025年の研究では、Codonがn_bodyベンチマークで99.06%のエネルギー削減を記録し、PyPy・Numbaを上回った。SpinelもCodon同様、型注釈を要求しない型推論アプローチを取る。
mypycはmypy互換の型注釈を活用してCに変換し、2.4〜14倍の高速化を実現する。Pythonコミュニティでは「黒魔術なし、型注釈あり、現実的高速化」という位置づけだ。Spinelに型注釈の概念を持ち込んだ場合、mypyc的なポジションも視野に入るが、Matz氏は型注釈のない世界を選んだ。
| Python AOT | アプローチ | 型注釈 | 高速化倍率(参考) |
|---|---|---|---|
| Cython | Pythonライク言語+C生成 | 必要 | 99〜124倍 |
| Nuitka | Python→C++変換 | 不要 | 2〜10倍 |
| mypyc | mypy型注釈→C変換 | 必要 | 2.4〜14倍 |
| Codon | 型推論+LLVM | 不要 | 10〜100倍以上(ワークロード依存) |
| Spinel | Ruby→Prism→C生成(型推論) | 不要 | 7〜87倍 |
06-3. JVM/CLR系AOTとの比較
Javaの世界では、GraalVM Native Imageが商用本格運用されている。Spring Boot 4ではサブ100msの起動時間と75%のメモリ削減を達成し、サーバーレス用途で広く採用されている。NativeAOTは.NET 8/9で安定化し、ASP.NET CoreアプリのサイズとAzure Functionsのコールドスタート短縮に大きく寄与した。
これらに比べると、Spinelは「実装規模も対応範囲もはるかに小さな実験プロジェクト」だ。GraalVMが手の届く範囲のJava全機能(リフレクション・動的クラスロード・ファイナライザ等)を頑張ってサポートする方向に進んだのに対し、Spinelは早期から「サブセットに絞ってシンプルさを優先」する判断を取っている。
| 商用級AOT | 起動時間(参考) | メモリ削減(参考) | 対応範囲 |
|---|---|---|---|
| GraalVM Native Image | <100ms(Spring Boot 4) | -75%(JVM比) | Javaほぼ全機能 |
| .NET NativeAOT | <50ms(典型例) | -50〜70%(JIT比) | .NET大半(リフレクション制限) |
| Spinel | 即時(VM起動なし) | 最小限(libc+libmのみ) | Rubyサブセット |
06-4. TypeScript/Lua/組み込み系との比較
2026年のTypeScriptネイティブコンパイル領域では、Rust製のPerry(LLVM経由)がNode.jsより最大38倍速いベンチマークを公開している。SpinelとPerryは「動的言語をネイティブにする」という目標が一致し、ランタイムを最小化したシングルバイナリ配布を最優先する点も共通する。
Lua界隈では、LuaJITが古典的な高速JIT実装、mrubyがRuby言語の組み込み向けバイトコードVMとして長く使われてきた。mrubyはRuby 1.9世代の言語仕様+最小ランタイムで、組み込み機器・ゲームエンジンへの組み込みを想定した設計だ。Spinelとmrubyは「最小ランタイム」という共通点を持ちつつ、Spinelはネイティブコード生成に踏み込んだ点でアプローチが分岐する。
07. RubyのJIT進化史とSpinelの位置づけ
RubyのJIT/AOTの歴史を整理すると、Spinelの登場意義がより立体的に見える。
07-1. Ruby JITの3世代
| 世代 | 名称 | 投入時期 | アプローチ | 状況 |
|---|---|---|---|---|
| 第1世代 | MJIT | Ruby 2.6(2018) | C言語に変換しGCC/Clangで動的コンパイル | Ruby 3.4で削除 |
| 第2世代 | YJIT | Ruby 3.1試験〜3.2安定(2022) | LBBV方式の小さなマシンコード生成 | プロダクション標準 |
| 第3世代 | ZJIT | Ruby 4.0(2025年12月) | メソッド単位の中間表現+最適化 | 実験的同梱 |
| 別系統 | Spinel | RubyKaigi 2026(2026年4月) | AOT・C生成・サブセット | 実験プロトタイプ |
YJITはShopify主導で開発された軽量JIT。Lazy Basic Block Versioning(LBBV)方式により、メソッドの個別バリアントごとに最適化されたマシンコードを生成する。Ruby 3.4ではx86-64で約92%のインタプリタ比高速化を記録した。
ZJITはRuby 4.0で実験的に同梱されたメソッドベースJITで、ロードストア最適化が2026年3月に投入され、特定ベンチマークでYJITを抜き始めている。setivarベンチマークでは、ZJITが平均2ms/反復、YJITが平均5ms/反復という逆転現象が観測された。
07-2. Spinelが補完する領域
YJIT/ZJITはあくまで「長く動き続けるプロセス向け」の最適化技術だ。CLIツール、AIエージェント連携ヘルパー、サーバーレス関数のような短命プロセスでは、JITウォームアップの恩恵を受ける前に終了してしまう。
Spinelは「YJIT/ZJITが苦手な短命プロセス・配布制約・極限速度」の3領域に最適化された別解として設計されている。長命Webアプリ=CRuby+YJIT/ZJIT、短命ネイティブツール=Spinel、という分業体制が今後のRubyエコシステムの標準形になる可能性が高い。
08. AIと協働する開発スタイル — Matz氏×Claude Open 4.7
Spinelの開発プロセスそのものが、現代のソフトウェアエンジニアリングへの示唆に富む。Matz氏自身が明かしたところによれば、構想自体は3年前から存在したものの、実装はAnthropic社のClaude Open 4.7(1M context)との協働により数週間という短期間で集中的に行われた。
リポジトリのソースコードの大半に「co-authored by: Claude」という注記が残されている。コンパイラの実装は、言語仕様・パーサ・型推論システム・コード生成・ランタイム管理など複数の複雑なコンポーネントが密接に絡み合う領域だ。通常は構築・テスト・最適化に膨大な時間と労力を要するが、AIを積極的なパートナーとして活用することでプロトタイピング速度が飛躍的に向上した。
08-1. 数週間で3度のフルリファクタ
特筆すべきは、この数週間の間にアーキテクチャの根本的な見直しを含む全体リファクタリングが3度も実施された点である。仮説検証のサイクルが極限まで短縮され、低レイヤーソフトウェア開発の探索範囲が劇的に拡張されたことを示している。
熟練の開発者が言語のセマンティクスとシステムアーキテクチャを完全に掌握した上でAIを使うと、これまで「数年がかり」と思われていた領域が「数週間」に圧縮される。Rubyの設計者自身がAIエージェントと対話して自己ホスト可能なAOTコンパイラを作り上げた事績は、今後のプログラミング言語開発におけるAI活用の強力なユースケースを提示している。
# Matz氏のClaude協働サンプル(推測される作業フロー)
# 1. 仕様検討
$ claude "RubyのASTからC構造体マッピングを設計したい。
動的型のインスタンス変数をどう値型に落とすか提案して"
# 2. プロトタイプ実装
$ claude "Prism ASTを受けてsimpleな型推論を行うRubyコードを書いて"
# 3. ベンチマーク・リファクタ
$ claude "spinel_codegenがフィボナッチをC化するときの
生成コードを最適化したい。インライン展開の方針は?"
08-2. 1Mコンテキストの恩恵
Claude Open 4.7(1M context)の100万トークンのコンテキストウィンドウは、コンパイラのような大規模コードベースを丸ごとAIに読み込ませる用途で本領を発揮する。2万行超のRubyコードベース全体を一度のセッションで把握させ、整合性を保ったままアーキテクチャ変更を提案させる、という働き方は数年前には不可能だった。
Spinelの開発体験は、AIコーディングエージェントが「補助輪」から「対等な実装パートナー」に進化したことを象徴している。
09. 実用シナリオと今後の展望
Spinelは現時点では実験プロジェクトの域を出ないが、活用領域はすでに明確に見えつつある。
09-1. 単一バイナリ配布のCLIツール
最も現実的なユースケースは、Rubyで記述された小規模CLIツールの単一バイナリ化だ。インフラ管理ツール、CIヘルパー、開発者向けツール群はGo・Rustで書き直される傾向が続いてきたが、Spinelの成熟により「Rubyの表現力+ネイティブ配布」を両立できる選択肢が生まれる。
fpm、bundler/inline、scripts/release.rbのような開発ツールがSpinelで配布される未来は、十分に想定できる範囲にある。テキスト処理・DSL構築・YAMLメタデータ操作といったRubyの得意分野を、ランタイム不要で配布できる意義は大きい。
09-2. AIエージェント周辺ツール
急速に普及するAIコーディングエージェントの周辺ツールとしての利用も見込まれる。リポジトリ固有のメタデータ抽出、ログJSON変換、コード解析ヘルパーなどをRubyで書きSpinelでバイナリ化しておくことで、Rubyランタイムを持たない実行環境のエージェントから高速・確実に呼び出せる。
AnthropicのClaude Code、Cursor、GitHub Copilotといったツール群は、リポジトリ内の小さなヘルパースクリプトを大量に必要とする。Spinelで作られた極小バイナリは、こうした周辺ツールの新しい標準形態になる可能性がある。
09-3. ネイティブ拡張のRubyサブセット記述
Rubyのネイティブ拡張(Native Extension)をCやRustの代わりに、Spinelが解釈可能なRubyサブセットで記述するアプローチも模索されている。すでに正規表現エンジンの概念実証がSpinelで実装されており、「CRubyから呼び出される高速ライブラリをRubyライクな構文で開発する」未来が見え始めている。
Cの知識なしにRubyだけでネイティブ拡張を書ける世界は、Rubyコミュニティの能力を底上げする。FFI経由でCRubyから呼ぶ前提の小さなライブラリ、特定アルゴリズムの高速版、データ処理パイプラインの内部コア。これらがすべてSpinelで書ける可能性は、Ruby 4.x以降のエコシステム形成に大きな影響を与えうる。
09-4. 残された課題
ただしSpinelは万能ではない。並行処理がFibersのみでThread/Mutexがない、UTF-8以外のエンコーディングが扱えない、メタプログラミングを使うGemとの互換性がない、といった制限は当面残る。Webサーバ用途・大規模アプリ・既存Gem資産の活用は引き続きCRuby+YJIT/ZJIT領域である。
「全部Spinelに置き換える」のではなく、「適材適所で使い分ける」という姿勢が前提になる。Matz氏自身がそのポジショニングを明確に示しており、Rubyコミュニティの議論もこの線で収束しつつある。
10. まとめ — Rubyの新しい一面を切り開くスピネル
Spinelは、Rubyというインタプリタ言語の代名詞だった世界に「事前コンパイル+単一バイナリ配布」という新しい一面を切り開いた。CRuby比で7〜87倍、フィボナッチではYJIT有効CRubyの18%処理時間という数字は、単なる学術プロジェクトの域を超えている。
技術面ではPrism+静的型推論+C生成+GCC/Clangという素直な3段パイプライン、自己ホスト構造、libc/libmだけのランタイム最小化が特徴的だ。設計面では「Rubyのサブセットに絞ることで型推論を成立させる」というトレードオフを明確に取り、長命Webアプリ向けのYJIT/ZJITとは別軸の存在として位置づけられている。
開発プロセスそのものも歴史的に重要な事例だ。Matz氏自身がClaude Open 4.7(1M context)と協働し、数週間で2万行超のコンパイラバックエンドを構築した事実は、AIコーディングエージェントが言語処理系のような複雑領域でも実装パートナーとして機能することを示した。
Ruby 4.x以降のエコシステムは、CRuby+YJIT/ZJITの「動的フル機能・長命プロセス」と、Spinelの「サブセット・短命ネイティブ配布」が共存する二層構造になる可能性が高い。Spinelの完成度がどこまで上がるか、コミュニティGemとの相互運用がどう整理されるか、次のRubyKaigi 2027までに見えてくる景色が楽しみだ。
参照ソース
- matz/spinel — GitHubリポジトリ
- Trying Out Matz’s Ruby AOT Compiler: Spinel — zenn.dev
- Ruby inventor Matz working on native compiler with AI help — The Register
- An Overview of Spinel, Matz’s AOT Ruby Compiler — Ruby Inside
- Ruby 4.0’s ZJIT vs YJIT: Benchmarks, Safest Settings — Medium
- How ZJIT removes redundant object loads and stores — Rails at Scale
- An Empirical Study on Compiled Python Code — arXiv 2505.02346
- GraalVM Native Images in Spring Boot 4: Sub-100ms Startup — Medium