たとえば、あのジャンボ機も宙に浮く(あれは錯覚だと主張している大学教授がいるそうだが、多分錯覚や幻覚ではなかろう)。空気の比重より重いものがあのように宙に浮くこともあるのだから、ひょっとすると人体も空中に浮くかもしれない。しかし、それには体重に打ち勝つだけの揚力が必要なのだ。その力は、宗教的な修行などでは絶対に得られない類いのものであろう。
ジャンボ機が使われるようになったばかりの頃のことである。たまたま海外出張でアメリカから帰国する際にこのジャンボ機を利用したことがあった。アメリカのどこの空港だったか忘れてしまったが、出発時間が近づくにつれ搭乗口の前に乗客が集まり始める。その数がすごいのだ。搭乗口は一つしかないから、同じ便を待っている人達であることは明らかである。団体旅行の人達もいる。太鼓腹というよりビア樽のような腹と表現した方がよいくらいの実に見事な体躯の持ち主たちが沢山いる。そういう人達が続々と集まってくるのである。それを見ていた私は、段々と不安になってきた。こんなに沢山の人を乗せたのでは、飛ぶはずの機体も宙に浮けなくなるのではないかと素朴な恐怖心を抱いたのである。
出張で日本を発つときもジャンボ機を利用したのだが、そのときは沢山の搭乗口がある場所で待っていたのでその場にいた乗客すべてが一つの機体に乗り込むとは思いもしなかった。したがって何の不安も感じなかったのだが、こうして乗客全員を目の当たりに見てしまうと、いくら何でもこれでは重すぎるのではないかと心配になってきたのである。しかも、ここにいる人達ばかりでなく乗務員も含めた全員を、更に重い機体自身とともに持ち上げてしまうのだから、これはすごい揚力というべきであろう。宗教的な修行を積んだ人の念力などでは、到底及びもつかない力である。
空中浮揚に成功するかどうかは、要するに自重に打ち勝てる浮力を生ずることができるかどうかにかかっている。そのような浮力をどのようにして得るかの問題を解決しなければならないのである。
◆ブートストラップ
空中浮揚について、なぜ私がそんなにこだわるのかというと、実は何を隠そう私は会社に入ってからずっとこの「空中浮揚技術」の実践に取り組んできたのである。
コンピュータの分野では、この空中浮揚技術のことを“ブートストラップ”という。ブートストラップ(bootstrap)とは、文字通りでは“靴の紐”のことであるが、ここでは“自力で成し遂げる”とか“自力で進む”というくらいの意味で使われている。これこそ、正真正銘の宙に浮く方法のことなのだ。変な宗教にのめり込まなくても宙に浮く方法などは昔から研究されてきており、その技術は既に立派に確立されているといってもよいであろう。ただ、実践あるのみの段階にきているのである。
空中に浮くには、靴をはいた足が地に着かないようにする必要がある(別に、靴をはくこと自体は本質的なところではない)。それには、靴の紐をシッカと持って上へ引っ張り上げればよろしい。言葉だけの説明では分からない人もいるであろうから、次に手順を詳細に示すことにしよう。
つまり
(1)右足が地面に着かない内に、右足の靴の紐を上に
引っ張りあげる
(2)左足が地面に着かない内に、左足の靴の紐も上に
引っ張りあげる。
(3)再び(1),(2)を繰り返す。
このとき靴の中には生身の人間の足が入っている点に注意しなければならない。しかし、これはたいした問題ではない。その分、引く力が余分に必要になるだけのことである。問題はむしろ次の点にある。つまり、その足の持ち主と靴紐を引っ張る人が同じ人だという点である。ここが最大の問題なのだ。しかしこれとても、最初だけ他人の力を借りれば難無く乗り越えることができる。最初に「他人のふんどしで相撲を取る」ことができれば、これが可能になるのである。
実際にやってみると分かるが、これは並大抵の努力ではできないことである。理論は確立されているが、実践が非常に難しい技術なのだ。貴方(女)も試してみるがよい。ただ、人前ではやらぬ方がよろしかろう。
このブートストラップの技術は、コンパイラ(1)開発でしばしば利用される。高水準(2)の言語処理系を開発するとき、その言語(または、そのサブセット仕様)で処理系を記述するのである。これから開発しようとしているプログラム言語を用いてプログラムを記述したのでは、「鶏と卵はどちらが先か」ということになり、普通はうまくいかない。無から有を生ずることはできない道理である。しかし、ここにどこかのマシン上で動く他の同種の処理系があれば、無から有を生ずることが可能となる。最初に「他人のふんどしで相撲を取ることができれば」と言ったのはこのことなのである。
したがって、この手法は「最初にコンパイラありき」が前提となる。その力を借りれば、無から有を生じて空中浮揚ができるのである。この最初のコンパイラを次のように表現することにしよう。
x
C
a→x
これはコンパイラ“C”が“x”という言語で記述されており“a→x”という機能をもっていることを示す一般的な表記である。もっと分かり易く言えば a という言語を x という機械語(3)に変換する機能を持つコンパイラで、それが x という機械語で記述されているという意味である。あらかじめXというマシン上でこのような処理系が利用できれば、別のマシンYの上で動作する処理系
y
C
a→y
を作ることができる。それにはまず、
a
C
a→y
を作る必要がある。つまり a という高水準記述言語を用いて、Yというマシンの機械語 y を目的語とするコンパイラを作成する。これはもう、ゴリゴリと腕力にまかせて作るしかない。a という高水準言語で記述するので、生産性が高いのが取り柄である。したがってアセンブラ(4)などの低水準言語で作るよりはるかに楽ではあるが、それでも結構根気のいる作業である(これが私の仕事であった)。これを、先程の最初に存在するコンパイラに食わせて処理させるのである(他人のふんどしで相撲を取るのである)。コンパイラをXというマシン上で動かすのは、次のように箱で囲んで表すことにしよう。
┌-─x┐
│ C │
└a→x┘
ここに、今ゴリゴリと作ったばかりのコンパイラのソースプログラム(5)を入力すると
a ┌-─x┐ x
C ⇒│ C │⇒ C
a→y └a→x┘ a→y
ということになるから、出力として次のものが得られる。
x (コンパイラの機能が働くから a が x になる)