Objective-CとLISPの微妙な共通点

オブジェクト指向言語では、クラス内のインスタンス変数には直接的なアクセスができないようにし、クラスの再利用性をあげるのが基本とされています。そのためにJavaでは変数や関数にはpublicと明示しないかぎり、クラス外のオブジェクトからのアクセスが制限されるようになっています。

Objective-CにはC++と同じような@publicや@privateなどが用意されています。ところが、ダイナミックObjective-C 第101回を読むと、@privateのアクセス修飾子があってもコンパイル時に警告が出るだけで、クラス外からアクセスできてしまうのだとか。何という自由さ。さすがCのラッパー言語なだけあります。さて、その文書に以下のような記述がありました。

Objective-Cの言語仕様を見ていると“自由と責任”という言葉が頭に浮かぶ。言語的に何かを禁止するということは、Objective-Cではあまりない。むしろ、積極的に内部構造にアクセスするための文法やAPIを提供してくれている。あとは、それらを使うプログラマの責任なのだ。大いなる自由と引き換えに、秩序あるプログラムを作る責任も押し付けられるのだ。

まるでLISPのようです。LISPには言語的に禁止されているものがほとんどなく、言語内言語を作ることが推奨されているような雰囲気すらあるようです。LISPは、責任ある少数精鋭の職人が全体像を把握して作業を進めるという、宮大工のようなプログラマが使う言語なのでしょう。Objective-Cの自由さはちょっと異なっていて、アセンブリに近いC言語の影響か、「どこでも開墾して住んで良いよ」という自由さのような気がしています。そして、その対極にあるのが、プログラミングを産業化する牽引役となったJavaですね。与えられた部品を組み合わせることで短時間でそこそこのプログラムが書けるところが、まるでプレハブや建て売り住宅のようです。

【2009-02-20 追記】考えてみたら、関数型言語は副作用が少ないので、手続き型言語よりもしっかりとしたモジュール化が進められます。そうすると「全体像を把握」しなくても良い部分もありますね。