私がなぜPythonを使うか?
私にとってプログラムを書くことは手段なので、効率がよく作業負荷が少ないものがよい。
3つの評価軸
プログラミング言語の方向性は3つあると思っている。
- ハードウエアに優しい。
- 計算に優しい。
- 人に優しい。
「ハードウエアに優しい」とは
一言でいうと、アセンブリが該当します。これがうれしい状況は、コンピュータが起動した直後でなにも初期化されていない状況、ハードウェアの性能を極限まで引き出す必要な状況でしょう。
具体的には、boot loaderの実装とか、DSPでcodecのdecoderを実装しているときとか、CPUパワーが極端に制限されているとき、callスタックを直接操作してセキュリティホールを突きたい時、などでしょう。
「計算に優しい」とは
Lisp系の言語とか、純粋関数型言語とか、です。
メリットは計算そのものを表現する能力が高いこと、計算を表現するときに特殊な制限をかけることで自動変換可能になることなどが挙げられます。
「人に優しい」とは
まず、抽象度がそれなりに高いことが必須で、というのは「一定時間でかけるコードの行数は言語によらず一定である」という知見の存在があげられます。次にPEPの中にも出てきますが、コードはかかれる回数よりも読まれる回数が多いという点です。また、言語としてのコーディングスタイルが定まっているという点もあげられます。
「コーディングスタイルが定まっている」が何を指しているかというと、そうでなくて無為に使われた時間を挙げるとわかってもらえると思います。C系の言語の{}をどうindentするかという宗教論争にどれだけの時間が割かれたか?とか、C++のメンバ関数の中でメンバ変数にアクセスするときにthisを省いてよいがメンバ変数のm_をつけるとか何とかでしょう。
もっともミクロな項目を挙げるなら、メモリ破壊・メモリ管理だろう。うっかりでぶっ壊したメモリがめぐりめぐって引き起こすバグの原因を特定するのにかかる時間と労力、メモリをリークしないように気にしながら書く労力と時間、メモリリークのデバッグによって消耗される労力と時間を想像してみよう。それだけでぞっとする。
それから標準的な環境を構築するために必要なコスト、実際に作業するために必要なライブラリの入手コストも挙げられるだろう。Linuxのディストリビューションにどれだけ標準で入っているか?、Mac OS Xに入っているか?、windowsでbinaryのインストーラがあるか?などだ。後者はPerlでCPANの中からライブラリを適切に選ぶことはちょっと難があるケースがあるが、Pythonなら標準ライブラリがあるし、PyPI や setuptools / easy_install もある。
すぐに試せるinteractive shellがあることも大事だ。objectとの会話が許されない系はちょっとどうかと思う。
サプライズがないことも挙げられるだろう。phpの==やsortの話とか検索すれば山盛り出てくる。C++で純粋仮想関数を定義するときの構文、void foo() = 0;とかもどうかと思う。
どの評価軸を重要視すべきか?
用途限定されていればその状況をみればよいのですが、もうちょっと高い視点で考えてみましょう。Mooreの法則によりどんどん性能は上がってきました。これからもマルチコア等によって上がり続けるでしょう。何らかの企画から始まって最終的に消費者に届くまでの過程を考えると、プログラムを設計する過程はしゃれにならないコストがかかっていて、一番生産性の向上が低い部分だろう。ネットワークもCPUもメモリもディスクも常に進歩し続けていて、対数グラフでプロットされるわけだから。
とはいえ、AWSやGAEのおかげで、一人で世界を相手にするサービスを作ることは可能になっている。パワーを稼ぐことに労力をかけることよりも潜在的な競争相手に先んじて何かを作り上げることが大事で、その場合はスピードが肝になり、それは人に対する優しさに行き着くと思う。もちろんこれからもアセンブリ等の需要はなくなることはないし、計算すること自体が大変なジャンルは存在し続けるだろう。この辺はどこに強みをおくかと、だれとくむか(ハードウェア製造業者か?AWSか?)ということにかかってくる。
よくある意見に対する私の見解
indentでブロックはキモイ
code golferの方ですね、わかりますよ。というのは冗談として、pythonがstatemnetな言語である以上ブロック構造を作らなければならず、インデントが宗教論争を引き起こしてきたことを考えれば、reasonableな落としどころだと思っています。なにかうまい方法があるなら教えてください。きっと住めば都です、いい意味で。
''.joinキモイ
どこぞで盛り上がっているらしいですが、ぶっちゃけどうでもいいかな、というのが私の意見です。
ただ+=でつなぐのだけはない。パフォーマンスが理由ではないです(Jythonだと遅くなるらしい)。
",".join(xs)をforと+=を使って書くと「植木算」をすることになりますが、これがよくない。joinを使って書けば、どのようにつなぐかを記述する必要がない。命令的な何かを減らすだけでバグは減る。こんなコードにバグを入れるなという人もいるかもしれないが、それはマッチョだと思う。手段としてのプログラミングは、「ひろゆき」的低きに流れるにあるべきだ。
「低きに流れる」は悪いことだとは思わない。上善水の如し。とはいうものの、泳げるくらいにきれいな水であってほしい。
個人的には",",join(xs)ではなくてstr.join(",", xs)でもいいのだが、Array.join(",", xs)はできてくるobjectのtypeと作り手のtypeがマッチしないのが好きじゃない。str.joinだとタイプ量が多いので横着したととらえれば許せる範囲かな。str.joinだと思っている理由はstrのコンストラクタだととらえているからだ。
0 件のコメント:
コメントを投稿