< :前の番号
^ :番号順リスト
> :次の番号
P :前の記事(スレッド移動)
N :次の記事(スレッド移動)
|<:前のスレッド
>|:次のスレッド
^ :返事先
_:自分への返事
>:同じ返事先を持つ記事(前)
<:同じ返事先を持つ記事(後)
---:分割してスレッド表示、再表示
| :分割して(縦)スレッド表示、再表示
~ :スレッドのフレーム消去
.:インデックス
..:インデックスのインデックス
今度はrubyとpythonを比較します.
似ている点
* オブジェクト指向言語である
もっとも,松本はpythonはschemeが「オブジェクト指向言語」
であるのと同じ程度にしかオブジェクト指向言語ではないと思っ
ていますが.つまり,関数をfirst class objectとして扱える
言語にちょっと機能が追加された程度だと思っています.
* 例外処理がある
ただし,pythonの例外には名前が付けられます.rubyの例外に
は文字列をデータとして付加できるだけです.
* クロージャがある
lambdaで生成できます.クロージャは乱暴に表現すると手続き
をオブジェクト化したものです.
違う点
* 文法のみかけ
rubyはAlgol風にbegin..endを使う.pythonはインデントをブ
ロックに使えます.それとrubyの方が文法がルーズです(メソッ
ド呼び出しの括弧が省略できるなど).
* オブジェクト指向機能
pythonは多重継承をサポートします.rubyは多重継承はありま
せんが(わざと外してあるんです),同等の機能をより理解しや
すく実現するモジュールによるMixinを提供しています.
* 関数やメソッドがオブジェクトか
pythonは関数やメソッドもオブジェクトです.rubyはメソッド
はオブジェクトではありません.procを使えば手続きをオブジェ
クト化できますが.
* 文字列/ファイル処理能力
ほぼ同等だと思うんですけど,perlから来た人にはrubyの方が
似ていて分かりやすいでしょう.
* バイトコード
pythonはバイトコードコンパイラを内蔵していて,ソースコー
ドをバイトコードに変換して書き出すことができます.rubyに
はそのような機能はありません.要らないと思っているから無
いんですけど.
* 実行速度
rubyにはメソッドキャッシュがあるので,一般的にpythonより
高速なことが多いようです.バイトコードによるコンパイル時
間の短縮はあまり効いて来ないようです.
* GC(ゴミ集め)
pythonの処理系にはGCがありません.もっともオブジェクトは
レファレンスカウントされてるので普通は問題になりませんが.
問題になるのは
+ オブジェクトの参照がループした時,開放されない
+ C/C++でpythonを拡張する時,正しく参照数を増減させな
いとメモリリークが発生する.
特に後者は拡張モジュールを書く人に負担になります.rubyは
上の両方の問題を解決するようなGCを持っています.
* thread対応
pythonは一応thread対応しています.一応というのはインタプ
リタがリエントラントでないため,どう時に1つのthreadしか
動作しないようにロックしているからです.rubyは現時点では
thread対応はできていません.
まとめ
まとめるとrubyとpythonはかなり似ていますが,比べると
* より徹底したオブジェクト指向で
* よりルーズで(perlの影響)
* より拡張しやすくて
* はるかにマイナー ^^;;
であるといえるでしょう.正直言うと,開発初期に「pythonがあ
れば,rubyはいらないかなあ」と思ったこともありましたが,
「もっとオブジェクト指向してる言語が欲しい」という思いで,
ここまで来ました.それとpythonのリファレンスカウントの管理
は結構面倒で私は嫌です.rubyはCのスタックを参照してくれるの
で,ほとんどメモリ管理のことを意識する必要が無いです.
まつもと ゆきひろ /:|)