実行時コンパイラはどうやって高速処理を実現しているのか?【課題と可能性】:ポッドキャスト抜粋

Couger Team
Couger
Published in
Jul 6, 2022

バーチャルヒューマンエージェントの行動制御エンジンを開発する土田悠貴とCEO石井敦が、リアルタイムにコンパイルしてプログラムを動かす実行時コンパイラ(あるいは、JITコンパイラ)について語ります。

石井:世の中のシステムで最も重要かつスピードを求められるものは、今でも大体CかC++で作られています。CやC++は非常に実行速度に優れていて高度なものが作れるのですが、逆に気軽にスピーディーにコーディングするのは難しいという側面があります。

人間の行動には、習慣のように無意識に着実にやらなければいけないものと、パッと思いついたり指示されたことを柔軟にこなすものがあります。つまり、着実性と柔軟性の両方を兼ね備える必要があるわけですね。

そんな中で、C++は、Cの安定かつ高度なものができる点と構造的にプログラミングできるという両方を兼ね備えていて、重要なシステムによくC++は使われています。実行速度もC++が一番早いと思いますが、パフォーマンスに関して土田さんどう思われますか?

石井敦(クーガー CEO)

土田:C++は速いのですが、石井さんが言ったように開発を早いサイクル回していくのはCほどではないが難しいですね。やはり静的型付け言語で書く面倒くささと、1回コンパイルしないといけない点が、スピーディーさにブレーキをかけていると思います。JavaScriptだと書いてポッと渡せば、ただただ実行してくれるじゃないですか。

石井:そうですね。

土田:大きなプロジェクトだと、コンパイルで下手すると30分とか止まったりするので。その点、JavaScriptとかインタープリタ系の言語はいくら大きくなっても即実行できる。そのスピーディーさはとても勝てるものじゃないですよね。

石井:コンパイラ言語にもJavaなど色々あり、実行速度という点ではC系が一番速いですが、C++はCの扱いにくい部分をそのまま拡張しているところがあるのでさらに事故が起きやすいと思います。その点、JavaScript、PHP、Perlのような気軽に実行できるインタープリタ言語は有効ですよね。一方で読み込んだ後に実行するので、読み込みのオーバーヘッドが大きいことが課題ですよね。

土田:そうですね。結局、そのまま実行しているのではなく、実行するのに効率の良い中間言語に一度落とし込むプロセスが入っているので。

石井:その中で出てきたのが「JITコンパイラ(Just In Time Compiler)」というわけです。我々が活用をしているJavaScriptエンジン「V8」の中でもJITコンパイラが動いていて、JavaScriptでC++並みの実行速度を実現しています。具体的にはどういう動きになっているのですか?

土田悠貴(クーガー ヒューマンエージェントアーキテクト)

土田:JITコンパイラの動きを簡単に言うと、統計情報を取って最適化をかけているということですね。この関数がよく使われているから、これは最適化の対象だという扱いになるとJITコンパイラ側でコードや結果を差し替えをします。この辺りは数学の関数と一緒で、与えるものが同じであれば基本的には結果も同じだよねということです。

例えば、与えるものが1と2で足し算をしてくれる関数があるとして、常に同じ値を与えているなら結果の3だけ返せばいい。そういう足し算すらしないということがJITコンパイラの中で行われています。

あとはインライン展開ですね。関数を呼ぶ際にオーバーヘッドで時間がかかることがありますよね。そこでその処理をその場に全部置いておいて、関数を読み出すオーバーヘッドを減らしたりもします。

それから、V8エンジンだとダイナミックにキャッシュしてくれますね。なので、それで結果を置き換えるというのもよくやっていますね。

石井:それを最初にロードしたときに作るのですね。

土田:いいえ。JITなので実行時ですね。確かにV8エンジンに関しては最初にコンパイルするところもありますが、最適化は殆どされません。最適化は、実行時に統計を取って重いものを解消するのが基本です。理由は、無駄な最適化をかけないためです。

ただ最適化しても、逆に重くなったり、メモリーを食いすぎたり、非効率な部分が出てしまうのです。それを避けるために、統計を取るのだと思います。

石井:そこがインタープリタとの違いですか?

土田:そうですね。ただ実際のところV8エンジンはインタープリタのレイヤーとJITのレイヤーの2つで構成されています。JavaScriptのコードを投げると、まずはインタープリタが最適化は殆どされていないが実行はできる形にします。それを実行して情報がどんどん溜まっていった結果、JITが最適化できるところをガンッと差し替える。この2段ステップで実行自体はされています。

石井:ちなみに全く同じコードが、2回目実行されるときはどうなるんですか?

続きはポッドキャストでお聴きください!

YouTube
Apple Podcast
Google Podcast
Spotify

--

--

Couger Team
Couger
Editor for

We develop next generation interface “Virtual Human Agent” and XAI(Explainable AI).