Rubyにおけるバイナリ非互換

ruby-devMLで1.9.1と1.9.2がバイナリ非互換になるという
アナウンスが既に流れています。


あなたは「バイナリ非互換」という表記で何を連想しますか?


この言葉で動作しなくなるスクリプトが出てくる(スクリプトレベルでの
非互換)と考えるのなら、それは間違い。


現状、実行環境としてのRubyではスクリプトの読み込み・YARVバイト
コードの生成・YARVバイトコードの実行が時系列で連続しています。
今後、YARVバイトコードの事前コンパイルが可能になれば
YARVバイトコードの互換性の問題が発生する可能性はありますが、
現状ではこの問題も起こりえません。
(YARVバイトコード自体、変更途上で枯れていないため、現状では
その詳細な仕様は非公開となっています。ソースコードを読めば
わかりますが...)


では、「バイナリ非互換」は何かというと、実行環境としてのRuby
持っているC(++)による言語拡張機能に関する非互換が発生すること
を意味します。


実行環境としてのRubyにおいて言語拡張モジュールがアクセスする
部分に手を加えたため、それ以前のバージョンでコンパイルして生成
した言語拡張モジュールのバイナリは正常に動作しなくなるという
ことを意味します。


ruby-dev MLにおける「バイナリ非互換」のアナウンスは1.9.2では
1.9.1以前との組み合わせでコンパイルした言語拡張モジュールは
1.9.2で行った変更により正常に動作しなくなったので、全ての言語
拡張モジュールは再コンパイルを必須とさせていただきますという
宣言です。


(Ruby(MRI)ではマイナーバージョンアップであっても「バイナリ非互換」
を発生させるような変更が度々行われますが、Ruby(MRI)開発チームが
何も考えていないわけではありません、最近ではリリースマネージャ?
というポジションの方を中心に「バイナリ非互換」の発生する変更を
次のリリースに取り込むかを議論してから決定しています。)


言語拡張モジュール組込機能を持たない言語実行環境では
「バイナリ非互換」の問題は発生しません。


言語拡張モジュール組込機能を持たない言語が持つ言語よりも
優れているというようなことはありません。
C(++)等による拡張モジュール組込機能を持たない環境が持つ
環境よりも優れているというようなことはないのと同様です。


Rubyにおける「バイナリ非互換」は言語としてのRubyではなく
実行環境としてのRubyの問題であることを再度述べておきます。


ちなみに「バイナリ非互換」が発生する可能性のある環境は
そこらかしこにあり、それなりの頻度で「バイナリ非互換」
は発生しています。C(++)等による外部モジュールとのリンク
を行う環境では「バイナリ非互換」の問題との縁はきれません。


#
#勘違いした投稿を某巨大掲示板等でたまに見かけるので書いてみました。
#
#『「バイナリ非互換」が発生するRubyは終わっている』という
#文章が電波以外の何物でもないことは以上より明らかです。
#