ものがたり(旧)

atsushieno.hatenablog.com に続く

language is law

昨日のAsteriaの話と微妙に繋がるのだけど、今日はプログラミング言語について。って書くと何か壮大だな。ただの思いつきで書いてますから、そのつもりで。

Asteriaの"Graphical Language"(まあこの語句をそのまま受け容れるとして)がプログラマーにいじらせないことを目的としている言語であるとしたら、通常のプログラミング言語は何でもいじらせてくれる存在ということになろう。実際には、プログラミング言語にはそれぞれ制約がある。Javaならポインタが使えない(まあideologyとして)し、.NETのmanaged worldでも個別のメモリ解放はさせてくれない。関数型言語に普通returnは無い。ブビ厨にスレッドなんていじらせるな、みたいな思想もこの類だろう。そのうちref/outは有害だからC#言語仕様から外せ、なんて言われるようになるかも(ry

制約が多い方が好ましいという考え方もあるし、制約はあるけど例外を設けよう、という考え方もありだ。これってよく考えると法律と似ている。マリファナは違法にするけど病院で薬物として使うのはおっけーとか、心中は失敗したら同意殺人未遂*1だけど尊厳死はおっけーとか。法律と似ているけど、プログラミング言語はLessigの四規制力の考え方で言えばむしろアーキテクチャ、あるいは規範だ。

(規範が何でこんなところに出てくるかというと、プログラミング言語によっては、というか僕はC#というか.NETしか具体例を知らないのだけど、言語が警告に適合する条件を規定することがある、という事実による。.NETにはObsoleteAttributeという属性があり、これが付加された型あるいはメンバーを使用すると警告が出る。C#の仕様はちゃんとじっくり眺めたことがないので分からないけど、その他の警告ももしかしたら「規定」されているのかもしれない。)

アーキテクチャが支配する。この問題点は、こいつは得てして残酷な神になったり、トミーなまけんぼうになってしまったりするということだ。だから、制約を追加するなら、本当にそれが必要なことなのか、十分に考えてから設計した方が良い。僕が個人的にJavaよりC#に好感が持てる点は、この辺りにある。ref/outが使えなければC#イラソですよ(w

もちろん、法律にさまざまなステップがあるように(13歳未満/18歳未満/18歳以上女の子とへっちな関係になる場合*2)、プログラミング言語だってユーザーのレベルによって緩やかな制約が認められたって良い。ただ、個人的な趣味としては、どうせならこういうのは言語の内部で、できればwarningのレベルで解決してほしい話題であって、C#よりVB.NETの方が初心者が多いからこっちではマナーからルールへ変えましょうというのはあまり好ましくないなあと思うし、そう考えると、やっぱNemerleみたいな拡張性のある言語じゃないと難しいかな、とも思う。ああ、後になってから気づいたけどladybugさんのコンパイル時エラー検出の話と近いことを考えているのかもしれない。

そう言う意味では、個人的には、.NETのcscは、とても適切なマナーの持ち主のように好印象なのだ*3cscは数多くのwarning機能をサポートしているし、プラットフォーム仕様をふまえて考えれば、言語自体の制約は極めて小さい(僕が気になるのはboxing/unboxingの融通のきかなさくらいか)。

ちなみに僕は、Marekが追加しているmcsの警告ルールには(以前もちょっと書いたけど)少なからず疑問を持っているのだけど、彼のwarningの実装は見るべきものがある。現在のmcsは、cscでは捕まえないような怪しいコード(たとえば同じ変数への代入の厳密な検出とか)も警告してくれる。

話はだいぶというか出発点あたりに戻るのだけど、この業界の人はたまに、最初のプログラミング言語に何を選ぶか、という議論をするのだけど、最初に全く自由のない言語を与えられた場合と、最初から自由な言語を与えられた場合とで、どんな違いが出てくるだろうか。プログラミングをよく分かっていない時に、何でもいじれる自由な言語を与えられたらまともなプログラミングが出来ない、と考えることもできるけど、僕には逆の道の方が好ましいように思える。

最初から自由を与えられずに生きてきたら、いざ自由を手にしたとき、結局それを活かすこともなく制約されたプログラミングに終始するかもしれない。あるいはそんな自由など邪道だ、と言って拒否し続けるか。最初から自由を知っていたら、そしてそこに適切な規範が存在すれば、それがベストなんじゃないか、と思う。

要件効果的な発想が根幹にある僕としては、自己矛盾でも生じない限りwarningで良いんじゃないかとすら思う。3年以上死刑無期のリスクを冒してでも殺したい相手が居たら、多分殺した方が良いのだ。って何か殺伐とした〆だな。前の段落で終わらせときゃ良かったか。

*1:ちなみに無理心中は単なる殺人なので、最初に相手の同意を取り付けておいた方が良いゾ。あるいは訴えられたら相手は同意していたと主張しておいた方が良いゾ。

*2:男の子だと13歳未満が微妙なので女の子です。ごめんなさい。

*3:他のコンパイラでも似たような議論が出来るのかもしれないけど