今度は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のスタックを参照してくれるの
 で,ほとんどメモリ管理のことを意識する必要が無いです.

                                まつもと ゆきひろ /:|)