小松です。 Ruby WorkshopのSecond session report (long version) です。 / / / Opening session reportとだいたい同じ記号を使っています。 ()はいろいろつかってしまったので、[]をコメントに使用 〇はOHPのタイトル ◇は会場からの質問 →はそれに対する木村さんの回答 / / / (Windows環境におけるRubyについて 木村浩一さん 10:55〜11:45) 木村さんがburgundy [赤ワイン色ってやつかな?] のFSFのTシャツで登場。 ○Windows環境におけるRuby その現在・過去・未来 Windows系をやってるのは、わたしだけじゃなくて、わたなべさんとかも やっているのですが、どういうわけかわたしに発表がまわってきてしまった。 現状だけだと時間がもたない……ということで過去も話すことにした。 ○現状 cygwin版とmswin32版がある。 いろいろな理由からmswin32版のバイナリ配布は行っていない。 mswin32版の作成には高いVisual C++が必要。 ○なぜ移植したか。 まずわたなべさんがNiftyで話題にして、それではと思って取ってきたけど、 コンパイルしてみたら通らない。 幸か不幸かコンパイルできなくて、ruby-listに入る前だったので まつもとさんやわたなべさんとメールのやり取りをした結果、 どうやら途中らしいと。 それではということで、ソースに移植作業の形跡があったのと gawkやmawkをいじったことがあったので、その延長でやってみた。 仕事でMSどっぷりだったので、仕事をするふりをしてやっていた。 ○作業にあたっての苦労 ・popen() ・拡張紙の違い ・コンパイラーのオプション ・構築スクリプトの対応 ・使用できるツールが限定されている ○popen() popen()はVMSやWindowsにはない。 MS-DOSでは、awk・Perlで使われているテンポラリファイル経由が常套手段。 Windowsではプロセスが独立して動くので対応しようとした。 これがおおはまり。 というのは、ドキュメントがあるが必要な情報がどこにあるのかわからない。 できたと思ったらクラッシュしてしまった。 VC++のソースを見たらundocumentedな仕様を使わないとうまく動かないことが わかった。 あきらめてライブラリを使うようにした。 ○拡張子の違い UNIX版との拡張子の違い (.aと.lib, .oと.obj, .soと.dll) を 意識しないといけない。 機械的な作業だが面倒。 ○コンパイラーのオプション オプションが違ってmakeするときに苦労する。 VC++のコンパイラは自分の理解しないオプションは無視してくれるので 意味のないものも渡したままにしている。 ○構築スクリプト(extmk.rb)の対応 拡張子とオプションの違いから別ファイルにした。 Rubyが良くわかっていない状態でいじくりまわしたので苦労して時間が かかった。 Rubyをいじるのがたのしみだったというか、これでRubyを覚えた。 つい最近まで別ファイルだったが、1.4では一本化されている。 ○使用できるツールの制限 UNIXだとyaccからなにからあるが、Windowsではコンパイラ以外のツールは できるだけ使いたくない。 バイナリ配布じゃないので、実際に作る人にただでさえ高いハードルを さらに高くしたくない。 作業していた頃はparse.cがついていなかった。 それをどうしようかと思ってkmyaccをつかってみようとしたが、 PerlはOKだがRubyはなぜかだめだった。 次の候補はcygwinのbyacc。 しかし、cygwinは1つのarchiveが20Mぐらいで、ある時メーリングリストで クレームをつけられた。 ちょっと後になってparse.cが付くようになったのはありがたかった。 bysonでparse.cを作ってコンパイルできなかった人がいて、細々なことに対処した。 Windowsの場合、インタプリタの実体はDLLになっている。Perlも同じ。 DLLのexportする関数を検出してDEFファイルを生成することが自動的に出来ないので、 いちいち手作業で書き込んでいる。 ○cygwin版Ruby 現状の話をする。 cygwin版Rubyはjperlでも有名なわたなべひろふみさんの手によるもの。 実はわたしもこっちを使うことが多い。 Rubyをいじりたい時はmswin32版、Rubyを使いたいときはcygwin版を使う。 Windows版Rubyとしてはこっち [cygwin] の方がいい。 雑誌にのったのもこちら。 win32oleにも対応している。 win32oleは最初はmswin32版だったがcygwinにも移植された。 ○cygwin版とmswin32版の違い UNIXとWindowsの違いをDLLが吸収してくれる。 苦労が少ない。 forkやexecが動くようになる。 そういった意味でcygwinは良い。UNIXと互換性が高い。 ○WindowsでRubyを使う場面 わたしが見た所では、テキスト処理言語としてとwin32ole拡張ライブラリを 使った「糊」言語として使う。 ○win32ole 助田さんによる拡張ライブラリ。 「糊」という表現を使ったが、OLEでExcelでChartを出したりAccessの データベースを使ったりできる。 Perlの同等の拡張ライブラリに比べて、いいかどうかは別にして、より VBAに近い記述ができる。 Perlはhashとreferenceを使っている。 1つ2つならよいが、5段6段になると…… どうもわたしはPerlのarrow演算子に耐えられない。 Rubyは「.」なのでよい。 心のそこから感謝している。 ○将来に向けて その1 拡張ライブラリのtcltklibのサンプルがうまく動かない。 何秒か動かすといきなりAccess Violationで落ちる。 デバッグプリントを入れると落ちるところが変わる。 GCのせいかと思っているがつきとめられなかった。 cygwin版ではおきない。 VC++のバグかと思ったが違うようだ。 だいぶむかし、Mailing ListでBorland C++でやってみたというのがあった。 VC++以外のコンパイラ (ex. Borland C++ Builder, LCC) だが、だいぶ昔に Borland C++でちょっとやってみたが1日・2日で挫折した。 微妙なところでプロトタイプのエラーでコンパイルできなかった。 (まつもとさん) 今はVALUEで受け渡しするので楽なはず、またやってみませんか。 時間があれば。 Pythonは引数なしで起動するとウィンドウが開いて対話的に使える。 fjでCE版がないかといわれた。 考えているがVC++だけではなく、CE用のSDKがいる。 個人的にはそういった環境にそそられない。 ○将来に向けて その2 ・Windows Scripting Host対応 VBに似たもので.BATファイルが進化したもの。 win32oleと関連するがいろんな所をオブジェクトとして操作できる。 例によってドキュメントを眺めているがいつになったらできるか わからない。 ・Internet Explorerとの連携 良くも悪くもWindowsに密着している。 一見Explorerをいじっているが、ExcelをいじってChartでうけとるとかができる。 SDKにのっているが、ドキュメントの量が半端じゃない。 (まつもとさん) 多すぎる。 / / / 質疑応答 (11:30開始) ◇ruby.exeとrubymw.dllに分離したのはなぜか →Rubyとかから呼んだ場合、関数がうまくうごかなかった。 Rubyの機能を,他のアプリからも使えるように。 VBから使えたりするとウリになるなぁ、と思っている。 ◇VC++は使ったことがないがスピードはどうか? →そういった方に興味がない。 (cygwin版とmswin32版は体感的に目に見えて違うとか、それほど違いはない とか会場から発言があるが決定的な発言は出ない) ◇現状mswin32版はバイナリ配布していない。 cygwin版は大げさすぎて嫌われる。 そのへんよろしくお願いします。 →標準で入っているライブラリが動かないと…… InstallShieldの使い方を覚えて、うまく動いていないtcltklibを外して 配布するか。 ◇Windows版のユーザーはどのくらいいるか? →mswin32版は何人かいる [木村さんと助田さんとReporterだけ?]。 cygwin版はNiftyの会議室からそこそこいるのではないか。 ◇現状ではmsvcrt.dll化できない →socketを使えるようにするため。socketが使える方が大事。 ◇Linux版Rubyを使っていてWindows版Rubyを使うと遅くて耐えられない。 nif.rbの出力が遅い。 →telnetで入るとそうでもない。 ◇mswin32版とcygwin版の比較をちゃんとなんかベンチマークしてるか →ほとんどしていない。 [この後Rubyのベンチマークの話になる] (まつもとさん) 専用のベンチマークソフトはありません、誰か作って。 (まつもとさん) その時々で『遅いなー』というスクリプトをベンチマーク代わりに (まつもとさん) 使ってきた。誰かrbbenchとか作りませんか? (まつもとさん) 1.3ではrename.rbがベンチマークだった。 ◇win版のRubyは,DOS窓が遅いんじゃないでしょうか。 tcktklibなしでもバイナリ配布を。 →貴重な意見として拝聴します。 ◇Linux・cygwin・mswin32では、Linuxがいちばん早い。次がcygwinで最後がmswin32。 標準出力はmswin32版が早い。 遅いのはsocketがらみか。 -- 小松克行 / Katsuyuki Komatsu <komatsu / sarion.co.jp>