Ruby 2.0.0 リリース特集

編集:ささだ

Ruby 2.0.0 リリース特集について

2013 年 2 月 24 日に Ruby 2.0.0 がリリースされました (Ruby 2.0.0-p0 リリース)。ダウンロード方法などは、リリース文をご覧下さい。

リリース文にあります Ruby 2.0.0 の「主要な新機能」は次の通りです (引用します)。

  • 言語コア機能
    • キーワード引数: API 設計の新しい柔軟性
    • Module#prepend: クラス拡張の新しい方法
    • シンボルの配列を簡単に作るリテラル %i
    • dir: 実行中のファイルのあるディレクトリ名
    • default UTF-8 encoding: 多くのマジックコメントが不要に
  • 組み込みライブラリ
    • Enumerable#lazy / Enumertor::Lazy: 無限の遅延ストリーム
    • Enumerable#size: 遅延サイズ評価
    • #to_h: Hash への変換メソッド
    • Onigmo (鬼雲): 新しい正規表現エンジン (鬼車の fork)
    • 非同期例外を安全にハンドリングする API
  • デバッグサポート
    • DTrace サポート: 本番環境での実行時診断を可能にする機能
    • TracePoint: 改善されたトレース API
    • 性能改善
    • bitmap marking による GC 最適化
    • Rails の起動時間を大幅に短縮する Kernel#require の最適化
    • メソッドディスパッチなどの VM 最適化
    • 浮動小数演算の最適化

しかし、具体的に何が変わったか、あまり情報がまとまっていないのが実情です。そこで、Ruby 開発者の人たちに Ruby 2.0.0 の機能や改善についてご紹介頂く特集記事をまとめました。

記事は次の通りです。

さらに、Ruby 安定版の今後の保守の見通し では、Ruby 1.9.3 のメンテナである usa さんに、Ruby 2.0.0 および 1.9.3 の安定版の見通しについてまとめて頂きました。

お楽しみ下さい。

識者からのメッセージ

本 Ruby 2.0.0 リリース特集にあたって Ruby のパパであるまつもとゆきひろさんをはじめ、著名な Rubyist の方々からメッセージを頂きましたのでご紹介します。

まつもとさんからのメッセージ

書いた人:まつもとゆきひろ (@yukihiro_matz)

Ruby が登場して 20 年、私はバージョン番号を大胆に進めることに抵抗を感じてきました。過去、マーケティング上の理由でソフトウェアのバージョン番号が大幅に進むケースはいくつか見ましたが (Solaris とか)、オープンソースにマーケティングは無縁だと考えてきましたし、むしろ「バージョンなんて飾りです。偉い人にはそれがわからんのです」というのが本音でした。

もちろん、Ruby2 あるいは Ruby 2.0 という名前をこの 10 年ほのめかしていたのは私自身なのですが、それはあくまでも開発者のヤル気の源泉としてであり、たとえるならば「馬車馬のためのニンジン」のようなものと考えてきたのが本音です。

しかし、2011 年ごろに、キーワード引数や Module#prepend、Refinement など、私が 10 年以上も欲しいと思っていながら実現できてなかった機能の実装がコミュニティメンバーから提案されてきました。見果てぬ夢が次第に現実化してきたと言ってもよいでしょう。

最終的に私に 2.0 リリースの決心をさせたのは、2011 年に聞いた「2013 年は Ruby 開発開始 20 周年だから、2.0 にふさわしい」という発言でした。残念ながらどなたの発言だか失念してしまったのですが、この言葉がバージョンを進めるのに抵抗があった私の心を溶かしてくれました。

きっと他の方が詳細に解説してくださっていると思いますが、Ruby 2.0 の変更は実に多岐にわたります。しかし、基本的な方針は、互換性を保ちつつより良い言語を提供することです。

特に特徴的な新機能である、キーワード引数は API の複雑化への対処、Module#prepend および Refinement は、既存のクラスを拡張する時の複雑性の制御への対処であり、今後、ますます大規模化、複雑化が予想される Ruby プログラム開発へ備える意図が含まれています。

また DTrace や TracePoint などのデバッグ支援機能や、GC や VM の性能改善など Ruby 2.0 は将来の Ruby を取り巻く環境を予想しつつ、それに対処できるように進化しつつあります。

私たち、Ruby 開発コミュニティは、Ruby がいつまでも人々の役に立つ愛すべき言語であり続けられるように、日夜努力を続けているのです。Ruby 2.0 がリリースされた後も、この活動を継続していく心づもりです。

できることならば、今後も Ruby のことを暖かく見守っていただけるようにお願いします。また、もし気が向いたらならば、Ruby の開発コミュニティに参加してみてください。どこかの勉強会に参加してみるもよし、Ruby 開発メーリングリストに参加してみるもよし。私たちは皆さんを歓迎します。

Ruby 2.0 on Rails

書いた人:松田明 (@a_matsuda)

Rails プログラマーの皆さんにとっては、Ruby on Rails の Ruby 2.0 対応状況が気になるところでしょう。せっかく処理系の最新版がリリースされても、フレームワークが対応してくれないとなかなか現場に投入できなかったりしますからね。

しかし、ご安心ください。松江で開催された RubyWorld Conference 2009 の Jeremy Kemper のトーク (すっげーいい話なので、講演をご覧になっていない方は是非リンク先の動画を観てみてください) をご覧になった方ならご記憶のことかと思いますが、Ruby on Rails コアチームは昔から変わらず、Ruby の進化を最大限サポートする立場をとっています。いや、むしろ、今回 Ruby 2.0 とほぼ同時期のリリースが予想される Rails 4.0 以降では、両者が正式リリースされるよりも前から Ruby 2.0 を「推奨」と位置づけています (https://github.com/rails/rails/commit/a0380e8) 。

もちろん宣言しているだけじゃなくて、実際 Ruby 2.0 に対しては Travis CI でコミットごとにビルドを通していて、常に動作の確認がとれている状態になっています。もし仮に Ruby 2.0 で Rails がうまく動かないケースがあったら、それはきっとバグなので、こちらまでご報告ください (https://github.com/rails/rails/issues) 。

さて、そんなこんなで新機能もいろいろ増えて動作も速くなって前バージョンと 100% 互換で Rails コアチームも使用を推奨している Ruby 2.0 を、今すぐお手元の Rails プロジェクトに導入しない理由はもはや何も無いですよね?

空気のように環境が変わると言うこと

書いた人:id:secondlife (@hotchpotch)

最近の私の近況ですが、ユーザが沢山居る環境で、表面上ではできるかぎり変化を起こさず、裏側を大きく変える仕事をしています。このユーザとは、エンドユーザだったり、はたまた開発者だったりします。

やってみると改めて実感するのですが、空気のように環境を変えるには、ただならぬ努力が必要です。できるだけ意識させること無く、問題なく変化させるか。裏側は様々な変更があり、いろいろなメリットが生まれるのですが、ユーザから見た表面上には大きな変化は生まれません。

さて、Ruby 2.0 の話しです。Ruby 2.0 には、Refinement のような、うまく扱えばより柔軟な言語内 DSL 等を実装可能、しかし使い方を誤れば黒魔術になりそうな機能から、待ちに待ったキーワード引数等、言語仕様の追加から、様々な性能改善まで、また一歩大きく言語として進化しました。

しかしながら一番驚いたのが、空気のように環境を変えられたことでした。2012 年下旬から Ruby 2.0 HEAD を使ってますが、Ruby 1.9.3 からすんなり移行でき、また社内で扱っているほとんどの 1.9.3 プロジェクトで spec が通りました (しかも 20-80% も高速に!)。一部のプロジェクトでは実際に Ruby 2.0 HEAD で 3 ヶ月ほど動かしてますが、不安定になったことは一度もありません。100% の互換性のうたい文句は伊達じゃありません。

空気のように環境を変えることができる Ruby 2.0。是非皆さんも使ってみて下さい。そして改めて、Ruby 開発に携わっている皆さん、ありがとうございます。きっと互換性の裏には、多大な努力があったはずです。

Message from Dave Thomas

書いた人:Dave Thomas、訳した人:@makoto_inoue

Message

I’ve known Ruby since she was just 4 or 5 years old. Of course, I knew her parents, Smalltalk and Perl, and had a nodding acquaintance with Aunt Clu, so I knew she was in good hands. I watched with pleasure as she took her first tentative steps into the wide world. Even as a young language, she captured the hearts of some wonderful people―I think it was her relaxed and happy nature.

Of course, when she became a teenager, she had a few rough times. She got involved with some strange friends, but her character and strength means that she simply developed into a deeper and more confident language.

Now, at 20, Ruby shows fantastic maturity and composure. She is loved by hundreds of thousands of people, and she makes their lives better.

I’m looking forward to watching her continue to grow over the next 20 years.

Happy birthday.

(和訳)

Rubyのことは彼女が 4〜5 歳のころから知っています。彼女の両親である Smalltalk とPerl のことはよく知っているし、そして Clu おばさんについても聞きかじっていたから、彼女の筋がいいってことは知っていました。彼女が初めてみんなの前ではにかみながらお披露目をしたときもちゃんと見守っていましたよ。若い言語でありながら彼女がすばらしい人々を魅了していたのは、私が思うに、彼女の落ち着いていながらも幸せに満ちた性格によるんじゃないでしょうか。

もちろん彼女がティーンエイジャーの時はいくつかの危なっかしい時がありましたよね。変な友達とつるむようになった時もあったけど、でも彼女の素直でまっすぐな性格によって、より深く、自信に満ちた言語になっていきました。

今年、二十歳になった Ruby はすばらしいほどに成熟し、落ち着いた言語になりました。彼女は多くの人々に愛され、人々の役にたっています。

次の 20 年に向けて、彼女がより成熟していくのを見続けることができるのを楽しみにしています。

お誕生日おめでとう。

Favorite Feature

Obviously, the new keyword arguments are very cool. But when I was playing with them, I came across an implementation detail that just made me smile like a fool:

   APP_OPTS     = { name: 'play', author: 'dave' }
   LOG_OPTS     = { level: 2, color: 'blue', line: "3pt" }

   def log(msg, options)
     p msg
     p options
   end

   log("Starting", **APP_OPTS)
   log("Connected", **APP_OPTS, **LOG_OPTS)
   log("Giving up", **APP_OPTS, **LOG_OPTS, color: "VERY RED")

produces:

   "Starting"
   {:name=>"play", :author=>"dave"}
   "Connected"
   {:name=>"play", :author=>"dave", :level=>2, :color=>"blue", :line=>"3pt"}
   "Giving up"
   {:name=>"play", :author=>"dave", :level=>2, :color=>"VERY RED", :line=>"3pt"}

The **arg converts the hash into the equivalent of the individual options (in the same way that a single star expands an array into individual parameters. And then Ruby collects all these values into the hash that it eventually passes to the method.

It’s this kind of attention to small details that makes Ruby such a fun language―there’s always something to discover.

(和訳)

新しいキーワード引数がクールなのは知っていましたが、実際にその機能を試している時に、実装の詳細に出くわして、おもわず間抜けみたいにニヤニヤ笑いをしてしまいました。

   APP_OPTS     = { name: 'play', author: 'dave' }
   LOG_OPTS     = { level: 2, color: 'blue', line: "3pt" }

   def log(msg, options)
     p msg
     p options
   end

   log("Starting", **APP_OPTS)
   log("Connected", **APP_OPTS, **LOG_OPTS)
   log("Giving up", **APP_OPTS, **LOG_OPTS, color: "VERY RED")

出力結果:

   "Starting"
   {:name=>"play", :author=>"dave"}
   "Connected"
   {:name=>"play", :author=>"dave", :level=>2, :color=>"blue", :line=>"3pt"}
   "Giving up"
   {:name=>"play", :author=>"dave", :level=>2, :color=>"VERY RED", :line=>"3pt"}

引数として渡している *arg はハッシュを個別のオプションに変換してくれます (が配列を個別のパラメターに変換するのと同様にです)。その後、Ruby がそれらの値が別々にメソッドに渡された際、マージされたものをハッシュに再変換してくれています。

こういう細心の注意を払ってくれているところが Ruby を楽しい言語にしてくれているんだと思います。Ruby にはいつも新しい発見があります。

Message from Charles Oliver Nutter

書いた人: Charles Oliver Nutter、 訳した人:@zundan

Congratulations to the MRI team on releasing 2.0! We are looking forward to implementing Ruby 2.0 features like keyword arguments in upcoming releases of JRuby, and I’m personally excited to see where we can take Ruby in the post-2.0 era. I’ve also seen solid improvements in performance and GC overhead while playing with the release candidates. Great job!

(和訳)

MRI チームの皆さん、2.0 のリリースおめでとうございます! 私たちは、JRuby に、キーワード引数などの Ruby 2.0 の機能を実装するのを楽しみにしています。 私たちが 2.0 後の時代で Ruby をどのように発展させていくことになるのか、個人的にわくわくしています。 (Ruby 2.0.0 の) リリース候補版を試していて、パフォーマンスや GC のオーバーヘッドが確実に改善されているのを見ていました。Great job!

Message from Thomas E Enebo

書いた人: Thomas E Enebo、 訳した人:@zundan

I have been very excited to see Ruby 2.0.0 released. This release has been the dream of many Ruby programmers for quite some time. As for Ruby 2 features, I expect keyword arguments will have the largest impact on how people change their APIs; so I predict it will have the largest visible impact in how we think in terms of writing Ruby code.

I am also excited to see how features like refinements and Module#prepend get used in unexpected ways. Unexpected uses often end up being responsible for game-changing idioms and I am hoping these features deliver something amazing.

(和訳)

Ruby 2.0.0 がリリースされていくのを目にして、とても興奮しています。 このリリースは、多くの Ruby プログラマにとって長年の夢でした。 Ruby 2 の新機能について言えば、 人々が API を更新していくのに最も影響が大きいのが、キーワード引数でしょう。 キーワード引数が、私たちが Ruby のコードを書くときに考えることに、 最も顕著な影響を与えることになると思います。

私はまた Refinements や Module#prepend などの機能が、 予想もできないやり方で使われることを楽しみにしています。 予想もできない使い方は、 しばしば考え方を根本から変えてしまうようなイディオムを産み出すことになります。 私は、これらの新しい機能が、 何かすばらしいものをもたらしてくれるのを楽しみに待っています。

おわりに

それでは、Ruby 2.0.0 で Happy Hacking!!