Arantium Maestum

プログラミング、囲碁、読書の話題

Every language is a Perlis language

時々ツイッターで俎上に上がる言説として「プログラミング言語は一つ学んだら大体全部同じ」という話と「お前HaskellLisp見ても同じことが言えるの?」、そして「いやHaskellLispだってそこまで違うわけじゃない」という一連の流れがある。

これで思い出すのはAlan PerlisのEpigrams of Programmingである。ACM SIGPLAN Noticesの特別記事として出されたユーモアたっぷりの箴言集で、序文からしていい感じだ:

The phenomena surrounding computers are diverse and yield a surprisingly rich base for launching metaphors at individual and group activities. Conversely, classical human endeavors provide an inexhaustible source of metaphor for those of us who are in labor within computation. Such relationships between society and device are not new, but the incredible growth of the computer's influence (both real and implied) lends this symbiotic dependency a vitality like a gangly youth growing out of his clothes within an endless puberty.

The epigrams that follow attempt to capture some of the dimensions of this traffic in imagery that sharpens, focuses, clarifies, enlarges and beclouds our view of this most remarkable of all mans' artifacts, the computer.

特定界隈で最も有名な例としては

  1. A LISP programmer knows the value of everything, but the cost of nothing.

だろう。オスカー・ワイルドをもじってLISPの計算効率の悪さをやんわりと揶揄している。

19番目の箴言

  1. A language that doesn't affect the way you think about programming, is not worth knowing.

というもの。言語が思考・世界観を規定するというサピア・ウォーフ仮説を彷彿とさせる。

この箴言を受けてPerlis Languageというものが時々言及される。つまり「どういった言語が(一般的な言語を使っているプログラマの)プログラミング観に大きな影響を与えるのか?」という問いに対しての答えである。Perlis languageの候補としてよく挙がる言語はLisp系、ML系、Forth系、APL系、Prolog系などだろう。

例えばLambda the Ultimateというプログラミング言語理論のコミュニティブログのこの記事やMichael Fogusの記事などで直接この話題が取り上げられている。あるいはIo、PrologHaskellなどの多彩な言語を一週間ずつ試していく「7つの言語 7つの世界」(原題「Seven Languages in Seven Weeks」)という書籍も同一のコンセプトだと言えそう。

個人的にはこういう話が大好きで、そしてこういったいわゆるPerlis languageというものに触れるのも好き。プログラマとして日々のコーディングに役に立っているか、というのは微妙な気もするが・・・。ここら辺は読書が好きだけど、それが仕事の糧になっているかどうか、という話と似ているかもしれない。「直接的に役に立っているという実感はないが、頑張れば役に立っている理屈をつけられないこともないが、正直なところ役に立つからやっているわけじゃないし、楽しいからやっているけど何らかの非自明な因果で役に立っているといいなという淡い期待はある」という感じ。

しかし(ここから本題)Perlis Languageとして特定の言語を挙げる、という行為はすなわち他の言語を「非Perlis言語」としてカテゴライズする意味も持つのではないか?つまり例えばCを知っている人間がC++を、C++を知っている人間がJavaを、RubyistPythonを(そしてもちろんその逆も)学ぶことでプログラミング観は広がらない、ということにならないだろうか?

実際にはそんなことはまったくないと思う。I can write FORTRAN in any languageというジョークがあるが、そのような「言語の世界観(というより様々な言語機能や特性の総体から浮かび上がる流儀)」を無視したプログラミングをするのでない限り、どんな言語であってもそれを学ぶことによって新しい世界、プログラミング観などが得られるように思う。(その世界観に共感するかどうかはまた別の話だが)

PythonRubyであっても、構文の自由度、Rubyオブジェクト指向への忠実さに対比してPythonのdunder methodによるProtocol重視、Rubyのブロックによるメタプログラミングなどなどの見どころは色々とあって、それが言語の基本思想や歴史、使われるドメインやエコシステム、ユーザコミュニティなどとどう関連しているのか、など「プログラミングについての考えが豊かになる」点はいくらでもあると思う。

もちろん程度問題はあって、例えばC++JavaRubyを知っている人が次にPythonを試すよりAPLを試す方が世界が広がる(あるいはちょっと頭が柔らかくなる?)というのはあるだろう。とりあえず長期的にはAPL、Forth、Prologなどにも触れておくのは価値のあることな気もする(前述の通り「気がする」だけかもしれない)。また、これらは既知の言語との離れ具合が極端なので一週間くらい試すだけでも強烈な世界観の変化があり得る。RubyPythonなどの違いはある程度深掘りしないと「この言語アホな仕様になってるな」程度で終わってしまうことも多く、プログラミング観を広げるような何かを得るためには逆説的により多くの時間的・精神的投資が必要かもしれない。

しかしどんな言語でも、その言語固有の特徴と歴史、ユースケースやコミュニティがあって、その世界に触れることが「not worth knowing」だとは思えない。

なのでPerlisの箴言は以下のように改変したい:

A language that doesn't affect the way you think about programming, is a language you don't know enough about.