"ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する方法であって、コンピュータが、メモリ内に読み込まれた前記バイナリコード中から、各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出するステップと、前記検出された領域内において、ゾーン10進数形式の変数を2進型へ変換する処理、PACKUNPACKのコードを削除しても変換された結果が変わらないPACKUNPACKのコードを前記バイナリコードから削除する処理、又はそれらの組み合わせの処理を行うステップとを実行することを含む、前記方法。前記処理を行うステップの後に、前記コンピュータが、桁合わせをするための剰余算命令のコードを前記バイナリコードから削除するステップをさらに実行することを含む、請求項1に記載の方法。前記桁合わせをするための剰余算命令のコードを前記バイナリコードから削除するステップが、A前記変数がn1桁であり、さらに当該変数をn2桁にする剰余算命令についてn1≧n2の条件を満たす場合には、前記n1桁に桁合わせをするための剰余算命令のコードを前記バイナリコードから削除するステップと、B前記Aの条件下にない場合には、a前記変数が符号なしの場合に、a1前記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、前記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを前記バイナリコードから削除するステップと、a2前記a1以外の場合において、当該a1の条件を満たさない演算の前で桁が正しいことを保証するステップと、b前記変数が符号ありの場合に、b1前記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、当該連続している一連の演算の式の途中で符号が変わらないこと及び2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、前記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを前記バイナリコードから削除するステップと、b2前記b1以外の場合において、当該b1の条件を満たさない演算の前で桁が正しいことを保証するステップとを含む、請求項2に記載の方法。前記桁合わせをするための剰余算命令のコードを前記バイナリコードから削除するステップの後に、前記コンピュータが、前記バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行うステップをさらに実行することを含み、前記軽減が、前記剰余を求める演算を下記式:結果分子に置き換えることによって行われる、請求項2に記載の方法。前記a2の保証するステップが、前記a1の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを前記バイナリコードに挿入するステップを含む、請求項3に記載の方法。前記b2の保証するステップが、前記b1の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを前記バイナリコードに挿入するステップを含む、請求項3に記載の方法。前記検出するステップが、前記バイナリコード中の各ブロックにおいて、副作用となり得る命令の後にアクセスがある変数の集合体以下、GENともいう及び前記各ブロックにおいて、副作用となり得る命令が存在する場合には変数全体の集合体以下、KILLともいうを作成するステップであって、前記KILLは、副作用となり得る命令が存在しない場合には空集合である、前記作成するステップと、各ブロックの先頭における変数の集合以下、INともいうを、各ブロックの終わりにおける変数の集合以下、OUTともいう、前記GEN及び前記KILLから求めるステップと、各ブロック内の各命令において変更された集合情報を前記各ブロック内の各命令に付加情報としてそれぞれ設定するステップであって、前記集合情報は前記INを基にして求められる、前記設定するステップと、前記各命令に設定された付加情報について、各変数が連続している領域を、当該変数に対する副作用となり得る命令のない領域とするステップとを含む、請求項1に記載の方法。前記作成するステップが、各ブロック内の命令が変数へのアクセスであるかどうか、及び、前記命令が副作用となり得る命令であるかどうかを判定するステップと、前記判定を各命令の実行順に繰り返すステップと、前記判定の結果から、前記GEN及び前記KILLを作成するステップとを含む、請求項7に記載の方法。前記OUT及び前記INが、OUTKILL∪GENIN∩N∈PredOUTのデータフロー方程式から求められ、OUTは、上記式で処理中のブロックBの直前にあるブロックNの終わりにおける変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である、請求項7に記載の方法。前記設定するステップが、各ブロック内の命令が変数へのアクセスであるかどうか、及び、前記命令が副作用となり得る命令であるかどうかを判定し、前記INの集合情報を変更するステップと、前記各ブロック内の各命令において変更された集合情報を前記ブロック内の各命令に付加情報としてそれぞれ設定するステップであって、前記集合情報は前記INを基にして求められる、上記設定するステップと、前記判定及び前記INの集合情報の変更を各命令の実行順に繰り返すステップとを含む、請求項7に記載の方法。前記PACKUNPACKのコードを前記バイナリコードから削除する前記処理が、c1副作用となり得る命令のない前記領域中に書き込みがある変数の場合に、前記副作用となり得る命令のない前記領域内にあるゾーン10進数形式の変数に対するPACKUNPACKのコードのうち、最初と最後の型変換命令以外のコードを前記バイナリコードから削除する処理と、c2副作用となり得る命令のない前記領域中に書き込みがない変数の場合に、前記副作用となり得る命令のない前記領域内にあるゾーン10進数形式の変数に対するPACKUNPACKのコードのうち、最初の型変換命令以外のコードを前記バイナリコードから削除する処理とを含む、請求項1に記載の方法。前記PACKUNPACKのコードを前記バイナリコードから削除する前記処理が、c3前記c1及び/又はc2の前記型変換命令以外のコードを削除する際に、当該削除するコードに付随する符号処理のコードを前記バイナリコードからさらに削除する処理をさらに含む、請求項11に記載の方法。ゾーン10進数形式の変数を2進型へ変換する前記処理が、当該変換処理前後のコスト差を見積もり、変換処理後の見積もりコストが変換処理前の見積もりコストよりも小さいことを条件に行われ、次に、前記PACKUNPACKのコードを前記バイナリコードから削除する処理が、前記コスト差の見積もりの計算によって前記変換する処理がされなかった部分について行われる、請求項1に記載の方法。前記変換処理前後の前記コスト差が、下記式:コスト差=変数がゾーン10進数形式である場合と2進型である場合とでの当該変数へアクセスする命令のコスト差にその実行頻度を乗じた値2進型への変換コストに各前記検出された領域内へ入る実行頻度を乗じた値ゾーン10進数形式への変換コストに各前記検出された領域から出る実行頻度を乗じた値桁合わせをするための剰余算命令のコストにその剰余算命令の実行頻度を乗じた値によって求められる、請求項13に記載の方法。前記副作用となり得る命令が、ゾーン10進数形式の変数を2進型への型変換を行うと処理矛盾を起こし得る命令、又は、PACKUNPACKのコードを削除すると処理矛盾を起こし得る命令である、請求項1に記載の方法。前記副作用となり得る命令が、コンパイルスコープ外の命令を実行する命令、アプリケーションから観測可能な例外を起こし得る命令、及び、前記変数のベースアドレスレジスタ又はインデックスレジスタを変更する命令の少なくとも1つである、請求項1に記載の方法。ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する装置であって、各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する検出部と、前記検出された領域内において、ゾーン10進数形式の変数を2進型へ変換する処理、PACKUNPACKのコードを削除しても変換された結果が変わらないPACKUNPACKのコードを前記バイナリコードから削除する処理、及びそれらの組み合わせの処理のうちの1つを行う処理部とを備えている、前記装置。前記処理が前記処理部によって行われた後に、桁合わせをするための剰余算命令のコードを前記バイナリコードから削除する削除部をさらに備えており、前記削除部は、A前記変数がn1桁であり、さらに当該変数をn2桁にする剰余算命令についてn1≧n2の条件を満たす場合には、前記n1桁に桁合わせをするための剰余算命令のコードを前記バイナリコードから削除し、B前記Aの条件下にない場合には、a前記変数が符号なしの場合に、a1前記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、前記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを前記バイナリコードから削除し、a2前記a1以外の場合において、当該a1の条件を満たさない演算の前で桁が正しいことを保証し、b前記変数が符号ありの場合に、b1前記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、当該連続している一連の演算の式の途中で符号が変わらないこと及び2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、前記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを前記バイナリコードから削除し、b2前記b1以外の場合において、当該b1の条件を満たさない演算の前で桁が正しいことを保証する、請求項17に記載の装置。ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する装置であって、前記バイナリコードを読み込むためのメモリと、前記メモリ上で前記バイナリコードを最適化するためのプロセッサとを備えており、前記最適化が、請求項1~16のいずれか一項に記載の方法の各ステップを実行することによって行われる、前記装置。ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化するためのコンピュータプログラムであって、コンピュータに、請求項1~16のいずれか一項に記載の方法の各ステップを実行させる、前記コンピュータプログラム。上記の通り、COBOL言語はその歴史が古いために、場合によってはCOBOLのバイナリコード以下、単にバイナリコードともいうだけが存在しまたは保存されており、COBOLのソースコード以下、単にCOBOLコードともいうが逸失してしまっている場合がある。このような場合に、COBOLコードを再コンパイルしてバイナリコードを最適化することができない。従って、COBOLコードに対してではなく、バイナリコードそれ自体を最適化したいという要望がある。また、COBOLコードをコンパイルする際に、ゾーン10進数によるオーバーヘッドを減らす技術が存在している。例えば、特許文献1及び2のいずれも、ソースコードに対して型変換を行っている。すなわち、特許文献1及び2のいずれも、COBOLコードに対する最適化を記載する。しかしながら、特許文献1及び2のいずれも、バイナリコードに対する最適化を記載していない。また、バイナリコードに対しては、副作用を起こし得る命令を考慮しなければならない。なぜならば、副作用を起こし得る命令を考慮しないと、元のプログラムと比べて結果が異なる可能性があるからである。従って、ソースコードに対して型変換を行っている特許文献1及び2に記載の技術をバイナリコードの最適化にそのまま適用することはできない。特許文献1は、型の変換が可能な項目を抽出することを記載する特許請求の範囲。特許文献1は、さらに、型の変換が可能な項目が、作業用変数などを変換可能項目としていること、ただし、他プログラムとのインタフェースに使用されている項目については型変換を行うと処理矛盾が生じる可能性があるので型変換を行わず、且つ、プログラム内で作業用に使用されている項目であっても、高級言語の再定義の機能を利用して、別の型属性で参照される項目については、同様に型の変換を行ってはならないことを記載する3頁左下欄12~右下欄4行。すなわち、特許文献1において、型変換を行うと処理矛盾が生じる可能性がある項目については最適化の対象とならないために、最適化の機会が失われてしまう。また、型変換のためのコストの見積もりを、特許文献1ではクロック数サイクル数で計算し、特許文献2では変数及び数値データの更新回数が参照回数よりも多い場合という判断基準で決定している。しかしながら、特許文献1及び2のいずれも、最適化を行うかどうかのコストを見積もる場合に、各ブロックにおける実行頻度を考慮していない。そのために、コストの見積もり結果が正確でないという問題がある。以上に述べた問題を解決するために、バイナリコードに対して直接的に最適化を実行することができ、且つ、副作用となり得る命令があるCOBOLコード又はそのバイナリコード、特にバイナリコードに対して適用可能な最適化技法が求められている。本発明者は、メモリ内に読み込まれたバイナリコード中から、各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出し、当該検出された領域内において、最適化処理を行うことによって、上記問題を解決することを見出した。すなわち、本発明は、各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出することを特徴とする。本発明は、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコード、特にはCOBOLのバイナリコードを最適化する方法を提供する。当該方法は、コンピュータ、例えばバイナリコード最適化装置が、上記最適化方法を上記バイナリコードに対して適用することによって実行されうる。または、上記方法は、コンピュータ、例えばコンパイラ装置が、上記最適化方法が実装されたコンパイラによってCOBOLコードをコンパイルすることによって、上記コンピュータによって実行されうる。上記方法は、コンピュータが、メモリ内に読み込まれた上記バイナリコード中から、各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出するステップと、上記検出された領域内において、ゾーン10進数形式の変数を2進型へ変換する処理、PACKUNPACKのコードを削除しても変換された結果が変わらないPACKUNPACKのコードを上記バイナリコードから削除する処理、又はそれらの組み合わせの処理を行うステップとを実行することを含む。本発明の一つの実施態様において、上記コンピュータが、上記処理を行うステップの後に、桁合わせをするための剰余算命令のコードを上記バイナリコードから削除するステップをさらに実行することを含みうる。本発明の一つの実施態様において、上記桁合わせをするための剰余算命令のコードを上記バイナリコードから削除するステップが、A上記変数がn1桁であり、さらに当該変数をn2桁にする剰余算命令についてn1≧n2の条件を満たす場合には、上記n1桁に桁合わせをするための剰余算命令のコードを上記バイナリコードから削除するステップと、B上記Aの条件下にない場合には、a上記変数が符号なしの場合に、a1上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除するステップと、a2上記a1以外の場合において、当該a1の条件を満たさない演算の前で桁が正しいことを保証するステップと、b上記変数が符号ありの場合に、b1上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、当該連続している一連の演算の式の途中で符号が変わらないこと及び2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除するステップと、b2上記b1以外の場合において、当該b1の条件を満たさない演算の前で桁が正しいことを保証するステップとを含みうる。本発明の一つの実施態様において、上記桁合わせをするための剰余算命令のコードを上記バイナリコードから削除するステップの後に、上記コンピュータが、上記バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行うステップをさらに実行することを含み、上記軽減が、上記剰余を求める演算を下記式:結果分子に置き換えることによって行われうる。本発明の一つの実施態様において、上記a2の保証するステップが、上記a1の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを上記バイナリコードに挿入するステップを含みうる。本発明の一つの実施態様において、上記b2の保証するステップが、上記b1の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを上記バイナリコードに挿入するステップを含みうる。本発明の一つの実施態様において、上記検出するステップが、上記バイナリコード中の各ブロックにおいて、副作用となり得る命令の後にアクセスがある変数の集合体以下、GENともいう及び上記各ブロックにおいて、副作用となり得る命令が存在する場合には変数全体の集合体以下、KILLともいうを作成するステップであって、上記KILLは、副作用となり得る命令が存在しない場合には空集合である、上記作成するステップと、各ブロックの先頭における変数の集合以下、INともいうを、各ブロックの終わりにおける変数の集合以下、OUTともいう、上記GEN及び上記KILLから求めるステップと、各ブロック内の各命令において変更された集合情報を上記各ブロック内の各命令に付加情報としてそれぞれ設定するステップであって、上記集合情報は上記INを基にして求められる、上記設定するステップと、上記各命令に設定された付加情報について、各変数が連続している領域を、当該変数に対する副作用となり得る命令のない領域とするステップとを含みうる。本発明の一つの実施態様において、上記GEN及び上記KILL作成するステップが、各ブロック内の命令が変数へのアクセスであるかどうか、及び、上記命令が副作用となり得る命令であるかどうかを判定するステップと、上記判定を各命令の実行順に繰り返すステップと、上記判定の結果から、上記GEN及び上記KILLを作成するステップとを含みうる。本発明の一つの実施態様において、上記OUT及び上記INが、OUTKILL∪GENIN∩N∈PredOUTのデータフロー方程式から求められうる。OUTは、上記式で処理中のブロックBの直前にあるブロックNの終わりにおける変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である。本発明の一つの実施態様において、上記設定するステップが、各ブロック内の命令が変数へのアクセスであるかどうか、及び、上記命令が副作用となり得る命令であるかどうかを判定し、上記INの集合情報を変更するステップと、各ブロック内の各命令において変更された集合情報を上記各ブロック内の各命令に付加情報としてそれぞれ設定するステップであって、上記集合情報は上記INを基にして求められる、上記設定するステップと、上記判定及び上記INの集合情報の変更を各命令の実行順に繰り返すステップとを含みうる。本発明の一つの実施態様において、上記PACKUNPACKのコードを上記バイナリコードから削除する上記処理が、c1副作用となり得る命令のない上記領域中に書き込みがある変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン10進数形式の変数に対するPACKUNPACKのコードのうち、最初と最後の型変換命令以外のコードを上記バイナリコードから削除する処理と、c2副作用となり得る命令のない上記領域中に書き込みがない変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン10進数形式の変数に対するPACKUNPACKのコードのうち、最初の型変換命令以外のコードを上記バイナリコードから削除する処理とを含みうる。本発明の一つの実施態様において、上記PACKUNPACKのコードを上記バイナリコードから削除する上記処理が、c3上記c1及び/又はc2の上記型変換命令以外のコードを削除する際に、当該削除するコードに付随する符号処理のコードを上記バイナリコードからさらに削除する処理をさらに含みうる。本発明の一つの実施態様において、ゾーン10進数形式の変数を2進型へ変換する上記処理が、当該変換処理前後のコスト差を見積もり、変換処理後の見積もりコストが変換処理前の見積もりコストよりも小さいことを条件に行われ、次に、上記PACKUNPACKのコードを上記バイナリコードから削除する処理が、上記コスト差の見積もりの計算によって上記変換する処理がされなかった部分について行われうる。本発明の一つの実施態様において、上記変換処理前後の上記コスト差が、コスト差=変数がゾーン10進数形式である場合と2進型である場合とでの当該変数へアクセスする命令のコスト差にその実行頻度を乗じた値2進型への変換コストに各上記検出された領域内へ入る実行頻度を乗じた値ゾーン10進数形式への変換コストに各上記検出された領域から出る実行頻度を乗じた値桁合わせをするための剰余算命令のコストにその剰余算命令の実行頻度を乗じた値によって求められうる。また、本発明は、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコード、特にはCOBOLのバイナリコードを最適化する方法を提供する。当該方法は、コンピュータ、例えばバイナリコード最適化装置が、上記最適化方法を上記バイナリコードに対して適用することによって実行されうる。または、上記方法は、コンピュータ、例えばコンパイラ装置が、上記最適化方法が実装されたコンパイラによってCOBOLコードをコンパイルすることによって、上記コンピュータによって実行されうる。上記方法は、コンピュータが、メモリ内に読み込まれた上記バイナリコードから、桁合わせをするための剰余算命令のコードを削除するステップを実行することを含む。本発明の一つの実施態様において、上記方法は、上記コンピュータが、上記剰余算命令のコードの削除が行われた後に、メモリ内に読み込まれ且つ上記剰余算命令のコードが削除されたバイナリコード中から、各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出するステップと、上記検出された領域内において、ゾーン10進数形式の変数を2進型へ変換する処理、PACKUNPACKのコードを削除しても変換された結果が変わらないPACKUNPACKのコードを上記バイナリコードから削除する処理、又はそれらの組み合わせの処理を行うステップとをさらに実行することを含みうる。また、本発明は、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する装置を提供する。当該装置は例えばバイナリコード最適化装置であり、当該装置は、上記バイナリコードに対して上記最適化を適用する。または、当該装置は例えばコンパイラ装置であり、当該装置は、上記最適化を、COBOLコードをコンパイルする際に適用する。上記装置は、各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する検出部と、上記検出された領域内において、ゾーン10進数形式の変数を2進型へ変換する処理、PACKUNPACKのコードを削除しても変換された結果が変わらないPACKUNPACKのコードを上記バイナリコードから削除する処理、及びそれらの組み合わせの処理のうちの1つを行う処理部とを備えている。本発明の一つの実施態様において、上記装置が、上記処理が上記処理部によって行われた後に、桁合わせをするための剰余算命令のコードを上記バイナリコードから削除する削除部をさらに備えうる。本発明の一つの実施態様において、上記削除部は、A上記変数がn1桁であり、さらに当該変数をn2桁にする剰余算命令についてn1≧n2の条件を満たす場合には、上記n1桁に桁合わせをするための剰余算命令のコードを上記バイナリコードから削除し、B上記Aの条件下にない場合には、a上記変数が符号なしの場合に、a1上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除し、a2上記a1以外の場合において、当該a1の条件を満たさない演算の前で桁が正しいことを保証し、b上記変数が符号ありの場合に、b1上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、当該連続している一連の演算の式の途中で符号が変わらないこと及び2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除し、b2上記b1以外の場合において、当該b1の条件を満たさない演算の前で桁が正しいことを保証しうる。本発明の一つの実施態様において、上記装置は、上記桁合わせをするための剰余算命令のコードが上記削除部によって上記バイナリコードから削除された後に、上記バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行う軽減部をさらに備えうる。上記軽減部は、上記剰余を求める演算を下記式:結果分子に置き換えることによって上記軽減を行いうる。本発明の一つの実施態様において、上記削除部は、a2の保証を、上記a1の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを上記バイナリコードに挿入することによって行う。本発明の一つの実施態様において、上記削除部は、b2の保証を、上記b1の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを上記バイナリコードに挿入することによって行う。本発明の一つの実施態様において、上記検出部が、上記バイナリコード中の各ブロックにおいて、副作用となり得る命令の後にアクセスがある変数の集合体以下、GENともいう及び上記各ブロックにおいて、副作用となり得る命令が存在する場合には変数全体の集合体以下、KILLともいうを作成し、ここで上記KILLは、副作用となり得る命令が存在しない場合には空集合であり、各ブロックの先頭における変数の集合以下、INともいうを、各ブロックの終わりにおける変数の集合以下、OUTともいう、上記GEN及び上記KILLから求め、各ブロック内の各命令において変更された集合情報を上記各ブロック内の各命令に付加情報としてそれぞれ設定し、ここで前記集合情報は前記INを基にして求められ、上記各命令に設定された付加情報について、各変数が連続している領域を、当該変数に対する副作用となり得る命令のない領域としうる。本発明の一つの実施態様において、上記検出部が、上記GEN及び上記KILLの作成において、各ブロック内の命令が変数へのアクセスであるかどうか、及び、上記命令が副作用となり得る命令であるかどうかを判定し、上記判定を各命令の実行順に繰り返し、上記判定の結果から、上記GEN及び上記KILLを作成しうる。本発明の一つの実施態様において、上記検出部が、上記OUT及び上記INを、OUTKILL∪GENIN∩N∈PredOUTのデータフロー方程式から求めうる。OUTは、上記式で処理中のブロックBの直前にあるブロックNの終わりにおける変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である。本発明の一つの実施態様において、上記検出部が、上記集合情報の設定において、各ブロック内の命令が変数へのアクセスであるかどうか、及び、上記命令が副作用となり得る命令であるかどうかを判定し、上記INの集合情報を変更し、上記各ブロック内の各命令において変更された集合情報を上記ブロック内各命令にそれぞれ設定し、上記判定及び上記INの集合情報の変更を各命令の実行順に繰り返しうる。上記集合情報は、上記INを基にして求められる。本発明の一つの実施態様において、上記処理部が、c1副作用となり得る命令のない上記領域中に書き込みがある変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン10進数形式の変数に対するPACKUNPACKのコードのうち、最初と最後の型変換命令以外のコードを上記バイナリコードから削除し、c2副作用となり得る命令のない上記領域中に書き込みがない変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン10進数形式の変数に対するPACKUNPACKのコードのうち、最初の型変換命令以外のコードを上記バイナリコードから削除しうる。本発明の一つの実施態様において、上記処理部が、さらに、c3上記c1及び/又はc2の上記型変換命令以外のコードを削除する際に、当該削除するコードに付随する符号処理のコードを上記バイナリコードから削除しうる。本発明の一つの実施態様において、上記処理部は、ゾーン10進数形式の変数を2進型へ変換する上記処理を、当該変換処理前後のコスト差を見積もり、変換処理後の見積もりコストが変換処理前の見積もりコストよりも小さいことを条件に行い、次に、上記PACKUNPACKのコードを上記バイナリコードから削除する処理を、上記コスト差の見積もりの計算によって上記変換する処理がされなかった部分について行いうる。本発明の一つの実施態様において、上記処理部は、上記変換処理前後の上記コスト差を、コスト差=変数がゾーン10進数形式である場合と2進型である場合とでの当該変数へアクセスする命令のコスト差にその実行頻度を乗じた値2進型への変換コストに各上記検出された領域内へ入る実行頻度を乗じた値ゾーン10進数形式への変換コストに各上記検出された領域から出る実行頻度を乗じた値桁合わせをするための剰余算命令のコストにその剰余算命令の実行頻度を乗じた値によって求めうる。また、本発明は、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する装置を提供する。当該装置は例えばバイナリコード最適化装置であり、当該装置は、上記バイナリコードに対して上記最適化を適用する。または、当該装置は例えばコンパイラ装置であり、当該装置は、上記最適化を、COBOLコードをコンパイルする際に適用する。上記装置は、メモリ内に読み込まれた上記バイナリコードから、桁合わせをするための剰余算命令のコードを削除する削除部を備える。本発明の一つの実施態様において、上記装置が、上記削除が上記削除部によって行われた後に、メモリ内に読み込まれ且つ上記剰余算命令のコードが削除されたバイナリコード中から、各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する検出部と、上記検出された領域内において、ゾーン10進数形式の変数を2進型へ変換する処理、PACKUNPACKのコードを削除しても変換された結果が変わらないPACKUNPACKのコードを上記バイナリコードから削除する処理、及びそれらの組み合わせの処理のうちの1つを行う処理部とをさらに備えうる。また、本発明は、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコード、特にはCOBOLのバイナリコードを最適化する装置を提供する。当該装置は例えばバイナリコード最適化装置であり、当該装置は、上記バイナリコードに対して上記最適化を適用する。または、当該装置は例えばコンパイラ装置であり、当該装置は、COBOLコードをコンパイルする際に上記最適化を適用しうる。上記装置は、上記バイナリコードを読み込むためのメモリと、上記メモリ上で上記バイナリコードを最適化するためのプロセッサとを備えている。上記装置は、上記最適化を、上記に記載された方法の各ステップを実行することによって行う。また、本発明は、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコード、特にはCOBOLのバイナリコードを最適化するためのコンピュータプログラムを適用する。当該コンピュータプログラムは、上記バイナリコードを最適化するためのコンピュータプログラムにおいて実装されうる。または、当該コンピュータプログラムは、コンパイラにおいて実装されうる。上記コンピュータプログラムは、コンピュータに、上記に記載されたいずれか一つの方法の各ステップを実行させる。上記コンピュータプログラムは、記憶媒体、例えばハードディスク、ソリッドステートドライブのようなアプリケーションを記憶し、そこからコンピュータが当該アプリケーションを起動可能な記憶媒体に格納されうる。または、上記コンピュータプログラムは、上記記憶媒体にインストールするために使用される記憶媒体、例えばCD-ROM、DVD若しくはBD、又はUSBメモリに格納されうる。本発明の最適化技法では、各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する為に、変数毎にバイナリコード中のどの領域であるならば最適化できるかを見つけることが可能である。従って、本発明の最適化技法では、どの変数を最適化対象とするかを選択する従来技術と比べて、最適化できる機会が増大する点で有用である。また、本発明の最適化技法では、COBOLコードが存在しない場合であっても、言い換えればCOBOLコードを再コンパイルすることができない状況下にあっても、バイナリコードに対して本発明に従う最適化技法を適用することができる。従って、本発明の最適化技法では、バイナリコードに対して最適化技法を直接的に適用することができる点で、特にビジネス上において有用である。さらに、本発明の最適化技法では、COBOLコード又はそのバイナリコードが副作用となりうる命令を含む場合であっても、本発明に従う最適化技法を適用することができる。従って、本発明の最適化技法では、副作用となり得る命令があることによって最適化の機会が失われることがない点で有用である。以下に、本発明の実施態様を各図面に従って説明する。なお、当該実施形態は、本発明の好適な形態を説明するためのものであり、本発明の範囲をここで示すものに限定する意図はないことを理解されたい。また、以下の図を通して、特に断らない限り、同一の符号は、同一の対象を指す。図1は、本発明の実施形態におけるコンピュータハードウェアの基本的なブロック図を示す。コンピュータ101は、CPU102とメインメモリ103とを備えており、これらはバス104に接続されている。CPU102は好ましくは、32ビット又は64ビットのアーキテクチャに基づくものであり、例えば、インテル社のCorei商標シリーズ、Core2商標シリーズ、Atom商標シリーズ、Xeon商標シリーズ、Pentium登録商標シリーズ、Celeron登録商標シリーズ、AMD社のPhenom商標シリーズ、Athlon商標シリーズ、Turion商標シリーズ又はSempron商標が使用されうる。バス104には、ディスプレイコントローラ105を介して、ディスプレイ106、例えば液晶ディスプレイLCDが接続されうる。ディスプレイ106は、コンピュータの管理のために、通信回線を介してネットワークに接続されたコンピュータについての情報と、そのコンピュータ上で動作中のソフトウェアについての情報を、適当なグラフィックインタフェースで表示するために使用される。バス104にはまた、SATA又はIDEコントローラ107を介して、ディスク108、例えばハードディスク又はシリコンディスクと、ドライブ109、例えばCD、DVD又はBDドライブとが接続されうる。バス104にはさらに、キーボードマウスコントローラ110又はUSBバス図示せずを介して、キーボード111及びマウス112が接続されうる。ディスク108には、任意的に、オペレーティングシステム、COBOLコード作成のための処理プログラム、COBOLコードをコンパイルするためのCOBOLコンパイラ、及びその他のプログラム、並びにCOBOLコード、バイナリコード、及び最適化されたコードが、メインメモリにロード可能に記憶されている。ドライブ109は、必要に応じて、CD-ROM、DVD-ROM又はBDからプログラムをディスク108にインストールするために使用される。通信インタフェース114は、例えばイーサネット登録商標プロトコルに従う。通信インタフェース114は、通信コントローラ113を介してバス104に接続され、コンピュータ101を通信回線115に物理的に接続する役割を担い、コンピュータ101のオペレーティングシステムの通信機能のTCP/IP通信プロトコルに対して、ネットワークインタフェース層を提供する。なお、通信回線は、有線LAN環境、或いは例えばIEEE802.11a/b/g/nなどの無線LAN接続規格に基づく無線LAN環境であってもよい。図2は、本発明の実施形態における、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードの最適化処理を行うための機能ブロック図を示す。コンピュータ201は、図1のコンピュータ101に対応する。コンピュータ201は、図1のコンピュータ101に示されている構成、例えばCPU及びメモリを備えている。コンピュータ201は、本発明に従う最適化技法を実施するためのバイナリコード最適化装置又はコンパイラ装置でありうる。記憶部202は、ゾーン10進数形式の変数へのアクセスを有する言語のソースコード例えばCOBOLのソースコード、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコード例えばCOBOLのバイナリコードを格納する。また、記憶部202は、本発明に従う最適化技法に従って最適化されたバイナリコードを格納する。以下では、ゾーン10進数形式の変数へのアクセスを有する言語のソースコードとして、COBOLのソースコード以下、単に、COBOLコードともいうを例として述べる。同様に、以下では、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードとして、COBOLのバイナリコード以下、単に、バイナリコードともいうを例として述べる。記憶部202は、コンピュータ201内に用意された記憶媒体、コンピュータ201に直接的に又はネットワークを介して接続された外部記憶媒体でありうる。記憶部202は、例えばハードディスク又はソリッドステートディスクでありうるがこれらに限定されない。コンピュータ201は、本発明に従う最適化技法を実施するための少なくとも最適化部215を備えており、字句解析部211、構文解析部212、意味解析部213を任意に備えうる。コンピュータ201が、コンパイラ図示せずを備えている場合、当該コンパイラが、字句解析部211、構文解析部212、意味解析部213及び最適化部215に加えて、COBOLコードをバイナリコードに変換するための変換部214を備えうる。字句解析部211は、入力されたCOBOLコード又はバイナリコードについて、字句解析を行う。構文解析部212は、字句解析部211によって字句解析された結果について構文解析を行う。意味解析部213は、構文解析部212によって構文解析された結果について意味解析を行う。変換部214は、COBOLコードをバイナリコードに変換する。最適化部215は、本発明に従う最適化技法に従い、バイナリコードを最適化する。また、最適化部215は、本発明以外の最適化技法、例えばソースコードの最適化技法及びバイナリコードの最適化技法を含んでいてもよい。最適化部215は、少なくとも検出部221及び処理部222を備えており、任意的に、削除部223及び/又は軽減部224を備えていてもよい。検出部221、処理部222、削除部223及び軽減部224は、起動信号を与える機能を有するコンピュータプログラムで実装され、又は、専用のハードウェア回路で実現されてもよい。特に、本願発明に従うコンピュータプログラムにおいて、各ステップの主体が検出部221、処理部222、削除部223及び軽減部224のいずれかでありうる場合、各部221~224の一部又は全部が専用のハードウェア回路で実現されてもよく、専用のハードウェア回路で実現されない部若しくは全ての部221~224がプログラムコードとして実装されてもよい。検出部221は、各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する下記図3Aのステップ302、312及び322を参照。検出部221は、上記領域を検出するために、下記処理1~4を行う下記図4~図6を参照。すなわち、1検出部221は、上記バイナリコード中の各ブロックにおいて、GEN及びKILLを作成する;2検出部221は、各ブロックの先頭における変数の集合以下、INともいうを、各ブロックの終わりにおける変数の集合以下、OUTともいう、上記GEN及び上記KILLから求める;3検出部221は、各ブロック内の各命令において変更された集合情報を上記各ブロック内の各命令に付加情報としてそれぞれ設定する;4検出部221は、上記各命令に設定された付加情報について、各変数が連続している領域を、当該変数に対する副作用となり得る命令のない領域とする。上記集合情報は、上記INを基にして求められる。GENは、バイナリコード中の各ブロックにおいて、副作用となり得る命令の後にアクセスがある変数の集合体である。KILLは、バイナリコード中の各ブロックにおいて、副作用となり得る命令が存在する場合には変数全体の集合体ただし、副作用となり得る命令が存在しない場合には空集合であるである。検出部221は、上記1の上記の作成において、下記処理1a~1cを行う。すなわち、1a検出部221は、各ブロック内の命令が変数へのアクセスであるかどうか、及び、上記命令が副作用となり得る命令であるかどうかを判定する;1b検出部221は、上記判定を各命令の実行順に繰り返す;1c検出部221は、上記判定の結果から、上記GEN及び上記KILLを作成する。検出部221は、上記OUT及び上記INを、下記データフロー方程式から求める。OUTは、下記式で処理中のブロックBの直前にあるブロックNの終わりにおける変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である。OUTKILL∪GENIN∩N∈PredOUT検出部221は、上記3の上記付加情報の設定において、下記処理3a~3cを行う。すなわち、3a検出部221は、各ブロック内の命令が変数へのアクセスであるかどうか、及び、上記命令が副作用となり得る命令であるかどうかを判定し、上記INの集合情報を変更する;3b検出部221は、上記各ブロック内の各命令において変更された集合情報を上記各ブロック内の各命令に付加情報としてそれぞれ設定する;3c検出部221は、上記判定及び上記INの集合情報の変更を各命令の実行順に繰り返す。上記集合情報は上記INを基にして求められる。処理部222は、上記検出された領域内において、ゾーン10進数形式の変数を2進型へ変換する処理図3Aのステップ303を参照、PACKUNPACKのコードを削除しても変換された結果が変わらないPACKUNPACKのコードを上記バイナリコードから削除する処理同ステップ314を参照、及びそれらの組み合わせの処理同ステップ323及び324を参照のうちの1つを行う。PACKUNPACKは、COBOLにおいて周知の命令である。処理部222は、ゾーン10進数形式の変数を2進型へ変換する処理を、当業者に知られている任意の方法を使用して行いうる。処理部222は、ゾーン10進数形式の変数を2進型へ変換する上記処理を、当該変換処理前後のコスト差を見積もり、変換処理後の見積もりコストが変換処理前の見積もりコストよりも小さいことを条件に行い、次に、上記PACKUNPACKのコードを上記バイナリコードから削除する処理を、上記コスト差の見積もりの計算によって上記変換する処理がされなかった部分について行いうる。処理部222は、上記変換処理前後の上記コスト差を、下記足し算の式に従い求める。すなわち、コスト差=変数がゾーン10進数形式である場合と2進型である場合とでの当該変数へアクセスする命令のコスト差にその実行頻度を乗じた値2進型への変換コストに各上記検出された領域内へ入る実行頻度を乗じた値ゾーン10進数形式への変換コストに各上記検出された領域から出る実行頻度を乗じた値桁合わせをするための剰余算命令のコストにその剰余算命令の実行頻度を乗じた値ここで、上記式のうち、変数がゾーン10進数形式である場合と2進型である場合とでの当該変数へアクセスする命令のコスト差にその実行頻度を乗じた値において、その実行頻度とは、ゾーン10進数形式又は2進型のいずれの実行頻度であってもよい。なぜならば、変数がアクセスする場所が同じであるので、実行頻度はいずれも同じであるからである。処理部222は、PACKUNPACKのコードをバイナリコードから削除するために、下記処理c1~c2を行う。すなわち、c1処理部222は、副作用となり得る命令のない上記領域中に書き込みがある変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン10進数形式の変数に対するPACKUNPACKのコードのうち、最初と最後の型変換命令以外のコードを上記バイナリコードから削除する;c2処理部222は、副作用となり得る命令のない上記領域中に書き込みがない変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン10進数形式の変数に対するPACKUNPACKのコードのうち、最初の型変換命令以外のコードを上記バイナリコードから削除する。処理部222は、さらに、c3上記c1及び/又はc2の上記型変換命令以外のコードを削除する際に、当該削除するコードに付随する符号処理のコードを上記バイナリコードから削除する。削除部223は、ゾーン10進数形式の変数を2進型へ変換する処理、PACKUNPACKのコードを削除しても変換された結果が変わらないPACKUNPACKのコードを上記バイナリコードから削除する処理、及びそれらの組み合わせの処理のうちのいずれか1つが処理部222によって行われた後に、桁合わせをするための剰余算命令のコードを上記バイナリコードから削除する。削除部223は、桁合わせをするための剰余算命令のコードを削除する場合に、下記処理A~Bを行う下記図7~図11、特に図9を参照。すなわち、A削除部223は、上記変数がn1桁であり、さらに当該変数をn2桁にする剰余算命令についてn1≧n2の条件を満たす場合には、上記n1桁に桁合わせをするための剰余算命令のコードを上記バイナリコードから削除する;B削除部223は、上記Aの条件下にない場合には、変数が符号なしか又は符号ありかに応じて下記処理a~bを行う。すなわち、a上記変数が符号なしの場合に下記図9のステップ9015で判定される、a1削除部223は、上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において図9のステップ905で判定される、2進計算のオーバーフローが起きないこと図9のステップ9014で判定されるが保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除する;a2削除部223は、上記a1以外の場合において、当該a1の条件を満たさない演算の前で桁が正しいことを保証する;b上記変数が符号ありの場合に下記図9のステップ9015で判定される、b1削除部223は、上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において図9のステップ905で判定される、当該連続している一連の演算の式の途中で符号が変わらないこと図9のステップ9018で判定される及び2進計算のオーバーフローが起きないこと図9のステップ9014で判定されるが保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除する;b2削除部223は、上記b1以外の場合において、当該b1の条件を満たさない演算の前で桁が正しいことを保証する。上記a2において、上記a1の条件を満たさない演算の前で桁が正しいことを保証することは、演算の前で桁が正しくなるような剰余算命令のコードをバイナリコードに挿入すること、又は、演算の前で桁が正しくなるような剰余算命令のコードをバイナリコードに挿入しなくても桁が保証される場合には何もしないことを包含する。演算の前で桁が正しくなるようなコードをバイナリコードに挿入することは、例えば、桁がn1桁である場合に、n1桁になるような剰余算命令を上記バイナリコードに挿入することである。上記b2においても、上記b1の条件を満たさない演算の前で桁が正しいことを保証することは、演算の前で桁が正しくなるような剰余算命令のコードをバイナリコードに挿入すること、又は、演算の前で桁が正しくなるような剰余算命令のコードをバイナリコードに挿入しなくても桁が保証される場合には何もしないことを包含する。演算の前で桁が正しくなるようなコードをバイナリコードに挿入することは、例えば、桁がn1桁である場合に、n1桁になるような剰余算命令を上記バイナリコードに挿入することである。削除部223は、上記a2の保証を、上記a1の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを上記バイナリコードに挿入することによって行う。また、削除部223は、上記b2の保証を、上記b1の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを上記バイナリコードに挿入することによって行う。軽減部224は、上記バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行う。軽減部224は、演算子強度の軽減を、削除部223によって上記桁合わせをするための剰余算命令のコードが上記バイナリコードから削除された後に行う。軽減部224は、上記剰余を求める演算を下記式に置き換えることによって、演算子強度の軽減を行う。すなわち、剰余を求める演算は、式:結果分子に置き換えられる。図3Aは、本発明の実施形態における、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードの最適化処理全体のフローチャートを示す。最適化処理は、下記の点で3つのフローチャートに分けられうる。A.ステップ301で開始する最適化処理以下、最適化処理301というでは、最適化は、ゾーン10進数形式の変数を2進型へ変換する処理ステップ303を含む。B.ステップ311で開始する最適化処理以下、最適化処理311というでは、最適化は、PACKUNPACKのコードを削除しても変換された結果が変わらないPACKUNPACKのコードをバイナリコードから削除する処理ステップ314を含む。変換された結果が変わらないとは、変換された結果が保証されるということである。C.ステップ321で開始する最適化処理以下、最適化処理321というでは、最適化は、最適化処理301のステップ303の処理ステップ323及び、最適化処理311のステップ314ステップ324の組み合わせを含む。以下に、最適化処理301、311及び321について説明する。A.最適化処理301ステップ301では、コンピュータ201は、バイナリコードを記憶部202から受け取る。または、コンピュータ201は、COBOLコンパイラで変換されたバイナリコードを変換部214から受け取る。コンピュータ201は、上記受け取ったバイナリコードを最適化部215に渡す。ステップ302では、最適化部215内の検出部221は、バイナリコード内における各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域以下、最適化対象領域といもいうを検出する。副作用となり得る命令のない領域は、副作用を起こす命令を含まない領域とも言い換えられる。検出部221は、下記図4~図6に記載のフローチャートに従い上記最適化対象領域を検出する。例えば、バイナリコード内に最適化対象領域A及び最適化対象領域Bがあり、どちらの領域においてもゾーン10進数形式の変数vへのアクセスがあるけれども、領域Aのみが副作用となり得る命令のない領域であると判定されたとする。この場合、領域Aに対してのみゾーン10進数形式の変数を2進型へ変換する。すなわち、領域Aに対してのみ2進型へ変換し、領域Bに対して2進型への変換を行わない。ここで、変数vが格納されているメモリ領域は1カ所であることから、領域Aに対してのみ2進型に変換するために、処理部222は、変数vを作業領域に読み出してコピーし、当該コピーに対して2進型の変換を行う。当該作業領域は、メモリ中に用意される。本発明の一つの実施態様において、副作用となり得る命令とは、ゾーン10進数形式の変数を2進型への型変換を行うと処理矛盾を起こし得る命令、又は、PACKUNPACKのコードを削除すると処理矛盾を起こし得る命令である。本発明の一つの実施態様において、副作用となり得る命令とは、コンパイルスコープ外の命令を実行する命令、アプリケーションから観測可能な又は見える例外を起こし得る命令、及び、上記変数のベースアドレスレジスタ又はインデックスレジスタを変更する命令の少なくとも1つを包含する。コンパイルスコープ外の命令を実行する命令とは、例えば、call命令、又はindirectbranch命令である。アプリケーションから観測可能な例外を起こし得る命令とは、例えば、例外が発生した場合に、アプリケーションがその例外を捕らえて処理を行わないことがコンパイル時にわかるような例外を起こしうる命令である。例外は、アプリケーションに見えるものを対象としうる。例外を起こしうる命令の代表的なものは、メモリアクセスのための命令に関連する命令である。アプリケーションから観測される例外を起こし得る命令において、米国特許7865885号明細書に記載のトランザクショナルメモリ技術を使用し、例外が起きた場合に実行をある地点からやり直す手法をとれば、例外は無視することができる。従って、本願発明に従う最適化技法をさらに効率よく適用することが可能である。また、アプリケーションから観測される例外を起こし得る命令において、ワーキングストレージへのメモリアクセスは例外を起こす可能性がないことを利用して、副作用を起こしうる命令の検出のコストを削減することが可能である。ワーキングストレージへのアクセスであることは、例えばコンパイル時に検出することが可能である。ワーキングストレージへのアクセスであるかどうかの解析は、特定のCOBOLの初期化パターンを検出した場合に、特定のレジスタをベースレジスタとして使用しているかどうかで検出することが可能である。この理由は、COBOLの初期化ルーチンが正しく実行されたならば、ワーキングストレージセクションへのアクセスは、実際には例外を発生することがないということに基づく。上記変数のベースアドレスレジスタ又はインデックスレジスタを変更する命令とは、例えば、ロード命令、演算命令、レジスタ間のコピー命令であるがこれらに限定されない。ステップ303では、最適化部215内の処理部222は、ステップ302で検出された最適化対象領域内において、ゾーン10進数形式の変数を2進型へ変換する処理を行う。当該変換する処理は、変換処理前後のコスト差を見積もり、変換処理後の見積もりコストが変換処理前の見積もりコストよりも小さいことを条件に行われうる。変換処理前後のコスト差は、下記式に従い求められうる:コスト差=変数がゾーン10進数形式である場合と2進型である場合とでの当該変数一時計算領域を含むへアクセスする命令のコスト差にその実行頻度を乗じた値2進型への変換コストに各上記検出された領域内へ入る実行頻度を乗じた値ゾーン10進数形式への変換コストに各上記検出された領域から出る実行頻度を乗じた値桁合わせをするための剰余算命令のコストにその剰余算命令の実行頻度を乗じた値ステップ305では、最適化部215内の削除部223は、ステップ303の後に、桁合わせをするための剰余算命令のコードを最適化する。剰余算命令のコードを最適化は、桁合わせをするための剰余算命令のコードを上記バイナリコードから削除すること、及び任意的に、バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行うことを包含する。演算子強度の軽減については、ステップ305と独立してステップ306において実行されうるようにしてもよい。削除部223は、下記図7~図10に記載のフローチャートに従い上記剰余算命令のコードを削除する。本発明の実施態様に従う剰余算命令のコードの削除の例は、下記図12及び図13に示されている。ステップ305において、削除部223は、複数の剰余計算をまとめて削除できる。桁合わせの剰余の仕様は、COBOLの場合、その言語仕様で決まっている。桁合わせの剰余の結果は、桁が3桁の符号なし変数ならば、0~999までの値となる。COBOLコンパイラが生成した2進演算コードでは、この桁合わせは演算ごとに毎回行っている。本発明の実施態様にいて、桁合わせの剰余をする箇所の特定は、図7~図10に記載のフローチャートに従い行われる。ステップ306では、最適化部215内の軽減部224は、ステップ305の後に、上記バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行う。なお、軽減部224は、図8に示すように、ステップ305の処理内において、上記バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行いうる。ステップ307では、コンピュータ201は、バイナリコードの最適化処理を終了する。B.最適化処理311ステップ311~312及びステップ315~317は、最適化処理301のステップ301~302及びステップ305~307にそれぞれ対応する。ステップ314では、処理部222は、ステップ312で検出された最適化対象領域内において、PACKUNPACKのコードを削除する処理を行う。削除するPACKUNPACKのコードは、ステップ311で検出された最適化対象領域内にあり、PACKUNPACKのコードを削除してもPACKUNPACKにより変換された結果が変わらないPACKUNPACKのコードである。本発明の実施態様に従うPACKUNPACKのコードの削除の例については、下記図14及び図15に示されている。上記PACKUNPACKのコードをバイナリコードから削除する処理は、例えば下記の処理に従い行われる。処理部222は、副作用となり得る命令のない領域中に書き込みがある変数更新のある変数ともいうであるか、又は、副作用となり得る命令のない領域中に書き込みがない変数更新のない変数ともいうであるかを判定する。処理部222は、更新のある変数の場合に、上記副作用となり得る命令のない領域内にあるゾーン10進数形式の変数に対するPACKUNPACKのコードのうち、最初と最後の型変換命令以外のコードをバイナリコードから削除する。言い換えれば、最初と最後の型変換命令は削除されないので、当該最初と最後の型変換命令は、最適化されたバイナリコードの実行において実行される。また、処理部222は、上記削除するコードに付随する符号処理のコードも上記バイナリコードから削除しうる。一方、処理部222は、更新のない変数の場合に、上記副作用となり得る命令のない領域内にあるゾーン10進数形式の変数に対するPACKUNPACKのコードのうち、最初の型変換命令以外のコードをバイナリコードから削除する。言い換えれば、最初の型変換命令は削除されないので、当該最初の型変換命令は、最適化されたバイナリコードの実行において実行される。また、処理部222は、上記削除するコードに付随する符号処理のコードも上記バイナリコードから削除しうる。削除するコードに付随する符号処理のコードは、例えば、図14のバイナリコード1402中のコード1412内及び図15のバイナリコード1502中のコード1512内に記載されているOIのコードである。PACKUNPACKの削除において上記最初と最後の型変換命のコードの検出は、下記に従い行われる。処理部222は、KILLがφであり、IN及びOUTが変数vであるとするならば途中のブロックであり、それ以外の条件のブロックにおいて、最初及び/又は最後の型変換命令のコードが含まれると判断する。C.最適化処理321ステップ321~ステップ322、ステップ323及びステップ325~327は、最適化処理301のステップ301~302、ステップ303及びステップ305~307にそれぞれ対応する。ステップ324は、下記点を除き、最適化処理311のステップ314に対応する。ステップ324では、処理部222は、ステップ322において検出された最適化対象領域のうち、ステップ323の変換処理がされなかった部分例えば、コスト計算によって変換処理が行われなかった部分について、PACKUNPACKのコードを削除する処理を行う。なお、処理部222は、ステップ324に記載の処理をステップ323に記載の処理よりも先行して行ってもよい。この場合、ステップ323では、処理部222は、ステップ322において検出された最適化対象領域のうち、ステップ324に記載の処理がされなかった部分について、ゾーン10進数形式の変数を2進型へ変換する処理を行う。ただし、ステップ324に記載の処理をステップ323に記載の処理よりも先行して行う場合のコンパイル時間は、ステップ324に記載の処理をステップ323に記載の処理よりも先行して行う場合のコンパイル時間よりも長い。上記最適化の処理は、例えばCOBOLのソースコードを静的に又は動的にコンパイルする際に、本願発明に従う最適化技法を実装したコンパイラによって行われうる。また、上記最適化の処理は、COBOLのバイナリコードを実行する前に又はCOBOLのバイナリコードを実行しながら上記最適化技法を実装したアプリケーションによって行われうる。図3Bは、本発明の実施形態における、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードの最適化処理全体のフローチャートを示す。ステップ331では、コンピュータ201は、バイナリコードを記憶部202から受け取る。または、コンピュータ201は、COBOLコンパイラで変換されたバイナリコードを変換部214から受け取る。ステップ332では、削除部223は、桁合わせをするための剰余算命令のコードを最適化する。剰余算命令のコードを最適化は、図3Aのステップ305、ステップ315及びステップ325に対応する。ステップ333では、検出部221は、上記剰余算命令のコードが最適化された後のバイナリコード内における各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域最適化対象領域を検出する。最適化対象領域の検出は、図3Aのステップ302、ステップ312及びステップ322に対応する。ステップ334では、処理部222は、ステップ333で検出された最適化対象領域内において、ゾーン10進数形式の変数を2進型へ変換する処理を行う。ゾーン10進数形式の変数を2進型へ変換する処理は、図3Aのステップ303及びステップ323に対応する。ステップ335では、処理部222は、ステップ334で検出された最適化対象領域内において、PACKUNPACKのコードを削除する処理を行う。なお、処理部222は、ステップ335に記載の処理をステップ334に記載の処理よりも先行して行ってもよい。この場合、ステップ334では、処理部222は、ステップ333において検出された最適化対象領域のうち、ステップ335に記載の処理がされなかった部分について、ゾーン10進数形式の変数を2進型へ変換する処理を行う。PACKUNPACKのコードを削除する処理は、図3Aのステップ314及びステップ324に対応する。ステップ336では、軽減部224は、ステップ335の後に、上記バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行う。なお、軽減部224は、図8に示すように、ステップ332の処理内において、又は、ステップ332の直後に、バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行いうる。演算子強度の軽減は、図3Aのステップ306、316及び326に対応する。ステップ337では、コンピュータ201は、バイナリコードの最適化処理を終了する。図4は、図3Aに示す最適化処理のうち、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する処理ステップ302、312及び322のフローチャートを示す。ステップ401では、検出部221は、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する処理を開始する。ステップ402では、検出部221は、GEN及びKILLを作成する。GENは、バイナリコード中の各ブロックBにおいて、副作用となり得る命令の後にアクセスがある変数の集合体である。KILLは、上記各ブロックBにおいて、副作用となり得る命令が1個でも存在する場合には変数全体の集合体であるただし、副作用となりうる命令が存在しない場合には空集合である。GEN及びKILLは、下記ステップ403に示すデータフロー解析で使用するデータフロー方程式の入力データである。GEN及びKILLの作成については、下記図5に記載のフローチャートに従い説明する。ステップ403では、検出部221は、図4に記載のデータフロー方程式を用いて、当該データフロー方程式にステップ402で作成されたGEN及びKILLを適用してINを求める。INは、各ブロックBの先頭における変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である。INを基にして、下記ステップ404及び405において、副作用となり得る命令のない領域が、バイナリコード中から検出される。データフロー方程式のうち、INを求める式中のOUTは、データフロー方程式で処理中のブロックBの直前にあるブロックNの終わりにおける変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である。ブロックNは、ブロックBの直前に処理される任意のブロックであって、1又は複数である。ブロックNは、複数であることが多い。データフロー方程式のうち、INを求める式中のN∈Predは、処理中のブロックBの直前にあるブロックNに対して行われる処理であることを意味する。ステップ404では、検出部221は、各ブロックB内の各命令iに、VSETの集合情報の内容を付加情報として設定する。付加情報は、例えば作業領域であるVSETの集合情報から命令i毎に設定される。VSETは、例えばメモリ内の作業領域である。付加情報は、メモリ内に読み込まれたバイナリコード中において、ゾーン10進数形式の変数vへのアクセスを含み且つ副作用となり得る命令のない領域を特定するための情報である。各ブロック内の各命令iにVSETの集合情報の内容を付加情報として設定するためのフローチャートが、下記図6に示されている。また、集合情報の内容の例が下記図11において示されており、例えば、ブロック1102の上から順に、INB、V1、V1,V2、φ、そしてV1である。ステップ405では、検出部221は、ステップ404において各命令iに設定した付加情報について、各変数が連続している領域を、その変数に対する副作用となり得る命令のない領域とする。ステップ406では、検出部221は、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する処理を終了する。ステップ404の処理を疑似コードで書くと、下記の通りである。VSETINforifVSETvelseifVSETφiにVSETの集合情報の内容を付加情報として設定図5は、図4に示す検出処理のうち、GEN及びKILLを作成する処理ステップ402のフローチャートを示す。ステップ501では、検出部221は、GEN及びKILLを作成する処理を開始する。ステップ502では、検出部221は、GEN及びKILLを空集合φで初期化する。ステップ503では、検出部221は、ブロックB内の各命令iを実行順にスキャンする。ステップ504では、検出部221は、命令iが変数vへのアクセスであるかどうかを検査する。命令iが変数vへのアクセスである場合、検出部221は、ステップ505に進む。一方、命令iが変数vへのアクセスでない場合、検出部221は、ステップ506に進む。ステップ505では、検出部221は、ステップ504で判定された命令iからGENvを求める。ステップ506では、検出部221は、命令iが副作用となり得る命令かどうかを検査する。命令iが副作用となり得る命令である場合、検出部221は、ステップ507に進む。一方、命令iが変数vへのアクセスでない場合、検出部221は、ステップ508に進む。ステップ507では、検出部221は、ステップ506で判定された命令iから、KILLφの補集合を求める。また、検出部221は、GENを空集合φで初期化する。ステップ508では、検出部221は、各ブロックB内の各命令iについて実行順にステップ503~507を繰り返す。検出部221は、全ての命令iについて、ステップ503~507の処理が終了することに応じて、ステップ509に進む。ステップ509では、検出部221は、GEN及びKILLを作成する処理を終了する。図6は、図4に示す検出処理のうち、各ブロックB内の命令iに、VSETの集合情報の内容を付加情報として設定する処理ステップ404のフローチャートを示す。ステップ601では、検出部221は、各ブロックB内の各命令iに、作業領域であるVSETの集合情報の内容を付加情報として設定する処理を開始する。ステップ602では、検出部221は、VSETにINの内容をコピーする。ステップ603では、検出部221は、ブロックB内の各命令iを実行順にスキャンする。ステップ604では、検出部221は、命令iが変数vへのアクセスであるかどうかを検査する。命令iが変数vへのアクセスである場合、検出部221は、ステップ605に進む。一方、命令iが変数vへのアクセスでない場合、検出部221は、ステップ606に進む。ステップ605では、検出部221は、ステップ604で判定された命令iからGENvを求める。ステップ606では、検出部221は、命令iが副作用となり得る命令かどうかを検査する。命令iが副作用となり得る命令である場合、検出部221は、ステップ607に進む。一方、命令iが変数vへのアクセスでない場合、検出部221は、ステップ608に進む。ステップ607では、検出部221は、VSETを空集合φで初期化する。ステップ608では、検出部221は、命令iに、VSETの集合情報を付加情報として設定する。ステップ604においてYesの場合、ステップ606においてYesの場合、及びステップ606においてNoの場合のそれぞれに応じて、VSETに異なる集合情報が追加され、初期化され、又は、変更されない。VSETの集合情報の内容の例について、下記図11に示す。ステップ609では、検出部221は、各ブロックB内の各命令iについて実行順にステップ603~608を繰り返す。検出部221は、全ての命令iについて、ステップ603~608の処理が終了することに応じて、ステップ610に進む。ステップ610では、検出部221は、各ブロックB内の各命令に、VSETの集合情報の内容を付加情報として設定する処理を終了する。図7は、図3Aに示す最適化処理のうち、桁合わせのための剰余算命令を最適化する処理ステップ305、315及び325のフローチャートを示す。ステップ701では、削除部223は、桁合わせのための剰余算命令REMを最適化する処理を開始する。ステップ702では、削除部223は、最適化対象領域内の桁合わせのための全ての剰余算命令REMについて、ステップ703の削除処理を実行するループを開始する。ステップ703では、削除部223は、剰余算命令REMについて、1つの剰余算命令についての削除処理を実行する。1つの剰余算命令についての削除処理については、下記図8~図10においてさらにその詳細な内容を説明する。ステップ704では、削除部223は、未処理の剰余算命令についての削除処理を実行する。削除部223は、全ての剰余算命令についてステップ703の処理が終わることに応じて、ステップ705に進む。ステップ705では、削除部223は、桁合わせのための剰余算命令REMを最適化する処理を終了する。図8は、図7に示す剰余算命令を最適化する処理のうち、剰余算命令REMについて1つの剰余算命令についての削除処理を実行する処理ステップ703のフローチャートを示す。剰余算命令を削除できる条件は、桁が合っていなくても問題無いこと、又は、既に桁が合っているために問題無いことである。桁が合っていなくても問題無いことは、下記のAnalyzeUSEに従い判定される。既に桁が合っているため問題無いことは、下記のAnalyzeDEFに従い判定される。ステップ801では、削除部223は、1つの剰余算命令についての削除処理を開始する。入力データは、剰余算命令REMである。ステップ802では、削除部223は、剰余算命令REMの分母が10のn乗であるかどうかを判定する。削除部223は、分母が10のn乗である場合にステップ803に進み、一方、分母が10のn乗でない場合にステップ810に進み、1つの剰余算命令についての削除処理を終了する。ステップ803では、削除部223は、変数NDIGITSにnを入れる。ステップ804では、削除部223は、剰余算命令REMの各使用Iについて、剰余算命令の必要性をAnalyzeUSEに従い判定する。AnalyzeUSEについては、下記図9に記載のフローチャートにおいて説明する。ステップ805では、削除部223は、全ての使用Iについて不必要であるかどうかを判定する。削除部223は、全ての使用Iについて不必要である場合にステップ808に進みREMを削除し、一方、全ての使用Iについて不必要でない場合にステップ806に進む。ステップ806では、削除部223は、剰余算命令REMの各定義Jについて、剰余算命令の必要性をAnalyzeDEFに従い判定する。AnalyzeDEFについては、下記図10に記載のフローチャートにおいて説明する。ステップ807では、削除部223は、全ての定義Jについて不必要であるかどうかを判定する。削除部223は、全ての定義Jについて不必要である場合にステップ808に進みREMを削除し、一方、全ての使用Iについて不必要でない場合にステップ809に進む。なお、図8では、全ての使用Iについて不必要でない場合にステップ809に進むが、ステップ809を経ずに、ステップ810に進み、1つの剰余算命令についての削除処理を終了するようにしてもよい。ステップ808では、削除部223は、ステップ805における全ての使用Iについて不必要であることに応じて又はステップ807における全ての定義Jについて不必要であることに応じて、剰余算命令REMを削除する。ステップ809では、削除部223は、REMについて演算子強度命令の実行コストの軽減を軽減部224に要求する。軽減部224は、剰余を求める演算を、結果分子に置き換えることによって、上記演算子強度の軽減を果たす。当該置き換えは、上記剰余を求める演算が、最適化対象領域内に限定されず、バイナリコード中の剰余算命令について削除されなかった残りの個々の剰余算命令について行われうる。軽減部224は、演算子強度の軽減後に、処理を削除部223に戻す。削除部は、軽減部224での演算子強度の軽減が終わることに応じて、ステップ810に進む。ステップ810では、削除部223は、1つの剰余算命令についての削除処理を終了する。図9は、図8に示す剰余算命令を最適化する処理のうち、剰余算命令REMの各使用Iについて剰余の必要又は不必要をチェックする処理AnalyzeUSEステップ804のフローチャートを示す。ステップ901では、削除部223は、REMの各使用Iについて剰余の必要性をチェックする処理AnalyzeUSEに従い、使用Iが必要であるか又は不必要であるかの判定を開始する。ステップ902では、削除部223は、使用Iがすでにチェック済みかどうかを判定する。削除部223は、使用Iがすでにチェック済みである場合にステップ903に進み、一方、使用Iがすでにチェック済みでない場合に当該使用Iは不必要であると判定する904。ステップ903では、削除部223は、使用Iが剰余算命令であるかどうかを判定する。削除部223は、使用Iが剰余算命令である場合にステップ9011に進み、一方、使用Iが剰余算命令でない場合にステップ905に進む。ステップ905では、削除部223は、使用Iが足し算、引き算、又は掛け算のいずれかであるかどうかを判定する。削除部223は、使用Iが足し算、引き算、又は掛け算のいずれかである場合にステップ907に進み、一方、使用Iが足し算、引き算、及び掛け算のいずれでもない場合にステップ9014に進む。ステップ907では、削除部223は、使用Iの出力について剰余不必要と判定された場合に当該使用Iの入力についても不必要であるかどうかを判定する。削除部223は、上記入力についても不必要である場合にステップ9017に進み、一方、上記入力についても不必要でない場合にステップ909に進み、REMの各使用Iについて剰余の必要性をチェックする処理AnalyzeUSEを終了する。ステップ9011では、削除部223は、使用Iの分母が、10のn乗NDIGITSnであるかどうかを判定する。削除部223は、使用Iの分母が10のn乗NDIGITSnである場合に当該使用Iは不必要であると判定し9013、一方、使用Iの分母が10のn乗NDIGITSnでない場合に当該使用Iは必要であると判定する9012。NDIGITSnである場合には、その剰余算命令は必要であることから9012削除できない。一方、NDIGITSnである場合には、その剰余算命令は必要でないことから9013削除しうる。NDIGITSnにおいて、NDIGITSはn1桁に対応し、nはn2桁に対応する。よって、ある変数をn1桁で丸める剰余算命令があり、当該変数をさらにn2桁≦n1で丸めるための剰余算命令がある場合には、n1桁で丸める剰余算命令を削除することを意味する。例えば、n1桁が5桁の剰余算命令であり、n2桁が4桁の剰余算命令である場合には、削除部223は、n1桁の剰余算命令、すなわち5桁の剰余算命令を削除できる。ステップ9014では、削除部223は、使用Iによって2進上のオーバーフローが起きないかどうかを判定する。削除部223は、2進上のオーバーフローが起きない場合にステップ9015に進み、一方、2進上のオーバーフローが起きる場合使用Iによって2進上のオーバーフローが起きないことがない場合に当該使用Iは必要であると判定する9016。ステップ9015では、削除部223は、使用Iの分子は符号ありかどうかを判定する。削除部223は、使用Iの分子が符号なしの場合にステップ9017に進み、一方、使用Iの分子が符号ありの場合にステップ9018に進む。符号あり又はなしであるかどうかは、アセンブラ言語の命令であるZAPを使っているかどうか、又は、10進数形式の変数の符号フィールドに何をセットしているかどうかで判定可能である。また、符号あり又はなしであるかをコンパイル時に見つける方法として、例えば、10進数形式の変数の符号フィールドにFをセットしているならば符号なしと判定し、それ以外であれば符号ありと判定する方法を採用しうる。ステップ9017では、ステップ907の上記入力についても不必要であることに応じて、又は、ステップ9018の10進上の符号が変わらないことに応じて、削除部223は、使用Iの各使用Kについて、剰余の必要性をAnalyzeUSEに従い判定する。AnalyzeUSEについては、図9のフローチャートと同じである。ステップ9020では、削除部223は、全ての使用Kについて不必要であるかどうかを判定する。削除部223は、全ての使用Iについて不必要である場合に当該使用Kは不必要であると判定し9021、一方、全ての使用Iについて不必要でない場合に当該使用Kは必要であると判定する9022。ステップ9018では、削除部223は、使用Iによって10進上の符号が変わらないかどうかを判定する。削除部223は、10進上の符号が変わらない場合にステップ9017に進み、一方、10進上の符号が変わる場合に当該使用Iは必要であると判定する9019。ステップ909では、REMの各使用Iについて剰余の必要性をチェックする処理AnalyzeUSEを終了する。図10は、図8に示す剰余算命令を最適化する処理のうち、剰余算命令REMの各定義Jについて剰余の必要又は不必要をチェックする処理AnalyzeDEFステップ806のフローチャートを示す。ステップ1001では、削除部223は、REMの各定義Jについて剰余の必要性をチェックする処理AnalyzeUSEに従い、定義Jが必要であるか又は不必要であるかの判定を開始する。ステップ1002では、削除部223は、定義Jが桁及び符号とも正しいかどうかを判定する。削除部223は、定義Jが桁及び符号とも正しくない場合にステップ1003に進み、一方、定義Jが桁及び符号とも正しい場合に当該定義Jが不必要であると判定する1004。ステップ1003では、削除部223は、定義Jの入力について剰余が不必要と判断された場合に当該定義Jの出力についても不必要であるかどうかを判定する。削除部223は、上記出力についても不必要である場合にステップ1005に進み、一方、上記出力についても不必要でない場合に当該定義Jが必要であると判定する1006。ステップ1005では、削除部223は、定義Jの各定義Lについて剰余の必要性をAnalyzeDEFに従い判定する。AnalyzeDEFについては、図10のフローチャートと同じである。ステップ1005では、削除部223は、全ての定義Lについて不必要であるかどうかを判定する。削除部223は、全ての定義Lについて不必要である場合に当該定義Lについて不必要であると判定し1008、一方全ての定義Lについて不必要でない場合に当該定義Lについて必要であると判定する1009。図7に示す剰余算命令を最適化において、図8~図10に示すフローチャートによって、剰余算命令の演算の桁が正しいことが保証されている。すなわち、剰余算命令の演算の桁が正しいことの保証が必要な場合には、それに対応する剰余算命令は必要であると判定されて、除去されない。図11は、図6のステップ608に示す作業領域であるVSETに格納された集合情報の内容について、当該VSETがどのような集合情報を含んでいるのかを説明するための図である。VSETには、1ステップ604においてYesの場合、2ステップ606においてYesの場合、及び3ステップ606においてNoの場合のそれぞれに応じて、異なる集合情報が追加され、初期化され、又は、変更されない。ブロック1101はバイナリコードの一部を示し、ブロック1101には、例えば、上から、変数V1、変数V2へのアクセス、副作用となり得る命令、及び変数V1へのアクセスがあるとする。そうすると、上から見ていくと、最終的に、GENはV1となり、KILLBはV1、V2となる。ブロック1102において、最初にVSETにINの内容をコピーする。次に、変数V1へのアクセスがあることから、VSETにV1が追加されるステップ605。次に、変数V2へのアクセスがあることから、VSETにV1V2が追加される副作用となり得る命令の直前までステップ605。次に、副作用となり得る命令があるのでVSETは空集合φで初期化されるステップ607。次に、副作用となり得る命令の次に変数V1へのアクセスがあることから、VSETにV1が追加されるステップ605。図12は、COBOLコード、最適化対象であるバイナリコード、及び、本発明の実施態様に従い、ゾーン10進数形式の変数を2進型へ変換して最適化されたコードを示す。COBOLコード1201は最適化対象であるバイナリコード1202へ変換する前のソースコードである。バイナリコード1202は、COBOLコード1201をCOBOLコンパイラによって変換した結果のコードである。最適化されたコード1203は、バイナリコード1202を本発明の実施態様に従う最適化技法で最適化されたバイナリコードである。COBOLコード1201のうち、01datPIC91行目は、符号なし7桁の数を示す。符号がないことは、符号フィールドにFを設定しているためにわかる。処理部222は、検出部221によって検出された最適化対象領域内において、3~8行目に示すコード1212を、最適化されたコード1203の3~13行目に示すコード1213に書き換える。すなわち、処理部222は、バイナリコード1202中のゾーン10進数形式の変数を2進型へ変換している。当該変換の結果、最適化されたコード1203が得られる。最適化されたコード1203では、本来であれば2つのAHIのコードの直後にそれぞれ剰余算命令のコードが挿入される。しかし、本発明に従う最適化技法によって、最後のAHIのコードの直後に剰余算命令を挿入するだけで済んでいる。すなわち、バイナリコード1202中の最後の1回の剰余算命令以外の剰余算命令のコードが除去されている。従って、バイナリコード1202中の最後の1回に対応する剰余算命令だけが実行される。バイナリコード1202及び最適化されたコード1203のそれぞれについて、命令のサイクル数に基づいて各コードのパフォーマンスを比較した。その結果、上記最適化によって、約1.1倍命令のサイクル数を基に計算のパフォーマンス向上が確認された。また、上記最適化によってさらに別の最適化が可能になり、例えばdatdat2という変形が容易になる。図13は、COBOLコード、最適化対象であるバイナリコード、及び、本発明の実施態様に従い、ゾーン10進数形式の変数を2進型へ変換して最適化されたコードを示す。COBOLコード1301は最適化対象であるバイナリコード1302へ変換する前のソースコードである。バイナリコード1302は、COBOLコード1301をCOBOLコンパイラによって変換した結果のコードである。最適化されたコード1303は、バイナリコード1302を本発明の実施態様に従う最適化技法で最適化されたバイナリコードである。COBOLコード1301は、変数A、B、及びCは共に符号なし7桁の数を示す。符号がないことは、符号フィールドにFを設定しているためにわかる。変数Aはbinaryが指定されているために、2進で演算が行われる。処理部222は、検出部221によって検出された最適化対象領域内において、5~19行目に示すコード1312を、最適化されたコード1303の5~17行目に示すコード1313に書き換える。すなわち、処理部222は、バイナリコード1302中のゾーン10進数形式の変数を2進型へ変換している。当該変換の結果、最適化されたコード1303が得られる。最適化されたコード1303では、本来であれば3つのARのコードの直後にそれぞれ剰余算命令のコードが挿入される。しかし、本発明に従う最適化技法によって、最後のAR10行目のコードの直後に剰余算命令を挿入するだけで済んでいる。すなわち、バイナリコード1302中の最後の1回の剰余算命令以外の剰余算命令のコードが除去されている。従って、バイナリコード1302中の最後の1回に対応する剰余算命令だけが実行される。バイナリコード1302及び最適化されたコード1303のそれぞれについて、命令のサイクル数に基づいて各コードのパフォーマンスを比較した。その結果、バイナリコード1302では91サイクルであったものが、最適化されたコード1302では27サイクルであった。従って、上記最適化によって、約4.6倍命令のサイクル数を基に計算のパフォーマンス向上が確認された。また、上記最適化によってさらに別の最適化が可能になり、例えばdatdat2という変形が容易になる。図14は、COBOLコード、最適化対象であるバイナリコード、及び、本発明の実施態様に従い、更新がある変数idxに対するPACKUNPACKのバイナリコードを削除して最適化されたコードを示す。COBOLコード1401は最適化対象であるバイナリコード1402へ変換する前のソースコードである。バイナリコード1402は、COBOLコード1401をCOBOLコンパイラによって変換した結果のコードである。最適化されたコード1403は、バイナリコード1402を本発明の実施態様に従う最適化技法で最適化されたバイナリコードである。COBOLコード1401のうち、01datPIC91行目は、符号なし7桁の数を示す。また、バイナリコード1402は、副作用となり得る命令のない領域中に書き込みがある変数すなわち、更新がある変数の場合の例である。更新がある変数であることは、バイナリコード1402から特定できる。処理部222は、検出部221によって検出された最適化対象領域内において、4行目のUNPACのコードUNPK0256及びそれに付随する5行目の符号処理のコードOI7XF0、並びに6行目のPACKのコードPACK2560及びそれに付随する7行目の符号処理のコードOI259X0Fをバイナリコード1402から削除する。すなわち、処理部222は、PACKUNPACKのコードのうち、最初1行目と最後最後から2行目の型変換命令以外のコード4~7行目1412を削除している。当該削除の結果、最適化されたコード1403が得られる。バイナリコード1402及び最適化されたコード1403のそれぞれについて、命令のサイクル数に基づいて各コードのパフォーマンスを比較した。その結果、その結果、最適化されたコード1403の実行速度は、同一ハードウェア環境において、最適化前のバイナリコード1402の実行速度と比べて、約25命令のサイクル数を基に計算のパフォーマンス向上が観察された。また、上記最適化によってさらに別の最適化が可能になり、例えばdatdat2という変形が容易になる。図15は、COBOLコード、最適化対象であるバイナリコード、及び、本発明の実施態様に従い、更新がない変数idx2に対するPACKUNPACKのバイナリコードを削除して最適化されたコードを示す。COBOLコード1501は最適化対象であるバイナリコード1502へ変換する前のソースコードである。バイナリコード1502は、COBOLコード1501をCOBOLコンパイラによって変換した結果のコードである。最適化されたコード1503は、バイナリコード1502を本発明の実施態様に従う最適化技法で最適化されたバイナリコードである。COBOLコード1501は、符号あり7桁の数を示す。更新がない変数idx2に対する最適化処理を示す。また、バイナリコード1502は、副作用となり得る命令のない領域中に書き込みがない変数すなわち、更新がない変数の場合の例である。更新がない変数であることは、バイナリコード1502から特定できる。処理部222は、検出部221によって検出された最適化対象領域内において、5行目のPACKのコードPACK25640及びそれに付随する6行目の符号処理のコードOI271X0Fをバイナリコード1502から削除する。すなわち、処理部222は、変数idx2に対するPACKUNPACKのコードのうち、最初1行目の型変換命令以外のコード5~6行目を削除している。当該削除の結果、最適化されたコード1503が得られる。なお、変数idxに対するPACKUNPACKのコードであるPACKのコード下から5行目及びUNPKのコード下から2行目も除去可能である。バイナリコード1502及び最適化されたコード1503のそれぞれについて、命令のサイクル数に基づいて各コードのパフォーマンスを比較した。その結果、最適化されたコード1503の実行速度は、同一ハードウェア環境において、最適化前のバイナリコード1502の実行速度と比べて、約9命令のサイクル数を基に計算のパフォーマンス向上が観察された。"