Ruby 2.7のここがすごい! パターンマッチ、コンパクションGCなどをリリースマネージャーに聞いた

2019年12月25日にリリースされたばかりのRuby 2.7では、どのような機能がどういった経緯で採用されているのでしょう。リリースマネージャーのnaruseさんと、フルタイムコミッターのmameさんに詳しくうかがいました。

Ruby 2.7のここがすごい! パターンマッチ、コンパクションGCなどをリリースマネージャーに聞いた

プログラミング言語Rubyには、クリスマス前後に新しいバージョンをリリースする伝統があり、2013年の2.1.0以降は毎年12月25日にメジャーバージョンアップが行われています。2019年も無事にバージョン2.7.0がリリースされましたが、Ruby 2.7にはどのような新しい機能が導入されているのでしょう?

1Ruby 2.7.0 リリース2

Rubyの開発者コミュニティでは、オリジナル開発者であるまつもとゆきひろMatzさんを交えた開発者会議が月次で開催されており、2019年のクリスマスリリースでどの機能を取り入れるかは、11月28日の開発者会議で決定されました。

Misc #16262: DevelopersMeeting20191128Japan - Ruby master - Ruby Issue Tracking System

この開発者会議の直後、リリースマネージャーである成瀬ゆいnaruseさんと、フルタイムコミッターである遠藤侑介mameさんに集まっていただき、Ruby 2.7の新機能について、ラムダノートの鹿野桂一郎golden_luckyさんが深く詳しく聞きました。

4

成瀬 ゆい(なるせ・ゆい) 5nalsh 6nurse(写真左)
2004年からnkfライブラリのメンテナとしてRubyの開発に参加。バージョン1.9から文字コード全般に関わるようになり、バージョン2.1から現在までリリースマネージャーを務める。トレジャーデータ株式会社所属。
遠藤 侑介(えんどう・ゆうすけ) 7mametter 8mame(写真右)
2008年からRubyの開発に参加。テスト支援機能などのRubyの高品質化を中心に活動し、Ruby 2.0ではリリースマネージャーも努める。2017年からクックパッド株式会社で、笹田耕一氏に続く同社2人目のフルタイムコミッターとしてRubyの開発に専念する。著書に『RubyでつくるRuby ゼロから学びなおすプログラミング言語入門』(ラムダノート、2017年)など。

まつもとさんはとにかく忙しくて

──今日はRuby開発者会議の後にお時間をいただき、ありがとうございます。開発者会議には、まつもとゆきひろさんも参加されていたのですか?

naruse はい。そもそもRuby開発者会議は、3~4年くらい前に「まつもとさんに直接意見を言って、判断してもらう場」として始めたので、リモートでもいいから基本的にまつもとさんには参加してもらっています。

全ての機能提案に対してYes/Noを答えてもらうのが理想なんですが、まつもとさんは本当に忙しくて。一時期は、新しい機能を判断してもらう機会が「カンファレンスなどで捕まえて直談判」しかないという状況があり、それで月に一回、定期的にこういう会議を開くようになりました。

mame 会議が近づくと開発者会議チケットを切るので、議論してほしいバグ報告や提案があればチケット番号と要約を書いてもらい、会議のアジェンダとしています。

naruse 運用には試行錯誤もあったんですが、最終的にチケットを利用した現在の方針にたどり着きました。

──今日の開発者会議で俎上に載ったチケットはいくつあったんですか?

naruse 20くらいですね。

──開発者の方はたくさん参加されるのですか?

naruse 今日は10人くらいでした。平日なので参加できるメンバーは限られますが、クックパッドでフルタイムのコミッターになった遠藤さんをはじめ、最近は平日の開発者会議に参加できるメンバーが増えてきたので、やりやすくなりました。

──現在のRubyで、まつもとさんはどういう形でリリースにかかわっているんでしょう。

naruse まつもとさんが、現在のRubyでリリース版のコードに対して何らかの作業をすることは、滅多にありません。昨年の2.6でKernel#thenを自ら追加していますが、これはかなり久しぶりですね。

ただし、各バージョンごとに1つだけ、欠かさず実施してもらっている作業があります。それはversion.hの内容、つまりバージョン番号を更新することです。これだけは、儀式的な意味も込めて、まつもとさんに毎回お願いしています。

──新機能の追加といった判断は、リリースマネージャーである成瀬さんがされているのでしょうか?

naruse いえ、新機能の追加は、コミッターが直接リポジトリにpushしています。

ただし、Rubyでプログラムを書くユーザーが直接目にするような側面については、まつもとさんのOKがないとpushできません。Rubyの仕様に変更が出るような改良、例えばメソッドが追加されるといった場合は、まつもとさんの判断が必要です。

将来は、Pull Requestしてもらって誰かが承認するという手順になるかもしれませんが、いまのところは各自が自由に開発に参加して、うまく回っている感じです。

9

実はすごいirbの改良

──それではいよいよRuby 2.7の新機能についてですが、まずはユーザーに身近なところで、REPLの改良についてお聞きしたいと思います。

naruse このirbの改良は、Ruby Prize 2019の受賞作なんですよ。

──Ruby Prize?

naruse Rubyコミュニティの新人賞で、新しく活動に参加して顕著な実績があった個人を、松江市で毎年開催されているRubyWorld Conferenceで表彰しています。

RubyPrize 2019|最終ノミネート者発表

2019年の受賞者は糸柳茶蔵aycabtaさんで、その主な授賞理由が、今回のRuby 2.7に入ったirbの改良でした。

──プレビュー版のリリースノートに、実際に動作している様子が埋め込まれてますね。この手のドキュメントに動画は珍しいのでは?

naruse 新しいirbを使っている場面を実際に見てもらえば、一発で伝わるだろうということで、動画にしました1。Rubyの構文が解釈されて色が付いていますし、複数行にわたる編集が可能であることも伝わるでしょうから。

11Ruby 2.7.0 リリース

──確かに「複数行編集ができるようになりました」と文章で言われても、あまりピンとこないですね。

naruse いや、実はすごいことなんですよ。Webブラウザのような高級なアプリでも、あるいはものすごく最近に登場したプラットフォーム依存の言語でもなく、どのOSのコンソールでも複数行にわたる編集ができるREPLがあるプログラミング言語は、なかなかないと思います。ひょっとしたらJavaはできたかもしれませんが。

──そもそもJavaにREPLがあったんですか?

naruse 実はJava 9から入っているんです。

個人的に、最近は「ターミナルルネッサンス」とでも呼べるような活況だと感じていて、端末アプリにかつてない脚光が当たっています。特に気合いが入っているのはMicrosoftで、Windowsの端末環境は急速に良くなっていますよね。

──その潮流を受けて、irbも進化したということなんでしょうか?

naruse 実際には、いわゆるReadlineライブラリを使って、今回のようなirbの改良を実現するのは無理だったと思います。

糸柳さんがすごかったのは、ReadlineをRubyだけで再実装し、それによってirbの改良をクロスプラットフォームで実現させたことです。そのReadlineの再実装が、リリースノートにもあるrelineというライブラリです。

12GitHub - ruby/reline: The compatible library with the API of Ruby's stdlib 'readline'

mame 実際にはReadlineを包含しているので、relineは「Readlineよりすごい」よね。

naruse Readlineの再実装は、世界中の凄腕の開発者たちが挑戦している課題なんです。

例えば、macOSのデフォルトの環境ではReadlineが使えなくて、editlineというBSDライセンスの互換実装が動いています。しかし、このeditlineは多言語対応が弱くて、「MySQLのREPLで日本語が通らない」といった経験をしたことがある人も多いと思います。

また、Readlineの機能を実現するライブラリにはプラットフォーム依存の問題もあって、もちろんeditlineはWindowsでは動かないですし、Readlineそのものも最近のバージョンはビルドできなかったりします。

そんな具合に、Readlineまわりには多言語対応とクロスプラットフォームの問題があるんですが、これをクリアするためにRubyで実装しました、ってのがrelineです。

過去にもReadlineをRubyで再実装する試みがなかったわけではないのですが、irbを置き換えるレベルで実装し切ったたことが、relineの偉大さです。

mame 糸柳さんがReadlineをRubyで再実装している話はずいぶん前から聞いていたんですが、難しいだろうなと思ってたんですよ。ところが今年の半ばくらいに完成したものを見て、「ここまで動くの?!」と驚愕しました。これがWindowsを含めた各種OSで動くのか、と。

──これはirbだけでなく、Pryにも導入されるんですか?

naruse まだみたいですが、将来的にrelineに乗り換えたいという話は聞きました。JRubyでも動きます。

──REPLの改良の話は意外と大きかったんですね。

naruse わたしがRubyのリリースに関することをツイートして、リプライなどの反応があるのは、だいたいREPLの話ですね。

ただ、色が付いたことのインパクトが大きくて、複数行編集のすごさには、まだあまり気づいてもらえていないかもしれないと心配しています。実際に触ってもらえると、本当にすごいんですよ。将来は、補完機能やヘルプ表示も、よりいっそう強化できればと思っています。

mame 成瀬さんは、これが「ターミナルの将来を変えていく」「新世代のターミナル環境のきっかけになる」とまで考えてますよね。

naruse そうですね。Ruby 2.7で導入されるirbの改良からは、ターミナル環境のさまざまな可能性を感じています。

13

パターンマッチはRubyをどう変えるか

──Rubyのユーザーから見て大きな機能追加に、パターンマッチがありますね。

naruse パターンマッチについては、かなり前から「欲しい」という声がありました。最近では関数型言語の利用も増えてきたため、その声がいっそう大きくなっています。なるべくRubyの文法に似たパターンマッチのライブラリを考えた、といった発表も、何年も前のRubyKaigiからありました。

それこそ「Rubyでプログラムを書くユーザーに直接触れるところ」なので、どんなキーワードを使うかといった点も含めて、まつもとさんの判断が必要でした。いろいろな提案もあって、ずっと議論はしていたんです。

──なぜ今回のリリースで入ることになったのでしょう?

naruse なぜ今年のリリースか? と聞かれて答えるのは難しいんですが、パターンマッチ担当の辻本(和樹、k-tsjさんが「思い切って実装したから」ですね。結局「個人の情熱」みたいな部分が、機能追加の実現には大きな要因になるので。

紙の上で仕様を議論していてもなかなか進まないんですが、誰かの気持ちが盛り上がってマージできるような実装を作り上げて提案されると、急に話が進むことがあります。辻本さんのやる気が去年出ていたら、去年のリリースに含まれていたかもしれません。

あとは背景として、近年のWebアプリケーションの複雑化が、パターンマッチの積極的な導入を後押しした面はあると思います。REST APIとか、Webアプリケーションのルーティングを書くために、パターンマッチが使えるかもしれないという話は聞きますね。

──Rubyでパターンマッチが便利に使えそうなのは、どんな場面ですか?

mame 有望な用途としては、JSONの分解などがあるかもしれません。JavaScriptには分割代入(Destructuring assignment)という仕組みがあって、JSONを分解しつつ中身をうまく取り出す処理を、うまく書けます。それと同じことをRubyでもやりたい、と思っている人はいるはず。

naruse そうですね。ArrayやHashのdigメソッドのような操作を一気に複数やりたい、といった要望ですかね。JSONのデータからSQLのクエリを効率よく作りたい、という話を聞いたこともあります。

とはいえ、何かの要望に対して「パターンマッチが使えそう」ということと、「パターンマッチがあれば書ける」ことは別の話じゃないですか。パターンマッチに限らず、ブロックチェーンなどもそうですが、うまく使えそうな場面があるとして、それが本当にできるかというと何とも言えない面がある。

mame パターンマッチが欲しいという声はずっとあったので、かなり議論をして入れることにはなったけれど、実際どう使えばいいのかは、正直なところよくイメージできていないところはありますね。言語の機能がどう使われるかは、想定できない面もあるので。

naruse パターンマッチは、関数型と呼ばれる他のプログラミング言語のパラダイムの、いわば輸入にあたります。なぜ他の言語のパラダイムをわざわざRubyに導入するかというと、それによって書きやすくなるプログラムや、書けるようになるプログラムがあるからなんですが、それは使う人に考えてもらえればよくて、開発者サイドとしては、まずパラダイムを導入することに意義があると考えています。

mame 別のパラダイムからの輸入という観点でいえば、今までのRubyのパラダイムでは「いかにもパターンマッチがはまるようなプログラム」は書かれてこなかったので、既存のRubyプログラムの中に「パターンマッチで置き換えたい」と思えるものがあまり見当たらないのは当然だとも言えます。

逆に、これからRubyで関数型プログラミングっぽい書き方をしたい状況が出てきたときに、今回のパターンマッチの導入でやりやすくなることは、期待できるかもしれません。

──他の言語のパラダイムを取り込むというのは、そういうことですものね。

mame 当たり前と言えば当たり前の話なんですが、そう思います。

むしろ開発者側からすると、「今までRubyになかったパラダイム」をどうRubyに取り込むかという面が大変でした。

Ruby 2.7のパターンマッチの設計については、辻本さんがすごく丁寧にまとめた記事が『n月刊ラムダノート』にあるので、ぜひ読んでもらいたいです。

n月刊ラムダノート Vol.1, No.3(2019)(紙書籍+PDF版) - 技術書出版と販売のラムダノート

naruse プログラミング言語のある機能をどう設計したか、という話がここまで詳細に紙の媒体に残されることってあまりないですしね。

mame 辻本さんは途中の議論をすごくよく覚えていて、それがすごい。いろいろ考えて作っても、どう考えてそういう設計にしたのかは、どうしても忘れがちなので……。

──パターンマッチについては、まつもとさんによる判断もかなりあったそうですね。

naruse そうです。コードができる前からまつもとさんを交えてかなり議論していました。パターンマッチの関係者は去年から集まってミーティングしています。キーワードとしてinを使うといった判断も、そうした経緯で決まったものです。

Pattern matching - New feature in Ruby 2.7 - Speaker Deck

キーワード引数は、端的に壊れていたのを大整理した

エンジニアHubに会員登録すると
続きをお読みいただけます(無料)。
登録のメリット
  • すべての過去記事を読める
  • 過去のウェビナー動画を
    視聴できる
  • 企業やエージェントから
    スカウトが届く