RubyKaigi 2013 レポート

田中哲さん「Rubyの開発はこれからも多様性との戦い。それは『チャレンジしがいがある』もの」 ~ RubyKaigi 2013 基調講演 3日目

この記事を読むのに必要な時間:およそ 3 分

2013年5月30日~6月1日の3日間,お台場にある東京国際交流館にてRubyKaigi 2013が開催されました。基調講演をそれぞれレポートします。

画像

3日目最後の基調講演は,open-uri,socketをはじめとし,たくさんのライブラリの開発に携わっているRubyコミッター,田中哲さんによる,Ruby開発における「多様性との戦い」についての講演でした。

自己紹介

始めに「お台場」「多様性=ダイバーシティ」といえば……。と言ってダイバーシティの写真を映す,と言う和やかな冗談から始まった田中哲さんの発表は,Rubyのコミッターならではの切り口からみた多様性との戦いの記録でした。

画像

田中さんは2008年度のRubyKaigiでも多様性がテーマであったことを取り上げつつ,逆に,⁠多様性は無条件で良いものと言えるだろうか?」と問いかけました。一つの例として,ウェブブラウザの多様性を取り上げ,その対応に苦労した人も多いのではないか,と言います。

そうして,ご自身がRubyの開発を通してプラットフォーム多様性と戦ってきた話を始めました。

Rubyを多様な環境で動くようにするには

Rubyの開発のフローにおいては,ある機能や修正を実装したあとでも,その変更をプラットフォームメンテナにより様々な環境にポートしていく作業が必要になるとのことでした。そしてこの「様々なプラットフォーム」での多様性こそが今回のテーマだと言います。

dbmライブラリ

多様性との戦いの現場の例として,dbmライブラリについて取り上げました。

dbmとはいわゆるKVSの一種であるそうです。データベースのファイルをdbmライブラリでオープンすると,ハッシュのように読み込みや書き込みをすることができ,また他のプロセスからも読み書きができるようなシンプルなデータベースです。

便利そうなライブラリなのですが,会場にいるRubyist達にはあまり知られていないようでした。

画像

Rubyのネイティブ拡張の仕組みとextconf.rb

最初に田中さんは,Rubyにおけるネイティブ拡張の方法について説明しました。

rubyのソースディレクトリの中のextディレクトリの配下には,dbm.cというC拡張のソースと,extconf.rbというRubyのスクリプトが存在します。このextconf.rb は,ビルド時に様々な環境を調査するものだとのことです。様々なCのプログラムで利用されているconfigureスクリプトのようなものですが,こちらはRubyで書けるものとなります。

extconf.rbの内部ではmkmfと言う名前のライブラリを利用しています。最も簡単な例は次のような2行のスクリプトです。

require 'mkmf'
create_makefile('fcntl')

mkmf.rbを利用すると,Cのライブラリや型などが,現在のプラットフォームで利用可能かの調査ができるそうです。そして,Rubyでは標準で様々な拡張ライブラリのためのextconf.rbが添付されていますが,dbmのものは254行あり,Ruby標準ライブラリの中でも第3位の大きさだそうです。

dbmの歴史

次に,dbmはRubyのライブラリ名でもあると同時に,Cのライブラリの名前であると言うことで,Cのdbmライブラリの歴史を話しました。

dbm

まず,dbmは,AT&Tが提供するUnix version 7に添付されていたものが最初だったそうです。ヘッダファイルもなく,キーと値のサイズにも厳しい制限がありました。この段階のdbmはRubyではサポートしていません。

ndbm

一方で,4.3 BSDには,Unix Version 7から派生したndbmが添付されていました。こちらもAT&Tのライセンスだったそうです。そしてこの段階でAPIが標準化され,Rubyもサポートするようになりました。こちらのndbmライブラリはlibcで標準で含まれているので,コンパイラにリンカを指定しなくとも利用可能だそうです。

gdbm

また,GNU operating systemの開発の上で,AT&Tライセンスでない自由なdbmが必要になりました。そこでGNUライセンスのgdbmが誕生することとなりました。gdbm独自のAPIに加えdbm,ndbm互換APIを持っているそうです。

Berklay DB

Berklay大学でもAT&Tでないライセンスのndbmの代替が必要となり,Berklay DBが開発されました。Berklay DBは比較的高機能だそうです。また,他のdbmと違ってファイルが一つだけとなります。

qdbm

比較的最近のものではqdbmと言うものも存在し,こちらも高機能であるとのことでした。

ライブラリを正しく使うには?

RubyのDBMライブラリでは先に述べたCのDBMライブラリのうち,ndbm,gdbm,Berklay DB,qdbmの4種類を,Rubyからはどのライブラリを使っているか意識することなく同じAPIで利用することができるそうです。そのためにはRubyのDBMライブラリからCライブラリを正しく使う必要があると田中さんは述べました。

Cライブラリを正しく利用するためには,対応するライブラリとヘッダを正しく読み込めば良いのですが,現実ではなかなか大変な例もあるとのことでした。例えば,ndbm.hをインクルードする場合でも,実態が4.3BSDのndbmかもしれないし,Berklay DBかもしれない,あるいは入っていないかもしれない,という現象が起こりうると言います。

画像

dbmに関する過去のバグ

そして,かつてのruby-listでの投稿をもとに,いくつかのバグを紹介しました。プラットフォームによってrequire 'dbm' と言う単純なコードが動かなくなる事例があったそうです。

1.0リリース直後の時代

このような事例として,シンボルdbm_clearerrが見つからないと言うエラーがでてしまうと言う問題が,ruby 1.0-971021のリリース一週間後にruby-list MLに投稿されました。

これは,根本的にはdbm_clearerrの定義に,プラットフォームによってよってミスマッチがあることが原因でした。差異を埋めるために, #ifdefを宣言したところ,typoをしてしまったため,どういう環境にしても使われないので呼び出されなくなり,コンパイルエラーにはならなくなった,と言うエピソードを披露しました。

このtypoも含めRuby 1.3.6で直ったとのことでしたが,新たな問題を呼び込んでしまったそうです。

1.3.6以降でのバグ

新たな問題は,dbm_clearerrを正しくチェックするようになったことが原因で,オブジェクトファイルのリンク状況が変わり,プラットフォームによっては結果的に複数のオブジェクトファイルで同じ名前の宣言がされてしまって,エラーになる現象が起こってしまいました。

こちらは,dbm_clearerrのチェックを外すことで結果的に動くようになりましたが,よく考えないとなぜ直ったかが分からない,⁠薄氷を踏むような感じ」の修正だったとのことです。

著者プロフィール

近藤宇智朗(こんどううちお)

業務システム→ECサイト→オンラインゲームな雑食プログラマ。Ruby好き。Sinatra,Padrino,Rackなどが好き。

WEB+DB PRESS誌でも,連載「一歩先行くRuby」(vol.69~現在),特集「コードレビュー実践入門」(vol.72)など,何点か寄稿している。

最近興味があるのは型システムが強力な言語。

twitter : https://twitter.com/udzura
blog : http://blog.udzura.jp


にく

北海道出身で沖縄や東京に住んだ後,今は札幌在住のプログラマ。コンサドーレ札幌が好き。Ruby,Emacsが心のメインツール。最近はHaskellを試している。

twitter:https://twitter.com/niku_name

blog:http://niku.name/

コメント

コメントの記入