なんだかビミョーなPythonとLispの関係。WikiPediaでは、あたかもPythonがLispから派生 したような書き方されてたし(修正しましたけど・・・)
Paul Grahamの文章から端を発した、そんなLispとPythonについての一連のドキュメントを集めてみました。
最近のPaul Graham氏は、LispよりPythonのことをなんだか褒めてくれてるので、嬉しいです(笑)
以上、「ハッカーと画家」というタイトルで本になっています。
Paul Grahamが気に入った人は、彼のテキストの訳が一杯読めるココへ行こう。
Paul Grahamの三つの文章を見て、違和感を覚える人は多いと思います。特に「簡潔さは力なり」あたりの文章の彼の哲学は、うなずけるものの納得いかない、という点があるのではないでしょうか。彼の文章は「プログラムの本質」を仮定したところから始まっています。「簡潔さは力」。間違いありません。しかし言語には、力ばかりが求められるわけではありませんし、またその力を誰もが使えるとは限らない(万人、という意味でなく、言語を必要とする人間の中にも、という意味で)という点を考慮すれば、Lisp以外の選択肢の必要性はすぐに見えてきます。
要するに、Graham氏は頭が良いのです。比較的長い数式(S式?)を見ても、アルゴリズムが理解できる程度の直観力を持った方なわけです。で、「頭の良い」数学の先生に数学を教わった「できの悪い」生徒であった経験のある方ならわかっていただけるでしょうが、頭の良い人には「理解できないこと」が「理解できない」わけです。特にLispは、Graham氏自身の言葉にあるように「プログラミング言語として作られた言語ではない」という点には注目すべきでしょう。Lispは「言語」ではなく「式」であり「仮想コード」であるわけです。特定の一握りのエリートを除いて、「式」で思考する人間は稀でしょう。通常は「言語」で思考します。そして「式」で思考できない人にはLispは使えないでしょう。
※プログラミング言語は、アセンブラ的フロー制御からの脱却の為に生まれたことは正しいと思われますが、その終点は、Lispが目指す「式」だけでなく、「言語」に向かう流れがあることは考えるべきでしょう。「理」が何かを考えれば「合理」の解が複数存在してもおかしくないわけです。
BASICのコードは理解できてもLispのコードは理解できない人に、「Lispの方が断然効率が良いんだよ」と言っても意味が無い、つまり、あるタイプの人には「Lispという選択肢は無い」ということが理解できない限り、Graham氏の主張は無意味だったりします。
とはいえ、Lisp系言語(私の場合はSchemeをちこっと舐めた程度ですが)が見かけほど難しい概念ではない、ということも言っておかないと不公平でしょう。最初、Lispの本を読んで全く理解できなかった私ですが、CやJavaやPythonで「関数の使い方」を学んだ後にLispに戻ってきてみると、確かに実に興味深い言語であることがわかりました。
最近では、Pythonの鬼っ子のλ一族(lambda,apply,filter,map,reduce)と結構楽しくつきあっていますし、面倒くさいループをシンプルに書き表せたりと、はまりだすと結構はまります。ただし、頭の程度がそこそこな私にとっては、過去に書いた自分のソースが読めないことも日常茶飯事なので、「シンプルに書く快感」にはまりすぎると、Python派がPerlを「恐れる」のと同じ罠(ダークフォース?)に陥るでしょうから、用心は必要です。
というわけで、万人にとってはLispは最良の答えでないかもしれませんが、少なくとも一握りの選ばれた人たちにとっては最良の答えである、とゆーとこに落ち着くんじゃないでしょうか。
ちなみに、Graham氏はPythonのコンベに呼ばれてスピーチとかしたみたいです。なんというか、敵対するより「いろいろあっていいぢゃん」というPython言語とよく似たここちよいファジーさが、宗教論争するより楽しくて良いんじゃないでしょうか?
<蛇足>ちなみに、新しいテキストでは、Graham氏は可読性についても言及してたりします(ただその例として、さすがLispを使うのは耐えられなかったらしく、Perlが悪者にされてたりするのがお茶目☆)ついでに、誤解されそうなので言っておくと、私は彼のファンです☆
これも実は、結構問題だったりします。他言語との併用者に「Pythonが簡単か」と聞けば、概ね「簡単だ」という答えが返ってきます。ただ、その人がPythonでなく他言語の信奉者であったばあい「でも××言語でも似たようなもんだよ」あるいは、「××言語のほうが簡単だけどね」という答えが返ってくることが多いようです。上のGraham氏にしても、遠まわしではありますが「LispのほうがPythonより簡単だと思うけどな」みたいなニュアンスが感じ取れたりします。
「なにを以って簡単(easy)とするか」という命題は、Graham氏の「なにを以って簡潔(simple)とするか」という命題よりもかなり難しい問題になります。なぜなら「簡単」というのはあくまでも主観であり、ある人に簡単であるものが、ある人には簡単でないというのは普通にありえます。多分「難易度」という絶対指標は存在し得ないでしょう。個々人が感じる難易度は、少なくとも個々人の思考ベースとの乖離度合いと、複雑さ、という2本の軸は確実に存在するでしょう。さらにそれらの軸についても、単純にベクトル計算できないところもあるわけです。
単純な話ですが、ある言語を「簡単だ」と言うには、少なくとも複数の言語を「知っている」必要があります。さて、プロのプログラマならいざしらず、プログラムに関わる人々のうち、2種類以上のプログラミング言語を「知っている」人は、いったいどのくらいいるのでしょうか。また、言語が簡単であると言うには、一体いくつの言語と比較すれば良いのか、また、比較する人は何人必要なのか・・・そんなことを考え出すと、キリがありません。従って「覚えてしまえばみな同じ」という乱暴な意見も反論しづらいところです。
かといって、「どれも同じ」という考えには賛同できません。私自身結構浮気性なので、様々な言語に手を出していますが、「趣味が合わなくて使いたくない」言語とは別に、「難しい」言語というのは存在します。もっとも、その言語仕様の何割を使うかによって難易度が変化する言語も少なくないです。Pythonの言語仕様は、以前なら10割使っていても知れていましたが、リストの内包記法やイテレータなどまで入った現在、10割使うのは決して「簡単」だとは言えなくなりつつあります。PerlやRubyも簡単な言語として有名ですが、これも一歩奥に踏み込めばダークゾーンです。逆に難しい言語の代表とされるC++でも、表層だけを使うならC言語よりはるかに簡単です。LispやForthのように、見慣れた数値表現とは異なった表現の式は、まずとっかかりが難しいわけですが、1時間ほどレクチャーを受ければ、四則計算くらいはできないことはないでしょう(Forthは、計算機として使われることが多いので、これは大きいです)
よって、Pythonが本当に簡単かどうかについては判断できませんが、Pythonが「簡単な言語」を目指して作られている、あるいは「簡単な言語」となるように意識して作られているという点は考慮すべきでしょう。また、「教育用言語」であっても、いや、そうであればなおさら「実践で使える言語でなければ意味がない」という、ABC言語の失敗から学んだ哲学が、Pythonの言語仕様の中で生きているのでしょう。
Pythonの「簡単」という言葉への想いは、他言語より遥かに重いのです(私が知る中で他に挙げるとすれば、Smalltalkくらいでしょうか? Pascalは「教育的」ではあっても「簡単」であることは特に目指していないようですし・・・)。実際にPythonが「簡単な言語」かどうかは、使用した方々の感想にゆだねますが、「簡単な言語」にすべく現在も払われつづけられている努力が存在することだけは確かです。
・・・いや、努力してもできてなければダメだけど・・・けっこーうまくいってると思うのはやっぱり、贔屓目でしょうかねぇ(笑)