2017年9月18日から20日まで、広島国際会議場にて「RubyKaigi 2017」が開催されました。基調講演の模様をレポートします。
RubyKaigi 2017 初日の基調講演はフルタイムRubyコミッタである、中田伸悦さんです。Rubyの開発環境、中田さんの普段の開発環境、最近面白かったpatchなどについて発表しました。
Rubyの開発を取り巻く環境
基調講演は、Rubyが普段どのように開発されているかという話からはじまりました。Rubyの開発を取り巻くものとして、バージョン管理システム・Issue管理システム・開発者会議の3つについて触れました。
バージョン管理システムはSubversionを使っています。そもそもGitよりもRubyのほうが古くからあることや、Gitが公式にはWindowsをサポートしていないことなどもあり、RubyコミッターにとってはGitに移行するメリットが現時点ではあまりないそうです。また中田さん個人としては、GitのコミットハッシュよりもSubversionのリビジョンのほうが分かりやすいという意見を持っていました。
Issue管理システムはRedmineを使っており、各種メーリングリストと連携しています。
開発者会議では、Rubyのコミッターが集まってチケットの棚卸しをしているそうです。毎月1回程度の頻度で、主に東京で開催されています。
普段家でやっていること
次に中田さんの普段の開発について話をしました。Rubyのビルドに関する内部的な話や、中田さんの開発環境を取り上げました。
Rubyを手元でビルドするには、他のOSS同様にconfigureをしてmakeをします。レボジトリからビルドする場合は、Git(Subversion)・autoconf・bison・gperf、そしてRubyが必要になります。ここで必要となるRubyには、BASERUBYとMINIRUBYの2種類があります。BASERUBYは"defs/id.def"や"insns.def"といったファイルを処理するのに必要になります。MINIRUBYはRubyのビルド時につくられ、拡張ライブラリ用のMakefileの生成や、組み込みでないエンコーディングに必要なファイルの生成などに使われます。
ビルドに関してRubyの少し特殊な点として、Out-of-Placeビルドができるようにしている点だと言います。これはconfigureのoptionがとても多いことや、platformがたくさんあるためです。中田さんの場合、VMを使用してLinuxやWindows向けの開発をしているそうです。そのために同じソースディレクトリを共有しつつ、各種OSやオプション別に合計2-30個くらいのディレクトリをつくって、様々な設定でビルドを行っているそうです。
Ruby 2.4まで拡張ライブラリのコンパイルは並列で実行される一方、拡張ライブラリのコンパイル前に行う"extconf.rb"の実行は直列で実行していました。そのため"extconf.rb"の実行に時間がかかっていまいした。そこで、Ruby 2.5からは複数のプロセスをたてて、"extconf.rb"の実行を並列化するようにし、Rubyのビルドを高速化したそうです。
最近のpatchについて
つづいて最近行った修正のなかから面白かったものを2つあげ、詳しく解説しました。1つはRubyの文法に関するもの。もう1つはString#intern
を上書きした時の挙動に関するものです。
前者は以下のようなコードがあったときに、1行目がコメントアウトされているか否かによって、2行目の結果が変わるというものです。これは[ruby-list:50578]の質問に基づくものです。
このような現象を、"Rubyが全力で簡単な文法だと錯覚させようとしていることのしわ寄せ"だと言います。他のコミッターから"悪魔城"とよばれている"parse.y"に関連するものでありながら、修正自体は(中田さんにとっては)さほど難しくないという点が、この現象の面白いところだと話していました。この挙動自体はすくなくともRuby 1.1でも確認できるほど古くからあるものなので、挙動を変更してよいものかどうか悩んでいました。
後者はString#intern
を上書きすると、場合によっては:"#{str}"
というシンボルリテラルの結果が、Symbolでなくなってしまうというバグです。このバグは[Feature #13812]と対照的です。#13812は"文字列展開のなかで、Refinementsで定義した#to_s
を有効にしてほしい"というものです。
一方ではメソッドの再定義を無効にし、もう一方ではメソッドの再定義を有効にするという点が面白い点だと説明しました。
なお、#13812については基調講演のさなか、壇上でコミットが行われ、会場から拍手が送られました(r59950)。
まとめ
最後にRuby 2.5の開発状況について話しました。
これまでに提案したもののリジェクトされた機能として、Range作成用の^..^
演算子(ねこ演算子)や、DSLでの使用を想定したユーザー定義演算子があります。また現在議論中の機能として、Methodオブジェクトをつくるための演算子や、右代入について触れました。
そして中田さんは、「怖くないですから。新しいRubyをつくってみませんか? みなさんの参加をお待ちしております」と発表を締めくくりました。