本セッションの登壇者
セッション動画
「最新のRubyとその開発について」というタイトルで、クックパッド株式会社の笹田が発表させていただきます。
まず自己紹介です。Rubyのインタプリタの開発を生業としています。会社としてはRubyインタプリタの開発では直接の利益は得られませんが、クックパッドでは多くのプログラムがRubyで書かれているので、将来への投資ということで、Rubyインタプリタの開発を私ともう1人を雇って、開発しています。
私は学生だった2004年からRubyのバーチャルマシンを作っていました。いろいろな職場を転々としながら、結局Rubyのインタプリタ開発を20年近く続けてきたというキャリアを積んでいます。今日はRubyの最新の状況、我々開発者がどんなことをやっているか、実際に開発するにはどうすればいいか、資料などをご紹介させていただきます。

日本語開発者の多いRuby
Rubyをご紹介しておくと、1993年にまつもとゆきひろさんという日本人によって開発が開始されたオブジェクト指向プログラミング言語です。日本人が開発したプログラミング言語で、世界中でたくさん使われているというのはRubyしかないと思っていいかと思います。以前はPerlなどがよく使われていた時代なので、なんでPerlみたいな言語がいるんだ、みたいな反論を受けたとまつもとさんが笑い話として話していらっしゃいました。
現在ではRuby on Railsというとても流行っているウェブアプリケーションフレームワークがRubyで書かれているからRubyを使うというふうに、Rubyを仕事で使っていらっしゃる方が多いんじゃないかなと思います。今日はウェブアプリケーションの話はできませんが、Rubyユーザーの多くがウェブアプリケーション開発者かと思います。
いくつかのインタプリタがありまして、ruby
というコマンドを叩くと実行されるのが、Rubyと言えばこれというRubyのリファレンスインプリメンテーションです。Cで作られているのでCRubyとか、まつもとさんが作り始めたので、Matz Ruby Implementation(MRI)と呼ばれています。他にJavaでRubyを書き直したJRubyがあったり、OracleさんがGraalフレームワークの上でJava、Python、PHP、Rubyを書き換えるプロジェクトをやっていて、その1つでTruffleRubyというのがあります。あとはまつもとさんが組み込み向けに作り直したmrubyというシステムがあります。mrubyはembedded Rubyの略みたいなことをおっしゃっていたと思います。Rubyと言えばこれらが有名なのですが、私が開発しているのが一番上のrubyとインタプリタです。今日はこちらの話をします。

Rubyは毎年12月25日にリリースをするというのが決まっています。去年の12月にRuby 3.2がリリースされ、今年12月にRuby 3.3がリリース予定です。Ruby 3.3のプレビュー2が9月頃にリリースされる予定で、今その文面をどうするかを関係者で議論している状況です。

RubyKaigi 2023が長野県松本市で開催
日本のRubyコミュニティとしてRubyKaigiが松本で今年5月にありました。Rubyに関するワールドワイドのイベントをアメリカとヨーロッパと日本の3か所で毎年やっているんですけども、その中の1つがRubyKaigiです。このRubyKaigiは多くのインタプリタ開発者が今後の話を紹介するということで、Rubyの未来を予測するのにふさわしいイベントになっています。3日間でこのようなトークがありました。この赤い線で囲ったインタプリタ開発者たちが、今後、インタプリタはどうしていこうかみたいな話をたくさんしているという感じですね。

RustやPHPのようにRubyにも型をどうするというのを一生懸命考えている人たちがいっぱいいて、49トーク中の6トークが型に関するものでした。つまり、型が熱いということですね。
それから、パーサーです。今年、Rubyは30周年を迎えたんですけれども、30年経った後にパーサーを書き換えようという動きがあります。実はパーサーの作り方で提案されているのが2通りありまして、今、議論中です。後でご紹介します。周辺ツールの話やライブラリの話ももちろんあります。mrubyやJRuby、セキュリティの話もありましたが、この辺はスキップします。
RubyKaigiの登壇者の半分弱ぐらいがRubyのコミッターでした。特筆すべきは最近のRubyの開発の現場で、ShopifyというECサイトを作るカナダの会社がRubyを使っているということで、たくさんRubyに投資しています。その中でShopifyの社員の方からコントリビュートされたコードなど、今回のRubyKaigiでもたくさんの発表がありました。あまり企業色のなかったRubyで、私ともう1人がクックパッドに雇われたら「クックパッドすごいね」って言われていたんですけれども、ShopifyにはRubyとRuby on Railsをやっているオープンソースに貢献している方々たくさんいるという話を伺いました。このあたりが最近のRubyの特徴的なところかなと思います。

RubyKaigi 2024は沖縄で開催ということで、各社さんが「予算どうしよう」みたいな話をしてるみたいなことを、チラチラともらい聞いているところです。来年、最新のRubyをキャッチアップするには沖縄に遊びに行くといいよというご紹介でした。

最近のRubyをもう少しご紹介します。2020年のRuby 3.0でType systemとJust in time compilerとBetter concurrencyという3つの目標が掲げられているので、少し細かい話をしたいと思います。あと、パーサーが熱いという話ですね。

Ruby 3.0 の目標
型の導入ということで、これも2通りのアプローチがあります。Stripeという金融系の会社がRubyでたくさん書いているらしくて、金融系では型を規定して安全に使いたいというニーズがあります。そこで、プログラムの中にRubyの構文っぽく型を書き込んで、それをRubyインタプリタとは異なる別のツールが解析して型をチェックする、Sorbetというツールが開発されています。
それから、右下のようにRubyっぽいけれどRubyではない言語で書かれたrbsというのも提案されています。こういうふうに型を書いてSteepという型チェッカーによって型をチェックするツールとして、それぞれ統一しないで発展していて、どっちがメジャーになるんだろう、みたいな感じではあります。

また、Just in time compiler(JIT)ということでRubyのコードをネイティブコードに落とすというのをいろいろな方がされていて、今はShopifyによるYJITというのがたぶん一番有名です。YJITはLazy Basic Block Versioningというテクニックを使っています。英語の記事があるので、興味がある方はぜひ読んでみてください。また、Ruby 3.3からRJITという、RubyのJITコンパイラをRubyで書くためのフレームワークみたいなものが導入される予定です。

それからBetter concurrencyです。Fiber schedulerがRuby 3.0から入りました。Rubyには昔からFiberという名前でcoroutineが入っていたんですけれども、これをIOやスリープなど、ブロックしなければならない契機でスケジューラーをRubyで書いて、Fiberを切り替えるみたいなことができるようにするシステムです。coroutineだと1万とか10万とかがRubyの中で作れるので、とても軽量に扱えるという利点があります。それからRuby 3.0から私が入れたんですけれども、Ractorという新しい並列実行機能で、ある程度共有オブジェクトを絞ることによって、安全な並列並行処理ができる仕組みを導入しました。名前からわかるとおり、アクターモデルができるよということでRactorという名前にしています。Ruby 3.3で入れたいなと思っているのは、Ractorは並列に動くんですけども1:1スレッドといってネイティブスレッドが大量にいるモデルなので、OSのネイティブスレッドが10個でRactorを1000個みたいな動きで軽くなるM:Nスレッドというテクニックを入れようとしています。

Ruby 3.3にはlramaとYARPの2つのパーサーが同梱
次にパーサーの話です。まず、Rubyで書かれたBisonみたいなlramaというBison互換のパーサージェネレーターを作って、それに拡張構文を入れるとRubyの文法がシンプルになるんじゃないかという試みが行われています。実はパーサー記述を読み込むパーサージェネレーターをlramaにすでに置き換えています。ですので、Ruby 3.3にはlramaというパーサージェネレーターで作ったパーサーが同梱される予定です。
また新しい動きとして、YARP(Yet Another Ruby Parser)という手書きパーサーをShopifyの方が作られていて、Ruby 3.4ではそちらに入れ替えようかみたいな話もしております。YARP自体はRuby 3.3にも同梱はするということで、どちらも試せるバージョンになる予定です。この理由は、パーサーの管理が難しかったというのももちろんあったんですけども、Universal parserと呼んでいる標準化されたパーサーが欲しいからです。たとえばLSP(Language Server Protocol)、VSCodeなどでRubyのパースを実行したいみたいな用途がいろいろなところであります。書いているRubyコードが正しいかを調べるためのRubyチェッカーツールにはRuboCopなどがありますが、共通で使えるパーサーがないと言われています。それならインタプリタもツールも、全部ユニバーサルなものが何か1つあればみんなで使える、たとえばJRubyでも同じパーサーが使える、といったことを目指して、YARPパーサーというものが作られているところです。それからLSPでは、たとえば書いている途中のRubyプログラムでもパースしたい場合があります。そうすると当然文法エラーになりますが、エディター支援のために必要なので対応を考えているといったところが最近の新しい話題です。

Rubyインタプリタ開発へのお誘いということで、資料が比較的豊富で、日本語で読めて、まつもとさんが日本語でしゃべるので日本語資料がたくさんあり、日本人の識者がたくさんいます。

Rubyインタプリタというのは、言ってしまえばRubyスクリプトを読んでバイトコードに変えて、それを実行するという、ただそれだけのソフトウェアですが、そのソフトウェアを実行するためには、ランタイムの仕組みがたくさん必要です。

コントリビューター必携の資料はこちら
資料としては、少し古いんですけども『Rubyソース完全解説』という2002年の本があって、全部ウェブで公開(https://i.loveruby.net/ja/rhg/ )されているのでお勧めです。

それから2014年にRuby2.0という私の作ったバーチャルマシンを解説している『Rubyのしくみ』という本があって、こちらも新しいのでお勧めです。

2023年8月に最終巻が出たWEB+DB PRESSで私は「Rubyのウラガワ」という連載をしておりました。『Rubyソースコード完全解説』で出ていたデータ構造などを最新のRubyにキャッチアップするための資料になっています。

それから、『Ruby Hack Challenge』(https://github.com/ko1/rubyhackchallenge )という資料を用意しております。Rubyインタプリタをいじろうという同名のイベント用の資料です。Rubyのソースコードの構造など詳細は資料を参照ください。イベントももしかしたらやるかもしれないので、その時にはツイッターなどでご紹介しますので、興味を持ってくださった方はぜひご参加ください。

ランタイムと書きやすさにフォーカス
Ruby特有のことなんですが、インタプリタがランタイムにフォーカスすることが多いということで、たとえばコンパイラだとコンパイル時にだいたいの仕事が終わるんですけれども、ガベージコレクターとスレッドの処理など、ランタイムにたくさん処理があります。言語処理系のインタプリタ開発者というと、パーサーとかコンパイラに取り組むことが多いかと思うんですけども、Rubyだとビルトインメソッドの実装とか、ガベージコレクターの処理をやることが多くて、私もそのあたりの下回りをたくさんやってきました。
それから、書きやすさにフォーカスというのがRubyの違うところで、実装の都合でこうした方が書きやすいんだけどなというのはあまり許してくれないみたいなのが、Rubyの文化として存在します。また、開発コミュニティとしては今、コミッターが100人以上いるんですけれども、日本人が結構多いというのが良くて、私も日本語でたくさん言語処理系の開発の話をさせてもらって、楽しい思いをしております。

というわけで、今日は駆け足になりましたが、「最新のRubyとその開発について」ということでご紹介させていただきました。ありがとうございました。
