(57)【要約】【課題】計算機システムで実行される言語処理系における最適化処理技術のおいて、冗長な参照の比較とその結果に応じた分岐を効率的に除去する。【解決手段】計算機システムのプロセッサで実行される言語処理系で、分岐処理（９０３）のうち，まず２つの参照が同じか比較し，結果が真なら分岐し，さもなくば、個々の参照が指示するインスタンスの等価性を検証するメソッドを呼び出し，返戻値が真ならば分岐するものについて，参照間の比較結果が真になる確率が十分小さく（９０４），かつ，参照間の比較とその結果に応じた分岐を除去しても，プログラムの実行結果が変化しない場合（９０６）について，参照間の比較とその結果に応じた分岐を除去（９０８）する。【選択図】図９
2008102740.tif 000002
【特許請求の範囲】
【請求項１】
記憶部と処理部とを有する計算機システムの前記処理部で実行されるコンパイラにおける最適化処理方法であって，
前記コンパイラによるコンパイル対象のコード中にある条件分岐のうち，２つの参照の指示するインスタンスが等価か否かを参照間の比較演算によって確認し，前記演算結果が真であった場合に分岐先に分岐し，真でなければ，前記２つの参照の指示するインスタンスの等価性を検証するためのメソッドを呼び出し，前記メソッドの返戻値が真であった場合に前記分岐先に分岐するものを求め，
求めた前記条件分岐から，前記参照間の比較演算と前記演算結果に応じた分岐を除去しても，当該実行結果が変化しないか否かを調査し，
前記調査の結果が真ならば，前記条件分岐から，前記参照間の比較演算と前記演算結果が真であった場合に分岐する処理を除去する
最適化処理方法。
【請求項２】
請求項１記載の最適化処理方法であって，
前記参照間の比較演算と，前記演算結果が真であった場合に分岐する処理を除去するより前に，実行時プロファイルから，前記参照間の比較演算の結果が真となった頻度を求め，前記頻度が小さいと判断した場合に，前記除去をおこなう
最適化処理方法。
【請求項３】
請求項１記載の最適化処理方法であって，
前記調査では、前記メソッドが必ず真を返戻し，返戻後の実行に影響をおよぼす副作用を生じないか否かを調べる
最適化処理方法。
【請求項４】
記憶部と処理部とを有する計算機システムのための言語処理系であって、
前記処理部を、
コンパイル対象のコード中にある条件分岐のうち，２つの参照の指示するインスタンスが等価か否かを参照間の比較演算によって確認し，前記演算結果が真であった場合に分岐先に分岐し，真でなければ，前記２つの参照の指示するインスタンスの等価性を検証するためのメソッドを呼び出し，前記メソッドの返戻値が真であった場合に前記分岐先に分岐するものを求め，
求めた前記条件分岐から，前記参照間の比較演算と前記演算結果に応じた分岐を除去しても，実行結果が変化しないか否かを調査し，
前記調査の結果が真ならば，前記条件分岐から，前記参照間の比較演算と前記演算結果が真であった場合に分岐する処理を除去する
よう実行させる
言語処理系。
【請求項５】
請求項４記載の言語処理系であって，
前記言語処理系は、静的コンパイラと、前記中間コードを実行するインタプリタと動的コンパイラと実行時ライブラリとから構成される実行環境とからなり、
前記処理部を、
前記静的コンパイラによって、前記ソースコードを前記中間コードへ変換し、
前記インタプリタが、前記中間コードが含む分岐処理を実行する際、前記分岐に関する情報を実行プロファイルに記録し、
前記動的コンパイラが、求めた前記条件分岐から，前記参照間の比較演算と前記演算結果に応じた分岐を除去しても，前記実行結果が変化しないか否かを調査するに際し、前記実行時プロファイルを参照する
よう実行させる
言語処理系。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，プログラミング言語向け言語処理系における最適化処理技術に関するものである。
【背景技術】
【０００２】
オブジェクト指向のプログラミングでは，条件分岐のコードを記述することがしばしばある。図1のコードは条件分岐のコードであって，2つの条件のいずれかが成立した場合に分岐をおこなう。具体的には，まず，2つの変数o1，o2が格納する参照が等しいか比較し，比較結果が真であれば分岐し，if文に続く中括弧内の処理をおこなう。さもなければ変数o1が指示するインスタンスをレシーバとしてメソッドequals()を呼び出す。ここでメソッドequals()は，引数としてうけとった参照が指示するインスタンスと，レシーバが等価か検証するためのメソッドであるとする。そして，メソッド呼出しの結果が真であれば分岐し，if文に続く中括弧内の処理をおこなう。分岐をおこなわなかった場合にはif文に続く中括弧内の処理を飛ばして処理を先に進める。
【０００３】
ところで，図１のコードは，最初の分岐条件である参照同士の比較を省いた図２のコードと実質的に同じ役割を果たす場合が多い。図１のコードと図２のコードを比較すると，図１の方が，コード量が多いことが判る。それにもかかわらず，プログラマがしばしば，図２のコードではなく，図１のコードを書くことの目的は，メソッド呼出しによる実行速度の劣化を回避することにある。メソッド呼出しの実行に大きなコストがかかることが多く，もし，よりコストの小さい参照同士の比較によって，等価だと確かめることができるなら，その方がメソッド呼出しを回避できる分，実行を高速化できる。
【０００４】
既存のコンパイラは，図１のコードに対して，最適化を適用することがある（非特許文献１）。具体的には，フロー解析の結果，参照同士の比較結果が必ず真または偽になると判った場合には，比較の処理を，真または偽で置き換え，比較の手間を省く。なお，最適化は適用すると必ず性能を改善できる類のものだが，最適化の中には，適用すると逆に性能劣化を招きうるものもある。そこで既存のコンパイラの中には，最適化をどう適用するべきか判断するために，実行プロファイルを用いるものもある（非特許文献２）。
【０００５】
【非特許文献１】Alfred V. Aho, Ravi Sethi, and Jeffrey D. Ullman: Compilers Principles, Techniques, and Tools, pp.592, Addison-Wesley, 1986.
【非特許文献２】Karl Pettis and Robert C. Hansen: Profile Guided Code Positioning, Proceedings of the ACM SIGPLAN 1990 conference on Programming Language Design and Implementation, pp.16-27, 1990.
【発明の開示】
【発明が解決しようとする課題】
【０００６】
図１のコードの実行には，図２のコードを実行する場合より，大きなコストがかかる場合がある。具体的には，参照同士の比較結果が偽の場合，図１のコードではメソッド呼出しに加えて参照同士の比較もおこなうことから，メソッド呼出しのみをおこなう図２のコードより，実行に大きなコストがかかる。したがって参照同士の比較結果が頻繁に偽になる場合には，図１のコードを使うと，図２のコードを使う場合よりも，むしろプログラムの実行が遅くなるという問題がおきる。
【０００７】
本発明は、冗長な参照間の比較を除去することにより実行効率をあげうる、言語処理系における最適化処理方法、及びそのプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
上記目的を達成するため、本発明においては、記憶部と処理部とを有する計算機システムの処理部で実行されるコンパイラにおける最適化処理方法であって，コンパイラによるコンパイル対象のコード中にある条件分岐のうち，２つの参照の指示するインスタンスが等価か否かを参照間の比較演算によって確認し，その演算結果が真であった場合に分岐先に分岐し，真でなければ，２つの参照の指示するインスタンスの等価性を検証するためのメソッドを呼び出し，メソッドの返戻値が真であった場合に分岐先に分岐するものを求め，求めた条件分岐から，参照間の比較演算とその演算結果に応じた分岐を除去しても，実行結果が変化しないか否かを調査し，この調査の結果が真ならば，条件分岐から，参照間の比較演算とその演算結果が真であった場合に分岐する処理を除去する最適化処理方法、及びその言語処理系を構成する。
【０００９】
また，本発明においては、コンパイル対象のプログラムに関する実行プロファイルが利用可能である場合には，条件分岐中にある比較演算結果が真となる頻度を求め，頻度が小さいと判断した場合に限って上記の除去を実施する最適化処理方法、及びその言語処理系を構成する。
【００１０】
なお、本明細書において、「言語処理系」とは、プログラミング言語で記述されたプログラムを計算機上で実行するためのソフトウエアのことを言う。また、プロセッサを処理部、主記憶とハードディスクを記憶部と呼ぶことがある。
【発明の効果】
【００１１】
冗長な比較演算および分岐処理の除去により，プログラムの実行を高速化できる。
【発明を実施するための最良の形態】
【００１２】
本発明を実施する最良の言語処理系、及びそれを用いた計算機システムは，コンパイラと，ソースコード中にある個々の分岐の分岐確率を求める処理系からなる。分岐確率を求める処理系は，プロファイラや，あるいは分岐確率を静的に解析する処理系，プログラマがソースコード上に記述した分岐確率に関する指示文を解釈する処理系として実現できる。以下、本発明の最良の実施形態を、図面を用いて説明する。
【実施例１】
【００１３】
本発明の第一の実施例である、言語処理系とそれを実行する計算機システムを図３に示す。図３の計算機システムはプロセッサ３０１，主記憶３０２，ハードディスク３０３，ＤＶＤ−ＲＯＭ（Digital Versatile Disc  Read Only Memory）読み取り装置３０４と，これらを結ぶバス３０５からなる。図３の計算機システムは，ＤＶＤ−ＲＯＭ３０６から，本実施例の言語処理系３０７を読み取り，バス３０５を介してハードディスク３０３にインストールする。なお、言語処理系のインストールは、ＤＶＤ−ＲＯＭ３０６のような可搬記録媒体を使う場合のみならず、計算機システムの図示されていないネットワークインターフェースを用い、ネットワークからインストールすることも可能である。本実施例の言語処理系を実行する際には，ハードディスク３０３にインストールした言語処理系３０７を，バス３０５を介して主記憶３０２に読み込み，プロセッサ３０１で実行する。
【００１４】
さて、図３に明らかなように、言語処理系３０７は，静的コンパイラ３０８と実行環境３０９から構成され，実行環境３０９は，インタプリタ３１０と動的コンパイラ３１１，実行時ライブラリ３１２を含む。インタプリタ３１０はプロファイラ３１３を含み，動的コンパイラ３１１は最適化処理３１４を含む。
【００１５】
次に、本実施例の言語処理系３０７を使って，ソースコード３１５に記述したプログラムを実行するまでの過程を図４に示す。上述の通り、言語処理系３０７は主記憶３０２に読み込まれ，プロセッサ３０１で実行される。図４の過程では，まず，処理４０１でソースコード３１５を静的コンパイラ３０８によってコンパイルし，中間コード３１６に変換する。
【００１６】
続いて，処理４０２で中間コード３１６をインタプリタ３１０に入力してプログラムの実行を開始する。処理４０１でソースコード３１５を中間コード３１６に変換する理由は，ソースコード３１５のままインタプリタ３１０に解釈実行させると解釈に大きなコストがかかるからである。処理４０１におけるコンパイル作業では，出力するコードを中間コード３１６ではなく，機械コードとすることもでき，機械コードにはインタプリタ３１０を使わずにプロセッサ３０１で直接実行できるという利点があるが，一方で中間コードには機種非依存性を確保しうるという利点があり，本実施例では，処理４０１で出力するコードを中間コード３１６にする。
【００１７】
中間コード３１６の一実施例を図５に示す。図５の中間コード３１６は図１のソースコードに対応するもので，まずローカル変数o1，o2の値を読み込んで比較し，結果が真であればラベルEQUAL以下の処理をおこない，さもなくばローカル変数o1，o2を読み込んで仮想メソッドequals()を呼び出し，返戻値が真ならばラベルEQUAL以下の処理をおこない，さもなくばラベルEQUAL以下の処理をスキップしてラベルSKIPの先に進む。
【００１８】
図４に戻り，実行の処理４０２において，インタプリタ３１０は中間コード３１６が含む分岐処理を実行する際に，どちらの方向に分岐したかという情報をプロファイラ３１３に与え，プロファイラ３１３は与えられた情報を実行プロファイル４０３に記録する。実行プロファイル４０３は主記憶３０２上に形成される。
【００１９】
実行プロファイル４０３の一実施例を図６に示す。図６の実行プロファイル４０３は図５の中間コードを対象として採取したもので，分岐をおこなう中間コードの位置（オフセット）を記述する欄６０１と，この中間コードを実行した回数を記入する欄６０２，実際に分岐した回数を記載する欄６０３を持つ。図６から，図５の中間コードの先頭から２バイト目で分岐する確率が０％で，１１バイト目で分岐する確率が５０％であることが判る。
【００２０】
図４に戻り，インタプリタ３１０は実行の処理４０２の過程で，中間コード３１６中にある個々のメソッドの実行頻度を求め，頻度が高いものについて，動的コンパイラ３１１にコンパイルするよう指示する。指示を受け取った動的コンパイラ３１１は，中間コード３１６をコンパイルし，機械コード形式の動的コンパイル済みコード４０４に変換する。このコンパイルの過程で，最適化処理３１４が適用される。最適化処理３１４は，実行プロファイル４０３を参照して，どの分岐に最適化を適用すべきか判断する。
【００２１】
インタプリタ３１０は，メソッド呼出しを実行する際に，呼出先のメソッドに対応する動的コンパイル済みコード４０４があるか調べ，あるならば自身で当該メソッドを解釈実行する代わりに，動的コンパイル済みコード４０４を呼び出す。インタプリタ３１０および動的コンパイル済みコード４０４は，それぞれ実行中に実行時ライブラリ３１２中のメソッドを呼び出すことがある。
【００２２】
動的コンパイラ３１１の一実施例を図７に示す。図７の動的コンパイラは，まず，処理７０１において中間コード３１６を入力として受け取って，コンパイラの内部表現７０２に変換する。変換の過程で実行プロファイル４０３を読み込み，分岐を表す内部表現に，分岐確率情報を付与する。
【００２３】
内部表現７０２の一実施例を図８に示す。図８の内部表現７０２は図５の中間コード３１６に対応するもので，５つのノード８０１〜８０５からなる。ノード８０１，８０２はそれぞれ，中間コード３１６における１番と２番の局所変数，つまり図１における変数o1，o2を表わす。ノード８０３は，図５において，オフセット２の位置にある中間コードif_acmpeqに対応する処理，つまり，参照間の比較とその結果による分岐を表わす。ノード８０３には比較対象，分岐先，分岐確率，後続処理を記入する欄がある。比較対象の欄は，比較をおこなう参照の内部表現への参照を記入する欄で，ノード８０３では比較対象となる局所変数１および２のノード８０１，８０２を参照する。分岐先の欄は，比較結果が真であった場合の分岐先への参照を記入する欄で，ノード８０３ではラベルEQUAL以下の処理に対応する内部表現を参照する。分岐確率の欄は，分岐が発生する確率を記入するためのものである。ノード８０３の分岐確率の欄には，分岐確率が0%と記入されているが，この分岐確率は図６に示した実行プロファイル４０３から求めたものである。後続処理の欄は，分岐しなかった場合に，後続して実行すべき処理を表わす内部表現への参照を記入する欄である。ノード８０３では，後続処理の欄からノード８０４を参照する。
【００２４】
ノード８０４は，図５において，オフセット１１の位置にある中間コードifeqに対応する分岐処理を表わす。ノード８０４には，分岐条件と分岐先，分岐確率，後続処理を記入する欄がある。分岐条件の欄は，分岐をおこなうか否かを定める式の中間表現への参照を記入する欄で，ノード８０４では分岐条件の欄にノード８０５への参照が記入されている。分岐先の欄は，分岐条件が真であった場合の分岐先を記入する欄で，ノード８０４ではラベルEQUAL以下の処理に対応する内部表現を参照する。分岐確率の欄は，分岐が発生する確率を記入するためのものである。ノード８０４の分岐確率の欄には，分岐確率が50%と記入されているが，この分岐確率は図６の実行プロファイル４０３から求めたものである。後続処理の欄は，分岐しなかった場合に，後続して実行すべき処理を表わす内部表現への参照を記入する欄である。ノード８０４では，後続処理の欄から，ラベルSKIP以下の処理に対応する内部表現を参照する。
【００２５】
ノード８０５は，図５において，オフセット８の位置にある中間コードinvokevirtualに対応する仮想呼出しを表わす。ノード８０５には，呼出先と引数，後続処理を記入する欄がある。呼出先の欄は，呼出先の仮想関数を記入するための欄で，ノード８０５では呼出先がメソッドequals()であると記入されている。引数の欄はメソッドに与える引数を表わす内部表現への参照を記入すべき欄である。ノード８０５の引数の欄からは，引数になる局所変数１および２を表わすノード８０１，８０２を参照する。
【００２６】
図７に戻り，処理７０１が終わったら，内部表現７０２に対して，本実施例の最適化処理３１４を適用する。最後に処理７０３で，最適化後の内部表現７０２を，動的コンパイル済みコード４０４に変換する。
【００２７】
次に、最適化処理３１４の一実施例を図９に示す。図９では，まず処理９０１で内部表現７０２を走査して，分岐処理のうち，２つの参照の指示するインスタンスが等価か，まず参照間の比較演算によって確認し，比較結果が真であった場合に分岐し，さもなくば，２つの参照の指示するインスタンスの等価性を検証するためのメソッドを呼び出し，返戻値が真であった場合に分岐するものを求める。
【００２８】
メソッドが等価性を検証するためのものか否か調べる方法は，プログラミング言語に依存するが，たとえばJava（登録商標）言語では，言語処理系が等価性を検証するためのメソッドの宣言を与えるので，呼出先のメソッドが，この宣言に対応するものか，呼出先のメソッドのシグネチャを通じて調べることで，等価性を検証するためのものか否か判断できる。図８の内部表現は，処理９０１で求める分岐処理に相当する。また，処理９０１で検出する分岐処理のメソッド呼出しの部分は，必ずしもメソッド呼出しそのものである必要はなく，メソッド呼出しにインライン展開などの最適化を適用したあとの内部表現にもなりうる。
【００２９】
なお，処理９０１は本実施例の最適化対象の候補となる分岐処理を検出する処理だが，本実施例の最適化対象となる分岐処理は，必ずしも，参照間の比較結果による分岐の直後に，メソッド呼出しの結果による分岐をおこなうものである必要はない。たとえば図１０のプログラムでは，変数o1とo2の比較と，メソッド呼出しo1.equals(o2)の間に，変数o3とo4の比較を挟んでおり、参照間の比較結果による分岐の直後に、メソッド呼出しの結果による分岐を行っていない。しかし、本発明においては、図１０の変数o1とo2を対象とした比較およびメソッド呼出しの結果による分岐処理を最適化対象にしてもよい。
【００３０】
すなわち、本発明の最適化対象となる分岐処理は，２つの参照の指示するインスタンスが等価か，まず参照間の比較演算によって確認し，比較結果が真であった場合に分岐し，さもなくば，前記２つの参照の指示するインスタンスの等価性を検証するためのメソッドを呼び出し，返戻値が真であった場合に分岐するもので，なおかつ，参照間の比較結果による分岐を除去してもプログラムの実行結果が変化しないものである。ただし本実施例では，処理９０１で検出する分岐処理は，参照間の比較結果による分岐の直後に，メソッド呼出しの結果による分岐をおこなうものとする。
【００３１】
さて、図９において、処理９０１に続いて，判断９０２で，処理９０１で分岐処理を求められたか調べ，求められたならば処理９０３に進み，さもなくば最適化をあきらめる。処理９０３では，求めた分岐処理中にある，参照間の比較結果による分岐がどちらの方向に分岐するか，内部表現中の分岐確率を参照して調べる。続く判断９０４では前記調査の結果から，参照間の比較結果が真になる確率が低いか判断し，低いと判断したならば処理９０５に進み，さもなくば最適化をあきらめる。この確率の閾値は、例えば３％に設定される。処理９０５と，それに続く判断９０６では，処理９０１で検出した分岐処理から，参照間の比較と，その結果に応じた分岐を除去しても，プログラムの実行結果が変化しないか調査，判断する。
【００３２】
具体的には，まず，処理９０５において，内部表現７０２にフロー解析を適用して，処理９０１で求めた分岐処理中にあるメソッド呼出しのレシーバがとりうるクラスの集合を求め，続く判断９０６で分岐処理中にあるメソッド呼出しの呼出先候補となるメソッドの集合を，処理９０１で求めたレシーバのクラスの集合から求め，求めたメソッドの集合に属する全メソッドが最適化対象メソッド一覧９０７に載っているか調べる。最適化対象メソッド一覧９０７は，等価性を検証するメソッドのうち，比較対象の２つの参照が互いに等しいとき，次の２つの条件を満たすものを格納する。
【００３３】
２つの条件の第一は，必ず真を返戻することであり，第二は，返戻までの間に，返戻後の実行に影響をおよぼす副作用を生じないことである。最適化対象メソッド一覧９０７は，動的コンパイラ３１１が自動的に生成することも，言語処理系の実装者が手動で作成することもできるが，本実施例では言語処理系３０７の実装者が手動で作成するものとする。言語処理系３０７の実装者が最適化対象メソッド一覧９０７を作成する場合，実行時ライブラリ３１２中にある等価性を検証するメソッドのうち，前記の２条件を満たすものを最適化対象メソッド一覧９０７に登録する。この最適化対象メソッド一覧９０７は、図３に示した動的コンパイラ３１１の一部として記憶される。最適化対象メソッド一覧９０７の実施例を図１１に示す。図１１の最適化対象メソッド一覧９０７には，条件を満たすメソッドの名前を記録する欄１１０１があり，唯一，クラスjava.lang.Integerのメソッドequals()が登録されている。
【００３４】
図９に戻り，判断９０６で全呼出先候補のメソッドが最適化対象メソッド一覧９０７に載っていたらならば処理９０８に進み，さもなくば最適化を諦める。処理９０８では内部表現７０２に対して最適化を適用し，分岐処理が含む参照の比較と，その結果に応じた分岐を除去する。図８の内部表現７０２に処理９０８の最適化処理を適用すると，図１２の内部表現７０２になる。処理９０８が終わったら最適化は終了である。以上の最適化処理により、プログラムの実行を高速化できる。
【図面の簡単な説明】
【００３５】
【図１】ソースコードの一例を示す図。
【図２】ソースコードの他の例を示す図。
【図３】本発明の第一の実施例の計算機システムの構成を示す図。
【図４】第一の実施例の言語処理系３０７のフローを示す図。
【図５】第一の実施例の中間コード３１６の一実施例を示す図。
【図６】第一の実施例の実行プロファイル４０３の一実施例を示す図。
【図７】第一の実施例の動的コンパイラ３１１の一実施例を示す図。
【図８】第一の実施例の内部表現７０２の一実施例を示す図。
【図９】第一の実施例の最適化処理３１３の一実施例を示す図。
【図１０】第一の実施例のソースコードの例を示す図。
【図１１】第一の実施例の最適化対象メソッド一覧９０７の一実施例を示す図。
【図１２】第一の実施例の最適化後の内部表現７０２の一実施例を示す図。
【符号の説明】
【００３６】
３０１…プロセッサ、３０２…主記憶、３０３…ハードディスク、３０４…ＤＶＤ−ＲＯＭ読み取り装置、３０５…バス、３０６…ＤＶＤ−ＲＯＭ、３０７…言語処理系、３１１…動的コンパイラ、３１４…最適化処理、７０２…コンパイラの内部表現、９０１…最適化候補の分岐処理を求める処理、９０２…分岐があったか否かの判断、９０３…分岐確率を求める処理、９０４…分岐確率が十分低いか否かの判断、９０５…フロー解析によってレシーバのクラスを求める処理、９０６…クラスに対応するメソッドが最適化対象か否かの判断、９０７…最適化対象のメソッド一式を登録する表、９０８…分岐を除去する処理。
【図１】
2008102740.tif 000003
【図２】
2008102740.tif 000004
【図３】
2008102740.tif 000005
【図４】
2008102740.tif 000006
【図５】
2008102740.tif 000007
【図６】
2008102740.tif 000008
【図７】
2008102740.tif 000009
【図８】
2008102740.tif 000010
【図９】
2008102740.tif 000011
【図１０】
2008102740.tif 000012
【図１１】
2008102740.tif 000013
【図１２】
2008102740.tif 000014