2020年リリース「Ruby 3.0.0」の変更点・新機能を解説
2020年12月25日、7年ぶりのメジャーバージョンアップとなるRuby 3.0がリリースされました。これまでもRubyは人気のプログラミング言語のひとつとして世界中で利用されてきましたが、いくつかの課題を抱えていたことも事実です。そんな中でリリースされたRuby 3.0.0では、どのようなポイントが改善されたのしょうか? 実装された新機能も含め、Ruby 3.0.0の概要を解説します。
Contents
Rubyとは
Rubyは、1995年に公開された、アプリケーションのソフトウェアを作成するための動的プログラミング言語です。日本人技術者の「まつもと ゆきひろ」氏が、自身の好きなプログラミング言語(Peal、Smalltalk、Eiffel、Ada、Lisp)を組み合わせて開発したオブジェクト指向スクリプト言語で、日本発のプログラミング言語で初めて「IEC(国際電気標準会議)」に認定された、国際規格の言語でもあります。
プログラミング言語に使われる特有の記号を省略したシンプルで書きやすいコード設計を採用し、誰もが扱いやすい仕様となっていることが特徴で、いまでは世界中でさまざまなサービス開発に使用されています。
- ブログ
- ECサイト
- ポータルサイト
- SNS
- Webアプリケーション
- スマホアプリケーション
- チャットボット
- スクレイピング
- クローラー
Rubyで開発された有名なアプリケーションのなかには、食べログやTwitter、クックパッドなどがありますが、スクレイピングやクローラーとしても扱いやすく、個人から企業レベルまで重宝されています。
Ruby 3.0.0での変更点
Rubyのバージョンアップは毎年12月25日に行われています。今回はRuby3.0系初のリリースで、2013年にRuby 2.0が登場して以来、7年ぶりのメジャーバージョンアップとなっています。
なお、Ruby 3.1以降のアップデート情報、新機能は下記から確認可能です。
パフォーマンスの改善
今回のバージョンアップの目玉となるのは、Optcarrot(Rubyで書かれたファミリーコンピュータの模倣ソフトウェア)ベンチマークでこれまでの3倍以上のスピードを達成したことでしょう。これを可能にしたのが、MJITの改善です。
MJIT
JIT(Rubyプログラムを実行する際に、プロセッサにあわせて動くよう機械語に変換される技術)にC言語のソースコードを生成して、コンピュータが対応できるよう設計されたコンパイラのこと
このMJITはRuby2.6から実装されたものですが、今回のバージョンアップにより処理速度が向上。これまで処理に時間が掛かっていたAI技術などでも性能の向上が期待できるように改善されています。
ただし、メモリ負荷の大きいRuby on Railsなどの性能向上までには至っていないため、今後の課題とされています。
バージョンアップに伴う注意点
Ruby3.0.0へのバージョンアップにより、バックトレース(例外処理を行うことで例外を感知してプログラムの呼び出し状況を取得するメソッド)の順序の逆転がなくなりました。
Ruby2.5以前:例外が起きた行が先に表示されて、呼び出し元が後ろに表示される仕様
Ruby2.5以降:例外が起きた行が後ろに表示され、呼び出し元が先に表示される仕様
Ruby3.0.0では、バックトレースの順序はRuby2.5以前の順序に戻っています。
その他、いくつかの変更点がリリースされています。
- キーワード引数が通常の引数から分離した
- パターンマッチが実験的な機能ではなくなった
- $SAFEの機能が完全に削除された
Ruby 3.0.0での新機能
今回のバージョンアップでRuby3.0.0には新機能が実装されています。
- 並行処理
- 静的解析
これまでのRubyのプロセスで並列処理をする場合は、スレッドを使用しなければいけませんでしたが、簡単に並行処理ができる機能が追加されました。また、型の記述や静的型推論ツールを利用できるようになっています。
並行処理
Ruby3.0.0では、並行処理を行うための機能として以下の2つが追加されました。
- Ractor
- Fiber Scheduler
Ractor
Ractorとは並行実行の単位で、それぞれの処理が並行して実行される機能です。
Rubyで並列処理を行う方法としてマルチスレッド処理が用いられるケースがありましたが、この方法だと1つのプロセスに複数のスレッドが影響し合うことでバグが発生しやすいデメリットがありました。その問題を解決するために開発されたのがRactorです。
不具合を起こさないために、全ての変数を読み取り専用にして、並列単位ごとにそれぞれのメモリを個別に分ける方法を採用しています。メモリを個別にすることでスレッド同士が影響し合わず、不具合を起こしにくくしているのです。
また、スレッドとスレッドの間で共有する変数は型宣言で明示し、正しく動作していないコード処理に対してはコンパイルのときに検知する方法で並列処理を行います。
Fiber Scheduler
Fiber Schedulerは、Ruby1.9で登場したclass Fiberの新機能です。
Fiber
親と子の関係を持つ軽量のスレッド。この親子関係のある間で中断した処理は、自分の好きなタイミングで処理の続きを行えるため、Fiber間で並行処理が可能になる
今回Fiber Schedulerが導入されたことで、I/O処理などの待ち時間の長い大量の並行処理を、これまでのスレッドよりも効率的に行えるようになりました。また、処理を中断させたり、強制的に通信を途切れさせるようなブロッキング処理が起こった際に、非ブロッキング処理をRubyで記述し、別のFiber(親または子)に切り替えることができます。このため、サーバーに発生する大量のWebリクエストの同時処理をRubyで実行できるようになりました。
ただし、ブロッキングの可能性がある処理にはさまざまな要因があるため、Rubyだけでは対処しきれないという問題点も残っており、今後のバージョンアップで改善されるか注目です。
静的解析
Rubyで静的解析をおこなうための機能として以下の2つが追加されました。
- RBS
- TypeProf
Ruby3.0.0の大きな変化として、型情報を記述するためのRBS言語と、静的型推論ツールとしてTypeProfが実装されました。動的なアプリケーションを作ることがRubyの特徴でしたが、今回のバージョンアップによって、静的型付け言語のメリットを受けられるようになっています。
RBS
RBSは、Rubyのコードに静的型の情報を実現させる仕組みです。RBS単体で何かできるわけではなく、あくまで型の検査機能となります。
Rubyとは異なり、「.rbs」拡張子によるRBS言語として扱われるため、Ruby3.0.0の新機能ではありますがRubyスクリプト本体に型情報は書きません。のちほど紹介する「TypeProf」を使用すると、RBS言語を自動で生成してくれます。
注意点として、型チェックの実行はRubyの機能で行うのではなく、同梱されているライブラリ「rbs gem」を使用します。
TypeProf
TypeProfは、Rubyの静的型解析ができる新機能です。RBS言語を自動で生成してくれるだけでなく、静的型情報のRBS言語を出力できるので、Rubyでのバグを発見しやすくなります。
また、出力したRBS言語を変えずに、そのまま静的型情報を実現させられる点もメリットのひとつです。ただし、まだ実験的な段階のため解析の精度が低く、バグの検出の機能は限定的。改良を重ねている最中の機能となります。
その他の新機能
これまでRubyの文法で多用していた「end」をなくし、以下のようなメソッド定義が導入されました。
def square(x) = x * x
また、これまで「in」を使用していたパターンマッチですが、データ検索をする際に検索したパターンが出現するかどうかを特定する「一行パターンマッチ」に、試験的に「=>」を導入していくことになりました。
それに関連して、以下のようなファイル検索できるfindパターンも追加されています。
[*pre, size => x, size => y, *post]
上記のパターンは「size」が2連続で表記される箇所を探すパターンです。
Ruby 3.0.0へのアップグレード方法
Ruby 3.0.0のアップグレードは、Rubyバージョン指定を3.0.0に切り替えることとなりますが、その前にRubyの実行環境のインストールが必要です。
実行環境のインストールは、OSによって異なります。
OS | 必要なツール |
---|---|
Windows | RubyInstaller MSYS2 |
Mac | Homebrew rbenv |
なお注意点として、Macの場合は、「homebrew」をインストールするために「XCode」をインストールする必要があります。また、XCodeをターミナルから操作するために「Command Line Tools」もインストールし、ターミナルから「xcode-select --install」のコマンドを入力しなければいけません。
Ruby3.0.0にアップグレードする手順は、以下の順番でターミナルにコードを打ち込むだけです。
(#の文言は指示ですので打ち込まないでください)
ruby -v
#今のRubyのバージョンが分かります。
brew update
brew install rbenv ruby-build
#このコードで「rbenv」をインストールできます。
rbenv install --list
#上記のコードで、インストール可能なRubyのバージョンがリストアップされます。
rbenv install 3.0.0
#Ruby3.0.0が表示されていれば、上記のコードを打ち込みます。
rbenv global 3.0.0
#インストール完了後、上記のコード打ち込んでRubyのバージョンアップ完了です。
- 2020年12月25日にリリースされたRuby 3.0は、7年ぶりのメジャーバージョンアップ
- バージョンアップにより、Optcarrotベンチマークでこれまでの3倍以上のスピードを達成
- 並行処理を行うための機能として「Ractor」「Fiber Scheduler」を実装
- 静的解析をおこなうための機能として「RBS」「TypeProf」を実装
- 一部機能はまだ実験段階にあり、改良を重ねている最中