全くコンピュータの知らない人にTracing JITコンパイラを説明する試み (その1)

少し忙しいのですが、なんとなく全くコンピュータのことを知らない人にTracing JITを説明する文章が書きたくなったので、書いてみます。うまくいくかなー

私はTracing JITコンパイラを書いているわけですが、インターネット上ではなくリアルで会う人にJITコンパイラと言ってもほとんどの場合、通じません(通じる人もいる)。世の中そんなものだと思ったのですが、JITコンパイラとうっかり発したとしても、その後話が続くとどんなに素晴らしいことでしょう。

コンピュータとは?

 世の中にはコンピュータというものがあって、広く使われています。これを読んでいる人は携帯電話を使っている、もしかしたらスマートホンを使っている人がいるかもしれませんが(私はスマートホンを使っていませんが)、これはコンピュータの応用品というかほとんどコンピュータです。
コンピュータは日本語で電子計算機と訳されることからわかるとおり、計算をする機械です。計算というとお金の計算とか以外何に役に立つの?とか思うかもしれませんが、いろいろな物を数に置き換えると計算でいろいろなことができるのです。たとえば、携帯電話は声を数に変えることで遠くの人に声を伝えています。声を聞き取りやすくしたりそういうことも計算で出来ます。

コンピュータは計算が速く正確に出来るのですが、あまり難しいことはできません。出来ることは、足し算とか掛け算、せいぜいルートとか三角関数くらいです。でも、コンピュータはとても難しい計算をしているのはなぜでしょう?
コンピュータは単純な計算しかできませんが、計算を繰り返したり計算結果を記憶しておくことができます。このようなコンピュータの機能を利用すると、どんなに複雑な計算も簡単な計算の組み合わせることで、可能になるのです。
では、簡単な計算を組み合わせて複雑な計算にするのはだれがやるのでしょう?それは、人間です。そのようなことを行う人はプログラマーと呼ばれています。

社長の苦悩

  コンピュータにこういう計算をしなさいと命令するのは大変なことです。ここで、プログラマの仕事を会社の社長に例えてプログラマの苦労を説明したいと思います。
あまり、融通のきかない新入社員のM君(コンピュータの例え)は自分では何も考えません。でも、言われたことは非常に正確にこなします。今も昔も新入社員は自分で考えない、指示待ちだと言われるのは変わらないわけですが、M君はレベルが違います。右ひじを10度曲げろとか、親指の第二関節を15度動かせとかそんな感じじゃないと動かないのです。社長はほかにもやることがいっぱいあるのにM君の指示をするのに精いっぱいです。その代わり、指示されたことはどんなにたくさんあっても、素早く正確にこなすことができます。

 社長はM君の扱いに困り果ててしまいましたが、ある日いいことを思いつきました。係長のB君にM君の命令係をやってもらうことです。社長が、B君に「隣の部屋から茶碗をとってこい」と命令すると、B君はM君に命令して手足を動かして茶碗を取ってくるように動かすのです。これで満足と思ったのですが、B君は社長に比べて命令の仕方が下手で、M君はときどき意味もなく腕をぐるぐる回したりして、社長が直接命令するより作業に時間がかかるのです。

B君のような存在が、実際のコンピュータではプログラミング言語と呼ばれているものです。現在ではプログラマはコンピュータを直接命令するようなことはまれで、プログラミング言語を使ってコンピュータに命令することがほとんどです。

Cさん登場

 M君に命令するのに自分でやっていたら大変、B君に頼んだらM君の力を生かせられない。困った社長の前にCさんが登場しました。Cさんは、B君のように逐一M君に寄り添って命令する代わりに、「隣の部屋からお茶碗取ってこい」と命令すると徹夜で"隣の部屋からお茶碗持ってくる完全マニュアル"を作るのです。次の日、M君に渡すとM君はそれを読んで、社長が直接命令するくらい素早く茶碗を取ってくるのです。
一晩じっくり考えたマニュアルだけあってあまり無駄な動きはありません。むしろ社長の命令の方が無駄があるくらいです。

CさんもBさんのように、人間が楽な手段でコンピュータに命令するようにするものなので、プログラミング言語と呼ばれます。そして、Cさんのようにあらかじめコンピュータが理解しやすいマニュアルを作るのをコンパイラ、B君のように逐次コンピュータに命令するのをインタプリタと呼びます。

今お茶が飲みたい

 これですべて解決と思ったわけですが、人間の欲望とは限りないものでございます。社長はお茶が飲みたくて茶碗持ってこいと命令したのに、お茶が飲めるのは次の日の朝ということになってしまいます。これならB君の方がましだとも思ったものでした。

そんなとき、S君が名案を思いつきました。C君の作る"隣の部屋からお茶碗持ってくる完全マニュアル"には、「核攻撃を受けた時、首相官邸に連絡して危機管理センターのメンバーを招集する」とか、あまり使わない状況の命令も入っているのですが、たとえば「歩く」とか良く使う命令だけマニュアル化すればいいのではないかと。

でも、何が良く使う命令なのか普通は分かりません。また、突然核攻撃を受けるとか可能性の低い事態が起こるかもしれません。そこで、S君は初めはB君のようにM君に逐一命令を出します。命令を出しながらM君がどういう動作をたくさんやっているかもメモしていきます。隣の部屋からお茶碗を持ってくるという動作だと多分、「足を動かして歩く」あたりになるでしょう。そして、たくさんやっている動作が分かったら、M君にしばらく寝て貰って、その場でマニュアルを書くのです。マニュアル作成は「歩く」とか限定されたものだから速くできるでしょう。

また、お茶碗を取りに行ったときに核攻撃を受けた場合はS君がまた登場し、首相官邸に危機管理センターのメンバーを招集するように、逐一命令を出すようにします。

こんな感じで社長は一晩待たないでもお茶が飲めるようになりました。めでたしめでたし。
S君のように良く使うところだけ実行中にマニュアルを作成するのをJITコンパイラと呼びます。JITとはJust In Timeの略で"ちょうど良いときに"とかそんな意味です。

さらに無駄を省く

S君の方法(JITコンパイル)でも大体いいのですが、もっとマニュアルを書く時間を省く方法があります。たとえば、「歩く」でマニュアルを書くわけですが、歩くにも足音をたてないようにすり足にしたり、競歩で速く歩くとかいろいろ場合があるわけです。その中でお茶碗を隣の部屋に取りに行く歩き方だけをマニュアルにすればもっと早くマニュアルができます。
また、M君はただ歩くだけではなく、社内のかわいこちゃん(死語)のDさんがいないか確認する必要があります。見つけたら、「相変わらず可愛いね。今度、一緒に飯でもどう?」と声をかけるためです。これも一緒にマニュアル化したいとか考えると、、通り一遍に「歩く」をマニュアル化するのでは無駄が生じるしDさんを見ることが漏れてしまいます。

そこで、新たにM君の上司に任命されたTさんはM君の命令をしつつ、M君の行動をつぶさに観察します。そして、この動作を繰り返しているというものを発見したら、それをマニュアル化します。たとえば、「隣の部屋からお茶碗を持ってくる」だったら、「一歩踏み出して、Dさんがいないか確認する」ことを繰り返しているので、これだけをマニュアル化するのです。

Tさんのように動作を観察して、動作を繰り返しているところだけをマニュアル化する方法をTracing JITと呼んでいます。こうすると、Tracing JITは万能のようですが、もちろんそんなわけはありません。気が向いたらがあればもっと効率を上げる方法、Tracing JITにつきもののガードとか説明したいと思います。

続く