十月に思うこと

hiyama (檜山正幸)
Release:Thu Oct 28 2004
LastUpdate:Fri Oct 29 2004: 書き間違いを修正

目次

またエッセイ書いてみました。しかし、サイト全体としては、必要な説明が まったく欠如していたり、同じ事をクドクドと繰り返したり、記述の順序がイッ タリキタリだったり、もうひどいもんですな。

ところでこの記事では、「です/ます」調からいつのまにか「だ/である」 になっています。それと、一人称も「僕」になっちゃったね。

1. また、基本データ型の話:天上のデータと地上のデータ

数学的な整数(Javaのintではないぞ)や実数(当然、Javaのdoubleではない ぞ)は、いわば天上世界のデータです。この世のものではないから、時間も空 間も超越した存在なのです。それに対して、オブジェクトは地上世界のデータ ですね。メモリ内に場所を取って、ゴニョゴニョモゾモゾと動き回ったり(あ るいは止まっていたり)する。このゴニョゴニョモゾモゾが計算現象なわけ。

さて、この比喩に沿って考えると、基本データ型の位置づけはどうなるか? 基本データとは、天上のデータを模倣する地上のデータってことです。つまり、 intやStringは、ほんとはもちろん地上のデータなのだけど、我々はそれを天 上のデータのように扱いたいと思っている。と、そのようなことですね。

intやStringは所詮有限個の値しか持たないから(だって、ビットパターンだも んね)、どうしたって、天上の存在にはなれないし、メモリ領域だって消費 している。だが、ある範囲内では、抽象的整数のように扱っていいでしょ。 その「ある範囲内では、あたかも抽象的な値」である点が基本データを特徴付 けている。

天上のデータと地上のデータの際だった違いは、なんといっても同一性でしょ う。天上のデータでは、違いが観測(認識)できなければ同じ(存在物として 同一)だし、少しでも違いがあれば異なる存在です。オブジェクトではそうは いかない。観測量から区別できなくとも、存在物として違うことがあるからね。

例えば、xとyがString(を指している)として、xとyの長さはどちらもnであ り、0 ≦ i < n なるiに対してx.charAt(i) == y.charAt(i) だとすると、 xとyは観測的に区別できない。だけど、メモリの異なる場所に置かれた“2つ の”異なるオブジェクトの可能性がある。それが現実なんだが、メモリ上の場 所なんかは考えないと宣言すれば、Stringも基本データと考えていいのだ。 でも、メモリ位置をどうしても取り扱う必要があるなら、そのときは、 Stringを基本データと考えることをやめなくてはならない。つまり、あるデー タ型が基本データ型かどうか、ってのは、それを取り扱う我々の態度に依存す ると言ってよい。

念のために言っておくけど、今の基本データ型に関する説明は、「intや booleanもオブジェクトであるほうがいいの/悪いの」といった議論とはまっ たく何の関係もない。「天上のデータを模倣しようとする態度」によって基本 データ型であるかないかを判定しているのであって、実際の型システムの構成 は、どうでもいいのである。

2. オブジェクトというデータ

基本データを、「天上のデータの模倣」あるいは「疑似的な天上のデータ」 と捉えると、基本データ以外の特徴も浮かび上がってくる。基本データ以外の データは、以下のごとく、自分が地上の存在(*注1)であることを積極的に認 めているようなデータだ。

注1

地上の存在とは、誕生のときから肉体を持ち、いずれは死すべき存在だ。天 上の存在は肉体を持たない。したがって老いることも死ぬこともない。いや、 そもそも天上では、肉体を入れる器である空間は不要であり、老いを引き起こ す時間は流れない。(これも比喩だから、あまりマジメに考えないように。)

僕は、「オブジェクト」という言葉により、上のような特徴を持ったデータ を指している。つまり、計算現象における質点(運動をになう最小単位)みた いな存在が“檜山のオブジェクト”なんですね。

だけど、計算現象をローレベルで(生々しく)見てしまうと、オブジェクトなん てどこにもないのですよ。だって、計算現象って、クロックのタイムチックと メモリアドレスで座標付けられた離散時空間の“模様”ですからね。その模様 のどこからどこまでが1つのオブジェクトかなんて、よくわからない。

コンサートやスポーツの会場で、ひま(?)な観客がウェーブってのをやります よね。あれを遠くで見ているとウェーブが走ってるけど、観客の一人一人は、 ヒンズースクワットみたいなことやっているだけ。つまり観客に番号付けて、 1秒ごとに「立っているか/座っているか」を記録すると、模様の変動として のウェーブは現れるけど、そのウェーブが実在なのか? 何かの個物なのか? と問われると、自信が持てないでしょう。

観客に番号付けて、1秒ごとに「立っているか/座っているか」を記録するこ とは、メモリにビットアドレスまで割り振って、クロックチックごとに 「1 or 0」を記録することと、まったく同じだよね。その模様の一部を、あた かも実在/個物であるかのごとくに識別性と同一性を与えたのがオブジェクトっ てことだ。

だが、だからといってオブジェクトがハカナイ存在かと言えば、そうとも言 い切れない。力学に登場する質点だって、質量が突出した位置が変動している に過ぎないから、空間の各点だけを眺めていると「1 or 0」の値を取っている だけ。時空間に描かれた0-1模様を、力学では質点と呼ぶだけのことだ。だか ら、オブジェクトは質点と同様な存在基盤は持っている。あるいは、オブジェ クトがハカナイとすれば、それは質点と同様なハカナサだと言える。

僕自身は、質点の存在をさして疑ってはいない -- 信じているのではなくて、 疑う行為がジャマになることがあるからだ。よって、オブジェクトを質点と 同様に扱うことも、(それが真実の姿ではないとしても)十分 に役に立つ仮構だと思っている。実際、オブジェクトの質点描像(運動の軌跡 としてのオブジェクト)を通して、僕は色々なことを知った(*注2)

もし必要があれば、「あらゆるデジタル計算現象は、離散時空間に描かれたモノクロ のまだら模様に過ぎない」という立場に戻ることができる。自分が見ているも のが仮構/見なし/幻影だとしても、それが、なにがしかの理解(した気分) を提供してくれるなら、それでよいんじゃないか、と僕は思う。だって、「な にがしかの理解(した気分)」てのは、ある種の快感だからね。

3. なぜ、天上のデータが必要なのだろう

基本データ型というのは、天上のデータを模倣するものだ。基本データ型が 必要だってことは、天上のデータ(抽象的で超越的な値)を我々が欲している ことになる。なぜだろう?

思うに、天上のデータを認めないと、ほとんど何もできないからじゃなかろ うか。例えば、東京のA君と千葉のB君でどっちが背が高いかをウンヌンすると き、A君が169cmでB君が173cmなら、B君のほうが背が高いってなるでしょう。 このとき、身長というスカラー量を基準にしているけど、身長なる量は天上の データですよ。だって、場所や時間に依存したら比較できないから、判断の根 拠にもならない。

整数とか実数とかの形で数値化しないとしても、なにか超越的で変化しない 媒介物を通じて比較するよね。たとえば、A君の背丈と同じ長さにヒモを切っ て、東京から千葉までヒモを運ぶ。そして、千葉でヒモとB君を比べれば、数 値を介さないで、身長の比較ができる。このとき、ヒモは地上の物質だけど、 運搬中に(極端に)長さが変わるとか、千葉に入ると変形するとかはないと仮 定されている。つまりは、時間も空間も超越した不変な尺度としてヒモを使っ ている。そもそも、「運搬中に長さが“変わる”」とか「千葉に入ると“変形 する”」という言明も、「長さが変わらない」「変形しない」という概念との 比較でないと意味をなさない。

なんでもかんでもが時間と空間に依存したり、何もしないのに状態がどんど ん変わっていく世界、不変(と仮定できる)尺度/基準が一切存在しない世界(ほ とんど想像できないが)では、たぶん僕らはうまく考えることも語ることもで きない。だから、足場、枠組みとして天上のデータに頼らざるをえないのだろ う。あらゆるデータがミュータブルであり、あらゆる観測に副作用の危険があ るような状況には、誰も耐えられないと思うのだ。

4. 同一性、超越性、資源性

RDBでは、第1正規化という大原則がある。あれは、「行データは基本データ の組で決定される」ってことだ。行を構成するデータが再びオブジェクト的だ と扱いがやっかいになる。それと、行データの等しさを基本データ(属性値、 フィールド値)の組の等しさで定義している。これは、識別不可能性と同一性 が一致していることになる。

まとめれば、第1正規化の原則は、行データを天上のデータを基に扱おう(扱 いたい)と主張しているわけだ。RDBがいまだにデータベースの主流技術であ る理由のひとつは、天上のデータの扱いやすさ、天上のデータへの安心感・信 頼感じゃなかろうか。

話はがらりと変わるが、「1 + 2 = 3」は分かるが、「1 + 1 = 2」が分からな い子供の話を聞いた(読んだかも?)ことがある。その理由は次のようなこと だ。

この子の気持ちを理解するために、0から9までの数字が書き込まれ たカード、プラス記号、イコール記号が書き込まれたカード、全部で12枚のカー ドの束があると想像しよう。このカード一式(ストック)から数字や記号を “持ってきて”算数の式を作るとする。すると、最初の1を持ってきた時点で、 もはや1はなくなっている。だから、「1 + 1」という足し算は表現できない。

この子は、数字や記号を単一の(複製不可能な)資源として考えている。だ から、一度使用すればなくなってしまう。「1 + 1」を納得するには、数字や 記号は、いくらでもタダでコピーできると考えなくてはならない。

さてさて、なんだかこりゃ変だね。整数は、天上のデータだから、唯一無二 の存在のはずだが、いくらでもコピーできる。唯一無二だが、いくら使っても 減らない。そりゃいったい、どういうことだ? -- 僕もよくわからないのだが、 超越的/抽象的な整数1(1のイデアか?)は唯一無二だが、紙に鉛筆で描かれた図柄と しての1は、紙面/鉛筆の芯/手の動作などで生成されるから、資源的な地上 の存在ということなのだろうか。

紙に鉛筆で描かれた図柄は確かに資源であるが、それと同じ意味で、コンピュータ 内に存在するあらゆるものは資源だ。一方で我々は、資源性を持たない超越的 なデータがないと、何もできないらしい。ウーム、ややこしい。

5. パラダイム論争

非常に純度の高い関数型プログラミングでは、超越的なデータ(つまり、純 粋な値)に対する操作だけでプログラムを書こうとする。それはそれで美しい とも思うのだが、計算の世界から資源性を取り除くのは容易ではない。例えば、 call-by-name/遅延評価を入れると、もう資源性の匂いがただよってしまう (それが悪いってことではないよ)。

オブジェクトの概念が比較的うまくいっているのは、無理に資源性を除こう とはしなかったので、理念と計算現象のギャップが少ないせいかもしれない。 だからと言って、関数や論理がダメなのだとは言ってない。伝統的な数学(つ うか、普通の数学)や論理では、資源性を扱わなかったのだから、数学的・論 理的現象をコンピュータでエミュレートしたいなら、むしろ頑張って資源性を 隠さないといけない(*注3)

注3

資源性があまりに露骨に出ちゃうと、資源管理がしんどすぎるから、どんな パラダイムであれ、大なり小なり資源性の隠蔽は必要だ。

で、僕が何を言いたいかというと、特定のプログラミングパラダイムが「最 高だ」とか「万能だ」とかってことは“ない”ってことさ。そういう宗教論争 はたいていは不毛だろう(各パラダイムの特徴や輪郭を鮮明にする効果がある なら、それなりに有意義かもしれないが)。

オブジェクト指向がうまくいっている事例は確かにあるだろう。だが、関数 型のほうがずっと向いている応用もあるだろう。論理型がドンピシャとはまる 分野もあるだろう。要するに、「それぞれに得意不得意がある」ってが事実で しょ。その事実を素直に(まっとうに)解釈理解すれば、どれが優れてるかな んて議論よりは、各パラダイムの得意不得意を分析したり、あるパラダイムが 適用できる/適用できない理由は何かを考えたほうが建設的だと思うぞ。

6. 「正しい」とは

どうも、話がハナハダ発散してしまった。「正しいプログラム」と何の関係 があるんだ?と突っこまれそう(少しは関係あると思って書いてるんだけどさ)。 話を戻して(というより、さらに 脱線して)、「正しい」の話をしましょう。

「JavaWorld DAY」で僕は、正しいプログラムについて語ったのであって、正 しい仕様については何も言ってない。「正しいプログラム」の「正しい」の意 味については、Meyerの"correctness"の定義を引用して「仕様との適合/合致」 という意味を(少なくともこの講演内では)与えている( スライド2 、国語辞書の意味で言葉を使っているのではない)。いったん、「正しい」とは「仕様と の適合/合致」だと定義したからには、「仕様」とは何であるか、「適合/合 致」とは何であるかも示さなくてはならない。それで、示そうと“試みた”の がこの講演だったわけだ。

さて、じゃ「正しい仕様」となると、これはどう定義すべきか。「仕様」概 念が明確に定義されているとしても、仕様以外のナニモノカをひきあいに出し て、そのナニモノカを正しさの判断基準とするしかない。ナニモノカって何だ ろうか? 「現実世界」とか言ってもいいのだが、もし、現実世界との適合/ 合致が仕様の正しさだとすると、今度は(僕の性分としては)現実世界の形式 的な記述を求めてしまう。

仕様の形式的記述なら、少しは可能性をみいだせるのだが、現実世界の形式 的記述となると、まったくのお手上げだ。よって、僕が「正しい仕様」につい て語ることは、(残り少ないけど)一生ない。

もっとも、エモーショナルなレベルで、「リッパな仕様」とか「ろくでもな い仕様」「クソ仕様」だと判断する(むしろ“感じる”)ことはあるけどね。