(57)【特許請求の範囲】
【請求項１】
ゾーン１０進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する方法であって、コンピュータが、
メモリ内に読み込まれた前記バイナリコード中から、各変数について、ゾーン１０進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出するステップと、
前記検出された領域内において、ゾーン１０進数形式の変数を２進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを前記バイナリコードから削除する処理、又はそれらの組み合わせの処理を行うステップと
を実行することを含む、前記方法。
【請求項２】
前記処理を行うステップの後に、前記コンピュータが、桁合わせをするための剰余算命令のコードを前記バイナリコードから削除するステップをさらに実行することを含む、請求項１に記載の方法。
【請求項３】
前記桁合わせをするための剰余算命令のコードを前記バイナリコードから削除するステップが、
（Ａ）前記変数がｎ１桁であり、さらに当該変数をｎ２桁にする剰余算命令についてｎ１≧ｎ２の条件を満たす場合には、前記ｎ１桁に桁合わせをするための剰余算命令のコードを前記バイナリコードから削除するステップと、
（Ｂ）前記（Ａ）の条件下にない場合には、
（ａ）前記変数が符号なしの場合に、
（ａ１）前記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、２進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、前記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを前記バイナリコードから削除するステップと、
（ａ２）前記（ａ１）以外の場合において、当該（ａ１）の条件を満たさない演算の前で桁が正しいことを保証するステップと、
（ｂ）前記変数が符号ありの場合に、
（ｂ１）前記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、当該連続している一連の演算の式の途中で符号が変わらないこと及び２進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、前記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを前記バイナリコードから削除するステップと、
（ｂ２）前記（ｂ１）以外の場合において、当該（ｂ１）の条件を満たさない演算の前で桁が正しいことを保証するステップと
を含む、請求項２に記載の方法。
【請求項４】
前記桁合わせをするための剰余算命令のコードを前記バイナリコードから削除するステップの後に、前記コンピュータが、前記バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行うステップをさらに実行することを含み、
前記軽減が、前記剰余を求める演算を下記式：
結果 =  (分子 < 分母 && 分子 >= 0) ? 分子 : (分子 % 分母)
に置き換えることによって行われる、請求項２に記載の方法。
【請求項５】
前記（ａ２）の保証するステップが、前記（ａ１）の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを前記バイナリコードに挿入するステップを含む、請求項３に記載の方法。
【請求項６】
前記（ｂ２）の保証するステップが、前記（ｂ１）の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを前記バイナリコードに挿入するステップを含む、請求項３に記載の方法。
【請求項７】
前記検出するステップが、
前記バイナリコード中の各ブロックにおいて、副作用となり得る命令の後にアクセスがある変数の集合体（以下、GEN(B)ともいう）及び前記各ブロックにおいて、副作用となり得る命令が存在する場合には変数全体の集合体（以下、KILL(B)ともいう）を作成するステップであって、前記KILL(B)は、副作用となり得る命令が存在しない場合には空集合である、前記作成するステップと、
各ブロックの先頭における変数の集合（以下、IN(B)ともいう）を、各ブロックの終わりにおける変数の集合（以下、OUT(B)ともいう）、前記GEN(B)及び前記KILL(B)から求めるステップと、
各ブロック内の各命令において変更された集合情報を前記各ブロック内の各命令に付加情報としてそれぞれ設定するステップであって、前記集合情報は前記IN(B)を基にして求められる、前記設定するステップと、
前記各命令に設定された付加情報について、各変数が連続している領域を、当該変数に対する副作用となり得る命令のない領域とするステップと
を含む、請求項１に記載の方法。
【請求項８】
前記作成するステップが、
各ブロック内の命令が変数へのアクセスであるかどうか、及び、前記命令が副作用となり得る命令であるかどうかを判定するステップと、
前記判定を各命令の実行順に繰り返すステップと、
前記判定の結果から、前記GEN(B)及び前記KILL(B)を作成するステップと
を含む、請求項７に記載の方法。
【請求項９】
前記OUT(B)及び前記IN(B)が、
OUT(B) = (IN(B) - KILL(B)) ∪ GEN(B)
IN(B) = ∩N∈Pred(B) OUT(N)
のデータ・フロー方程式から求められ、OUT(N)は、上記式で処理中のブロックBの直前にあるブロックNの終わりにおける変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である、請求項７に記載の方法。
【請求項１０】
前記設定するステップが、
各ブロック内の命令が変数へのアクセスであるかどうか、及び、前記命令が副作用となり得る命令であるかどうかを判定し、前記IN(B)の集合情報を変更するステップと、
前記各ブロック内の各命令において変更された集合情報を前記ブロック内の各命令に付加情報としてそれぞれ設定するステップであって、前記集合情報は前記IN(B)を基にして求められる、上記設定するステップと、
前記判定及び前記IN(B)の集合情報の変更を各命令の実行順に繰り返すステップと
を含む、請求項７に記載の方法。
【請求項１１】
前記PACK/UNPACKのコードを前記バイナリコードから削除する前記処理が、
（ｃ１）副作用となり得る命令のない前記領域中に書き込みがある変数の場合に、前記副作用となり得る命令のない前記領域内にあるゾーン１０進数形式の変数に対するPACK/UNPACKのコードのうち、最初と最後の型変換命令以外のコードを前記バイナリコードから削除する処理と、
（ｃ２）副作用となり得る命令のない前記領域中に書き込みがない変数の場合に、前記副作用となり得る命令のない前記領域内にあるゾーン１０進数形式の変数に対するPACK/UNPACKのコードのうち、最初の型変換命令以外のコードを前記バイナリコードから削除する処理と
を含む、請求項１に記載の方法。
【請求項１２】
前記PACK/UNPACKのコードを前記バイナリコードから削除する前記処理が、
（ｃ３）前記（ｃ１）及び／又は（ｃ２）の前記型変換命令以外のコードを削除する際に、当該削除するコードに付随する符号処理のコードを前記バイナリコードからさらに削除する処理をさらに含む、請求項１１に記載の方法。
【請求項１３】
ゾーン１０進数形式の変数を２進型へ変換する前記処理が、当該変換処理前後のコスト差を見積もり、変換処理後の見積もりコストが変換処理前の見積もりコストよりも小さいことを条件に行われ、次に、
前記PACK/UNPACKのコードを前記バイナリコードから削除する処理が、前記コスト差の見積もりの計算によって前記変換する処理がされなかった部分について行われる、請求項１に記載の方法。
【請求項１４】
前記変換処理前後の前記コスト差が、下記式：
コスト差＝変数がゾーン１０進数形式である場合と２進型である場合とでの当該変数へアクセスする命令のコスト差にその実行頻度を乗じた値
＋２進型への変換コストに各前記検出された領域内へ入る実行頻度を乗じた値
＋ゾーン１０進数形式への変換コストに各前記検出された領域から出る実行頻度を乗じた値
＋桁合わせをするための剰余算命令のコストにその剰余算命令の実行頻度を乗じた値
によって求められる、請求項１３に記載の方法。
【請求項１５】
前記副作用となり得る命令が、ゾーン１０進数形式の変数を２進型への型変換を行うと処理矛盾を起こし得る命令、又は、PACK/UNPACKのコードを削除すると処理矛盾を起こし得る命令である、請求項１に記載の方法。
【請求項１６】
前記副作用となり得る命令が、
コンパイル・スコープ外の命令を実行する命令、
アプリケーションから観測可能な例外を起こし得る命令、及び、
前記変数のベースアドレス・レジスタ又はインデックス・レジスタを変更する命令
の少なくとも１つである、請求項１に記載の方法。
【請求項１７】
ゾーン１０進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する装置であって、
各変数について、ゾーン１０進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する検出部と、
前記検出された領域内において、ゾーン１０進数形式の変数を２進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを前記バイナリコードから削除する処理、及びそれらの組み合わせの処理のうちの１つを行う処理部と
を備えている、前記装置。
【請求項１８】
前記処理が前記処理部によって行われた後に、桁合わせをするための剰余算命令のコードを前記バイナリコードから削除する削除部をさらに備えており、
前記削除部は、
（Ａ）前記変数がｎ１桁であり、さらに当該変数をｎ２桁にする剰余算命令についてｎ１≧ｎ２の条件を満たす場合には、前記ｎ１桁に桁合わせをするための剰余算命令のコードを前記バイナリコードから削除し、
（Ｂ）前記（Ａ）の条件下にない場合には、
（ａ）前記変数が符号なしの場合に、
（ａ１）前記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、２進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、前記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを前記バイナリコードから削除し、
（ａ２）前記（ａ１）以外の場合において、当該（ａ１）の条件を満たさない演算の前で桁が正しいことを保証し、
（ｂ）前記変数が符号ありの場合に、
（ｂ１）前記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、当該連続している一連の演算の式の途中で符号が変わらないこと及び２進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、前記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを前記バイナリコードから削除し、
（ｂ２）前記（ｂ１）以外の場合において、当該（ｂ１）の条件を満たさない演算の前で桁が正しいことを保証する、
請求項１７に記載の装置。
【請求項１９】
ゾーン１０進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する装置であって、
前記バイナリコードを読み込むためのメモリと、
前記メモリ上で前記バイナリコードを最適化するためのプロセッサと
を備えており、
前記最適化が、請求項１〜１６のいずれか一項に記載の方法の各ステップを実行することによって行われる、前記装置。
【請求項２０】
ゾーン１０進数形式の変数へのアクセスを有する言語のバイナリコードを最適化するためのコンピュータ・プログラムであって、コンピュータに、請求項１〜１６のいずれか一項に記載の方法の各ステップを実行させる、前記コンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ゾーン１０進数形式の変数へのアクセスを有する言語のバイナリコード、特にはＣＯＢＯＬのバイナリコードを最適化する技法に関する。
【背景技術】
【０００２】
ＣＯＢＯＬは、１９５９年にアメリカ合衆国で生まれた高級言語であり、種々の言語の中でもその歴史が古い。また、ＣＯＢＯＬ言語は、事務処理系のプログラムを効率よく開発できることから、現在でも基幹システム（例えば、メインフレーム）において使用されている。例えば、インターナショナル・ビジネス・マシーンズ・コーポレーション（登録商標）から販売されているメインフレームであるＩＢＭ（登録商標）  Ｓｙｓｔｅｍ  ｚ（登録商標）上でＣＯＢＯＬのバイナリコードが多く使われている。
【０００３】
ＣＯＢＯＬにおいて、Ｉｎｔ型が何も指定されない場合には、数字は、ゾーン１０進数（Zoned Decimal）形式（外部１０進形式ともいう）として表される。また、ＣＯＢＯＬにおいて、通常の２進演算を行うためには、ＢＩＮＡＲＹ修飾詞が必要である。しかし、多くのＣＯＢＯＬプログラマーは、Ｉｎｔ型として何も指定しない。そのために、ＣＯＢＯＬでは、ゾーン１０進数形式が多く使用されている。
【０００４】
ゾーン１０進数形式は、ＣＯＢＯＬの実行において内部的にはパック形式（内部１０進形式ともいう）に毎回変換される。そのために、性能低下や速度低下が顕著である。
【０００５】
そこで、上記に述べた性能低下や速度低下を改善する為に、ＣＯＢＯＬのソースコードをコンパイルする際に、当該ソースコードを最適化することが行われてきている。当該最適化は、例えば、上記ソースコードに対して１０進進数形式から２進型の演算へ型変換することである。
【０００６】
下記特許文献１は、ＣＯＢＯＬのソースプログラムに対して型変換を行うことを記載する（４頁左上欄３〜１６行）。型変換は、クロック数を比較することによって行われる（４頁右上欄３〜左下欄１１行）。
【０００７】
下記特許文献２は、ＣＯＢＯＬ言語コンパイラでソースプログラム中の変数及び数値データの更新回数と参照回数をカウントし、更新回数が参照回数より多い変数及び数値データにはソースプログラムで指定された型以外にバイナリ型のアロケーションを設け、演算はバイナリ型で行い最後にソースプログラムで指定された型に変換するオブジェクトプログラムを生成することを記載する（要約、特許請求の範囲、段落０００９）。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開平３−１０２４２７号公報
【特許文献２】特開平５−１０８３７０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
上記の通り、ＣＯＢＯＬ言語はその歴史が古いために、場合によってはＣＯＢＯＬのバイナリコード（以下、単に「バイナリコード」ともいう）だけが存在し（または保存されており）、ＣＯＢＯＬのソースコード（以下、単に「ＣＯＢＯＬコード」ともいう）が逸失してしまっている場合がある。このような場合に、ＣＯＢＯＬコードを再コンパイルしてバイナリコードを最適化することができない。従って、ＣＯＢＯＬコードに対してではなく、バイナリコードそれ自体を最適化したいという要望がある。
【００１０】
また、ＣＯＢＯＬコードをコンパイルする際に、ゾーン１０進数によるオーバーヘッドを減らす技術が存在している。例えば、特許文献１及び２のいずれも、ソースコードに対して型変換を行っている。すなわち、特許文献１及び２のいずれも、ＣＯＢＯＬコードに対する最適化を記載する。しかしながら、特許文献１及び２のいずれも、バイナリコードに対する最適化を記載していない。また、バイナリコードに対しては、副作用を起こし得る命令を考慮しなければならない。なぜならば、副作用を起こし得る命令を考慮しないと、元のプログラムと比べて結果が異なる可能性があるからである。従って、ソースコードに対して型変換を行っている特許文献１及び２に記載の技術をバイナリコードの最適化にそのまま適用することはできない。
【００１１】
特許文献１は、型の変換が可能な項目を抽出することを記載する（特許請求の範囲）。特許文献１は、さらに、型の変換が可能な項目が、作業用変数などを変換可能項目としていること、ただし、他プログラムとのインタフェースに使用されている項目については型変換を行うと処理矛盾が生じる可能性があるので型変換を行わず、且つ、プログラム内で作業用に使用されている項目であっても、高級言語の再定義の機能を利用して、別の型属性で参照される項目については、同様に型の変換を行ってはならないことを記載する（３頁左下欄１２〜右下欄４行）。すなわち、特許文献１において、型変換を行うと処理矛盾が生じる可能性がある項目については最適化の対象とならないために、最適化の機会が失われてしまう。
【００１２】
また、型変換のためのコストの見積もりを、特許文献１ではクロック数（サイクル数）で計算し、特許文献２では変数及び数値データの更新回数が参照回数よりも多い場合という判断基準で決定している。しかしながら、特許文献１及び２のいずれも、最適化を行うかどうかのコストを見積もる場合に、各ブロックにおける実行頻度を考慮していない。そのために、コストの見積もり結果が正確でないという問題がある。
【００１３】
以上に述べた問題を解決するために、バイナリコードに対して直接的に最適化を実行することができ、且つ、副作用となり得る命令があるＣＯＢＯＬコード又はそのバイナリコード、特にバイナリコードに対して適用可能な最適化技法が求められている。
【課題を解決するための手段】
【００１４】
本発明者は、メモリ内に読み込まれたバイナリコード中から、各変数について、ゾーン１０進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出し、当該検出された領域内において、最適化処理を行うことによって、上記問題を解決することを見出した。すなわち、本発明は、各変数について、ゾーン１０進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出することを特徴とする。
【００１５】
本発明は、ゾーン１０進数形式の変数へのアクセスを有する言語のバイナリコード、特にはＣＯＢＯＬのバイナリコードを最適化する方法を提供する。当該方法は、コンピュータ、例えばバイナリコード最適化装置が、上記最適化方法を上記バイナリコードに対して適用することによって実行されうる。または、上記方法は、コンピュータ、例えばコンパイラ装置が、上記最適化方法が実装されたコンパイラによってＣＯＢＯＬコードをコンパイルすることによって、上記コンピュータによって実行されうる。上記方法は、コンピュータが、
メモリ内に読み込まれた上記バイナリコード中から、各変数について、ゾーン１０進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出するステップと、
上記検出された領域内において、ゾーン１０進数形式の変数を２進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを上記バイナリコードから削除する処理、又はそれらの組み合わせの処理を行うステップと
を実行することを含む。
【００１６】
本発明の一つの実施態様において、上記コンピュータが、上記処理を行うステップの後に、桁合わせをするための剰余算命令のコードを上記バイナリコードから削除するステップをさらに実行することを含みうる。
【００１７】
本発明の一つの実施態様において、上記桁合わせをするための剰余算命令のコードを上記バイナリコードから削除するステップが、
（Ａ）上記変数がｎ１桁であり、さらに当該変数をｎ２桁にする剰余算命令についてｎ１≧ｎ２の条件を満たす場合には、上記ｎ１桁に桁合わせをするための剰余算命令のコードを上記バイナリコードから削除するステップと、
（Ｂ）上記（Ａ）の条件下にない場合には、
（ａ）上記変数が符号なしの場合に、
（ａ１）上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、２進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除するステップと、
（ａ２）上記（ａ１）以外の場合において、当該（ａ１）の条件を満たさない演算の前で桁が正しいことを保証するステップと、
（ｂ）上記変数が符号ありの場合に、
（ｂ１）上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、当該連続している一連の演算の式の途中で符号が変わらないこと及び２進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除するステップと、
（ｂ２）上記（ｂ１）以外の場合において、当該（ｂ１）の条件を満たさない演算の前で桁が正しいことを保証するステップと
を含みうる。
【００１８】
本発明の一つの実施態様において、上記桁合わせをするための剰余算命令のコードを上記バイナリコードから削除するステップの後に、上記コンピュータが、上記バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行うステップをさらに実行することを含み、
上記軽減が、上記剰余を求める演算を下記式：
結果 =  (分子 < 分母 && 分子 >= 0) ? 分子 : (分子 % 分母)
に置き換えることによって行われうる。
【００１９】
本発明の一つの実施態様において、上記（ａ２）の保証するステップが、上記（ａ１）の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを上記バイナリコードに挿入するステップを含みうる。
【００２０】
本発明の一つの実施態様において、上記（ｂ２）の保証するステップが、上記（ｂ１）の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを上記バイナリコードに挿入するステップを含みうる。
【００２１】
本発明の一つの実施態様において、上記検出するステップが、
上記バイナリコード中の各ブロックにおいて、副作用となり得る命令の後にアクセスがある変数の集合体（以下、GEN(B)ともいう）及び上記各ブロックにおいて、副作用となり得る命令が存在する場合には変数全体の集合体（以下、KILL(B)ともいう）を作成するステップであって、上記KILL(B)は、副作用となり得る命令が存在しない場合には空集合である、上記作成するステップと、
各ブロックの先頭における変数の集合（以下、IN(B)ともいう）を、各ブロックの終わりにおける変数の集合（以下、OUT(B)ともいう）、上記GEN(B)及び上記KILL(B)から求めるステップと、
各ブロック内の各命令において変更された集合情報を上記各ブロック内の各命令に付加情報としてそれぞれ設定するステップであって、上記集合情報は上記IN(B)を基にして求められる、上記設定するステップと、
上記各命令に設定された付加情報について、各変数が連続している領域を、当該変数に対する副作用となり得る命令のない領域とするステップと
を含みうる。
【００２２】
本発明の一つの実施態様において、上記GEN(B)及び上記KILL(B)作成するステップが、
各ブロック内の命令が変数へのアクセスであるかどうか、及び、上記命令が副作用となり得る命令であるかどうかを判定するステップと、
上記判定を各命令の実行順に繰り返すステップと、
上記判定の結果から、上記GEN(B)及び上記KILL(B)を作成するステップと
を含みうる。
【００２３】
本発明の一つの実施態様において、上記OUT(B)及び上記IN(B)が、
OUT(B) = (IN(B) - KILL(B)) ∪ GEN(B)
IN(B) = ∩N∈Pred(B) OUT(N)
のデータ・フロー方程式から求められうる。OUT(N)は、上記式で処理中のブロックBの直前にあるブロックNの終わりにおける変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である。
【００２４】
本発明の一つの実施態様において、上記設定するステップが、
各ブロック内の命令が変数へのアクセスであるかどうか、及び、上記命令が副作用となり得る命令であるかどうかを判定し、上記IN(B)の集合情報を変更するステップと、
各ブロック内の各命令において変更された集合情報を上記各ブロック内の各命令に付加情報としてそれぞれ設定するステップであって、上記集合情報は上記IN(B)を基にして求められる、上記設定するステップと、
上記判定及び上記IN(B)の集合情報の変更を各命令の実行順に繰り返すステップと
を含みうる。
【００２５】
本発明の一つの実施態様において、上記PACK/UNPACKのコードを上記バイナリコードから削除する上記処理が、
（ｃ１）副作用となり得る命令のない上記領域中に書き込みがある変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン１０進数形式の変数に対するPACK/UNPACKのコードのうち、最初と最後の型変換命令以外のコードを上記バイナリコードから削除する処理と、
（ｃ２）副作用となり得る命令のない上記領域中に書き込みがない変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン１０進数形式の変数に対するPACK/UNPACKのコードのうち、最初の型変換命令以外のコードを上記バイナリコードから削除する処理と
を含みうる。
【００２６】
本発明の一つの実施態様において、上記PACK/UNPACKのコードを上記バイナリコードから削除する上記処理が、
（ｃ３）上記（ｃ１）及び／又は（ｃ２）の上記型変換命令以外のコードを削除する際に、当該削除するコードに付随する符号処理のコードを上記バイナリコードからさらに削除する処理をさらに含みうる。
【００２７】
本発明の一つの実施態様において、ゾーン１０進数形式の変数を２進型へ変換する上記処理が、当該変換処理前後のコスト差を見積もり、変換処理後の見積もりコストが変換処理前の見積もりコストよりも小さいことを条件に行われ、次に、
上記PACK/UNPACKのコードを上記バイナリコードから削除する処理が、上記コスト差の見積もりの計算によって上記変換する処理がされなかった部分について行われうる。
【００２８】
本発明の一つの実施態様において、上記変換処理前後の上記コスト差が、
コスト差＝（変数がゾーン１０進数形式である場合と２進型である場合とでの当該変数へアクセスする命令のコスト差にその実行頻度を乗じた値）
＋（２進型への変換コストに各上記検出された領域内へ入る実行頻度を乗じた値）
＋（ゾーン１０進数形式への変換コストに各上記検出された領域から出る実行頻度を乗じた値）
＋（桁合わせをするための剰余算命令のコストにその剰余算命令の実行頻度を乗じた値）
によって求められうる。
【００２９】
また、本発明は、ゾーン１０進数形式の変数へのアクセスを有する言語のバイナリコード、特にはＣＯＢＯＬのバイナリコードを最適化する方法を提供する。当該方法は、コンピュータ、例えばバイナリコード最適化装置が、上記最適化方法を上記バイナリコードに対して適用することによって実行されうる。または、上記方法は、コンピュータ、例えばコンパイラ装置が、上記最適化方法が実装されたコンパイラによってＣＯＢＯＬコードをコンパイルすることによって、上記コンピュータによって実行されうる。上記方法は、コンピュータが、メモリ内に読み込まれた上記バイナリコードから、桁合わせをするための剰余算命令のコードを削除するステップを実行することを含む。
【００３０】
本発明の一つの実施態様において、上記方法は、上記コンピュータが、
上記剰余算命令のコードの削除が行われた後に、メモリ内に読み込まれ且つ上記剰余算命令のコードが削除されたバイナリコード中から、各変数について、ゾーン１０進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出するステップと、
上記検出された領域内において、ゾーン１０進数形式の変数を２進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを上記バイナリコードから削除する処理、又はそれらの組み合わせの処理を行うステップと
をさらに実行することを含みうる。
【００３１】
また、本発明は、ゾーン１０進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する装置を提供する。当該装置は例えばバイナリコード最適化装置であり、当該装置は、上記バイナリコードに対して上記最適化を適用する。または、当該装置は例えばコンパイラ装置であり、当該装置は、上記最適化を、ＣＯＢＯＬコードをコンパイルする際に適用する。上記装置は、
各変数について、ゾーン１０進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する検出部と、
上記検出された領域内において、ゾーン１０進数形式の変数を２進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを上記バイナリコードから削除する処理、及びそれらの組み合わせの処理のうちの１つを行う処理部と
を備えている。
【００３２】
本発明の一つの実施態様において、上記装置が、上記処理が上記処理部によって行われた後に、桁合わせをするための剰余算命令のコードを上記バイナリコードから削除する削除部をさらに備えうる。
【００３３】
本発明の一つの実施態様において、上記削除部は、
（Ａ）上記変数がｎ１桁であり、さらに当該変数をｎ２桁にする剰余算命令についてｎ１≧ｎ２の条件を満たす場合には、上記ｎ１桁に桁合わせをするための剰余算命令のコードを上記バイナリコードから削除し、
（Ｂ）上記（Ａ）の条件下にない場合には、
（ａ）上記変数が符号なしの場合に、
（ａ１）上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、２進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除し、
（ａ２）上記（ａ１）以外の場合において、当該（ａ１）の条件を満たさない演算の前で桁が正しいことを保証し、
（ｂ）上記変数が符号ありの場合に、
（ｂ１）上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、当該連続している一連の演算の式の途中で符号が変わらないこと及び２進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除し、
（ｂ２）上記（ｂ１）以外の場合において、当該（ｂ１）の条件を満たさない演算の前で桁が正しいことを保証しうる。
【００３４】
本発明の一つの実施態様において、上記装置は、上記桁合わせをするための剰余算命令のコードが上記削除部によって上記バイナリコードから削除された後に、上記バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行う軽減部をさらに備えうる。上記軽減部は、上記剰余を求める演算を下記式：
結果 =  (分子 < 分母 && 分子 >= 0) ? 分子 : (分子 % 分母)
に置き換えることによって上記軽減を行いうる。
【００３５】
本発明の一つの実施態様において、上記削除部は、（ａ２）の保証を、上記（ａ１）の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを上記バイナリコードに挿入することによって行う。
【００３６】
本発明の一つの実施態様において、上記削除部は、（ｂ２）の保証を、上記（ｂ１）の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを上記バイナリコードに挿入することによって行う。
【００３７】
本発明の一つの実施態様において、上記検出部が、
上記バイナリコード中の各ブロックにおいて、副作用となり得る命令の後にアクセスがある変数の集合体（以下、GEN(B)ともいう）及び上記各ブロックにおいて、副作用となり得る命令が存在する場合には変数全体の集合体（以下、KILL(B)ともいう）を作成し、ここで上記KILL(B)は、副作用となり得る命令が存在しない場合には空集合であり、
各ブロックの先頭における変数の集合（以下、IN(B)ともいう）を、各ブロックの終わりにおける変数の集合（以下、OUT(B)ともいう）、上記GEN(B)及び上記KILL(B)から求め、
各ブロック内の各命令において変更された集合情報を上記各ブロック内の各命令に付加情報としてそれぞれ設定し、ここで前記集合情報は前記IN(B)を基にして求められ、
上記各命令に設定された付加情報について、各変数が連続している領域を、当該変数に対する副作用となり得る命令のない領域としうる。
【００３８】
本発明の一つの実施態様において、上記検出部が、上記GEN(B)及び上記KILL(B)の作成において、
各ブロック内の命令が変数へのアクセスであるかどうか、及び、上記命令が副作用となり得る命令であるかどうかを判定し、
上記判定を各命令の実行順に繰り返し、
上記判定の結果から、上記GEN(B)及び上記KILL(B)を作成しうる。
【００３９】
本発明の一つの実施態様において、上記検出部が、上記OUT(B)及び上記IN(B)を、
OUT(B) = (IN(B) - KILL(B)) ∪ GEN(B)
IN(B) = ∩N∈Pred(B) OUT(N)
のデータ・フロー方程式から求めうる。OUT(N)は、上記式で処理中のブロックBの直前にあるブロックNの終わりにおける変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である。
【００４０】
本発明の一つの実施態様において、上記検出部が、上記集合情報の設定において、
各ブロック内の命令が変数へのアクセスであるかどうか、及び、上記命令が副作用となり得る命令であるかどうかを判定し、上記IN(B)の集合情報を変更し、
上記各ブロック内の各命令において変更された集合情報を上記ブロック内各命令にそれぞれ設定し、
上記判定及び上記IN(B)の集合情報の変更を各命令の実行順に繰り返しうる。上記集合情報は、上記IN(B)を基にして求められる。
【００４１】
本発明の一つの実施態様において、上記処理部が、
（ｃ１）副作用となり得る命令のない上記領域中に書き込みがある変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン１０進数形式の変数に対するPACK/UNPACKのコードのうち、最初と最後の型変換命令以外のコードを上記バイナリコードから削除し、
（ｃ２）副作用となり得る命令のない上記領域中に書き込みがない変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン１０進数形式の変数に対するPACK/UNPACKのコードのうち、最初の型変換命令以外のコードを上記バイナリコードから削除しうる。
【００４２】
本発明の一つの実施態様において、上記処理部が、さらに、
（ｃ３）上記（ｃ１）及び／又は（ｃ２）の上記型変換命令以外のコードを削除する際に、当該削除するコードに付随する符号処理のコードを上記バイナリコードから削除しうる。
【００４３】
本発明の一つの実施態様において、上記処理部は、
ゾーン１０進数形式の変数を２進型へ変換する上記処理を、当該変換処理前後のコスト差を見積もり、変換処理後の見積もりコストが変換処理前の見積もりコストよりも小さいことを条件に行い、次に、
上記PACK/UNPACKのコードを上記バイナリコードから削除する処理を、上記コスト差の見積もりの計算によって上記変換する処理がされなかった部分について行いうる。
【００４４】
本発明の一つの実施態様において、上記処理部は、上記変換処理前後の上記コスト差を、
コスト差＝（変数がゾーン１０進数形式である場合と２進型である場合とでの当該変数へアクセスする命令のコスト差にその実行頻度を乗じた値）
＋（２進型への変換コストに各上記検出された領域内へ入る実行頻度を乗じた値）
＋（ゾーン１０進数形式への変換コストに各上記検出された領域から出る実行頻度を乗じた値）
＋（桁合わせをするための剰余算命令のコストにその剰余算命令の実行頻度を乗じた値）
によって求めうる。
【００４５】
また、本発明は、ゾーン１０進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する装置を提供する。当該装置は例えばバイナリコード最適化装置であり、当該装置は、上記バイナリコードに対して上記最適化を適用する。または、当該装置は例えばコンパイラ装置であり、当該装置は、上記最適化を、ＣＯＢＯＬコードをコンパイルする際に適用する。上記装置は、メモリ内に読み込まれた上記バイナリコードから、桁合わせをするための剰余算命令のコードを削除する削除部を備える。
【００４６】
本発明の一つの実施態様において、上記装置が、
上記削除が上記削除部によって行われた後に、メモリ内に読み込まれ且つ上記剰余算命令のコードが削除されたバイナリコード中から、各変数について、ゾーン１０進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する検出部と、
上記検出された領域内において、ゾーン１０進数形式の変数を２進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを上記バイナリコードから削除する処理、及びそれらの組み合わせの処理のうちの１つを行う処理部と
をさらに備えうる。
【００４７】
また、本発明は、ゾーン１０進数形式の変数へのアクセスを有する言語のバイナリコード、特にはＣＯＢＯＬのバイナリコードを最適化する装置を提供する。当該装置は例えばバイナリコード最適化装置であり、当該装置は、上記バイナリコードに対して上記最適化を適用する。または、当該装置は例えばコンパイラ装置であり、当該装置は、ＣＯＢＯＬコードをコンパイルする際に上記最適化を適用しうる。上記装置は、上記バイナリコードを読み込むためのメモリと、上記メモリ上で上記バイナリコードを最適化するためのプロセッサと
を備えている。上記装置は、上記最適化を、上記に記載された方法の各ステップを実行することによって行う。
【００４８】
また、本発明は、ゾーン１０進数形式の変数へのアクセスを有する言語のバイナリコード、特にはＣＯＢＯＬのバイナリコードを最適化するためのコンピュータ・プログラムを適用する。当該コンピュータ・プログラムは、上記バイナリコードを最適化するためのコンピュータ・プログラムにおいて実装されうる。または、当該コンピュータ・プログラムは、コンパイラにおいて実装されうる。上記コンピュータ・プログラムは、コンピュータに、上記に記載されたいずれか一つの方法の各ステップを実行させる。上記コンピュータ・プログラムは、記憶媒体、例えばハードディスク、ソリッド・ステート・ドライブのようなアプリケーションを記憶し、そこからコンピュータが当該アプリケーションを起動可能な記憶媒体に格納されうる。または、上記コンピュータ・プログラムは、上記記憶媒体にインストールするために使用される記憶媒体、例えばＣＤ−ＲＯＭ、ＤＶＤ若しくはＢＤ、又はＵＳＢメモリに格納されうる。
【発明の効果】
【００４９】
本発明の最適化技法では、各変数について、ゾーン１０進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する為に、変数毎にバイナリコード中のどの領域であるならば最適化できるかを見つけることが可能である。従って、本発明の最適化技法では、どの変数を最適化対象とするかを選択する従来技術と比べて、最適化できる機会が増大する点で有用である。
【００５０】
また、本発明の最適化技法では、ＣＯＢＯＬコードが存在しない場合であっても、言い換えればＣＯＢＯＬコードを再コンパイルすることができない状況下にあっても、バイナリコードに対して本発明に従う最適化技法を適用することができる。従って、本発明の最適化技法では、バイナリコードに対して最適化技法を直接的に適用することができる点で、特にビジネス上において有用である。
【００５１】
さらに、本発明の最適化技法では、ＣＯＢＯＬコード又はそのバイナリコードが副作用となりうる命令を含む場合であっても、本発明に従う最適化技法を適用することができる。従って、本発明の最適化技法では、副作用となり得る命令があることによって最適化の機会が失われることがない点で有用である。
【図面の簡単な説明】
【００５２】
【図１】本発明の実施形態におけるコンピュータ・ハードウェアの基本的なブロック図を示す。
【図２】本発明の実施形態における、ゾーン１０進数形式の変数へのアクセスを有する言語のバイナリコードの最適化処理を行うための機能ブロック図を示す。
【図３Ａ】本発明の実施形態における、ゾーン１０進数形式の変数へのアクセスを有する言語のバイナリコードの最適化処理全体のフローチャートを示す。
【図３Ｂ】本発明の実施形態における、ゾーン１０進数形式の変数へのアクセスを有する言語のバイナリコードの最適化処理全体のフローチャートを示す。
【図４】図３Ａに示す最適化処理のうち、ゾーン１０進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する処理（ステップ３０２、３１２及び３２２）のフローチャートを示す。
【図５】図４に示す検出処理のうち、バイナリコード中の各ブロックにおいて、副作用となり得る命令の後にアクセスがある変数の集合体（以下、GEN(B)ともいう）及び上記各ブロックにおいて、副作用となり得る命令が存在する場合には変数全体の集合体（ただし、副作用となりうる命令が存在しない場合には空集合である）（以下、KILL(B)ともいう）を作成する処理（ステップ４０２）のフローチャートを示す。
【図６】図４に示す検出処理のうち、各ブロック内の命令に、VSETの集合情報の内容を付加情報として設定する処理（ステップ４０４）のフローチャートを示す。
【図７】図３Ａに示す最適化処理のうち、桁合わせのための剰余算命令を最適化する処理（ステップ３０５、３１５及び３２５）のフローチャートを示す。
【図８】図７に示す剰余算命令を最適化する処理のうち、剰余算命令REMについて「１つの剰余算命令についての削除処理」を実行する処理（ステップ７０３）のフローチャートを示す。
【図９】図８に示す剰余算命令を最適化する処理のうち、剰余算命令REMの各使用Iについて剰余の必要又は不必要をチェックする処理  AnalyzeUSE(REM, I, NDIGITS)（ステップ８０４）のフローチャートを示す。
【図１０】図８に示す剰余算命令を最適化する処理のうち、剰余算命令REMの各定義Jについて剰余の必要又は不必要をチェックする処理  AnalyzeDEF(J, NDIGITS)（ステップ８０６）のフローチャートを示す。
【図１１】図６のステップ６０８に示す作業領域であるVSETに格納された集合情報の内容について、当該VSETがどのような集合情報を含んでいるのかを説明するための図を示す。
【図１２】ＣＯＢＯＬコード、最適化対象であるバイナリコード、及び、本発明の実施態様に従い、ゾーン１０進数形式の変数を２進型へ変換して最適化されたコードを示す。
【図１３】ＣＯＢＯＬコード、最適化対象であるバイナリコード、及び、本発明の実施態様に従い、ゾーン１０進数形式の変数を２進型へ変換して最適化されたコードを示す。
【図１４】ＣＯＢＯＬコード、最適化対象であるバイナリコード、及び、本発明の実施態様に従い、更新がある変数idxに対するPACK/UNPACKのバイナリコードを削除して最適化されたコードを示す。
【図１５】ＣＯＢＯＬコード、最適化対象であるバイナリコード、及び、本発明の実施態様に従い、更新がない変数idx2に対するPACK/UNPACKのバイナリコードを削除して最適化されたコードを示す。
【発明を実施するための形態】
【００５３】
以下に、本発明の実施態様を各図面に従って説明する。なお、当該実施形態は、本発明の好適な形態を説明するためのものであり、本発明の範囲をここで示すものに限定する意図はないことを理解されたい。また、以下の図を通して、特に断らない限り、同一の符号は、同一の対象を指す。
【００５４】
図１は、本発明の実施形態におけるコンピュータ・ハードウェアの基本的なブロック図を示す。
コンピュータ（１０１）は、ＣＰＵ（１０２）とメイン・メモリ（１０３）とを備えており、これらはバス（１０４）に接続されている。ＣＰＵ（１０２）は好ましくは、３２ビット又は６４ビットのアーキテクチャに基づくものであり、例えば、インテル社のＣｏｒｅ  ｉ（商標）シリーズ、Ｃｏｒｅ  ２（商標）シリーズ、Ａｔｏｍ（商標）シリーズ、Ｘｅｏｎ（商標）シリーズ、Ｐｅｎｔｉｕｍ（登録商標）シリーズ、Ｃｅｌｅｒｏｎ（登録商標）シリーズ、ＡＭＤ社のＰｈｅｎｏｍ（商標）シリーズ、Ａｔｈｌｏｎ（商標）シリーズ、Ｔｕｒｉｏｎ（商標）シリーズ又はＳｅｍｐｒｏｎ（商標）が使用されうる。バス（１０４）には、ディスプレイ・コントローラ（１０５）を介して、ディスプレイ（１０６）、例えば液晶ディスプレイ（ＬＣＤ）が接続されうる。ディスプレイ（１０６）は、コンピュータの管理のために、通信回線を介してネットワークに接続されたコンピュータについての情報と、そのコンピュータ上で動作中のソフトウェアについての情報を、適当なグラフィック・インタフェースで表示するために使用される。バス（１０４）にはまた、ＳＡＴＡ又はＩＤＥコントローラ（１０７）を介して、ディスク（１０８）、例えばハードディスク又はシリコン・ディスクと、ドライブ（１０９）、例えばＣＤ、ＤＶＤ又はＢＤドライブとが接続されうる。バス（１０４）にはさらに、キーボード・マウスコントローラ（１１０）又はＵＳＢバス（図示せず）を介して、キーボード（１１１）及びマウス（１１２）が接続されうる。
【００５５】
ディスク（１０８）には、任意的に、オペレーティング・システム、ＣＯＢＯＬコード作成のための処理プログラム、ＣＯＢＯＬコードをコンパイルするためのＣＯＢＯＬコンパイラ、及びその他のプログラム、並びにＣＯＢＯＬコード、バイナリコード、及び最適化されたコードが、メイン・メモリにロード可能に記憶されている。
ドライブ（１０９）は、必要に応じて、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ又はＢＤからプログラムをディスク（１０８）にインストールするために使用される。
【００５６】
通信インタフェース（１１４）は、例えばイーサネット（登録商標）・プロトコルに従う。通信インタフェース（１１４）は、通信コントローラ（１１３）を介してバス（１０４）に接続され、コンピュータ（１０１）を通信回線（１１５）に物理的に接続する役割を担い、コンピュータ（１０１）のオペレーティング・システムの通信機能のＴＣＰ／ＩＰ通信プロトコルに対して、ネットワーク・インタフェース層を提供する。なお、通信回線は、有線ＬＡＮ環境、或いは例えばＩＥＥＥ８０２．１１ａ／ｂ／ｇ／ｎなどの無線ＬＡＮ接続規格に基づく無線ＬＡＮ環境であってもよい。
【００５７】
図２は、本発明の実施形態における、ゾーン１０進数形式の変数へのアクセスを有する言語のバイナリコードの最適化処理を行うための機能ブロック図を示す。
コンピュータ（２０１）は、図１のコンピュータ（１０１）に対応する。コンピュータ（２０１）は、図１のコンピュータ（１０１）に示されている構成、例えばＣＰＵ及びメモリを備えている。コンピュータ（２０１）は、本発明に従う最適化技法を実施するためのバイナリコード最適化装置又はコンパイラ装置でありうる。
【００５８】
記憶部（２０２）は、ゾーン１０進数形式の変数へのアクセスを有する言語のソースコード（例えばＣＯＢＯＬのソースコード）、ゾーン１０進数形式の変数へのアクセスを有する言語のバイナリコード（例えばＣＯＢＯＬのバイナリコード）を格納する。また、記憶部（２０２）は、本発明に従う最適化技法に従って最適化されたバイナリコードを格納する。
【００５９】
以下では、ゾーン１０進数形式の変数へのアクセスを有する言語のソースコードとして、ＣＯＢＯＬのソースコード（以下、単に、ＣＯＢＯＬコードともいう）を例として述べる。同様に、以下では、ゾーン１０進数形式の変数へのアクセスを有する言語のバイナリコードとして、ＣＯＢＯＬのバイナリコード（以下、単に、バイナリコードともいう）を例として述べる。
【００６０】
記憶部（２０２）は、コンピュータ（２０１）内に用意された記憶媒体、コンピュータ（２０１）に直接的に又はネットワークを介して接続された外部記憶媒体でありうる。記憶部（２０２）は、例えばハードディスク又はソリッドステートディスクでありうるがこれらに限定されない。
【００６１】
コンピュータ（２０１）は、本発明に従う最適化技法を実施するための少なくとも最適化部（２１５）を備えており、字句解析部（２１１）、構文解析部（２１２）、意味解析部（２１３）を任意に備えうる。コンピュータ（２０１）が、コンパイラ（図示せず）を備えている場合、当該コンパイラが、字句解析部（２１１）、構文解析部（２１２）、意味解析部（２１３）及び最適化部（２１５）に加えて、ＣＯＢＯＬコードをバイナリコードに変換するための変換部（２１４）を備えうる。
【００６２】
字句解析部（２１１）は、入力されたＣＯＢＯＬコード又はバイナリコードについて、字句解析を行う。
【００６３】
構文解析部（２１２）は、字句解析部（２１１）によって字句解析された結果について構文解析を行う。
【００６４】
意味解析部（２１３）は、構文解析部（２１２）によって構文解析された結果について意味解析を行う。
【００６５】
変換部（２１４）は、ＣＯＢＯＬコードをバイナリコードに変換する。
【００６６】
最適化部（２１５）は、本発明に従う最適化技法に従い、バイナリコードを最適化する。また、最適化部（２１５）は、本発明以外の最適化技法、例えばソースコードの最適化技法及びバイナリコードの最適化技法を含んでいてもよい。
【００６７】
最適化部（２１５）は、少なくとも検出部（２２１）及び処理部（２２２）を備えており、任意的に、削除部（２２３）及び／又は軽減部（２２４）を備えていてもよい。検出部（２２１）、処理部（２２２）、削除部（２２３）及び軽減部（２２４）は、起動信号を与える機能を有するコンピュータ・プログラムで実装され、又は、専用のハードウェア（回路）で実現されてもよい。特に、本願発明に従うコンピュータ・プログラムにおいて、各ステップの主体が検出部（２２１）、処理部（２２２）、削除部（２２３）及び軽減部（２２４）のいずれかでありうる場合、各部（２２１〜２２４）の一部又は全部が専用のハードウェア（回路）で実現されてもよく、専用のハードウェア（回路）で実現されない部若しくは全ての部（２２１〜２２４）がプログラム・コードとして実装されてもよい。
【００６８】
検出部（２２１）は、各変数について、ゾーン１０進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する（下記図３Ａのステップ３０２、３１２及び３２２を参照）。
【００６９】
検出部（２２１）は、上記領域を検出するために、下記処理（１）〜（４）を行う（下記図４〜図６を参照）。すなわち、
（１）検出部（２２１）は、上記バイナリコード中の各ブロックにおいて、GEN(B)及びKILL(B)を作成する；
（２）検出部（２２１）は、各ブロックの先頭における変数の集合（以下、IN(B)ともいう）を、各ブロックの終わりにおける変数の集合（以下、OUT(B)ともいう）、上記GEN(B)及び上記KILL(B)から求める；
（３）検出部（２２１）は、各ブロック内の各命令において変更された集合情報を上記各ブロック内の各命令に付加情報としてそれぞれ設定する；
（４）検出部（２２１）は、上記各命令に設定された付加情報について、各変数が連続している領域を、当該変数に対する副作用となり得る命令のない領域とする。上記集合情報は、上記IN(B)を基にして求められる。
【００７０】
GEN(B)は、バイナリコード中の各ブロックにおいて、副作用となり得る命令の後にアクセスがある変数の集合体である。
【００７１】
KILL(B)は、バイナリコード中の各ブロックにおいて、副作用となり得る命令が存在する場合には変数全体の集合体（ただし、副作用となり得る命令が存在しない場合には空集合である）である。
【００７２】
検出部（２２１）は、上記（１）の上記の作成において、下記処理（１ａ）〜（１ｃ）を行う。すなわち、
（１ａ）検出部（２２１）は、各ブロック内の命令が変数へのアクセスであるかどうか、及び、上記命令が副作用となり得る命令であるかどうかを判定する；
（１ｂ）検出部（２２１）は、上記判定を各命令の実行順に繰り返す；
（１ｃ）検出部（２２１）は、上記判定の結果から、上記GEN(B)及び上記KILL(B)を作成する。
【００７３】
検出部（２２１）は、上記OUT(B)及び上記IN(B)を、下記データ・フロー方程式から求める。OUT(N)は、下記式で処理中のブロックBの直前にあるブロックNの終わりにおける変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である。
OUT(B) = (IN(B) - KILL(B)) ∪ GEN(B)
IN(B) = ∩N∈Pred(B) OUT(N)
【００７４】
検出部（２２１）は、上記（３）の上記付加情報の設定において、下記処理（３ａ）〜（３ｃ）を行う。すなわち、
（３ａ）検出部（２２１）は、各ブロック内の命令が変数へのアクセスであるかどうか、及び、上記命令が副作用となり得る命令であるかどうかを判定し、上記IN(B)の集合情報を変更する；
（３ｂ）検出部（２２１）は、上記各ブロック内の各命令において変更された集合情報を上記各ブロック内の各命令に付加情報としてそれぞれ設定する；
（３ｃ）検出部（２２１）は、上記判定及び上記IN(B)の集合情報の変更を各命令の実行順に繰り返す。上記集合情報は上記IN(B)を基にして求められる。
【００７５】
処理部（２２２）は、上記検出された領域内において、ゾーン１０進数形式の変数を２進型へ変換する処理（図３Ａのステップ３０３を参照）、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを上記バイナリコードから削除する処理（同ステップ３１４を参照）、及びそれらの組み合わせの処理（同ステップ３２３及び３２４を参照）のうちの１つを行う。PACK/UNPACKは、ＣＯＢＯＬにおいて周知の命令である。
【００７６】
処理部（２２２）は、ゾーン１０進数形式の変数を２進型へ変換する処理を、当業者に知られている任意の方法を使用して行いうる。
【００７７】
処理部（２２２）は、ゾーン１０進数形式の変数を２進型へ変換する上記処理を、当該変換処理前後のコスト差を見積もり、変換処理後の見積もりコストが変換処理前の見積もりコストよりも小さいことを条件に行い、次に、
上記PACK/UNPACKのコードを上記バイナリコードから削除する処理を、上記コスト差の見積もりの計算によって上記変換する処理がされなかった部分について行いうる。
【００７８】
処理部（２２２）は、上記変換処理前後の上記コスト差を、下記足し算の式に従い求める。すなわち、
コスト差＝（変数がゾーン１０進数形式である場合と２進型である場合とでの当該変数へアクセスする命令のコスト差にその実行頻度を乗じた値）
＋（２進型への変換コストに各上記検出された領域内へ入る実行頻度を乗じた値）
＋（ゾーン１０進数形式への変換コストに各上記検出された領域から出る実行頻度を乗じた値）
＋（桁合わせをするための剰余算命令のコストにその剰余算命令の実行頻度を乗じた値）
【００７９】
ここで、上記式のうち、変数がゾーン１０進数形式である場合と２進型である場合とでの当該変数へアクセスする命令のコスト差にその実行頻度を乗じた値において、「その実行頻度」とは、ゾーン１０進数形式又は２進型のいずれの実行頻度であってもよい。なぜならば、変数がアクセスする場所が同じであるので、実行頻度はいずれも同じであるからである。
【００８０】
処理部（２２２）は、PACK/UNPACKのコードをバイナリコードから削除するために、下記処理（ｃ１）〜（ｃ２）を行う。すなわち、
（ｃ１）処理部（２２２）は、副作用となり得る命令のない上記領域中に書き込みがある変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン１０進数形式の変数に対するPACK/UNPACKのコードのうち、最初と最後の型変換命令以外のコードを上記バイナリコードから削除する；
（ｃ２）処理部（２２２）は、副作用となり得る命令のない上記領域中に書き込みがない変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン１０進数形式の変数に対するPACK/UNPACKのコードのうち、最初の型変換命令以外のコードを上記バイナリコードから削除する。
【００８１】
処理部（２２２）は、さらに、（ｃ３）上記（ｃ１）及び／又は（ｃ２）の上記型変換命令以外のコードを削除する際に、当該削除するコードに付随する符号処理のコードを上記バイナリコードから削除する。
【００８２】
削除部（２２３）は、ゾーン１０進数形式の変数を２進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを上記バイナリコードから削除する処理、及びそれらの組み合わせの処理のうちのいずれか１つが処理部（２２２）によって行われた後に、桁合わせをするための剰余算命令のコードを上記バイナリコードから削除する。
【００８３】
削除部（２２３）は、桁合わせをするための剰余算命令のコードを削除する場合に、下記処理（Ａ）〜（Ｂ）を行う（下記図７〜図１１、特に図９を参照）。すなわち、
（Ａ）削除部（２２３）は、上記変数がｎ１桁であり、さらに当該変数をｎ２桁にする剰余算命令についてｎ１≧ｎ２の条件を満たす場合には、上記ｎ１桁に桁合わせをするための剰余算命令のコードを上記バイナリコードから削除する；
（Ｂ）削除部（２２３）は、上記（Ａ）の条件下にない場合には、変数が符号なしか又は符号ありかに応じて下記処理（ａ）〜（ｂ）を行う。すなわち、
（ａ）上記変数が符号なしの場合に（下記図９のステップ９０１５で判定される）、
（ａ１）削除部（２２３）は、上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において（図９のステップ９０５で判定される）、２進計算のオーバーフローが起きないこと（図９のステップ９０１４で判定される）が保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除する；
（ａ２）削除部（２２３）は、上記（ａ１）以外の場合において、当該（ａ１）の条件を満たさない演算の前で桁が正しいことを保証する；
（ｂ）上記変数が符号ありの場合に（下記図９のステップ９０１５で判定される）、
（ｂ１）削除部（２２３）は、上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において（図９のステップ９０５で判定される）、当該連続している一連の演算の式の途中で符号が変わらないこと（図９のステップ９０１８で判定される）及び２進計算のオーバーフローが起きないこと（図９のステップ９０１４で判定される）が保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除する；
（ｂ２）削除部（２２３）は、上記（ｂ１）以外の場合において、当該（ｂ１）の条件を満たさない演算の前で桁が正しいことを保証する。
【００８４】
上記（ａ２）において、上記（ａ１）の条件を満たさない演算の前で桁が正しいことを保証することは、演算の前で桁が正しくなるような剰余算命令のコードをバイナリコードに挿入すること、又は、演算の前で桁が正しくなるような剰余算命令のコードをバイナリコードに挿入しなくても桁が保証される場合には何もしないことを包含する。演算の前で桁が正しくなるようなコードをバイナリコードに挿入することは、例えば、桁がｎ１桁である場合に、ｎ１桁になるような剰余算命令を上記バイナリコードに挿入することである。
【００８５】
上記（ｂ２）においても、上記（ｂ１）の条件を満たさない演算の前で桁が正しいことを保証することは、演算の前で桁が正しくなるような剰余算命令のコードをバイナリコードに挿入すること、又は、演算の前で桁が正しくなるような剰余算命令のコードをバイナリコードに挿入しなくても桁が保証される場合には何もしないことを包含する。演算の前で桁が正しくなるようなコードをバイナリコードに挿入することは、例えば、桁がｎ１桁である場合に、ｎ１桁になるような剰余算命令を上記バイナリコードに挿入することである。
【００８６】
削除部（２２３）は、上記（ａ２）の保証を、上記（ａ１）の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを上記バイナリコードに挿入することによって行う。
【００８７】
また、削除部（２２３）は、上記（ｂ２）の保証を、上記（ｂ１）の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを上記バイナリコードに挿入することによって行う。
【００８８】
軽減部（２２４）は、上記バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行う。軽減部（２２４）は、演算子強度の軽減を、削除部（２２３）によって上記桁合わせをするための剰余算命令のコードが上記バイナリコードから削除された後に行う。
【００８９】
軽減部（２２４）は、上記剰余を求める演算を下記式に置き換えることによって、演算子強度の軽減を行う。すなわち、剰余を求める演算は、式：
結果 =  (分子 < 分母 && 分子 >= 0) ? 分子 : (分子 % 分母)
に置き換えられる。
【００９０】
図３Ａは、本発明の実施形態における、ゾーン１０進数形式の変数へのアクセスを有する言語のバイナリコードの最適化処理全体のフローチャートを示す。
最適化処理は、下記の点で３つのフローチャートに分けられうる。
Ａ．ステップ３０１で開始する最適化処理（以下、最適化処理３０１という）では、最適化は、ゾーン１０進数形式の変数を２進型へ変換する処理（ステップ３０３）を含む。
Ｂ．ステップ３１１で開始する最適化処理（以下、最適化処理３１１という）では、最適化は、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードをバイナリコードから削除する処理（ステップ３１４）を含む。変換された結果が変わらないとは、変換された結果が保証されるということである。
Ｃ．ステップ３２１で開始する最適化処理（以下、最適化処理３２１という）では、最適化は、最適化処理３０１のステップ３０３の処理（ステップ３２３）及び、最適化処理３１１のステップ３１４（ステップ３２４）の組み合わせを含む。
【００９１】
以下に、最適化処理３０１、３１１及び３２１について説明する。
【００９２】
Ａ．最適化処理３０１
ステップ３０１では、コンピュータ（２０１）は、バイナリコードを記憶部（２０２）から受け取る。または、コンピュータ（２０１）は、ＣＯＢＯＬコンパイラで変換されたバイナリコードを変換部（２１４）から受け取る。コンピュータ（２０１）は、上記受け取ったバイナリコードを最適化部（２１５）に渡す。
【００９３】
ステップ３０２では、最適化部（２１５）内の検出部（２２１）は、バイナリコード内における各変数について、ゾーン１０進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域（以下、最適化対象領域といもいう）を検出する。副作用となり得る命令のない領域は、副作用を起こす命令を含まない領域とも言い換えられる。検出部（２２１）は、下記図４〜図６に記載のフローチャートに従い上記最適化対象領域を検出する。
【００９４】
例えば、バイナリコード内に最適化対象領域Ａ及び最適化対象領域Ｂがあり、どちらの領域においてもゾーン１０進数形式の変数vへのアクセスがあるけれども、領域Ａのみが副作用となり得る命令のない領域であると判定されたとする。この場合、領域Ａに対してのみゾーン１０進数形式の変数を２進型へ変換する。すなわち、領域Ａに対してのみ２進型へ変換し、領域Ｂに対して２進型への変換を行わない。ここで、変数vが格納されているメモリ領域は１カ所であることから、領域Ａに対してのみ２進型に変換するために、処理部（２２２）は、変数vを作業領域に読み出してコピーし、当該コピーに対して２進型の変換を行う。当該作業領域は、メモリ中に用意される。
【００９５】
本発明の一つの実施態様において、副作用となり得る命令とは、ゾーン１０進数形式の変数を２進型への型変換を行うと処理矛盾を起こし得る命令、又は、PACK/UNPACKのコードを削除すると処理矛盾を起こし得る命令である。
【００９６】
本発明の一つの実施態様において、副作用となり得る命令とは、コンパイル・スコープ外の命令を実行する命令、アプリケーションから観測可能な（又は見える）例外を起こし得る命令、及び、上記変数のベースアドレス・レジスタ又はインデックス・レジスタを変更する命令の少なくとも１つを包含する。
【００９７】
コンパイル・スコープ外の命令を実行する命令とは、例えば、call命令、又はindirect branch命令である。
【００９８】
アプリケーションから観測可能な例外を起こし得る命令とは、例えば、例外が発生した場合に、アプリケーションがその例外を捕らえて処理を行わないことがコンパイル時にわかるような例外を起こしうる命令である。「例外」は、アプリケーションに見えるものを対象としうる。例外を起こしうる命令の代表的なものは、メモリ・アクセスのための命令に関連する命令である。
【００９９】
アプリケーションから観測される例外を起こし得る命令において、米国特許7865885号明細書に記載のトランザクショナル・メモリ技術を使用し、例外が起きた場合に実行をある地点からやり直す手法をとれば、例外は無視することができる。従って、本願発明に従う最適化技法をさらに効率よく適用することが可能である。
【０１００】
また、アプリケーションから観測される例外を起こし得る命令において、ワーキング・ストレージへのメモリ・アクセスは例外を起こす可能性がないことを利用して、副作用を起こしうる命令の検出のコストを削減することが可能である。ワーキング・ストレージへのアクセスであることは、例えばコンパイル時に検出することが可能である。ワーキング・ストレージへのアクセスであるかどうかの解析は、特定のＣＯＢＯＬの初期化パターンを検出した場合に、特定のレジスタをベースレジスタとして使用しているかどうかで検出することが可能である。この理由は、ＣＯＢＯＬの初期化ルーチンが正しく実行されたならば、ワーキング・ストレージ・セクションへのアクセスは、実際には例外を発生することがないということに基づく。
【０１０１】
上記変数のベースアドレス・レジスタ又はインデックス・レジスタを変更する命令とは、例えば、ロード命令、演算命令、レジスタ間のコピー命令であるがこれらに限定されない。
【０１０２】
ステップ３０３では、最適化部（２１５）内の処理部（２２２）は、ステップ３０２で検出された最適化対象領域内において、ゾーン１０進数形式の変数を２進型へ変換する処理を行う。当該変換する処理は、変換処理前後のコスト差を見積もり、変換処理後の見積もりコストが変換処理前の見積もりコストよりも小さいことを条件に行われうる。変換処理前後のコスト差は、下記式に従い求められうる：
コスト差＝（変数がゾーン１０進数形式である場合と２進型である場合とでの当該変数（一時計算領域を含む）へアクセスする命令のコスト差にその実行頻度を乗じた値）
＋（２進型への変換コストに各上記検出された領域内へ入る実行頻度を乗じた値）
＋（ゾーン１０進数形式への変換コストに各上記検出された領域から出る実行頻度を乗じた値）
＋（桁合わせをするための剰余算命令のコストにその剰余算命令の実行頻度を乗じた値）
【０１０３】
ステップ３０５では、最適化部（２１５）内の削除部（２２３）は、ステップ３０３の後に、桁合わせをするための剰余算命令のコードを最適化する。剰余算命令のコードを最適化は、桁合わせをするための剰余算命令のコードを上記バイナリコードから削除すること、及び任意的に、バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行うことを包含する。演算子強度の軽減については、ステップ３０５と独立してステップ３０６において実行されうるようにしてもよい。削除部（２２３）は、下記図７〜図１０に記載のフローチャートに従い上記剰余算命令のコードを削除する。本発明の実施態様に従う剰余算命令のコードの削除の例は、下記図１２及び図１３に示されている。ステップ３０５において、削除部（２２３）は、複数の剰余計算をまとめて削除できる。
【０１０４】
桁合わせの剰余の仕様は、ＣＯＢＯＬの場合、その言語仕様で決まっている。桁合わせの剰余の結果は、桁が３桁の符号なし変数ならば、０〜９９９までの値となる。ＣＯＢＯＬコンパイラが生成した２進演算コードでは、この桁合わせは演算ごとに毎回行っている。本発明の実施態様にいて、桁合わせの剰余をする箇所の特定は、図７〜図１０に記載のフローチャートに従い行われる。
【０１０５】
ステップ３０６では、最適化部（２１５）内の軽減部（２２４）は、ステップ３０５の後に、上記バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行う。なお、軽減部（２２４）は、図８に示すように、ステップ３０５の処理内において、上記バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行いうる。
【０１０６】
ステップ３０７では、コンピュータ（２０１）は、バイナリコードの最適化処理を終了する。
【０１０７】
Ｂ．最適化処理３１１
ステップ３１１〜３１２及びステップ３１５〜３１７は、最適化処理３０１のステップ３０１〜３０２及びステップ３０５〜３０７にそれぞれ対応する。
ステップ３１４では、処理部（２２２）は、ステップ３１２で検出された最適化対象領域内において、PACK/UNPACKのコードを削除する処理を行う。削除するPACK/UNPACKのコードは、ステップ３１１で検出された最適化対象領域内にあり、PACK/UNPACKのコードを削除してもPACK/UNPACKにより変換された結果が変わらないPACK/UNPACKのコードである。本発明の実施態様に従うPACK/UNPACKのコードの削除の例については、下記図１４及び図１５に示されている。
【０１０８】
上記PACK/UNPACKのコードをバイナリコードから削除する処理は、例えば下記の処理に従い行われる。
処理部（２２２）は、副作用となり得る命令のない領域中に書き込みがある変数（更新のある変数ともいう）であるか、又は、副作用となり得る命令のない領域中に書き込みがない変数（更新のない変数ともいう）であるかを判定する。
処理部（２２２）は、更新のある変数の場合に、上記副作用となり得る命令のない領域内にあるゾーン１０進数形式の変数に対するPACK/UNPACKのコードのうち、最初と最後の型変換命令以外のコードをバイナリコードから削除する。言い換えれば、最初と最後の型変換命令は削除されないので、当該最初と最後の型変換命令は、最適化されたバイナリコードの実行において実行される。また、処理部（２２２）は、上記削除するコードに付随する符号処理のコードも上記バイナリコードから削除しうる。
一方、処理部（２２２）は、更新のない変数の場合に、上記副作用となり得る命令のない領域内にあるゾーン１０進数形式の変数に対するPACK/UNPACKのコードのうち、最初の型変換命令以外のコードをバイナリコードから削除する。言い換えれば、最初の型変換命令は削除されないので、当該最初の型変換命令は、最適化されたバイナリコードの実行において実行される。また、処理部（２２２）は、上記削除するコードに付随する符号処理のコードも上記バイナリコードから削除しうる。削除するコードに付随する符号処理のコードは、例えば、図１４のバイナリコード（１４０２）中のコード（１４１２）内及び図１５のバイナリコード（１５０２）中のコード（１５１２）内に記載されている「OI」のコードである。
【０１０９】
PACK/UNPACKの削除において上記最初と最後の型変換命のコードの検出は、下記に従い行われる。処理部（２２２）は、KILL(B)がφであり、IN(B)及びOUT(B)が変数vであるとするならば途中のブロックであり、それ以外の条件のブロックにおいて、最初及び／又は最後の型変換命令のコードが含まれると判断する。
【０１１０】
Ｃ．最適化処理３２１
ステップ３２１〜ステップ３２２、ステップ３２３及びステップ３２５〜３２７は、最適化処理３０１のステップ３０１〜３０２、ステップ３０３及びステップ３０５〜３０７にそれぞれ対応する。
ステップ３２４は、下記点を除き、最適化処理３１１のステップ３１４に対応する。
ステップ３２４では、処理部（２２２）は、ステップ３２２において検出された最適化対象領域のうち、ステップ３２３の変換処理がされなかった部分（例えば、コスト計算によって変換処理が行われなかった部分）について、PACK/UNPACKのコードを削除する処理を行う。
なお、処理部（２２２）は、ステップ３２４に記載の処理をステップ３２３に記載の処理よりも先行して行ってもよい。この場合、ステップ３２３では、処理部（２２２）は、ステップ３２２において検出された最適化対象領域のうち、ステップ３２４に記載の処理がされなかった部分について、ゾーン１０進数形式の変数を２進型へ変換する処理を行う。ただし、ステップ３２４に記載の処理をステップ３２３に記載の処理よりも先行して行う場合のコンパイル時間は、ステップ３２４に記載の処理をステップ３２３に記載の処理よりも先行して行う場合のコンパイル時間よりも長い。
【０１１１】
上記最適化の処理は、例えばＣＯＢＯＬのソースコードを静的に又は動的にコンパイルする際に、本願発明に従う最適化技法を実装したコンパイラによって行われうる。また、上記最適化の処理は、ＣＯＢＯＬのバイナリコードを実行する前に又はＣＯＢＯＬのバイナリコードを実行しながら上記最適化技法を実装したアプリケーションによって行われうる。
【０１１２】
図３Ｂは、本発明の実施形態における、ゾーン１０進数形式の変数へのアクセスを有する言語のバイナリコードの最適化処理全体のフローチャートを示す。
ステップ３３１では、コンピュータ（２０１）は、バイナリコードを記憶部（２０２）から受け取る。または、コンピュータ（２０１）は、ＣＯＢＯＬコンパイラで変換されたバイナリコードを変換部（２１４）から受け取る。
ステップ３３２では、削除部（２２３）は、桁合わせをするための剰余算命令のコードを最適化する。剰余算命令のコードを最適化は、図３Ａのステップ３０５、ステップ３１５及びステップ３２５に対応する。
ステップ３３３では、検出部（２２１）は、上記剰余算命令のコードが最適化された後のバイナリコード内における各変数について、ゾーン１０進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域（最適化対象領域）を検出する。最適化対象領域の検出は、図３Ａのステップ３０２、ステップ３１２及びステップ３２２に対応する。
ステップ３３４では、処理部（２２２）は、ステップ３３３で検出された最適化対象領域内において、ゾーン１０進数形式の変数を２進型へ変換する処理を行う。ゾーン１０進数形式の変数を２進型へ変換する処理は、図３Ａのステップ３０３及びステップ３２３に対応する。
ステップ３３５では、処理部（２２２）は、ステップ３３４で検出された最適化対象領域内において、PACK/UNPACKのコードを削除する処理を行う。なお、処理部（２２２）は、ステップ３３５に記載の処理をステップ３３４に記載の処理よりも先行して行ってもよい。この場合、ステップ３３４では、処理部（２２２）は、ステップ３３３において検出された最適化対象領域のうち、ステップ３３５に記載の処理がされなかった部分について、ゾーン１０進数形式の変数を２進型へ変換する処理を行う。PACK/UNPACKのコードを削除する処理は、図３Ａのステップ３１４及びステップ３２４に対応する。
ステップ３３６では、軽減部（２２４）は、ステップ３３５の後に、上記バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行う。なお、軽減部（２２４）は、図８に示すように、ステップ３３２の処理内において、又は、ステップ３３２の直後に、バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行いうる。演算子強度の軽減は、図３Ａのステップ３０６、３１６及び３２６に対応する。
ステップ３３７では、コンピュータ（２０１）は、バイナリコードの最適化処理を終了する。
【０１１３】
図４は、図３Ａに示す最適化処理のうち、ゾーン１０進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する処理（ステップ３０２、３１２及び３２２）のフローチャートを示す。
ステップ４０１では、検出部（２２１）は、ゾーン１０進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する処理を開始する。
ステップ４０２では、検出部（２２１）は、GEN(B)及びKILL(B)を作成する。GEN(B)は、バイナリコード中の各ブロックBにおいて、副作用となり得る命令の後にアクセスがある変数の集合体である。KILL(B)は、上記各ブロックBにおいて、副作用となり得る命令が１個でも存在する場合には変数全体の集合体である（ただし、副作用となりうる命令が存在しない場合には空集合である）。GEN(B)及びKILL(B)は、下記ステップ４０３に示すデータ・フロー解析で使用するデータ・フロー方程式の入力データである。GEN(B)及びKILL(B)の作成については、下記図５に記載のフローチャートに従い説明する。
ステップ４０３では、検出部（２２１）は、図４に記載のデータ・フロー方程式を用いて、当該データ・フロー方程式にステップ４０２で作成されたGEN(B)及びKILL(B)を適用してIN(B)を求める。
IN(B)は、各ブロックBの先頭における変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である。IN(B)を基にして、下記ステップ４０４及び４０５において、副作用となり得る命令のない領域が、バイナリコード中から検出される。
データ・フロー方程式のうち、IN(B)を求める式中のOUT(N)は、データ・フロー方程式で処理中のブロックBの直前にあるブロックNの終わりにおける変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である。ブロックNは、ブロックBの直前に処理される任意のブロックであって、１又は複数である。ブロックNは、複数であることが多い。
データ・フロー方程式のうち、IN(B)を求める式中のN∈Pred(B)は、処理中のブロックBの直前にあるブロックNに対して行われる処理であることを意味する。
ステップ４０４では、検出部（２２１）は、各ブロックB内の各命令iに、VSETの集合情報の内容を付加情報として設定する。付加情報は、例えば作業領域であるVSETの集合情報から命令i毎に設定される。VSETは、例えばメモリ内の作業領域である。付加情報は、「メモリ内に読み込まれたバイナリコード中において、ゾーン１０進数形式の変数vへのアクセスを含み且つ副作用となり得る命令のない領域」を特定するための情報である。各ブロック内の各命令iにVSETの集合情報の内容を付加情報として設定するためのフローチャートが、下記図６に示されている。また、集合情報の内容の例が下記図１１において示されており、例えば、ブロック１１０２の上から順に、ＩＮ（Ｂ）、Ｖ１、Ｖ１，Ｖ２、φ、そしてＶ１である。
ステップ４０５では、検出部（２２１）は、ステップ４０４において各命令iに設定した付加情報について、各変数が連続している領域を、その変数に対する副作用となり得る命令のない領域とする。
ステップ４０６では、検出部（２２１）は、ゾーン１０進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する処理を終了する。
【０１１４】
ステップ４０４の処理を疑似コードで書くと、下記の通りである。
VSET = IN(B);
for (each i ∈ ブロックB内の各命令iを実行順にスキャン){
if (i はvへのアクセス){
VSET |= v;
} else if (i ∈ 副作用となり得る命令){
VSET = φ;
}
i にVSETの集合情報の内容を付加情報として設定;
}
【０１１５】
図５は、図４に示す検出処理のうち、GEN(B)及びKILL(B)を作成する処理（ステップ４０２）のフローチャートを示す。
ステップ５０１では、検出部（２２１）は、GEN(B)及びKILL(B)を作成する処理を開始する。
ステップ５０２では、検出部（２２１）は、GEN(B)及びKILL(B)を空集合（φ）で初期化する。
ステップ５０３では、検出部（２２１）は、ブロックB内の各命令iを実行順にスキャンする。
ステップ５０４では、検出部（２２１）は、命令iが変数vへのアクセスであるかどうかを検査する。命令iが変数vへのアクセスである場合、検出部（２２１）は、ステップ５０５に進む。一方、命令iが変数vへのアクセスでない場合、検出部（２２１）は、ステップ５０６に進む。
ステップ５０５では、検出部（２２１）は、ステップ５０４で判定された命令iからGEN(B) |= vを求める。
ステップ５０６では、検出部（２２１）は、命令iが副作用となり得る命令かどうかを検査する。命令iが副作用となり得る命令である場合、検出部（２２１）は、ステップ５０７に進む。一方、命令iが変数vへのアクセスでない場合、検出部（２２１）は、ステップ５０８に進む。
ステップ５０７では、検出部（２２１）は、ステップ５０６で判定された命令iから、KILL(B) = φの補集合を求める。また、検出部（２２１）は、GEN(B)を空集合（φ）で初期化する。
ステップ５０８では、検出部（２２１）は、各ブロックB内の各命令iについて実行順にステップ５０３〜５０７を繰り返す。検出部（２２１）は、全ての命令iについて、ステップ５０３〜５０７の処理が終了することに応じて、ステップ５０９に進む。
ステップ５０９では、検出部（２２１）は、GEN(B)及びKILL(B)を作成する処理を終了する。
【０１１６】
図６は、図４に示す検出処理のうち、各ブロックB内の命令iに、VSETの集合情報の内容を付加情報として設定する処理（ステップ４０４）のフローチャートを示す。
ステップ６０１では、検出部（２２１）は、各ブロックB内の各命令iに、作業領域であるVSETの集合情報の内容を付加情報として設定する処理を開始する。
ステップ６０２では、検出部（２２１）は、VSETにIN(B)の内容をコピーする。
ステップ６０３では、検出部（２２１）は、ブロックB内の各命令iを実行順にスキャンする。
ステップ６０４では、検出部（２２１）は、命令iが変数vへのアクセスであるかどうかを検査する。命令iが変数vへのアクセスである場合、検出部（２２１）は、ステップ６０５に進む。一方、命令iが変数vへのアクセスでない場合、検出部（２２１）は、ステップ６０６に進む。
ステップ６０５では、検出部（２２１）は、ステップ６０４で判定された命令iからGEN(B) |= vを求める。
ステップ６０６では、検出部（２２１）は、命令iが副作用となり得る命令かどうかを検査する。命令iが副作用となり得る命令である場合、検出部（２２１）は、ステップ６０７に進む。一方、命令iが変数vへのアクセスでない場合、検出部（２２１）は、ステップ６０８に進む。
ステップ６０７では、検出部（２２１）は、VSETを空集合（φ）で初期化する。
ステップ６０８では、検出部（２２１）は、命令iに、VSETの集合情報を付加情報として設定する。ステップ６０４においてYesの場合、ステップ６０６においてYesの場合、及びステップ６０６においてNoの場合のそれぞれに応じて、VSETに異なる集合情報が追加され、初期化され、又は、変更されない。VSETの集合情報の内容の例について、下記図１１に示す。
ステップ６０９では、検出部（２２１）は、各ブロックB内の各命令iについて実行順にステップ６０３〜６０８を繰り返す。検出部（２２１）は、全ての命令iについて、ステップ６０３〜６０８の処理が終了することに応じて、ステップ６１０に進む。
ステップ６１０では、検出部（２２１）は、各ブロックB内の各命令に、VSETの集合情報の内容を付加情報として設定する処理を終了する。
【０１１７】
図７は、図３Ａに示す最適化処理のうち、桁合わせのための剰余算命令を最適化する処理（ステップ３０５、３１５及び３２５）のフローチャートを示す。
ステップ７０１では、削除部（２２３）は、桁合わせのための剰余算命令REMを最適化する処理を開始する。
ステップ７０２では、削除部（２２３）は、最適化対象領域内の桁合わせのための全ての剰余算命令REMについて、ステップ７０３の削除処理を実行するループを開始する。
ステップ７０３では、削除部（２２３）は、剰余算命令REMについて、１つの剰余算命令についての削除処理を実行する。１つの剰余算命令についての削除処理については、下記図８〜図１０においてさらにその詳細な内容を説明する。
ステップ７０４では、削除部（２２３）は、未処理の剰余算命令についての削除処理を実行する。削除部（２２３）は、全ての剰余算命令についてステップ７０３の処理が終わることに応じて、ステップ７０５に進む。
ステップ７０５では、削除部（２２３）は、桁合わせのための剰余算命令REMを最適化する処理を終了する。
【０１１８】
図８は、図７に示す剰余算命令を最適化する処理のうち、剰余算命令REMについて「１つの剰余算命令についての削除処理」を実行する処理（ステップ７０３）のフローチャートを示す。
剰余算命令を削除できる条件は、桁が合っていなくても問題無いこと、又は、既に桁が合っているために問題無いことである。桁が合っていなくても問題無いことは、下記のAnalyzeUSE(REM, I, NDIGITS)に従い判定される。既に桁が合っているため問題無いことは、下記のAnalyzeDEF(J, NDIGITS)に従い判定される。
【０１１９】
ステップ８０１では、削除部（２２３）は、１つの剰余算命令についての削除処理を開始する。入力データは、剰余算命令REMである。
ステップ８０２では、削除部（２２３）は、剰余算命令REMの分母が10のｎ乗であるかどうかを判定する。削除部（２２３）は、分母が10のｎ乗である場合にステップ８０３に進み、一方、分母が10のｎ乗でない場合にステップ８１０に進み、１つの剰余算命令についての削除処理を終了する。
ステップ８０３では、削除部（２２３）は、変数NDIGITSにnを入れる。
ステップ８０４では、削除部（２２３）は、剰余算命令REMの各使用Iについて、剰余算命令の必要性をAnalyzeUSE(REM, I, NDIGITS)に従い判定する。AnalyzeUSE(REM, I, NDIGITS)については、下記図９に記載のフローチャートにおいて説明する。
ステップ８０５では、削除部（２２３）は、全ての使用Iについて不必要であるかどうかを判定する。削除部（２２３）は、全ての使用Iについて不必要である場合にステップ８０８に進みREMを削除し、一方、全ての使用Iについて不必要でない場合にステップ８０６に進む。
ステップ８０６では、削除部（２２３）は、剰余算命令REMの各定義Jについて、剰余算命令の必要性をAnalyzeDEF(J, NDIGITS)に従い判定する。AnalyzeDEF(J, NDIGITS)については、下記図１０に記載のフローチャートにおいて説明する。
ステップ８０７では、削除部（２２３）は、全ての定義Jについて不必要であるかどうかを判定する。削除部（２２３）は、全ての定義Jについて不必要である場合にステップ８０８に進みREMを削除し、一方、全ての使用Iについて不必要でない場合にステップ８０９に進む。なお、図８では、全ての使用Iについて不必要でない場合にステップ８０９に進むが、ステップ８０９を経ずに、ステップ８１０に進み、１つの剰余算命令についての削除処理を終了するようにしてもよい。
ステップ８０８では、削除部（２２３）は、ステップ８０５における全ての使用Iについて不必要であることに応じて又はステップ８０７における全ての定義Jについて不必要であることに応じて、剰余算命令REMを削除する。
ステップ８０９では、削除部（２２３）は、REMについて演算子強度（命令の）実行コストの軽減を軽減部（２２４）に要求する。軽減部（２２４）は、剰余を求める演算を、結果 =  (分子 < 分母 && 分子 >= 0) ? 分子 : (分子 % 分母)に置き換えることによって、上記演算子強度の軽減を果たす。当該置き換えは、上記剰余を求める演算が、最適化対象領域内に限定されず、バイナリコード中の剰余算命令について削除されなかった残りの個々の剰余算命令について行われうる。軽減部（２２４）は、演算子強度の軽減後に、処理を削除部（２２３）に戻す。削除部は、軽減部（２２４）での演算子強度の軽減が終わることに応じて、ステップ８１０に進む。
ステップ８１０では、削除部（２２３）は、１つの剰余算命令についての削除処理を終了する。
【０１２０】
図９は、図８に示す剰余算命令を最適化する処理のうち、剰余算命令REMの各使用Iについて剰余の必要又は不必要をチェックする処理  AnalyzeUSE(REM, I, NDIGITS)（ステップ８０４）のフローチャートを示す。
ステップ９０１では、削除部（２２３）は、REMの各使用Iについて剰余の必要性をチェックする処理  AnalyzeUSE(REM, I, NDIGITS)に従い、使用Iが必要であるか又は不必要であるかの判定を開始する。
ステップ９０２では、削除部（２２３）は、使用Iがすでにチェック済みかどうかを判定する。削除部（２２３）は、使用Iがすでにチェック済みである場合にステップ９０３に進み、一方、使用Iがすでにチェック済みでない場合に当該使用Iは不必要であると判定する（９０４）。
ステップ９０３では、削除部（２２３）は、使用Iが剰余算命令であるかどうかを判定する。削除部（２２３）は、使用Iが剰余算命令である場合にステップ９０１１に進み、一方、使用Iが剰余算命令でない場合にステップ９０５に進む。
ステップ９０５では、削除部（２２３）は、使用Iが足し算、引き算、又は掛け算のいずれかであるかどうかを判定する。削除部（２２３）は、使用Iが足し算、引き算、又は掛け算のいずれかである場合にステップ９０７に進み、一方、使用Iが足し算、引き算、及び掛け算のいずれでもない場合にステップ９０１４に進む。
ステップ９０７では、削除部（２２３）は、使用Iの出力について剰余不必要と判定された場合に当該使用Iの入力についても不必要であるかどうかを判定する。削除部（２２３）は、上記入力についても不必要である場合にステップ９０１７に進み、一方、上記入力についても不必要でない場合にステップ９０９に進み、REMの各使用Iについて剰余の必要性をチェックする処理  AnalyzeUSE(REM, I, NDIGITS)を終了する。
ステップ９０１１では、削除部（２２３）は、使用Iの分母が、10のｎ乗&& NDIGITS >= n  であるかどうかを判定する。削除部（２２３）は、使用Iの分母が10のｎ乗&& NDIGITS >= n  である場合に当該使用Iは不必要であると判定し（９０１３）、一方、使用Iの分母が10のｎ乗 && NDIGITS >= n  でない場合に当該使用Iは必要であると判定する（９０１２）。NDIGITS>= nである場合には、その剰余算命令は必要であることから（９０１２）削除できない。一方、NDIGITS >= nである場合には、その剰余算命令は必要でないことから（９０１３）削除しうる。NDIGITS>= n において、NDIGITS はｎ１桁に対応し、nはｎ２桁に対応する。よって、ある変数をｎ１桁で丸める剰余算命令があり、当該変数をさらにｎ２桁（≦ｎ１）で丸めるための剰余算命令がある場合には、ｎ１桁で丸める剰余算命令を削除することを意味する。
例えば、ｎ１桁が５桁の剰余算命令であり、ｎ２桁が４桁の剰余算命令である場合には、削除部（２２３）は、ｎ１桁の剰余算命令、すなわち５桁の剰余算命令を削除できる。
ステップ９０１４では、削除部（２２３）は、使用Iによって２進上のオーバーフローが起きないかどうかを判定する。削除部（２２３）は、２進上のオーバーフローが起きない場合にステップ９０１５に進み、一方、２進上のオーバーフローが起きる場合（使用Iによって２進上のオーバーフローが起きないことがない場合）に当該使用Iは必要であると判定する（９０１６）。
ステップ９０１５では、削除部（２２３）は、使用Iの分子は符号ありかどうかを判定する。削除部（２２３）は、使用Iの分子が符号なしの場合にステップ９０１７に進み、一方、使用Iの分子が符号ありの場合にステップ９０１８に進む。符号あり又はなしであるかどうかは、アセンブラ言語の命令であるZAPを使っているかどうか、又は、１０進数形式の変数の符号フィールドに何をセットしているかどうかで判定可能である。また、符号あり又はなしであるかをコンパイル時に見つける方法として、例えば、１０進数形式の変数の符号フィールドにFをセットしているならば符号なしと判定し、それ以外であれば符号ありと判定する方法を採用しうる。
ステップ９０１７では、ステップ９０７の上記入力についても不必要であることに応じて、又は、ステップ９０１８の１０進上の符号が変わらないことに応じて、削除部（２２３）は、使用Iの各使用Kについて、剰余の必要性をAnalyzeUSE(REM, K, NDIGITS)に従い判定する。AnalyzeUSE(REM, K, NDIGITS)については、図９のフローチャートと同じである。
ステップ９０２０では、削除部（２２３）は、全ての使用Kについて不必要であるかどうかを判定する。削除部（２２３）は、全ての使用Iについて不必要である場合に当該使用Kは不必要であると判定し（９０２１）、一方、全ての使用Iについて不必要でない場合に当該使用Kは必要であると判定する（９０２２）。
ステップ９０１８では、削除部（２２３）は、使用Iによって１０進上の符号が変わらないかどうかを判定する。削除部（２２３）は、１０進上の符号が変わらない場合にステップ９０１７に進み、一方、１０進上の符号が変わる場合に当該使用Iは必要であると判定する（９０１９）。
ステップ９０９では、REMの各使用Iについて剰余の必要性をチェックする処理  AnalyzeUSE(REM, I, NDIGITS)を終了する。
【０１２１】
図１０は、図８に示す剰余算命令を最適化する処理のうち、剰余算命令REMの各定義Jについて剰余の必要又は不必要をチェックする処理  AnalyzeDEF(J, NDIGITS)（ステップ８０６）のフローチャートを示す。
ステップ１００１では、削除部（２２３）は、REMの各定義Jについて剰余の必要性をチェックする処理  AnalyzeUSE(REM, I, NDIGITS)に従い、定義Jが必要であるか又は不必要であるかの判定を開始する。
ステップ１００２では、削除部（２２３）は、定義Jが桁及び符号とも正しいかどうかを判定する。削除部（２２３）は、定義Jが桁及び符号とも正しくない場合にステップ１００３に進み、一方、定義Jが桁及び符号とも正しい場合に当該定義Jが不必要であると判定する（１００４）。
ステップ１００３では、削除部（２２３）は、定義Jの入力について剰余が不必要と判断された場合に当該定義Jの出力についても不必要であるかどうかを判定する。削除部（２２３）は、上記出力についても不必要である場合にステップ１００５に進み、一方、上記出力についても不必要でない場合に当該定義Jが必要であると判定する（１００６）。
ステップ１００５では、削除部（２２３）は、定義Jの各定義Lについて剰余の必要性をAnalyzeDEF(L, NDIGITS)に従い判定する。AnalyzeDEF(L, NDIGITS)については、図１０のフローチャートと同じである。
ステップ１００５では、削除部（２２３）は、全ての定義Lについて不必要であるかどうかを判定する。削除部（２２３）は、全ての定義Lについて不必要である場合に当該定義Lについて不必要であると判定し（１００８）、一方全ての定義Lについて不必要でない場合に当該定義Lについて必要であると判定する（１００９）。
【０１２２】
図７に示す剰余算命令を最適化において、図８〜図１０に示すフローチャートによって、剰余算命令の演算の桁が正しいことが保証されている。すなわち、剰余算命令の演算の桁が正しいことの保証が必要な場合には、それに対応する剰余算命令は必要であると判定されて、除去されない。
【０１２３】
図１１は、図６のステップ６０８に示す作業領域であるVSETに格納された集合情報の内容について、当該VSETがどのような集合情報を含んでいるのかを説明するための図である。
VSETには、（１）ステップ６０４においてYesの場合、（２）ステップ６０６においてYesの場合、及び（３）ステップ６０６においてNoの場合のそれぞれに応じて、異なる集合情報が追加され、初期化され、又は、変更されない。
ブロック（１１０１）はバイナリコードの一部を示し、ブロック（１１０１）には、例えば、上から、変数V1、変数V2へのアクセス、副作用となり得る命令、及び変数V1へのアクセスがあるとする。そうすると、上から見ていくと、最終的に、GEN(B)はV1となり、KILL（B）はV1、V2となる。
ブロック（１１０２）において、最初にVSETにIN(B)の内容をコピーする。次に、変数V1へのアクセスがあることから、VSETにV1が追加される（ステップ６０５）。次に、変数V2へのアクセスがあることから、VSETにV1,V2が追加される（副作用となり得る命令の直前まで）（ステップ６０５）。次に、副作用となり得る命令があるのでVSETは空集合（φ）で初期化される（ステップ６０７）。次に、副作用となり得る命令の次に変数V1へのアクセスがあることから、VSETにV1が追加される（ステップ６０５）。
【０１２４】
図１２は、ＣＯＢＯＬコード、最適化対象であるバイナリコード、及び、本発明の実施態様に従い、ゾーン１０進数形式の変数を２進型へ変換して最適化されたコードを示す。
ＣＯＢＯＬコード（１２０１）は最適化対象であるバイナリコード（１２０２）へ変換する前のソースコードである。
バイナリコード（１２０２）は、ＣＯＢＯＬコード（１２０１）をＣＯＢＯＬコンパイラによって変換した結果のコードである。
最適化されたコード（１２０３）は、バイナリコード（１２０２）を本発明の実施態様に従う最適化技法で最適化されたバイナリコードである。
【０１２５】
ＣＯＢＯＬコード（１２０１）のうち、「01 dat PIC 9(7).」（１行目）は、符号なし７桁の数を示す。符号がないことは、符号フィールドにＦを設定しているためにわかる。
処理部（２２２）は、検出部（２２１）によって検出された最適化対象領域内において、３〜８行目に示すコード（１２１２）を、最適化されたコード（１２０３）の３〜１３行目に示すコード（１２１３）に書き換える。すなわち、処理部（２２２）は、バイナリコード（１２０２）中のゾーン１０進数形式の変数を２進型へ変換している。当該変換の結果、最適化されたコード（１２０３）が得られる。
【０１２６】
最適化されたコード（１２０３）では、本来であれば２つのAHIのコードの直後にそれぞれ剰余算命令のコードが挿入される。しかし、本発明に従う最適化技法によって、最後のAHIのコードの直後に剰余算命令を挿入するだけで済んでいる。すなわち、バイナリコード（１２０２）中の最後の１回の剰余算命令以外の剰余算命令のコードが除去されている。従って、バイナリコード（１２０２）中の最後の１回に対応する剰余算命令だけが実行される。
【０１２７】
バイナリコード（１２０２）及び最適化されたコード（１２０３）のそれぞれについて、命令のサイクル数に基づいて各コードのパフォーマンスを比較した。その結果、上記最適化によって、約１．１倍（命令のサイクル数を基に計算）のパフォーマンス向上が確認された。
【０１２８】
また、上記最適化によってさらに別の最適化が可能になり、例えばdat = dat + 2という変形が容易になる。
【０１２９】
図１３は、ＣＯＢＯＬコード、最適化対象であるバイナリコード、及び、本発明の実施態様に従い、ゾーン１０進数形式の変数を２進型へ変換して最適化されたコードを示す。
ＣＯＢＯＬコード（１３０１）は最適化対象であるバイナリコード（１３０２）へ変換する前のソースコードである。
バイナリコード（１３０２）は、ＣＯＢＯＬコード（１３０１）をＣＯＢＯＬコンパイラによって変換した結果のコードである。
最適化されたコード（１３０３）は、バイナリコード（１３０２）を本発明の実施態様に従う最適化技法で最適化されたバイナリコードである。
【０１３０】
ＣＯＢＯＬコード（１３０１）は、変数A、B、及びCは共に符号なし７桁の数を示す。符号がないことは、符号フィールドにＦを設定しているためにわかる。変数Aはbinaryが指定されているために、2進で演算が行われる。
処理部（２２２）は、検出部（２２１）によって検出された最適化対象領域内において、５〜１９行目に示すコード（１３１２）を、最適化されたコード（１３０３）の５〜１７行目に示すコード（１３１３）に書き換える。すなわち、処理部（２２２）は、バイナリコード（１３０２）中のゾーン１０進数形式の変数を２進型へ変換している。当該変換の結果、最適化されたコード（１３０３）が得られる。
【０１３１】
最適化されたコード（１３０３）では、本来であれば３つのARのコードの直後にそれぞれ剰余算命令のコードが挿入される。しかし、本発明に従う最適化技法によって、最後のAR（１０行目）のコードの直後に剰余算命令を挿入するだけで済んでいる。すなわち、バイナリコード（１３０２）中の最後の１回の剰余算命令以外の剰余算命令のコードが除去されている。従って、バイナリコード（１３０２）中の最後の１回に対応する剰余算命令だけが実行される。
【０１３２】
バイナリコード（１３０２）及び最適化されたコード（１３０３）のそれぞれについて、命令のサイクル数に基づいて各コードのパフォーマンスを比較した。その結果、バイナリコード（１３０２）では９１サイクルであったものが、最適化されたコード（１３０２）では２７サイクルであった。従って、上記最適化によって、約４．６倍（命令のサイクル数を基に計算）のパフォーマンス向上が確認された。
【０１３３】
また、上記最適化によってさらに別の最適化が可能になり、例えばdat = dat + 2という変形が容易になる。
【０１３４】
図１４は、ＣＯＢＯＬコード、最適化対象であるバイナリコード、及び、本発明の実施態様に従い、更新がある変数idxに対するPACK/UNPACKのバイナリコードを削除して最適化されたコードを示す。
ＣＯＢＯＬコード（１４０１）は最適化対象であるバイナリコード（１４０２）へ変換する前のソースコードである。
バイナリコード（１４０２）は、ＣＯＢＯＬコード（１４０１）をＣＯＢＯＬコンパイラによって変換した結果のコードである。
最適化されたコード（１４０３）は、バイナリコード（１４０２）を本発明の実施態様に従う最適化技法で最適化されたバイナリコードである。
【０１３５】
ＣＯＢＯＬコード（１４０１）のうち、「01 dat PIC 9(7).」（１行目）は、符号なし７桁の数を示す。
また、バイナリコード（１４０２）は、副作用となり得る命令のない領域中に書き込みがある変数（すなわち、更新がある変数）の場合の例である。更新がある変数であることは、バイナリコード（１４０２）から特定できる。
処理部（２２２）は、検出部（２２１）によって検出された最適化対象領域内において、４行目のUNPACのコード「UNPK  0(8,8),256(4,13)」及びそれに付随する５行目の符号処理のコード「OI    7(8),X'F0'」、並びに６行目のPACKのコード「PACK  256(4,13),0(8,8)」及びそれに付随する７行目の符号処理のコード「OI    259(13),X'0F'」をバイナリコード（１４０２）から削除する。すなわち、処理部（２２２）は、PACK/UNPACKのコードのうち、最初（１行目）と最後（最後から２行目）の型変換命令以外のコード（４〜７行目）（１４１２）を削除している。当該削除の結果、最適化されたコード（１４０３）が得られる。
【０１３６】
バイナリコード（１４０２）及び最適化されたコード（１４０３）のそれぞれについて、命令のサイクル数に基づいて各コードのパフォーマンスを比較した。その結果、その結果、最適化されたコード（１４０３）の実行速度は、同一ハードウェア環境において、最適化前のバイナリコード（１４０２）の実行速度と比べて、約２５％（命令のサイクル数を基に計算）のパフォーマンス向上が観察された。
【０１３７】
また、上記最適化によってさらに別の最適化が可能になり、例えばdat = dat + 2という変形が容易になる。
【０１３８】
図１５は、ＣＯＢＯＬコード、最適化対象であるバイナリコード、及び、本発明の実施態様に従い、更新がない変数idx2に対するPACK/UNPACKのバイナリコードを削除して最適化されたコードを示す。
ＣＯＢＯＬコード（１５０１）は最適化対象であるバイナリコード（１５０２）へ変換する前のソースコードである。
バイナリコード（１５０２）は、ＣＯＢＯＬコード（１５０１）をＣＯＢＯＬコンパイラによって変換した結果のコードである。
最適化されたコード（１５０３）は、バイナリコード（１５０２）を本発明の実施態様に従う最適化技法で最適化されたバイナリコードである。
【０１３９】
ＣＯＢＯＬコード（１５０１）は、符号あり７桁の数を示す。更新がない変数idx2に対する最適化処理を示す。
また、バイナリコード（１５０２）は、副作用となり得る命令のない領域中に書き込みがない変数（すなわち、更新がない変数）の場合の例である。更新がない変数であることは、バイナリコード（１５０２）から特定できる。
処理部（２２２）は、検出部（２２１）によって検出された最適化対象領域内において、５行目のPACKのコード「PACK  256(16,13),40(7,8)」及びそれに付随する６行目の符号処理のコード「OI    271(13),X'0F'」をバイナリコード（１５０２）から削除する。すなわち、処理部（２２２）は、変数idx2に対するPACK/UNPACKのコードのうち、最初（１行目）の型変換命令以外のコード（５〜６行目）を削除している。当該削除の結果、最適化されたコード（１５０３）が得られる。
なお、変数idxに対するPACK/UNPACKのコードであるPACKのコード（下から５行目）及びUNPKのコード（下から２行目）も除去可能である。
【０１４０】
バイナリコード（１５０２）及び最適化されたコード（１５０３）のそれぞれについて、命令のサイクル数に基づいて各コードのパフォーマンスを比較した。その結果、最適化されたコード（１５０３）の実行速度は、同一ハードウェア環境において、最適化前のバイナリコード（１５０２）の実行速度と比べて、約９％（命令のサイクル数を基に計算）のパフォーマンス向上が観察された。
【図１】
0005689366.tif 000002
【図２】
0005689366.tif 000003
【図３Ａ】
0005689366.tif 000004
【図３Ｂ】
0005689366.tif 000005
【図４】
0005689366.tif 000006
【図５】
0005689366.tif 000007
【図６】
0005689366.tif 000008
【図７】
0005689366.tif 000009
【図８】
0005689366.tif 000010
【図９】
0005689366.tif 000011
【図１０】
0005689366.tif 000012
【図１１】
0005689366.tif 000013
【図１２】
0005689366.tif 000014
【図１３】
0005689366.tif 000015
【図１４】
0005689366.tif 000016
【図１５】
0005689366.tif 000017