#acl SomeUser:read,write All:read = Lightweight Language Lovers = == PythonとRubyを比較してみる(Rubyはアーティスト志向?) == さて、いきなりで恐縮ですが、下記のプログラムはPython版とは全然違った書き方をしています。 :-? [[BR]] どのみち前出程度のプログラムなら、特にPython からRuby なら、[[BR]] ほとんど機械的に変換するだけで動いてしまいます。( attachment:SjisChars_py.rb )[[BR]] それに、以下のプログラムは JRuby (*) では動いてくれないので、いずれ書き直す必要があります。[[BR]] ~-(*)最終的には Java とRuby の連携を目指しているため、JRuby の使用を前提に考えています。-~ それより、ここでの目的は Ruby の言語としての特徴をつかむことにあります。 その印象ですが、まず感じたのは ''書く時苦労した割には、後から見直した時は案外読みやすい'' ということでした。 確かに、Ruby は初めてということもあるのですが、それにしても書く時は、Pythonの * 簡潔で整然とした美しいソース * 充実したマニュアル に馴染んでいただけに違いが際立っていまい、いろいろと戸惑うことだらけで四苦八苦しました。[[BR]] しかし、後から読み直してみると「意外と読みやすい」、それどころか 「ドキュメント性が高いのでは」とさえ思うようになっていました。 書く時に悩んで、後で理解しやすいように記述することができる。と言えるのかも知れません。 例えばループですが、Python ではほとんどの場合、 for ... in ... の構文を使います。 これは書きやすさと整然としたソースをもたらし、誰が書いても同じようなプログラムになって保守性が高まるという、Python の狙いとするところの効果をもたらしていると思います。 これに対して、Ruby では、10.times {...}、Range().each {...}等いろいろな書き方ができます。[[BR]] これは語彙が豊富ということであり、場面に応じて表現を変えてプログラムをより読みやすくする、といったようなことができ、優秀なプログラマの「表現欲」のようなものを満たしてくれるのではないでしょうか。[[BR]] これが海外の著名なプログラマがRubyに魅かれる理由の一つのような気がします。 Ruby はアーティスト志向、Python はマネージャー志向と言えるような気がします。 「一つのことをやるのに様々な方法がある」といえばPerlの有名な "There's more than one way to do it." が思い浮かびますが、こちらは語彙よりは省略記法が豊かであるような気がします。[[BR]] あえて言うと玄人志向でしょうか。 一つのことをやるのに、 * 誰が書いても同じになることを目指すPython * 短く簡潔な表現も可能なPerl (There's をTIMTOWTDIと表記するような感じ?) に対して、 * 豊かな語彙を使って様々な表現ができるRuby 何となく母国語の違いが出ているような気がします。 {{{#! class SjisChars $KCODE = "SJIS" KU13 = 0x8740..0x879c KU89_92 = 0xED40..0xEEFC KU115_9 = 0xFA40..0xFC4B GAIJI = 0xF040..0xF9FC def initialize(chars) @chars = chars @reKisyu = mkRegexp(KU13, KU89_92, KU115_9) @reGaiji = mkRegexp(GAIJI) end def mkRegexp(*ra) ra.map! {|r| "[%s-%s]" % [[r.first].pack("n"), [r.last].pack("n")]} Regexp.compile(ra.join("|")) end def scanSjis @chars.split(//).each {|c| yield c, isKanji(c), isGaiji(c), isKisyu(c)} end def isKanji(c) c.length == 2 # return true if kanji end def isGaiji(c) @reGaiji.match(c) != nil end def isKisyu(c) @reKisyu.match(c) != nil end def hexprint scanSjis do |c, isKanji, isGaiji, isKisyu| h = (c.unpack("n")[0] if isKanji) || c.unpack("C")[0] attr = ("Gaiji" if isGaiji) || ("Kisyu" if isKisyu) || "" printf("%s %x %s\n", c, h, attr) end end end sc = SjisChars.new("abc漢字・・①㈱纊彧德羽裵錞德鍈ⅰ黑") sc.hexprint sc.scanSjis do |c, k, g, ki| printf("%s %s %s %s\n", c, k, g, ki) end }}} プログラムの解説は次回にしたいと思います。 --> ["../Ruby2"]へ ---- CategoryPython CategoryRuby