1. プログラム プログラム名: 君ならどう書く? (パズル/ゲームを題材としたネットワーク通信) 発表者名: Perl : 台場圭一(Tokyo Perl Mongers) PHP : 重松修 Python : 田原悠西(日本Pythonユーザ会) Ruby : 喜多淳一郎(tDiary) 記録者名: よしだ たけし 2. 時間 開始時刻: 16:30 終了時刻: 16:55 (質疑応答: 16:55 〜 17:05) 3. 発表の概要、論点 ※ 4 および 5 の内容の概略を文章形式で簡単に記述する。 ※ Update の場合、見出しの列挙でも良い。 お題「複数台のマシンでじゃんけんをするプログラムを書いてください」に基づいて、与えられたプロトコル仕様に則ったじゃんけんクライアントを作成します。 各言語でどのようにしてサーバとのやりとりやじゃんけんの出し方を実装したのか解説した後、実際にサーバを介してじゃんけんを行います。 その後、制作期間やLightweight/Heavyweightの違いといった質疑応答に移ります。 (注) プロトコル仕様については,発表者と実行委員会で議論して決めました。 4. 発表の流れ、内容 # ---------------------------------------- # じゃんけんゲームの紹介 # ---------------------------------------- プログラムのテーマは 「複数台のマシンでじゃんけんをするプログラムを書いてください」 です。 複数台のじゃんけんクライアントから一台の勝者を決めます。 サーバとクライアントで勝ち負けを送信してゲームを進行します。 各プログラムの発表は5分打ち切り制です。 # ---------------------------------------- # Perl プログラムの発表 # ---------------------------------------- TCP/UDP を使ってサーバ/クライアントのソケットを開きます。 サーバとクライアントの意味が一般とは逆になっています。 じゃんけんの通知や呼び込み、書き込みの操作には select を使って、操作が可能になったら実行するようにしました。 rand で乱数を発生させてじゃんけんの手を決める予定が、 int(rand(2)) となってために、0 か 1 しか値をとることが出来ず、発表時のプログラムでは「グー」を出せないことが聴講者から指摘されました。 (追記) その場で間違いを修正し,仕様変更やバグ対処に柔軟に対応できるのがLLの 特徴だと,発表者は述べました. # ---------------------------------------- # Python プログラムの発表 # ---------------------------------------- じゃんけんサーバに自分のアドレスで TCP でつなぎます。 その返事から random を使ってじゃんけんの手を選び、送信します。 するとその勝敗が UDP で届きます。 サーバからの返事を受け取る部分にはスレッドを使っています。 # ---------------------------------------- # Ruby プログラムの発表 # ---------------------------------------- スレッドを使うことで Python と差をつけようとしたが、プログラムから end を取ってしまうと、ほとんど Python と同じになってしまいました。 やることは、C でプログラミングした場合と同じで、「私が普通と思う方法」で書きました。 Perl 版のクライアントように select を使う方法や Fcntlを使う方法もあるけれども,引数の順番や定数の名前をいちいち覚えてられないしマニュアルを引くのも面倒なのでスレッドを使って実装することにしました。 今の Rubyの実装ではスレッドを使っても高速化できないが,むしろやりたいことをシンプルにするために Ruby のスレッドがあるのだと思います。 # ---------------------------------------- # PHP プログラムの発表 # ---------------------------------------- クラスライブラリはまだ十分とは程遠く、自分のやりたい処理に近いものがあれば楽に書けるのだが、今回のようなプログラムだとべたべた書く必要があるので、 PHP では苦しい。 PHP5 からは stream_socket_server が使えるので、それを使えば今回のプログラムも楽に書けます。 じゃんけんの手を選ぶのは、出来のいい乱数生成器を使用しました。 現状ではこういう処理をPHPで書くのはつらく、頑張れば書けないことも無いが、できれば別言語を使ったほうがいい。 # ---------------------------------------- # サーバを介したじゃんけんゲームの実演 # ---------------------------------------- 各言語のプログラムを一通り説明したので、じゃんけんゲームを実演します。 法林(司会者): 「最強のプログラミング言語がこれで決まります。しかも、じゃんけんで」 「じゃんけんは勝敗がつくまで5回繰り返します。 公平を期すため、サーバは Java で書かれました。」 「最強 Lightweight Language 決定戦の始まりです」 # 一回戦 最初に、PHP、Python が同時に負けます。 残った Perl、Ruby のうち Ruby が勝ち残り、一回戦の勝者は Ruby になりました。 # 二回戦〜 ラウンドごとに仕切り直す予定が、一回戦で早々と負けた PHP とPython はサーバにうまく接続できず、Ruby と Perl の間で延々とじゃんけんをすることになりました。 結局、Ruby が4勝して圧勝。そこには Ruby が勝つたびに大喜びするまつもとゆきひろさん(Ruby 作者)の姿がありました。 5. 質疑応答・議論の流れ、内容 # ---------------------------------------- # Q1:制作期間は? # ---------------------------------------- 質問者: 作るのにどれくらいかかったのか教えてください。 Perl: 大体3時間くらいです。 当日の昼休憩の時間も作業をしました。 PHP: 一日くらいかかりました。 日本語のマニュアルと実際の実装が異なっていて、少し余計にかかってしまったので、日本語マニュアルがシッカリしていれば、一日が半日で済んだかもしれません。 プログラムに使ったクラスライブラリもマニュアルが無かったので苦労しました。 Python: 自分で最初に作ったものは、ネットワーク用フレームワークのTwisted Matrixを使って作成し、半日くらいかかりました。 その後、今回の発表用に標準ライブラリのみで半日くらいで作成し、達人に突っ込まれつつ修正しました。 Ruby: 何度か作り直したものの、半日で終了しました。 行き帰りの新幹線通勤の時間中に作業を終えました。 Java(じゃんけんサーバ): 見直しも含めて、GUI、サーバ部分でそれぞれ一日半くらいかかりました。 GUIプログラミングは初挑戦で必要以上にかかったが、それでも一日半くらいで終了しました。 # -------------------------------------------------- # Q2: Heavyweight Language のことはどう思いますか? # -------------------------------------------------- 質問者: 先ほどの質疑応答の中でJavaの話が出ていましたが、Lightweight Language (以下 LL)と敵対するHeavyweight Language(以下 HL)のことはどう思いますか? Perl: (HLが得意とするような)大規模な仕事をしていないので、 HLのことを特に意識していません。 PHP: (LL だと)Make がいらず、書いたものがそのまま動く。 Python: PythonはHLでやるような大規模アプリケーション開発にも向いています。 実際、Zope のような大規模なアプリケーションサーバがPythonで書かれているので、大規模プログラムも書こうと思えば書けます。 Ruby: 個人的にはJavaは嫌いです。 スレッドの時に話しましたが、「すごいことをやっている」といったことを LLを使えば手軽にできます。 Cで書けといわれば書けますが、渋ってしまいます。 小飼弾さん(第1部のPerl発表者)の突っ込み: (LLはHLの代用にも使えますが、)言語を作るには heavyweight なものも必要です。 6. 発表の総括 Perl、Python、Ruby いずれの言語も、C などで書けば煩雑になりかねないネットワークプログラムも LL を使えば直線的かつ手軽に実装出来ることを実証したと思います。 一方で、今回のようなクライアントプログラムでは PHP は他の3つに比べて苦戦するようで、PHP 5 になって十分なクラスライブラリを利用できるようになることが待ち望まれます。 7. 所感 RubyとPython はともにスレッドを走らせてプロトコルを実装し、結果的に「end を取ってしまうと、ほとんど Python」という意外な類似性がわかるのは、今回のような競演があって初めて実感出来ることだと思います。 サーバーとの送受信テストやプログラムのデバッグに時間的余裕があれば、じゃんけんゲームももう少しうまく進行したのではないかと思います。 8. 特記事項 (特になし) $Id: p3-3.log,v 1.1 2004/03/24 04:00:39 ryuchi Exp $