Clojure派がPythonを酷評

Clojureで食っているという者がPythonをfunctional programmingやconcurrencyの観点から批評。Pythonは色々なパラダイムをサポートしようとしすぎて何もうまくできない幼稚な言語になってしまったという結論。

http://blog.bestinclass.dk/index.php/2009/10/python-vs-clojure-evolving/

Functional Programming

簡単なアルゴリズムならclojurepythonの表現力はさほど変りないが、複雑なものになってくると大違い。それをprojecteulr(http://projecteuler.net/)からの実例で示している。euler4の答だとPythonが4以上のコードサイズになってしまう。 「Euler 4: Finding Palindroms」を参照。

Concurrency

チップメーカーがGhzの増大をできななくなった今、並列処理がこれからの大きな課題になるが、Pythonには対策がない。Pythonは複数のスレッドでもGILがネックとなってマルチコアマシンでも並列処理が速くならない。GuidoはGIL(Global Interpreter Lock)問題を克服するつもりがないというくだりも引用している。

ClojurePythonの並列処理を簡単なカウンターの実例で検証している。二つの言語のデザインを考えるとあたりまえの結果(2cpu使って4倍以上の差)が出るんだが、やはり目の当たりにコードと数字を見ると、「マルチコア時代にClosureあり!」を思い知らされる。一方、Pythonはお先真っ暗。「An example」を参照

結論として、Pythonはライブラリが充実していて、とっつきやすく、大きなユーザコミュニティーが利点だが、得意なものがなく、並列処理問題から逃げ、さらにプログラマの頭脳を刺激するものが無い単純な言語としている。最後に、「Guidoが俺のソースの空白管理をするのはけしからん」とシンタックスに文句をつけている。

テングは最近もっぱらPythonでプログラミングをしている。上の批評は的をえていると思う。Pythonが「括弧のないLisp」だとか「Functiona Programmingもサポートしている」とか言う方々がいるが、多分これはlispに触れたことの無い人達だろう。関数の最後の表現の値を返さずreturnを書くことを強要したり、expressionとstatementとに違い、lambdaが一行だけに制約されていたり、、pythonでFunctionalっぽいコードを書こうとするとストレスがたまる。Paul Grahamも言っていたがPerlの方がよっぽどfunctionalだ。今では割切って、side-effectのない表現を作ろうとはせず、チマチマとstatementを書き状態変化させるモードでコーディングするようにしている。pythonはfunctionalスタイルを嫌いimparativeなスタイルを奨励している。それと闘ってもしかたない。

あと、上で利点にあがっているライブラリとコミュニティーだが、これもPerlにはかなわない。cpanのライブラリの豊富さ、APIデザイン、ドキュメンテーション、パッケージ管理、使い易さ。どれを取ってもperlに劣ると思う。

これが「perlパラドックス」だ。コア言語が滅茶苦茶でコードも何がなんだかわからくなるPerlだが、その(ためにか)サポート体制は非常に整理整頓されていて分りやすいものとなっている。

これに大して「Pythonパラドックス」もある。Pythonは自分で言うほど、エレガントでなく、一貫性もない。

ここまで批判的なのに何故pythonを使うのか。それはシンタックスが好きだからだ。他の要素が劣っていてもそれを補ってお釣がくるぐらいシンタックスがいいからだ。ここが「pythonは色々いいんだけどシンタックスがねー」世論と正反対なところだ。さほどfunctionalでもなく、得意技がなく、concurrencyも駄目なpython。でも「ゾーン」に入りやすくしてくれるシンタックスがあるのでよしとする!