12月11日~13日、ベルサール汐留にて「RubyKaigi 2015 」が開催されました。今年も基調講演が毎日一つずつ行われました。その模様をレポートします。
RubyKaigi 2015初日の基調講演はまつもとゆきひろ さんです。「 Ruby 3 challenges」と題して、間もなくリリース予定のRuby 2.3.0の紹介をしつつ、Ruby 3について話しました。
MINASWAN
"MINASWAN"という海外で生まれた標語があります。この言葉、その文化を日本に逆輸入したいと、まつもとさんは話し始めました。
Rubyコミュニティの徳
ラリー・ウォール がプログラマに必要なものとして提唱している、プログラマの三大美徳というものがあります。
怠惰 (自分の仕事を楽にするためにはどんな努力でもする)
短気 (コンピュータが怠けているのに怒りを感じ、コンピュータが意図を読みとって動作するようにする)
傲慢 (他の人が文句をつけないようなものを作る)
これらはすべて怒りの感情に通じています。怒りは制御されている限りにおいてはモチベーションに繋がりますが、外に出してしまうと周囲に伝染してしまいます。一方、よい感情も伝染するため、コミュニケーションにおいて内心腹を立ててもそれを外に出さず、親切な対応が大事です。これがRubyコミュニティにおける最も大事な徳であると、まつもとさんは言います。
Matz is nice so we are nice
そしてRubyコミュニティには、そのコミュニティを表現した標語に"MINASWAN"というものがあると紹介しました。これは"Matz is nice so we are nice"の略で、もめごとがあっても「matzがniceだから俺らもniceでいよう」と、なだめることが海外のメーリングリストではよく見られるそうです。MINASWANはマーティン・ファウラー が昔RubyConfで指摘したのが始まりで、今ではスローガンにまで昇華しています。
この標語についてあまり日本では触れられることがないため、日本のRubyコミュニティにこの特質を逆輸入したいと考え、講演の最初に取り上げたと述べました。
2.3.0 の変更点について
RubyKaigi 2015に合わせて 2.3.0-preview2 がリリース されました。Ruby 2.3.0はこのクリスマスにリリースされる予定です。
2.3.0での主要な変更点について紹介しました。
Did-you-mean
Enumerable#grep_v
Hash#fetch_values
Numeric#positive?
, Numeric#negative?
Hash#<=
, Hash#<
, Hash#>=
, Hash#>
Hash#to_proc
Array#dig
, Hash#dig
, Struct#dig
Indented here doc <<~
Frozen string literals pragma
Safe navigation operator
詳細については 2.3.0-preview2 の Changelog をご覧ください。
Frozen string literals
ここでは、変更点の中でもRuby 3における非互換の検証として注目されているFrozen string literalsについて詳しく取り上げます。
String
リテラル("literal"
)を常に.freeze
したものとして扱うコマンドラインオプションとマジックコメントが導入されました。この背景にはfreeze
にまつわる社会問題があったと、まつもとさんは話します。
Ruby 2.1から、"literal".freeze
が最適化され、String
オブジェクトを都度生成せずに常に同じオブジェクトを返すようになりました。"literal"
が何度も評価されるような場合には"literal".freeze
することでパフォーマンスの向上が見込まれます。
しかしこれにより、Rubyライブラリの"literal"
に対して、その箇所がボトルネックかどうかに関係なくひたすら.freeze
をつけるような Pull Requestが散見されるようになりました。確かに高速化はされるのですが、コードの可読性は損なわれてしまいます。そのため、Ruby 3ではすべてのString
リテラルをimmutableにすることを検討しており、その影響調査のために2.3でこのような機能を導入したそうです。
変化と苦痛
まつもとさんがRubyの開発を開始してから20年以上経過していますが、既存のコードを捨てて一から作り直したくなったり、劇的な変更を加えたくなったりしたことが何度もあると言います。そんな中、Rubyを変化させるにあたって大事にしているルールについて話しました。
変化はしたいけど苦痛は嫌
まつもとさんは、「 OSSコミュニティはサメと同じで、止まると死んでしまう」と表現します。業務と違ってOSSは自発的にやるため、おもしろくないと人が離れていってしまいます。そのため、OSSにはたくさんの変化が必要だと主張します。しかし、変化にはコストがかかり、コストは苦痛になるため、「 OSSを続けるためには“ 変化はしたいけれど苦痛は嫌” という矛盾と戦わなければならない」と述べました。
人々は自分が何が必要かを知らない
変化について考えるにあたって、その方向性やデザインを決定するのは難しく、正解を持っている人はほとんどいないと指摘します。人々は自分が何が必要かを知らないため、ほしいものを聞いてそのまま作っても失敗してしまうそうです。
1995年のRubyを作り始めたころは「スクリプト言語にオブジェクト指向は不要」と言われたこともありましたが、それでもまつもとさんは自分の信念を曲げませんでした。今になってみると、ほとんどの言語はなんらかの形でオブジェクト指向プログラミングが可能です。スクリプト言語の適用範囲が広がり、数十万行規模になることでオブジェクト指向でなければ管理不能になったためです。結果的に、まつもとさんが思う「未来にこんなものがほしい」というのが当たりました。
近年、RubyはWebアプリケーションを作る上でメジャーな言語になっています。一方、まだRubyは完成したとはいえず、状況に合わせて改善を続ける必要があると述べています。
Rubyの変化で大事にしているルール
システムを作っていると、次第にどんどん巨大化していってメンテナンスが大変になり、既存のコードを捨てたくなります。プログラミング言語においてもそれは例外ではなく、息も長いため特にそれが顕著だそうです。
ユーザも変化による苦痛を嫌がるため、非互換な変更が行われた際に移行するのに長い時間がかかります。例えばRuby 1.8から1.9に移行するには5年かかったと言います。その際に学び、Ruby 2からは次の4つのルールを大事にしていると紹介しました。
何もかもを捨ててはいけない
劇的な変化はいけない
理由なく互換性を壊してはいけない
ユーザへのメリットを提供しないといけない
これらのルールを守った結果、Ruby 1.9から2.0、2.1、2.2は高い互換性を保ち、スムーズに移行が進んでいます。
Ruby 3でやりたいこと
2013年にRuby 2.0がリリースされてから2年、時間が経つにつれて状況はどんどん変わっていき、状況に合わせた変化が求められています。先述したRubyの変化で大事にしているルールを守ることは強調しつつ、現在のRubyの課題とRuby 3でやりたいことについて話しました。
並行処理
Rubyを作り出した1993年頃はCPUコアの数は1つでしたが、近年はクロック数の向上が頭打ちになり、複数のコアを持つことが一般的になってきました。RubyではThread
を提供していますが抽象度が低いため、もっと抽象度が高い扱いやすいものを提供したいと考えているそうです。その方法として次のような候補を示しました。
Actor model
Ownership model
STM
Stream model
人とマシンとの協調
Rubyの使用用途が大規模なアプリケーションで使われるようになり、当初の数百行程度から今では数十万行のコードになっています。2.3ではDid-you-meanの導入が行われますが、このように親切なエラー表示や、賢いコンパイラの実装を考えているそうです。昨年はソフトタイピングの話をしました が、現在、他の言語を参考に静的解析ツールについて検討をしていると話しました。
Ruby 3x3
Rubyの実行速度は毎年5~10%程度改善していますが、どれほどRubyが速くなったとしても誰も文句は言いません。まつもとさんは、何かを達成するためにはゴールを設定することが大事と話し、"Ruby 3x3"、Ruby 3はRuby 2.0より3倍速くする、という目標を掲げました。
一方で、具体的にどうすれば3倍速くできるかが分かっているわけではないため、できることは何でもしようと考えているそうです。Rubyを3倍速くすることは決して簡単ではないが、難しいからこそやる価値があると、まつもとさんは述べています。東京オリンピックの前年である2019年までにRuby 3x3を実現したいと意気込みを語りました。
一緒にRubyをよくしていきたい
Rubyはもはや、まつもとゆきひろのものではない、とまつもとさんは言います。「 Rubyはコミュニティのものなので、コミュニティ全体としてRubyをよくしていきたい。やりたいことはいくつもあるが、その中でもこの5年間は特にパフォーマンスの向上について取り組む予定」と話します。
Rubyの開発は多くのコントリビュータに支えられています。Rubyに貢献している方々への感謝を告げ、「 より多い貢献によってよりRubyはよくなると思いますので、Rubyの進歩を加速するためにもみなさんのお手伝いを必要としています」という言葉で講演を締めくくりました。