RubyAndOtherLanguages

2007-03-13 17:07:52 +0900 (578d); rev 8

Ruby と諸言語との比較。 Ruby 公式サイトの元ページは http://www.ruby-lang.org/ja/compar.html にあった。 昔はリンクが張られていないだけで実体は存在していたのだが、 最近本当になくなってしまったようだ。例の CVS クラックの余波だろうか。

なお、基本的にこの Wiki のページは筆者独立であろうとしているのだが、 このページは例外的に管理人・青木の主観全開で書くことにする。

C

え? C はいいと思うよ。うん。おれは好きだな。 ポインタ演算をしくじるとすぐに逝ってしまう儚さがイイ(・∀・)!

なんて言うんですかねえ、守ってあげたいタイプ? (違)

で Ruby と比較すると、ちょっと違いすぎてわからない。 比較対象にするよりは、互いを補完する存在と考えるといいかな。

Perl

Perl5 のオブジェクト指向機能がクソだってのは衆目一致するところだと思う。 Perl 好きな人も Perl4 がいいって言ってたし。 だからオブジェクト指向嫌いなら Perl、好きなら Ruby、ということでどうだろう。

ただし一言書いとくと、Perl と Ruby は似てない。 みんな似てるっていうけどそんなのは大嘘だ。 Perl と Ruby が似てると言えるなら、 Ruby は C と Lisp と Smalltalk にも同じくらい似てる。

Python

Ruby と Python は確かに似てる。特にちょっと見た感じでは。 が、ちょっと使っていくとかなり違うことがわかる。

全般的に Python が禁欲僧みたいな印象なのに対し Ruby のほうはずっとノリノリである。 その違いは、まあ文法にも結構出ているのであるが、 むしろ標準クラスを見るとわかるのではないだろうか。

Ruby のほうの特徴はひとえに「大クラス主義」につきる。 これはまつもとさんが ruby-list で言っていたことだが、 Ruby のクラスはかなりたくさんの機能をかかえこむ傾向にある。 その対極は Smalltalk や Java だ。機能ごとにひたすら分割して直交性を上げまくる。 Python は Smalltalk よりはクラスが大きいが Ruby よりはずっと小さい。

結論を言うと、両方やって趣味の合うほう使うのがいいでしょう。

※ ちなみに青木が四年前に Ruby を選ぶ決め手になった理由は 「Ruby のほうが名前がカッコいい」であった。 人生なにがきっかけになるかわからない。 そういえば Linux と FreeBSD で迷ったときも名前で決めて Linux にしたな。

Java

Java は generics がないのが痛い。 1.5 でようやく搭載されたらしいけど、遅きに失したのではないか。 Mayer 先生だって「静的型付けにするなら generics 必須」て言ってるじゃん。

あと、後述する read/write property も欲しい。

Smalltalk

そうですねえ。やっぱ似てるところは似てるよね。

Scheme

Scheme いいよね。 徹底したミニマリズムとか、call/cc とか、カッコよすぎ。 遅延評価までできるし。

だんだんただの言語論評になってきたな。

CommonLisp

CLOS 萌え。

で、終わろうと思ったんだけど、あんまりにあんまりなので無理矢理 Ruby と比較する。

Ruby と CommonLisp で一番似ているのは、 その微妙な汚さではなかろうか。実用主義的と言ってもいい。 そのくせわりとマイナーで、表舞台に立たないところも似ている。

一方、似てないところと言えばライブラリの凝り具合かな。 CommonLisp のライブラリは偏執的すぎる。

Haskell

遅延評価はいいよなー。あれだけは欲しいと思った。 慣れてみるとカリー化もなかなかウマー。 だけどそれでもやっぱりオブジェクトと代入が欲しい今日この頃。 例外処理もいまいちスカッとしない。

Eiffel

少なくとも言語仕様に関しては Ruby は微妙に Eiffel に似てると 思ったりする今日このごろ。確かに表面的には全然似てないんだけど、 『オブジェクト指向入門』を読んでいて、 Eiffel を動的言語を前提に仕様を組み直したら Ruby にかなり近くなるのではないかと感じた。 まつもとさんは『オブジェクト指向入門』 にかなり影響を受けたようなのでそれも当然と言えば当然かもしれない。

表明構文はかなり好きだ。 Ruby にも欲しい。

嫌いなところもそれはそれでたくさんある。 ループの仕様が変態的とか、大文字小文字くらい区別したいとか、 ライブラリが偏執的とか、継承使いすぎとか。

C++

あんまり真面目に使わずに言うのもあれだが、 C++ の仕様はいったい何だ。 単に仕様が大きいだけなら許せるが、トラップの塊じゃねえか。 Ruby の仕様もたいがい複雑で「実装が仕様」でしかもコロコロ変わるが、 C++ よりはマシだろ。

あとは互換性かなあ。Windows だけとかだったらいいんだろうけど、 UNIX も考えると安易に使えない。 STL がどこでも使えるようになったのなんてつい最近だし (STL のない C++ なんて正に使う価値なし)。

C#

とりあえず、とっとと generics を付けろ!

まあしかしさすがに後発だけあって Java より多少いいような気がする。 MS らしく小汚い仕様も入ってるし。 しかし、goto まで付けるこたないんじゃねえかなあ。

foreach は便利そうだ。でもやっぱ Ruby のイテレータのが便利かな。 特に File.open みたいな範囲型イテレータが使いたい (→ RubyIteratorPattern)。

(ツッコミ) 「範囲型イテレータ」は using ステートメントによる Dispose() の呼び出し保証で可能なのでは? そういうことではない?

(返事) いや、そういうことです。そうか、そうだなあ。 そうかもしれない。じゃあ C# でいいや (マテ)

デレゲートは Method オブジェクトと比較できるかな。 でも C# ではタイプセーフであることのほうが重要なんだろうね。

Delphi

Object Pascal は return が使えなかったりするのが無性にいらつく。 しかし最も困るのは GC がないことだ。

そんなわけで、Apollo を使ってメイン処理は Ruby に丸投げ、 GUI は Delphi でサックリやる。というのがなかなかいい感じじゃないかと思う。 つまり Delphi も相互補完対象かな。

ところで、小さなことだが Delphi の read/write property はとてもいいと思う。 Java であれを実装しなかったのは大いなる過ちだな。 Ruby だと attr() と attr=() の組で同じことができる。

属性アクセスと (引数のない) メソッド呼び出しを区別すべきではないという 意見の根拠は『オブジェクト指向入門』に見られる。 2.1.4 (p.21), 5.8.2 (p.131) の「統一的参照の原則」を参照。

VB

……まぞ?


system revision 1.162