[#47] 名前なんてないほうが自由に生きていけるのです
先々月、名前を付けるということの重要性について書いてみた。今月はその続きとして、逆に名前がないとどうなるかを考えてみる。実はPerlやPython、JavaScriptなどに代表されるスクリプト言語では、名前のない関数を作れたりする。名前がなくてどうやって呼び出すのかというと、文章だけでは説明も難しいのだが、まぁ関数自体をオブジェクトと考えて、それに「実行しろ」という命令を送るようなモノだと思ってもらいたい。
ではプログラミングにおいて、関数に名前が付かないと、どういうメリットがあるのか?まず当たり前だが名前を付ける必要がなくなる(笑)。いやいや笑い事ではなく、これはある状況では、本当に大きなメリットなのだ。例えば、ほんのちょっとだけ動作の違う関数をたくさん作らないといけないような場合、名前による管理を続けていくとすぐに破綻してしまう。数が多くて人間が管理できる量ではないのであれば、初めから名前などなく、その機能をプログラムが見分けて判断すればよいのでは?という考えになる。そのほうが記述が簡潔になり、結果として管理しやすくなる。
さらに、名前がないことにより柔軟性が増すこともある。コードを引数に別のコードを呼び出したりすることが可能になる。コードを引数というのはわかりにくいと思うので、実際の例を考えてみよう。
「レストラン」プログラムの中に takeOrder()という関数がある。お客様の注文を取る関数だとしよう。普通の使い方では、引数にメニニューの名前を渡す。"ハンバーグ"とか"ラーメンなどなど。しかしこれではメニューに載っているモノしか注文ができない。オレはどうしても親子丼が食べたいんだ!と主張しても、名前でしか受け付けないインターフェースの場合には、メニューにないモノは頼めない。もしここで、名前ではなく手順、すなわちブログラムコードを受け付けることができるとどうだろう?親子丼"という名前の代わりに親子丼の作り方の手順を渡すのだ。裏では、コックさんがその手順を受け取って作ることがわかっているので、安心して注文を受けられる。明らかに柔軟性は増していることがわかる。
名無しの関数という考え方は、別にスクリプト言語に特有の考え方ではない。C言語系(C++やObjective-Cも含む)では関数ポインタという別の考え方で同様の効果を狙っている。しかし、C言語系では名前を付けなくてよいわけではないので、名前の管理コストが下がるということはない。工夫すればなんとか使えるというレベルだ。
一方、オブジェクト指向言語の原点、Smalltalk[*1]では、名無しの関数が盛大に使われる。それなしにはまともなプログラムが書けないほどだ。普通のプログラム言語では、条件分岐のif文や繰り返しのfor文などが言語仕様として実装されているが、Smalltalkでは面白いことに、これらは言語の仕様ではないのだ。その代わりにブロックと呼ばれる、まぁ名無しの関数のようなモノを引数としてオブジェクトに送り実行するのだ。
慣れないうちは奇妙に見えるが、よくよく考えてみると、絶妙なバランスで設計された仕組みということがわかる。こうしたことができるのも、if文などの制御構造ではなく、ブロックのみを取り入れるという、大胆な言語の仕様だからこそなのだ。なんとも面白い話である。
こうした、あえて名前を付けないことによるメリットというのは、何もプログラム言語にのみ有用なことではない。普通のコンピューターの使い方の中でも実はよく出てくる。例えばMac OS 9まで付属していたDAの「メモ帳」。とても気楽にメモを取れるのは、いちいち新しいページを作るのに名前やタイトルなんかを聞かれないからだと思う。それぞれのページは名無し状態、でもページ数も少ないしページをめくるアニメーションも気持ちいいし、名前なんてなくても問題なく、というか便利に使えていた。同じような理由で、「スクラップブック」という仕組みも、いちいち名前を付けない気軽さのたまものだったことに気がつかされる。
さらに、新規の書類を作ったときに現れる「名称未設定」という名称、Macのソフトでは当たり前に見るが、実はこれも名無しの状態と言える。というのも、コンピューターを使ううえで文書に名前を付けるということは、すなわちその文書を保存するということとほぼ同じことと言えるからだ。なので、保存してない状態=名称未設定、という一般的な理解も当然あるのだが、それ以外に文字どおり「名無し」という状態を強調するという見方もできる。つまり名無しとは、どこにもつながっていない状態と言えるわけだ。
Macのアプリケーションが最初なのかどうかはわからないが、このUntitled(名称未設定)という発想は、とても偉大な発明だと思う。最初に保存しようと思うまでは名前を聞かれることなく名無し状態で作業できる。名前を付けるというのは、けっこう面倒くさいことなのだ。それを先延ばしにできるわけだから、作業を始めるぞ!ということのもつ敷居の高さがかなり下げられる。
その昔、OpenDoc [*2] という仕組みがあったが、最初にドキュメントを保存しないと作業ができなかった。これは非常にストレスがたまるやり方だぞ、UI的には失敗[*3]だな、と思った記憶がある。最近の画像処理ソフトも、名前ではないがサイズを先に決めさせる。
Officeなんかもそんな感じだ。目的がキチンと決められている仕事の場合にはいいのかもしれないが、自由な発想の妨げになっているように思うがどうだろうか。オレは作業中にエディターで新規ドキュメントを開いて、ぱぱっと打ち込んで保存しないで捨てる、というのをよくするが、いちいち最初に保存場所なんかを聞かれていては、こんなメモ帳的な気軽な使い方はとてもできない。Untitledさまさまなのだ。名無しの話、来月に続きます。
バスケ(http://saryo.org/basuke/)
引っ越しも一段落。生活を変えるというのは、しんどいけどワクワクさせられるモノで、なんか心機一転頑張るぞ!という気になっています。そのわりに原稿が遅れてしまっていますが(笑)。すみません、反省します。
[*1] Smalitalk - オブジェクト指向言語の憧れ。話によく出てくるわりには、オレは実はちゃんとプログラムを書いたことがない。すみません。
[2] OpenDoc - OLEのようなコンポーネント技術。アップル主導でIBM などが参加して開発が進んだオープンなプロジェクト。
[3] UI的には失敗 - あくまでUI的に。技術自体は悪いことなかった。