ソフトウェアの法則 ソフトウェアと空中浮揚 ブートストラップについて
ソフトウェアの法則
(36)

ソフトウェアと空中浮揚


── ブートストラップについて

◆宙に浮く
 オウム真理教にまつわる一連の出来事を見ていて、大方の人が不思議に思ったのは、理工系高学歴の若者達が、なぜあのような“宗教”に引き込まれていったのかという点であろう。特に、教祖が空中浮揚しているというインチキ写真を見て、自分もそうなりたいと思ったのを入信の動機としている者が多い。

 空気の比重と人体を構成する物質の比重はどちらが重いか。この程度のことは、彼等のように最高学府で学んだ者でなくても大抵の人は体験的に知っているし、理論的にも理解しているはずである。テレビで繰り返し放映される信者の修行風景を見ていると、座禅を組んで瞑想しながらピョンピョンと飛び跳ねている。本人達は、あれを繰り返していればそのうちに宙に浮くことができるようになると思っていたのであろう。愚かな行為というべきである。滑稽というよりも、見るも哀れという感がしてならない。

 「あんなものは宗教ではない」と断ずる人がいるかもしれないが、昔の宗教というのは概ねあの程度のものだったのであろう。一般に宗教とは、超越的で、畏怖すべき、しかも魅惑的な神秘との出会いの経験に発するものである<*1>というから、「あんなものに引っ掛かって」と馬鹿にしてはいけないのかもしれない。ただ、その神秘的なるものが“空中浮揚”というような子供だましのものであった点が、聞けば聞くほど情けなく思えるのである。

【注】<*1>「聖なるもの」R.オットー 山谷省吾訳(岩波文庫)

 比叡山延暦寺の難行として12年間も比叡山にこもる籠山行というのがある<*2>。この行に入る前には好相行というのをやらねばならない。これは不眠不臥で三千仏の名を唱えながら、五体投地の礼拝を繰り返すものである。そして好相、つまり仏のよいお姿を自身で観得するまで際限なく続けるのだという。この間、水を飲む以外は一切の食事はとらない。縄牀にもたれてときどき休息することは許されているが、それ以外は不眠不臥で数週間ぶっ続けで拝み切るのだそうである。お付きの者がいてお経の声が小さくなると交代で叱りつける。これを数週間続けると突然仏の顔が見えるようになるという。この状態になったことはその顔つきからお付きの者にも分かるのだそうである。この正体はもちろん(門外漢が勝手に言わせてもらえば)幻覚であろうが、こういうのを本当の修行というのである。悟りを開くというのは心の持ちようであって、決して彼らのように宙に浮くことなど求めてはいない。

【注】<*2>「籠山十二年」中野英賢(昭和46年発行 日本文芸社) 著者と親しいという友人M氏から借りて読んだ本である。

 たとえば、あのジャンボ機も宙に浮く(あれは錯覚だと主張している大学教授がいるそうだが、多分錯覚や幻覚ではなかろう)。空気の比重より重いものがあのように宙に浮くこともあるのだから、ひょっとすると人体も空中に浮くかもしれない。しかし、それには体重に打ち勝つだけの揚力が必要なのだ。その力は、宗教的な修行などでは絶対に得られない類いのものであろう。

 ジャンボ機が使われるようになったばかりの頃のことである。たまたま海外出張でアメリカから帰国する際にこのジャンボ機を利用したことがあった。アメリカのどこの空港だったか忘れてしまったが、出発時間が近づくにつれ搭乗口の前に乗客が集まり始める。その数がすごいのだ。搭乗口は一つしかないから、同じ便を待っている人達であることは明らかである。団体旅行の人達もいる。太鼓腹というよりビア樽のような腹と表現した方がよいくらいの実に見事な体躯の持ち主たちが沢山いる。そういう人達が続々と集まってくるのである。それを見ていた私は、段々と不安になってきた。こんなに沢山の人を乗せたのでは、飛ぶはずの機体も宙に浮けなくなるのではないかと素朴な恐怖心を抱いたのである。

 出張で日本を発つときもジャンボ機を利用したのだが、そのときは沢山の搭乗口がある場所で待っていたのでその場にいた乗客すべてが一つの機体に乗り込むとは思いもしなかった。したがって何の不安も感じなかったのだが、こうして乗客全員を目の当たりに見てしまうと、いくら何でもこれでは重すぎるのではないかと心配になってきたのである。しかも、ここにいる人達ばかりでなく乗務員も含めた全員を、更に重い機体自身とともに持ち上げてしまうのだから、これはすごい揚力というべきであろう。宗教的な修行を積んだ人の念力などでは、到底及びもつかない力である。

 空中浮揚に成功するかどうかは、要するに自重に打ち勝てる浮力を生ずることができるかどうかにかかっている。そのような浮力をどのようにして得るかの問題を解決しなければならないのである。

 

◆ブートストラップ
 空中浮揚について、なぜ私がそんなにこだわるのかというと、実は何を隠そう私は会社に入ってからずっとこの「空中浮揚技術」の実践に取り組んできたのである。

 コンピュータの分野では、この空中浮揚技術のことを“ブートストラップ”という。ブートストラップ(bootstrap)とは、文字通りでは“靴の紐”のことであるが、ここでは“自力で成し遂げる”とか“自力で進む”というくらいの意味で使われている。これこそ、正真正銘の宙に浮く方法のことなのだ。変な宗教にのめり込まなくても宙に浮く方法などは昔から研究されてきており、その技術は既に立派に確立されているといってもよいであろう。ただ、実践あるのみの段階にきているのである。

 空中に浮くには、靴をはいた足が地に着かないようにする必要がある(別に、靴をはくこと自体は本質的なところではない)。それには、靴の紐をシッカと持って上へ引っ張り上げればよろしい。言葉だけの説明では分からない人もいるであろうから、次に手順を詳細に示すことにしよう。

 つまり
(1)右足が地面に着かない内に、右足の靴の紐を上に
   引っ張りあげる
(2)左足が地面に着かない内に、左足の靴の紐も上に
   引っ張りあげる。
(3)再び(1),(2)を繰り返す。

 このとき靴の中には生身の人間の足が入っている点に注意しなければならない。しかし、これはたいした問題ではない。その分、引く力が余分に必要になるだけのことである。問題はむしろ次の点にある。つまり、その足の持ち主と靴紐を引っ張る人が同じ人だという点である。ここが最大の問題なのだ。しかしこれとても、最初だけ他人の力を借りれば難無く乗り越えることができる。最初に「他人のふんどしで相撲を取る」ことができれば、これが可能になるのである。

 実際にやってみると分かるが、これは並大抵の努力ではできないことである。理論は確立されているが、実践が非常に難しい技術なのだ。貴方(女)も試してみるがよい。ただ、人前ではやらぬ方がよろしかろう。

 このブートストラップの技術は、コンパイラ(1)開発でしばしば利用される。高水準(2)の言語処理系を開発するとき、その言語(または、そのサブセット仕様)で処理系を記述するのである。これから開発しようとしているプログラム言語を用いてプログラムを記述したのでは、「鶏と卵はどちらが先か」ということになり、普通はうまくいかない。無から有を生ずることはできない道理である。しかし、ここにどこかのマシン上で動く他の同種の処理系があれば、無から有を生ずることが可能となる。最初に「他人のふんどしで相撲を取ることができれば」と言ったのはこのことなのである。

 したがって、この手法は「最初にコンパイラありき」が前提となる。その力を借りれば、無から有を生じて空中浮揚ができるのである。この最初のコンパイラを次のように表現することにしよう。

    x
   C
   a→x

 これはコンパイラ“”が“x”という言語で記述されており“a→x”という機能をもっていることを示す一般的な表記である。もっと分かり易く言えば a という言語を x という機械語(3)に変換する機能を持つコンパイラで、それが x という機械語で記述されているという意味である。あらかじめというマシン上でこのような処理系が利用できれば、別のマシンの上で動作する処理系

    y
   C
   a→y

を作ることができる。それにはまず、

    a
   C
   a→y

を作る必要がある。つまり a という高水準記述言語を用いて、というマシンの機械語 y を目的語とするコンパイラを作成する。これはもう、ゴリゴリと腕力にまかせて作るしかない。a という高水準言語で記述するので、生産性が高いのが取り柄である。したがってアセンブラ(4)などの低水準言語で作るよりはるかに楽ではあるが、それでも結構根気のいる作業である(これが私の仕事であった)。これを、先程の最初に存在するコンパイラに食わせて処理させるのである(他人のふんどしで相撲を取るのである)。コンパイラをというマシン上で動かすのは、次のように箱で囲んで表すことにしよう。

   ┌-─x┐
   │ C │
   └a→x┘

ここに、今ゴリゴリと作ったばかりのコンパイラのソースプログラム(5)を入力すると

    a ┌-─x┐   x
   C ⇒│ C │⇒ C
   a→y └a→x┘ a→y

ということになるから、出力として次のものが得られる。

    x (コンパイラの機能が働くから ax になる

   C
   a→y
 (入力と出力の機能は変わらない

これはまだ、我々が求めているものではない。というマシン上でしか動かないものだからである。しかしこれに再び最初のソースプログラムを食わせると、

    a ┌-─x┐   x
   C ⇒│ C │⇒ C
   a→y └a→x┘ a→y
           
        a ┌-─x┐   y
       C ⇒│ C │⇒ C
       a→y └a→y┘ a→y

となり、次のものが得られる。これが我々の求めていたものである。

    y
   C
   a→y

更に a という言語を拡張して A を作ることもできる。それには次のようにブートストラップを続けていけばよいのである。もはやというマシンを借りる必要はなくなった訳である。こういう場合、普通は記述言語の仕様は a のままにとどめておく。

       a ┌-─y┐   y
      C ⇒│ C │⇒ C
      A→y └a→y┘ A→y

 これが、ブートストラップと呼ばれる手法の概略である。ブートストラップの実践には、もっともっと別の難しさがあるのだが、それは「ソフトウェアとドッグフード」で述べることにする。

 最近は、コンピュータを起動させる(立ち上げる)ことを「ブート」と呼んでいるようである。つまり電源を入れたばかりで何も設定されていない状態のマシン上に、自動的にプログラムをロードして初期化することによって使用可能な状態にすることである(つまり、無から有を生ずるという意味である。更に、ブートをやり直すことを「リブート」などともいっている)。これは、何もないメモリ上にまず小さなプログラムをロードし、それを手づるにしてずるずると大きなプログラムを引きずり込むという手法を用いるのが普通で、それだからこそ“ブートストラップ”というのである。日本的に言うと「芋ずる式に」という表現が当てはまるのではないかと思う。普段「ブート」、「ブート」と言っている若者達は、この言葉の由来を本当に知って使っているのだろうかとときどき心配になる。

 ブートストラップという空中浮揚の技術は、このように活用され実践されてこそ意味があるといえよう。

 更に言えば、空中浮揚(ブートストラップ)して得られた成果であるコンパイラを、一般利用者が使ってくれて初めて意味があるものとなるのである。ブートして利用可能になったコンピュータも、一般利用者に有用に使われてこそ意味があるものとなる。ブートすることそれ自体が目的ではないのだ。

 オウムの信者達は、空中浮揚して一体何をしたかったのであろう。単に空中に浮くことしか考えていなかったのではあるまいか。浮いた後、それによって何をしたいのかを考えていれば、もう少し別の選択ができたものをと思わずにいられない。■

◆【リブートの多様な使い方】
・プログラムの動作がおかしくなったら、とりあえずマシンをリブートする。
・マシンがハングアップして応答しなくなったら、とりあえずマシンをリブートする。
・ゲームで遊んでいる最中に突然後ろにボスがやってきたら、とりあえずマシンをリブートする。

【用語解説】
(1)コンパイラ
 ある種の言語で書かれたプログラムを機械語に変換するプログラム
(2)高水準(記述)言語
 人間の言葉に比較的近い、プログラミング言語
(3)機械語
 コンピュータが固有に持っている命令語
(4)アセンブラ(低水準言語)
 シンボリックに記述された機械語を、コンピュータの命令コードに変換するプログラム
(5)ソースプログラム
 機械語に変換する前のプログラム
(1995-09-18:掲示、1998-5-1:削除、2006-8-1:再掲示)