標高+1m

Don't be rational

プログラミング言語が言語であるという事は

 去年からちょくちょく、今年はほぼ毎出勤日、帰りに2駅分歩いています。2駅もあるといろいろ考えられるので良いです。40分くらいしょうもない事を考えてはここに書いたりtwitterに書いたりブログに書いたりしています。

 さて、

言語が言語であるということ

 言語っていうのは文法と単語で出来ているわけです。プログラミング言語も言語なわけです。構文が文法に、リテラルなり関数なり手続きなりが単語にそれぞれ対応しそうです。オブジェクトや変数やデータリテラルは名詞、関数やメソッドは動詞てことになるでしょうか。連鎖性言語の世界では、ライブラリをvocabulary(語彙)、関数をword(単語)と呼んだりします。

 文法は単語の並べ方の規則です。文法は少ない方が嬉しいです。覚えやすいです。文法は後から付け足す事は普通できません。外国語を勉強するときに苦労するのは文法です。

 文法さえ覚えてしまえば、単語は覚えた物から使っていけば良いです。そして単語は追加、削除が容易です。

嬉しい言語

 文法を極力少なくして、単語をたくさん作る事で文章を作ることを推奨するプログラミング言語があります。連鎖性言語、SmalltalkLispなどです。
 
 連鎖性言語には文法が全くかほとんどありません。単語をスペース区切りで並べた物がプログラムになります。

 Smalltalkには、(少なくとも理想的には、)メッセージングの文法しかありません。The Early History of Smalltalkに詳しいですが、アラン・ケイLispのスペシャルフォームを嫌って、たった一つの文法でプログラムを構成しようとしてオブジェクトに辿り着いたと言っています。*1

 Lispのプログラムは、理想的には関数定義と関数呼び出しだけで構成されます (純Lisp)。実際には多くのLisp方言が先行評価をするため、if等はスペシャルフォームになっています。ただし、Lispではマクロによって、他の言語では文法レベルで解決しなければ行けない事を単語のように扱えます。マクロの存在とS式によって、Lispでは文法と単語の境界が曖昧になっています。

文法を作るという事

 
 言語内DSLというのが流行っています。Lispのマクロや、Rubyのメタプログラミングなどです。これは単語レベルでの考えからは外れて、処理系の挙動を利用して、文法、もしくは文法に見せかけた書き方を作るテクニックです。文法は少ない方が嬉しいという考え方でいくと、言語内DSLとかメタプログラミングとかには慎重になった方が良いでしょう。マクロとモナドをいつ使うかという個人的ルールにある、マクロクラブのルールはLispユーザの中ではある程度コンセンサスが取れていますが、他のメタプログラミングを多用する文化圏にもこうしたルールはあった方が良いと感じています。

 そしてもちろん、もしあなたが言語を作る人なら、文法の追加には細心の注意を払う必要があるでしょう。

言語の開発者になるには

 言語は文法と単語でできているわけです。単語がないと言語たりえません。

 単語はプログラミング言語では関数とか手続きにあたるわけです。そしてプログラマは単語を作るわけです。

 ということは、言語Xを使ってプログラムを書くプログラマ、特に(たとえごく小規模でも)ライブラリを作る人は、言語Xのデベロッパであると言えるわけです。ガイ・スティールが Growing a Languageで、まさにこのことを話しています。

まとめ

 とくに結論とかまとめとかはありません。プログラミング言語が言語であるということを考えてみると面白いねという話でした。

*1:それが全てではないですが少なくとも一つの理由ではあったでしょう