実行時情報を活用した第一級継続のオーバーヘッド削減手法

氏名:片桐 国建

概要:

継続を第一級のオブジェクトとしてキャプチャする第一級継続という言語機能が知られている。この機能の用途は様々であるが、第一級継続機能は、例外処理を利用したプログラムへ変換することにより、言語処理系には手を入れることなく実現できることが知られている。JavaScriptにおいては、長時間に渡る処理やブロックする処理によって他のイベント処理が停滞するのを避けるために第一級継続が利用できる場面がある。既に知られているプログラム変換では、ほとんどの関数呼び出しの部分にtry-catchを挿入する。継続のキャプチャは例外処理の伝播を利用することで、通常ではアクセス不可能な関数のローカルな情報へアクセスし、必要な情報を保存することで実現する。

例外処理が含まれたプログラムは処理系の最適化を抑制する。近年、JavaScriptの処理系の開発は活発に進んでおり多くの高度な最適化が行われている。しかし、第一級継続の実現のために例外処理が多く挿入されたプログラムは、この最適化が抑制され、例外処理の挿入に起因するオーバーヘッドが大きく増加する。JavaScriptのような動的な言語では静的な解析によってtry-catch挿入を抑制することが困難である。

本研究ではこの問題を解決するため、実行時情報を活用し動的にtry-catchを挿入/削除することでオーバーヘッドを削減する手法を提案する。また、本手法では投機的にtry-catchの削除を行うため、大域脱出と再実行によって動的にtry-catchの挿入を行い、try-catchが不足していた場合でも継続をキャプチャできる手法を提案している。また、1つの関数に対して2種類の本体を持つように変換し、2つの本体を呼び分けることで、動的なtry-catchの挿入と削除を実現する。本研究においては、動的なtry-catchの挿入と削除に関する戦略として、まず全ての関数呼び出しにtry-catchを挿入した上で、実行時情報を元に順次try-catchを削除していくことで高速化する戦略を示した。性能評価においては、第一級継続を用いたベンチマークプログラムによって提案手法が有効に機能するかを検証し、本研究の対象となるケースのプログラムにおいて性能向上することを確認した。


[修論pdf][研究室内部向け情報]