オープンソースプログラミング言語「Ruby」の最新メジャーリリース「Ruby 3.0.0」が公開された。新版の主な改善点はパフォーマンス改善、並行処理、静的解析の3点。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
Ruby開発チームは2020年12月25日、オープンソースプログラミング言語「Ruby」の最新メジャーリリース「Ruby 3.0.0」(以下、Ruby 3.0)を公開したと発表した。
Ruby 3.0はパフォーマンスの改善、並行処理、静的解析の3点を目標に開発されてきた。特にパフォーマンス改善については、「Ruby 3x3」として「Ruby 3はRuby 2の3倍速くする」ことが目標に掲げられてきた。
実際にRuby 3.0では、Optcarrotベンチマークで3倍の高速化を達成できた。
Ruby 2.6で導入されたJIT(Just In Time)コンパイラアーキテクチャ「MJIT」にさまざまな改善が施された。これにより、AIやOptcarrotで性能を評価できるゲームなど、少数のメソッドを多数呼び出すことに多くの時間を費やすアプリケーションの性能をJITが改善できるようになった。
一方、生成コードのサイズを大幅に削減したものの、「さまざまなメソッドを満遍なく呼び出す『i-cache』への負荷が大きい『Rails』のようなワークロードでは、JITコンパイラがその負荷を大きくしてしまうため、性能を改善できる状態には至っていない」とRubyチームは述べ、Ruby 3.1での改善を表明している。
アクターモデル風の並行並列制御機構である「Ractor」が実験的に導入された。Ractorはスレッド安全に関する懸念がなく、Rubyで並列処理を実行できるように設計されている。
複数のRactorを作成すると、並列計算機上で並列に実行される。Ractor間では、ほとんどのオブジェクトが共有できないように設計されており、スレッド安全なプログラムを記述可能だ。Ractor間のコミュニケーションはメッセージの送受信が担う。
def tarai(x, y, z) = x <= y ? y : tarai(tarai(x-1, y, z), tarai(y-1, z, x), tarai(z-1, x, y)) require 'benchmark' Benchmark.bm do |x| # sequential version x.report('seq'){ 4.times{ tarai(14, 7, 0) } } # parallel version x.report('par'){ 4.times.map do Ractor.new { tarai(14, 7, 0) } end.each(&:take) } end
Benchmark result: user system total real seq 64.560736 0.001101 64.561837 ( 64.562194) par 66.422010 0.015999 66.438009 ( 16.685797)
併せて、処理をブロックさせるI/Oなどの操作をフックするための「Fiber Scheduler」も導入された。この機能により、既存コードを変更せずに、軽量な並行制御を実現できるようになった。
Rubyプログラムの型を記述するための言語「RBS」や、型解析ツール「TypeProf」が導入された。TypeProfをはじめとする静的解析を実行するツールは、RBSを利用することでRubyプログラムをより精度良く解析できる。Ruby 3.0には、RBSで書かれた型定義を処理できるライブラリ「rbs gem」も同梱されている。
TypeProfはまだ実験的機能であり、現在は主に一種の型推論に使用される。型注釈のない普通のRubyコードを入力すると、どのようなメソッドが定義され、どのように使われているかを解析し、型シグネチャのプロトタイプをRBSフォーマットで生成する。
これらの改善の他、次のような新機能も導入した
Copyright © ITmedia, Inc. All Rights Reserved.