こんにちは。RubyKaigi1日目お疲れ様でした。年に一度のRubyistたちの祭典、RubyKaigiは皆様楽しんでいますか?初日の今日、私は多くのセッションを聴講したり、Rubyistの皆様と会話したりすることで、とても開発にモチベーションが高まってしまいました。早く帰ってコードを書きたい、仕事に戻ったらこういうことをやりたい、しかしもっと講演を聞きたい!というような複雑な気持ちでとても楽しんでいます。初日の盛り上がりと熱気でとても良い刺激を受けた一日となりました。 ※ 弊社エンジニアが1日目で気になったセッションのレポートも公開しておりますので、合わせてご覧ください。 さて、そのRubyKaigiの初日の中でも特に目玉となったのはRubyのパパ、Matzことまつもとゆきひろ氏の基調講演でした。最初の講演ということもあり、会場は立ち見が出るほどの満席となりました。
まつもとゆきひろ氏本人から語られるRuby 3の話
多くのRubyistの間でのトピックといえば、Ruby 3は果たしてどうなるのか?ということです。そのRuby 3の展望について、Matz氏本人から語られました。Rubyのpros, cons
Matz氏によると、Rubyには3つの良い点(Productive, Flexible, Fun)と悪い点(Performance, Multi-Core, Not for Bigger Team/Project)があり、Ruby 3についてはこれらの悪い点を改善した機能を提供する方針となると述べました。
Performanceの改善
RubyのパフォーマンスについてはRuby 1.9から徐々に性能は改善していっており、現在の最新バージョンであるRuby 2.6系からはJITコンパイラが搭載されました。
Optcarrot(Ruby製NESエミュレータ)のベンチマークではJITオプションをつけるだけで1.6倍の性能向上が確認されています。しかしながらRailsのようなメソッドが多いアプリケーションをMJITコンパイルすると逆に遅くなってしまうという欠点があります。この欠点をどのようなアプローチで解決するかという内容は、k0kuben氏による別セッションで詳しくお話されておりました。 さらにRubyでも型を使えるようになります。ただし、他の静的型付け言語で使われているようなコード中で型宣言をするものではなく、型定義ファイル(.rbiファイル)、型定義ライブラリ、タイププロファイラ、静的型チェックのようなコンポーネントを組み合わせて使うことになります。アプローチとしては型定義ファイル(.rbiファイル)に型シグネチャを定義し、タイププロファイラを使うことで.rbiファイルで定義された型の情報から矛盾している型を見つけられます。
また別のアプローチの静的型チェックについては SorbetとSteepがすでに開発されています。Sorbetは高速でNominal、DSLとして型情報を追加することができ、SteepはRubyで書かれていて柔軟という特徴があります。
- Sorbet: https://sorbet.org/
- Steep: https://github.com/soutaro/steep
Concurrency
RubyのUnicorn, Falconなどはコアを活用したプロダクトでそのようなアプローチが重要になってきています。Thread/Fiberという機能がすでにありますが、ボトルネックの解消には向いていません。
そこでRuby 3ではGuild(Isolates)とAutoFiber(AsyncWhatever)という新しい機能を提供することを検討しています。Guildではオブジェクトスペースを分離し、チャンネルを使ってImmutableなオブジェクトまたはDeep Frozen Objectを送ることができます。さらに、I/Oブロッキングによって自動でコンテキストスイッチするAutoFiberも導入予定だそうです。
ちなみに、()で別の名前となっているのはまだ名前が正式に決まっていないからとのこと。(Guildという名前はゲーム業界のプロダクトなどではすでにクラス名として使われていたりするという反発もあるそう)これらの名前を募集中です!
Ruby 3で変更されない点
これまではRuby 3の新機能についての紹介でしたが、逆に変更を諦めた点もいくつか紹介されました。- Frozen String Literal
Obsolate “?” LiteralObsolate backquotesDeperecate autoload