[Ruby] プログラムはどう始める?

by tanabe on May 28, 2005

気になっていたことについて、まつもとさんの解釈を発見したのでメモ。

オブジェクト指向でプログラミングをしていて、どうにも気持ちの悪いのがプロ グラムをスタートするときなんだけど、その辺りに関するRubyとしての解釈が Ruby-talkの過去ログにあった。

http://www.ruby-talk.org/cgi-bin/scat.rb/ruby/ruby-list/8970

川村氏の問題提起から。

おっしゃる通りです。トップレベルの文は誰が呼びだすのか、ということが気 になったわけです。

既存のOSの上で走る言語処理系は、オブジェクト指向じゃない外の世界との界 面を持たざるを得ない、それをどんな風に設計するべきかということですよね。

たとえばEiffelは、その界面を極力減らそうとしていると思います。プログラ ムのスタートにあたって、外部がやることは、ある特定のオブジェクト(神に相当?) を生成することだけで、後はそのオブジェクトのコンストラクタが世界を創り出すと いう考え方ですから。

ここから、まつもと氏の見解。

http://www.ruby-talk.org/cgi-bin/scat.rb/ruby/ruby-list/8965

まず前提。

プログラムの実行が制御の流れの開始点であると考えるとCのmain関数とかJava のmainメソッドとかいろいろあるわけですが,Rubyの場合はトップレベルの文がそれ を担っています.

これは確かになにかのメソッドではないのでオブジェクト指向的ではありませ ん.トップレベルではselfがmainに設定されているので,全体がmainのメソッドであ るという解釈は不可能ではないですが,私自身はそうは考えていませんし,そのよう な解釈をお勧めするわけではありません.

で、そのような言語仕様となっている理由はというと、『プログラムの開始は本 質的に手続き的なものだから。』というもの。

というのも,プログラムの実行の開始というのはどう考えても「制御の流れ」 であり,本質的に手続き的だと思うからです.EiffelやJavaのようになんらかのオブ ジェクトのメソッドとしてしか処理を記述できない文法の言語ならともかく,Rubyの ような言語でこのような部分までなんらかのオブジェクトのメソッドにする(あるい はそう解釈する)必要はない,あるいは本質的にメソッドでない以上メソッドにする のは適材適所の観点からも不自然であると考えます.

Javaなんかも含めて、もやもやしていた部分だったけど、これを読んで「そうい う理解の仕方なのか。なるほどなぁ。」と。これが一番美しいかというのは置いてお いて、一つ背景の理屈がわかってまずは納得。