読者です 読者をやめる 読者になる 読者になる

Line 1: Error: Invalid Blog('by Esehara' )

または私は如何にして心配するのを止めてバグを愛するようになったか

>> Zanmemo

あと何かあれは 「esehara あっと じーめーる」 か @esehara まで

PythonからRubyに移行した人間の印象

今日の料理

f:id:nisemono_san:20160615142428j:plain

安物のねぎとろは、納豆と良くあう。

前提

はじめてのにき(2016-06-16) より。

このエントリの立ち位置について

元々はPythonを勉強していたのだけれども、仕事の関係上、Rubyを主軸にすることにした人間のエントリです。ちなみに、PythonとRubyの立ち位置には詳しくなく、主観を元に構成されているので、客観的な部分に関しては弱いことをお断りしておく。また、現時点での知識が2.7になっているので、3.5では多少違う点があるかもしれない。

なぜならPythonのほうが「わかりやすかった」から

まず最初に、Pythonのほうが機械科学系の人に支持されやすい傾向としてあるのは、Pythonのライブラリ、例えばNumpyであったり、Scipy、または各種機械学習系のライブラリなどの影響が大きいのは間違いない。最近の機械学習ブームのせいなのか、Pythonも「エモい人(エモというのは、ちょっと気持ちわるい人という意味)」が入ってきているみたいな言われかたも見たけれども、しかしライブラリが充実しているから、というのは結果であっても要因ではないようにも感じる。

ではなぜPythonは使われたのか。まず一つにPerlのような「人によって解決は様々ある」というところから決別し、少なくとも理念的には「間違えようのないやり方がひとつだけあるのがいいね」としている。もっとも、これは理念であって、実際には色々な書き方は現実として存在するのだから仕方ない。

さて、ではPythonの「わかりやすさ」を支えているのは、逆説的にも「中途半端なオブジェクト指向」である、と僕は見ている。例えば、Rubyならば"hogehoge".sizeとすれば、文字列のサイズが取れるところを、Pythonではlen("hogehoge")としなければならないのは、過去にPythonをやっていた人間からしても「中途半端だなあ」と思わざるを得ない。また、良くやりだまに挙げられる:

class HelloClass:
    
    def say(self):
        print("Hello," + self.__class__.__name__)

HelloClass().say()

待って欲しい。Pythonがなぜselfが必要なのか。それは結局のところ、Pythonのメソッドというのは、関数オブジェクトみたいなものだからだ。例えば、こんなことだってできるのだ:

hello = HelloClass().say
hello()

また、Pythonにはプライベートメソッドというものがない。紳士協定として、_(アンダーバー)は「プライベートメソッドですよ」という取り決めがあるだけなのだ。

さらに見ていくと、Pythonにはlambdaという構文がある。lambdaという構文は、簡単に言ってしまえば

def foobar(x):
    return x

foobar = lambda x: x

みたいな構文だと考えることができる。さきほど、「Pythonのクラスにおけるメソッドというのは関数みたいなもんだ」というのを考えると、実はlambdaですら、メソッドを宣言するのに使えるのだ。

class HelloClass:
    
    hello = lambda self: "Hello," + self.__class__.__name__
    
    def say(self):
        print(self.hello())

HelloClass().say()

どういうこっちゃねん。

それはともかくとして、Pythonというのは、オブジェクト指向というのには、かなり歪な言語であるということは認めざるを得ない。しかし、その歪さがあるからこそ、ある程度汚く書いても、そこそこ読めるようになっているのだろうと思う。変な話、Pythonはオブジェクト指向を気取っているが、強要はしないという側面がある。

「実装にしか興味がない」ということを見おとしがちである

自分みたいなプログラミングオタクになると、すぐ綺麗なコードにこだわりがちで設計がどうのこうの、ということを考えたりする。だが、立ち止まって考えて欲しい。例えば、プログラミングオタクだったりすると、すぐエレガントなコードであったり、綺麗なコードだったり、あるいはメンテナンス可能なコードとかを考えたりする。確かに、業務をやっていて、そのコードを一年間ほど面倒見る立場であるならば、この観点は重要なものだろうと思う。

しかし、研究系であったり、実験系だったりすると、ある論文のアルゴリズムを素早く実装できて、再現できて、そんでもって捨てられることが重要になる可能性がある。必要になったら、もう一度書けばよい。そういう意味で、ルール少なめなPythonはとっつきやすいと見ている。俺は研究系に詳しくないので、間違っているかもしれないけれど、しかし素早さと綺麗さは、ある程度トレードオフになる(ただし、綺麗に書くと、速度もあがるという側面は否めない)。

Rubyは「ユーザーにとって楽しく書ける言語である」という側面を強調しがちである。確かに食わず嫌いだった自分にとってもRubyを書くのは楽しい(Lispを書くのはもっと楽しいよ;) )。でも、そのユーザーというのは誰かというと、いわば開発屋であって、研究屋ではないかもしれない。研究屋にとっては、「業務が終わったあとにプログラミングをする」ものではなく、「ビールを飲んで『マッドマックス 怒りのデス・ロード』を見て、JavaScriptエンジンを称える」ようなものであるかもしれない(念のため、「V8」をかけている)。

すると、Rubyのある種のプログラマにとってのハックする楽しさというのは、研究者にとっては邪魔な可能性は十分にある。あるいは、スクリプト製作者にとっても、だ。

Rubyはある程度洗練された言語であるが、その洗練さというのは、実装というか、成果物を最優先する立場にとっては、あまりにも余計なものであるかもしれない。その洗練された余計さを捨て、歪になった結果、Pythonは研究者や、いわばスクリプト製作者にマッチしていたのかもしれない。それは頭に置いておく必要はあるのかもしれないと思う。逆に、Rubyはハックしやすい言語であったからこそ、Railsのようなフレームワームが生まれたという側面は否めない。

話が脱線しまくっているけれど、歪さというのは強さでもあって、だからこそPHPは使われるのだし、LispやSmalltalkは「洗練されすぎた」ために不遇な地位であるとも言える(僕は両者の言語を、強度な一貫性を持った尊敬すべき言語だと思っている)。

ちなみに

最近だと、コンピュータサイエンスの教養本にRubyがサンプルコードとして使われることがあるので、意外にそっちの方面で優位性を持つ可能性はあるかもしれませんね。

アンダースタンディング コンピュテーション ―単純な機械から不可能なプログラムまで

アンダースタンディング コンピュテーション ―単純な機械から不可能なプログラムまで