Rubyを組み込む側から見たAPI/ABIの互換性

Rubyを動的にロードしているVimから見るとAPI/ABIが頻繁に変更されているという話。
6
mattn @mattn_jp

vim の if_ruby.c を見ると、いかに vim が ruby の API 変更に必死のパッチで追従しているのか良くわかる。 https://t.co/nnHhdYDsfd

2013-02-26 10:07:34
MURAOKA Taro @kaoriya

@mattn_jp できることなら切りたいレベル?w

2013-02-26 10:09:14
MURAOKA Taro @kaoriya

考えてみたら、ABI変わらない(はずな)のにソースコード修正が必要になるってなんか変だよね… ≫ if_ruby が ruby2.0 でビルド出来ない。 vim-jp/issues https://t.co/GJpFRPT7q1

2013-02-26 11:15:44
成瀬 @nalsh

@kaoriya @k_takata ABIバージョン変えてるとおり、ABIは変わってますね。で、これは Flonum 入れた @_ko1 が犯人

2013-02-26 12:03:10
成瀬 @nalsh

@mattn_jp あれ、ruby.h は include してないんですっけ?

2013-02-26 12:08:28
SODA Noriyuki @n_soda

@kaoriya 本題とは関係ない余談ですが、わりとありますよ>ABI互換だが、API非互換。あるAPIをdeprecatedにする場合、APIとしては使えなくするけど、ABI互換のために機能としては残してあるとか、libcあたりでは割とあります。

2013-02-26 12:09:48
MURAOKA Taro @kaoriya

@_ko1 @nalsh @k_takata 私の感覚で言えば、利用側のソースコードが変わってない(ABIが変わらないから当然な)のに、新たなシンボルが必要になるってのは変だなと感じます。

2013-02-26 12:13:06
MURAOKA Taro @kaoriya

あ、ごめん。ちゃんとRuby 2.0のABIはバージョン変わってた。これに引きずられて確認怠ってた。 https://t.co/FrtRsUCqRJ

2013-02-26 12:14:52
成瀬 @nalsh

@kaoriya @_ko1 @k_takata なんか前提がおかしいようですが、バージョンアップごとにリコンパイルはしてもらいますし、ABIのバージョンは変えます。これは予期せぬABI非互換で知らぬうちに壊れるのを防ぐためです。この前提から外れている点があれば教えて頂きたいと

2013-02-26 12:16:18
成瀬 @nalsh

@nalsh @kaoriya @_ko1 @k_takata 言い方がわかりづらいな。ABIは壊します、ソースコード互換性は維持したいです

2013-02-26 12:17:47
MURAOKA Taro @kaoriya

@nalsh @_ko1 @k_takata ABIの件は先のツイート通り私の勘違いで申し訳ない。ただVimのif_rubyではABIのバージョン変わらないのに再コンパイルだけではなく、ソースコードの修正(直接は使っていないシンボルの導入が大半)が必要になることが多いのです。

2013-02-26 12:18:40
成瀬 @nalsh

@kaoriya @_ko1 @k_takata なんでしんぼるの導入が必要になるんでしたっけ

2013-02-26 12:19:36
MURAOKA Taro @kaoriya

@nalsh @_ko1 @k_takata (続き)Vim側がrubyをdynamic loadingしているってのが1つの理由なんですが、ruby側でもいくつかのAPIがマクロで作られてて、その実装がコロコロ変わってるっていう理由もあると推測しています。

2013-02-26 12:20:22
mattn @mattn_jp

@nalsh してますが dll にエクスポートされてる物が変わってますし、inline になたりしてる物もあるのでいろいろと。。。

2013-02-26 12:20:34
成瀬 @nalsh

@mattn_jp リコンパイルすればruby.h経由でvimプラグイン側に入ると思っているんですが、何かわたしが勘違いしてるのかな

2013-02-26 12:21:41
MURAOKA Taro @kaoriya

@nalsh @_ko1 @k_takata 先に書いたとおり、Vim側がDynamic Loadingしたいってのと、RubyがAPIをマクロで定義している(推測)ってあたりがぶつかっているのかと。

2013-02-26 12:22:09
_ko1 @_ko1

@kaoriya @nalsh @k_takata ソースコードレベルで API を保証しており、外からシンボルを見て~ ってのはあんまり気にしていない気がしますねえ

2013-02-26 12:22:16
mattn @mattn_jp

@nalsh inline から dll エクスポート関数呼んでるのでエラりました。

2013-02-26 12:24:16
MURAOKA Taro @kaoriya

@_ko1 @nalsh @k_takata LuaやPerlにも似たような話は無くはないのですが、頻度的には少ない印象です。Pythonはほとんど記憶に無いです。インポートすべきシンボルが極端に少ないってのはありますが。

2013-02-26 12:24:28
MURAOKA Taro @kaoriya

Vimのif_*でVim本体との相性が良い順序はpython > perl >(こえられない壁)> lua > rubyな感じ。

2013-02-26 12:26:46
MURAOKA Taro @kaoriya

PerlがLuaに勝つのはXSの存在がでかい、かも。

2013-02-26 12:27:15
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

@mattn_jp ごめん。ぜんぜんわからん。ダメなコーディングサンプルを幾つか、またはコーディング規約の提案をruby-devに投げていただけるととても助かりますです

2013-02-26 14:18:29
成瀬 @nalsh

@kosaki55tea @mattn_jp ちなみにABI互換性についての一般論なら「どのようにしてlibcは後方互換を保つのか?」 http://t.co/Ml49LMGUvE にまとまってるんですけどね

2013-02-26 14:23:32
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

@nalsh @mattn_jp vimのあのハックはそういう一般論の話には見えなかったんだが

2013-02-26 14:24:25
1 ・・ 4 次へ