Ruby 1.8→1.9への移行とPython 2.x→3.xへの移行に関するやりとり

言語のバージョン間非互換性をどのように乗り越えた/乗り越えられずに苦労しているか、について、会話をまとめさせていただきました。 ※半月くらい前のつぶやきをまとめたので、漏れなどあるかもしれません。ご了承ください。
7
Sadayuki Furuhashi @frsyuki

Rubyの1.8系から1.9系への移行は本当にうまかったなぁと思う。binaryを別クラスにせずにStringクラスにencodingを足すのが良かった気がする。

2014-01-08 13:14:06
Yukihiro Matz @yukihiro_matz

@frsyuki Pythonは2系の出来が良すぎて、3系への移行がなかなか進んでないようですね。3系への新規機能追加を停めるモラトリアムも効果なかったみたいだし、難しいものです。

2014-01-08 13:17:23
早すぎる最適化オジサン @makotokuwata

そういう理由ではなくて、同一のPythonソースを2と3の両方で動くようにするのがかなり困難なことが原因です。だってリテラルや構文に互換性がないんだもん。 RT @yukihiro_matz Pythonは2系の出来が良すぎて、3系への移行がなかなか進んでないようですね。

2014-01-17 23:05:51
早すぎる最適化オジサン @makotokuwata

.@yukihiro_matz Rubyだと同一のコードで1.9と2.0の両方をサポートするのは難しくないですが、Pythonでは2と3の両サポートは大変。ただ最大の非互換性だったユニコードリテラルがPython3.3で復活したので、今後は3系への移行が進むと思われます。

2014-01-17 23:11:45
methane @methane

@makotokuwata @yukihiro_matz 同一ソースを難しくする理由の一つに、 Python 2.4/2.5 をなかなか切れなかったことが。例えば Mercurial はいまだに Python 2.4 をサポートしている。

2014-01-17 23:43:29
methane @methane

@makotokuwata @yukihiro_matz モラトリアムは、ライブラリの移行を待つためのものではなく、他の実装の移行を待つものでした。効果があったか不明なのは変わりませんが。

2014-01-17 23:44:46
methane @methane

@makotokuwata @yukihiro_matz 移行を阻んでるのは、 unicode 型と bytes 型が区別されてることではなく(Python 2 でも区別されてた) b'foo'[0] が b'f' になるか 102 になるかといった細かい挙動の違いで、

2014-01-17 23:46:31
methane @methane

@makotokuwata @yukihiro_matz とはいえ、移行しない一番の理由は「2に対応してるけど3に対応してないライブラリ数」と「3に対応しているけど2に対応してないライブラリ数」の差で、新しい物を作る時にCentOSの古いPythonをサポートする人が多いことかと

2014-01-17 23:59:01
methane @methane

@makotokuwata @yukihiro_matz Ruby で CentOS で yum install ruby するだけでは動かないものがどんどん新しく作られてるのをもっと見習って、 Python 3 でしか動かない魅力的なライブラリをどんどん作る必要があると思います

2014-01-18 00:01:53
Yukihiro Matz @yukihiro_matz

@makotokuwata Rubyだとバージョン的には大差なさそうな1.8と1.9の移行が地獄のようでしたが(爆)、5年かけてなんとかなったようですね。Pythonも進むといいのですが。

2014-01-18 00:18:43
Yukihiro Matz @yukihiro_matz

@methane @makotokuwata そういう「勢い」ってどこで作られるんでしょうねえ。まあ、もともとRubyの人たちはPythonの人たちより「非互換上等、前へ進め!」って人が多いように感じますが。

2014-01-18 00:20:36
methane @methane

@yukihiro_matz @makotokuwata 開発者だけじゃなくてユーザーも一体になってると思います。Python 製ツールにどこでも動く事を期待するユーザーと、それに応える開発者のマッチポンプ。

2014-01-18 00:29:03
methane @methane

@yukihiro_matz @makotokuwata CentOS で sudo easy_install できるツールが Python 3 に対応難しくて、そういうツールの存在が Python のバージョンを選べるユーザーの移行にブレーキをかけるという構造。

2014-01-18 00:31:22
methane @methane

@yukihiro_matz @makotokuwata 今では Ruby も基板として広く使われているので、今後 yum install ruby, gem install xxx される様になれば、7年以上も前の Ruby をサポートするために最新の Ruby の対応が遅れ、

2014-01-18 00:34:02
早すぎる最適化オジサン @makotokuwata

@yukihiro_matz 地獄でしたか?Rubyでは1.8と1.9の両方をサポートするのはそんなに難しくはないです。1.8と1.9には非互換な点がありますが、ライブラリやメソッドのレベルなので吸収しやすい。これがリテラルや構文の非互換性だとそうはいかない。

2014-01-18 00:34:03
methane @methane

@yukihiro_matz @makotokuwata 普段使ってるツールがなかなか最新の Ruby に対応しないことを理由に最新のRubyに移行しない開発者が出てくるかもしれません。その前に古いOSをいつまでも現役で使い続けるケース自体が減る事を願いますが。

2014-01-18 00:37:31
早すぎる最適化オジサン @makotokuwata

.@yukihiro_matz RubyとPythonの両方を触ってわかるのは、大事なのは非互換の有無ではなく、非互換が吸収できるかどうかということ。吸収できれば、同じファイルのままバージョン間で連続した移行が可能。Pyは2と3でリテラルや構文に一部互換性がないため、吸収しづらい

2014-01-18 00:39:06
早すぎる最適化オジサン @makotokuwata

.@yukihiro_matz 補足すると、Pythonには2のコードを3向けに自動変換する「2to3」というツールが標準で付属してます。しかし機械的に変換するだけでは動かないことばかりで、結局は手動で対応する必要があります。 自動変換は、動的言語では限界がありますね。

2014-01-18 00:52:25
methane @methane

@makotokuwata @yukihiro_matz コードの移行よりもユーザーの移行のほうが大変だと思います。 Python の 2/3両対応は 2.6 未満を切らないと非常に面倒で、ユーザーを一旦 2.6 以上に移行させて、そこから 3 に移行させないといけない。

2014-01-18 00:53:12
methane @methane

@makotokuwata @yukihiro_matz 去年一気に有名ライブラリ・フレームワークの Python 3 対応が進んだのは、 Python 2.6 未満を切れる環境がやっと整ってきたからです。

2014-01-18 01:03:53
methane @methane

@makotokuwata @yukihiro_matz 言語としては Python 2 で十分な人も、「バッテリー」が腐りかけてる(Unicodedata とか TLS 1.1/1.2 とか)ので、自分でPythonのバージョンを選べる Web 系の人は今年移行が進むと思います

2014-01-18 01:07:30
Yukihiro Matz @yukihiro_matz

@methane それは素晴らしい。Python3への移行が早く進むといいですね。

2014-01-18 01:23:40
早すぎる最適化オジサン @makotokuwata

@yukihiro_matz @methane あとは、1.8→1.9へは「高速化」というわかりやすいニンジンがありました。Pyは2→3へのニンジンがないですねえ。PHPも似た状況があったし、Rubyユーザが新バージョンへ移行できているのは、実はささださんのおかげといえるかも。

2014-01-18 08:19:15
早すぎる最適化オジサン @makotokuwata

@methane @yukihiro_matz Rubyでも、"foo"[0]という式が1.8では102で1.9では"f"になるという大きな非互換を抱えてましたが、1.9への移行はできました。こういう非互換は小手先のテクニックで吸収できるので、移行の障壁としては低いと思います。

2014-01-18 08:23:45
早すぎる最適化オジサン @makotokuwata

@methane @yukihiro_matz それは因果が違うような。Rubyでは新バージョンへの移行が充分すすんだから1.8を切り捨てても問題が少ないだけ。1.8を捨てたから新バージョンに移行したわけではない。

2014-01-18 08:29:57