JP5689366B2 - ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する方法、並びにその最適化装置及びコンピュータ・プログラム - Google Patents

ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する方法、並びにその最適化装置及びコンピュータ・プログラム Download PDF

Info

Publication number
JP5689366B2
JP5689366B2 JP2011121446A JP2011121446A JP5689366B2 JP 5689366 B2 JP5689366 B2 JP 5689366B2 JP 2011121446 A JP2011121446 A JP 2011121446A JP 2011121446 A JP2011121446 A JP 2011121446A JP 5689366 B2 JP5689366 B2 JP 5689366B2
Authority
JP
Japan
Prior art keywords
code
instruction
variable
binary
binary code
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2011121446A
Other languages
English (en)
Other versions
JP2012248139A (ja
Inventor
川人 基弘
基弘 川人
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP2011121446A priority Critical patent/JP5689366B2/ja
Priority to US13/483,300 priority patent/US20120311550A1/en
Priority to US13/591,330 priority patent/US20120317560A1/en
Publication of JP2012248139A publication Critical patent/JP2012248139A/ja
Application granted granted Critical
Publication of JP5689366B2 publication Critical patent/JP5689366B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4441Reducing the execution time required by the program code

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Description

本発明は、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコード、特にはCOBOLのバイナリコードを最適化する技法に関する。
COBOLは、1959年にアメリカ合衆国で生まれた高級言語であり、種々の言語の中でもその歴史が古い。また、COBOL言語は、事務処理系のプログラムを効率よく開発できることから、現在でも基幹システム(例えば、メインフレーム)において使用されている。例えば、インターナショナル・ビジネス・マシーンズ・コーポレーション(登録商標)から販売されているメインフレームであるIBM(登録商標) System z(登録商標)上でCOBOLのバイナリコードが多く使われている。
COBOLにおいて、Int型が何も指定されない場合には、数字は、ゾーン10進数(Zoned Decimal)形式(外部10進形式ともいう)として表される。また、COBOLにおいて、通常の2進演算を行うためには、BINARY修飾詞が必要である。しかし、多くのCOBOLプログラマーは、Int型として何も指定しない。そのために、COBOLでは、ゾーン10進数形式が多く使用されている。
ゾーン10進数形式は、COBOLの実行において内部的にはパック形式(内部10進形式ともいう)に毎回変換される。そのために、性能低下や速度低下が顕著である。
そこで、上記に述べた性能低下や速度低下を改善する為に、COBOLのソースコードをコンパイルする際に、当該ソースコードを最適化することが行われてきている。当該最適化は、例えば、上記ソースコードに対して10進進数形式から2進型の演算へ型変換することである。
下記特許文献1は、COBOLのソースプログラムに対して型変換を行うことを記載する(4頁左上欄3〜16行)。型変換は、クロック数を比較することによって行われる(4頁右上欄3〜左下欄11行)。
下記特許文献2は、COBOL言語コンパイラでソースプログラム中の変数及び数値データの更新回数と参照回数をカウントし、更新回数が参照回数より多い変数及び数値データにはソースプログラムで指定された型以外にバイナリ型のアロケーションを設け、演算はバイナリ型で行い最後にソースプログラムで指定された型に変換するオブジェクトプログラムを生成することを記載する(要約、特許請求の範囲、段落0009)。
特開平3−102427号公報 特開平5−108370号公報
上記の通り、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進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを上記バイナリコードから削除する処理、又はそれらの組み合わせの処理を行うステップと
を実行することを含む。
本発明の一つの実施態様において、上記コンピュータが、上記処理を行うステップの後に、桁合わせをするための剰余算命令のコードを上記バイナリコードから削除するステップをさらに実行することを含みうる。
本発明の一つの実施態様において、上記桁合わせをするための剰余算命令のコードを上記バイナリコードから削除するステップが、
(A)上記変数がn1桁であり、さらに当該変数をn2桁にする剰余算命令についてn1≧n2の条件を満たす場合には、上記n1桁に桁合わせをするための剰余算命令のコードを上記バイナリコードから削除するステップと、
(B)上記(A)の条件下にない場合には、
(a)上記変数が符号なしの場合に、
(a1)上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除するステップと、
(a2)上記(a1)以外の場合において、当該(a1)の条件を満たさない演算の前で桁が正しいことを保証するステップと、
(b)上記変数が符号ありの場合に、
(b1)上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、当該連続している一連の演算の式の途中で符号が変わらないこと及び2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除するステップと、
(b2)上記(b1)以外の場合において、当該(b1)の条件を満たさない演算の前で桁が正しいことを保証するステップと
を含みうる。
本発明の一つの実施態様において、上記桁合わせをするための剰余算命令のコードを上記バイナリコードから削除するステップの後に、上記コンピュータが、上記バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行うステップをさらに実行することを含み、
上記軽減が、上記剰余を求める演算を下記式:
結果 = (分子 < 分母 && 分子 >= 0) ? 分子 : (分子 % 分母)
に置き換えることによって行われうる。
本発明の一つの実施態様において、上記(a2)の保証するステップが、上記(a1)の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを上記バイナリコードに挿入するステップを含みうる。
本発明の一つの実施態様において、上記(b2)の保証するステップが、上記(b1)の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを上記バイナリコードに挿入するステップを含みうる。
本発明の一つの実施態様において、上記検出するステップが、
上記バイナリコード中の各ブロックにおいて、副作用となり得る命令の後にアクセスがある変数の集合体(以下、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のコードを上記バイナリコードから削除する上記処理が、
(c1)副作用となり得る命令のない上記領域中に書き込みがある変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン10進数形式の変数に対するPACK/UNPACKのコードのうち、最初と最後の型変換命令以外のコードを上記バイナリコードから削除する処理と、
(c2)副作用となり得る命令のない上記領域中に書き込みがない変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン10進数形式の変数に対するPACK/UNPACKのコードのうち、最初の型変換命令以外のコードを上記バイナリコードから削除する処理と
を含みうる。
本発明の一つの実施態様において、上記PACK/UNPACKのコードを上記バイナリコードから削除する上記処理が、
(c3)上記(c1)及び/又は(c2)の上記型変換命令以外のコードを削除する際に、当該削除するコードに付随する符号処理のコードを上記バイナリコードからさらに削除する処理をさらに含みうる。
本発明の一つの実施態様において、ゾーン10進数形式の変数を2進型へ変換する上記処理が、当該変換処理前後のコスト差を見積もり、変換処理後の見積もりコストが変換処理前の見積もりコストよりも小さいことを条件に行われ、次に、
上記PACK/UNPACKのコードを上記バイナリコードから削除する処理が、上記コスト差の見積もりの計算によって上記変換する処理がされなかった部分について行われうる。
本発明の一つの実施態様において、上記変換処理前後の上記コスト差が、
コスト差=(変数がゾーン10進数形式である場合と2進型である場合とでの当該変数へアクセスする命令のコスト差にその実行頻度を乗じた値)
+(2進型への変換コストに各上記検出された領域内へ入る実行頻度を乗じた値)
+(ゾーン10進数形式への変換コストに各上記検出された領域から出る実行頻度を乗じた値)
+(桁合わせをするための剰余算命令のコストにその剰余算命令の実行頻度を乗じた値)
によって求められうる。
また、本発明は、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコード、特にはCOBOLのバイナリコードを最適化する方法を提供する。当該方法は、コンピュータ、例えばバイナリコード最適化装置が、上記最適化方法を上記バイナリコードに対して適用することによって実行されうる。または、上記方法は、コンピュータ、例えばコンパイラ装置が、上記最適化方法が実装されたコンパイラによってCOBOLコードをコンパイルすることによって、上記コンピュータによって実行されうる。上記方法は、コンピュータが、メモリ内に読み込まれた上記バイナリコードから、桁合わせをするための剰余算命令のコードを削除するステップを実行することを含む。
本発明の一つの実施態様において、上記方法は、上記コンピュータが、
上記剰余算命令のコードの削除が行われた後に、メモリ内に読み込まれ且つ上記剰余算命令のコードが削除されたバイナリコード中から、各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出するステップと、
上記検出された領域内において、ゾーン10進数形式の変数を2進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを上記バイナリコードから削除する処理、又はそれらの組み合わせの処理を行うステップと
をさらに実行することを含みうる。
また、本発明は、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する装置を提供する。当該装置は例えばバイナリコード最適化装置であり、当該装置は、上記バイナリコードに対して上記最適化を適用する。または、当該装置は例えばコンパイラ装置であり、当該装置は、上記最適化を、COBOLコードをコンパイルする際に適用する。上記装置は、
各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する検出部と、
上記検出された領域内において、ゾーン10進数形式の変数を2進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを上記バイナリコードから削除する処理、及びそれらの組み合わせの処理のうちの1つを行う処理部と
を備えている。
本発明の一つの実施態様において、上記装置が、上記処理が上記処理部によって行われた後に、桁合わせをするための剰余算命令のコードを上記バイナリコードから削除する削除部をさらに備えうる。
本発明の一つの実施態様において、上記削除部は、
(A)上記変数がn1桁であり、さらに当該変数をn2桁にする剰余算命令についてn1≧n2の条件を満たす場合には、上記n1桁に桁合わせをするための剰余算命令のコードを上記バイナリコードから削除し、
(B)上記(A)の条件下にない場合には、
(a)上記変数が符号なしの場合に、
(a1)上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除し、
(a2)上記(a1)以外の場合において、当該(a1)の条件を満たさない演算の前で桁が正しいことを保証し、
(b)上記変数が符号ありの場合に、
(b1)上記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、当該連続している一連の演算の式の途中で符号が変わらないこと及び2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、上記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを上記バイナリコードから削除し、
(b2)上記(b1)以外の場合において、当該(b1)の条件を満たさない演算の前で桁が正しいことを保証しうる。
本発明の一つの実施態様において、上記装置は、上記桁合わせをするための剰余算命令のコードが上記削除部によって上記バイナリコードから削除された後に、上記バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行う軽減部をさらに備えうる。上記軽減部は、上記剰余を求める演算を下記式:
結果 = (分子 < 分母 && 分子 >= 0) ? 分子 : (分子 % 分母)
に置き換えることによって上記軽減を行いうる。
本発明の一つの実施態様において、上記削除部は、(a2)の保証を、上記(a1)の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを上記バイナリコードに挿入することによって行う。
本発明の一つの実施態様において、上記削除部は、(b2)の保証を、上記(b1)の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを上記バイナリコードに挿入することによって行う。
本発明の一つの実施態様において、上記検出部が、
上記バイナリコード中の各ブロックにおいて、副作用となり得る命令の後にアクセスがある変数の集合体(以下、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)を基にして求められる。
本発明の一つの実施態様において、上記処理部が、
(c1)副作用となり得る命令のない上記領域中に書き込みがある変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン10進数形式の変数に対するPACK/UNPACKのコードのうち、最初と最後の型変換命令以外のコードを上記バイナリコードから削除し、
(c2)副作用となり得る命令のない上記領域中に書き込みがない変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン10進数形式の変数に対するPACK/UNPACKのコードのうち、最初の型変換命令以外のコードを上記バイナリコードから削除しうる。
本発明の一つの実施態様において、上記処理部が、さらに、
(c3)上記(c1)及び/又は(c2)の上記型変換命令以外のコードを削除する際に、当該削除するコードに付随する符号処理のコードを上記バイナリコードから削除しうる。
本発明の一つの実施態様において、上記処理部は、
ゾーン10進数形式の変数を2進型へ変換する上記処理を、当該変換処理前後のコスト差を見積もり、変換処理後の見積もりコストが変換処理前の見積もりコストよりも小さいことを条件に行い、次に、
上記PACK/UNPACKのコードを上記バイナリコードから削除する処理を、上記コスト差の見積もりの計算によって上記変換する処理がされなかった部分について行いうる。
本発明の一つの実施態様において、上記処理部は、上記変換処理前後の上記コスト差を、
コスト差=(変数がゾーン10進数形式である場合と2進型である場合とでの当該変数へアクセスする命令のコスト差にその実行頻度を乗じた値)
+(2進型への変換コストに各上記検出された領域内へ入る実行頻度を乗じた値)
+(ゾーン10進数形式への変換コストに各上記検出された領域から出る実行頻度を乗じた値)
+(桁合わせをするための剰余算命令のコストにその剰余算命令の実行頻度を乗じた値)
によって求めうる。
また、本発明は、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する装置を提供する。当該装置は例えばバイナリコード最適化装置であり、当該装置は、上記バイナリコードに対して上記最適化を適用する。または、当該装置は例えばコンパイラ装置であり、当該装置は、上記最適化を、COBOLコードをコンパイルする際に適用する。上記装置は、メモリ内に読み込まれた上記バイナリコードから、桁合わせをするための剰余算命令のコードを削除する削除部を備える。
本発明の一つの実施態様において、上記装置が、
上記削除が上記削除部によって行われた後に、メモリ内に読み込まれ且つ上記剰余算命令のコードが削除されたバイナリコード中から、各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する検出部と、
上記検出された領域内において、ゾーン10進数形式の変数を2進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを上記バイナリコードから削除する処理、及びそれらの組み合わせの処理のうちの1つを行う処理部と
をさらに備えうる。
また、本発明は、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコード、特にはCOBOLのバイナリコードを最適化する装置を提供する。当該装置は例えばバイナリコード最適化装置であり、当該装置は、上記バイナリコードに対して上記最適化を適用する。または、当該装置は例えばコンパイラ装置であり、当該装置は、COBOLコードをコンパイルする際に上記最適化を適用しうる。上記装置は、上記バイナリコードを読み込むためのメモリと、上記メモリ上で上記バイナリコードを最適化するためのプロセッサと
を備えている。上記装置は、上記最適化を、上記に記載された方法の各ステップを実行することによって行う。
また、本発明は、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコード、特にはCOBOLのバイナリコードを最適化するためのコンピュータ・プログラムを適用する。当該コンピュータ・プログラムは、上記バイナリコードを最適化するためのコンピュータ・プログラムにおいて実装されうる。または、当該コンピュータ・プログラムは、コンパイラにおいて実装されうる。上記コンピュータ・プログラムは、コンピュータに、上記に記載されたいずれか一つの方法の各ステップを実行させる。上記コンピュータ・プログラムは、記憶媒体、例えばハードディスク、ソリッド・ステート・ドライブのようなアプリケーションを記憶し、そこからコンピュータが当該アプリケーションを起動可能な記憶媒体に格納されうる。または、上記コンピュータ・プログラムは、上記記憶媒体にインストールするために使用される記憶媒体、例えばCD−ROM、DVD若しくはBD、又はUSBメモリに格納されうる。
本発明の最適化技法では、各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する為に、変数毎にバイナリコード中のどの領域であるならば最適化できるかを見つけることが可能である。従って、本発明の最適化技法では、どの変数を最適化対象とするかを選択する従来技術と比べて、最適化できる機会が増大する点で有用である。
また、本発明の最適化技法では、COBOLコードが存在しない場合であっても、言い換えればCOBOLコードを再コンパイルすることができない状況下にあっても、バイナリコードに対して本発明に従う最適化技法を適用することができる。従って、本発明の最適化技法では、バイナリコードに対して最適化技法を直接的に適用することができる点で、特にビジネス上において有用である。
さらに、本発明の最適化技法では、COBOLコード又はそのバイナリコードが副作用となりうる命令を含む場合であっても、本発明に従う最適化技法を適用することができる。従って、本発明の最適化技法では、副作用となり得る命令があることによって最適化の機会が失われることがない点で有用である。
本発明の実施形態におけるコンピュータ・ハードウェアの基本的なブロック図を示す。 本発明の実施形態における、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードの最適化処理を行うための機能ブロック図を示す。 本発明の実施形態における、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードの最適化処理全体のフローチャートを示す。 本発明の実施形態における、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードの最適化処理全体のフローチャートを示す。 図3Aに示す最適化処理のうち、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する処理(ステップ302、312及び322)のフローチャートを示す。 図4に示す検出処理のうち、バイナリコード中の各ブロックにおいて、副作用となり得る命令の後にアクセスがある変数の集合体(以下、GEN(B)ともいう)及び上記各ブロックにおいて、副作用となり得る命令が存在する場合には変数全体の集合体(ただし、副作用となりうる命令が存在しない場合には空集合である)(以下、KILL(B)ともいう)を作成する処理(ステップ402)のフローチャートを示す。 図4に示す検出処理のうち、各ブロック内の命令に、VSETの集合情報の内容を付加情報として設定する処理(ステップ404)のフローチャートを示す。 図3Aに示す最適化処理のうち、桁合わせのための剰余算命令を最適化する処理(ステップ305、315及び325)のフローチャートを示す。 図7に示す剰余算命令を最適化する処理のうち、剰余算命令REMについて「1つの剰余算命令についての削除処理」を実行する処理(ステップ703)のフローチャートを示す。 図8に示す剰余算命令を最適化する処理のうち、剰余算命令REMの各使用Iについて剰余の必要又は不必要をチェックする処理 AnalyzeUSE(REM, I, NDIGITS)(ステップ804)のフローチャートを示す。 図8に示す剰余算命令を最適化する処理のうち、剰余算命令REMの各定義Jについて剰余の必要又は不必要をチェックする処理 AnalyzeDEF(J, NDIGITS)(ステップ806)のフローチャートを示す。 図6のステップ608に示す作業領域であるVSETに格納された集合情報の内容について、当該VSETがどのような集合情報を含んでいるのかを説明するための図を示す。 COBOLコード、最適化対象であるバイナリコード、及び、本発明の実施態様に従い、ゾーン10進数形式の変数を2進型へ変換して最適化されたコードを示す。 COBOLコード、最適化対象であるバイナリコード、及び、本発明の実施態様に従い、ゾーン10進数形式の変数を2進型へ変換して最適化されたコードを示す。 COBOLコード、最適化対象であるバイナリコード、及び、本発明の実施態様に従い、更新がある変数idxに対するPACK/UNPACKのバイナリコードを削除して最適化されたコードを示す。 COBOLコード、最適化対象であるバイナリコード、及び、本発明の実施態様に従い、更新がない変数idx2に対するPACK/UNPACKのバイナリコードを削除して最適化されたコードを示す。
以下に、本発明の実施態様を各図面に従って説明する。なお、当該実施形態は、本発明の好適な形態を説明するためのものであり、本発明の範囲をここで示すものに限定する意図はないことを理解されたい。また、以下の図を通して、特に断らない限り、同一の符号は、同一の対象を指す。
図1は、本発明の実施形態におけるコンピュータ・ハードウェアの基本的なブロック図を示す。
コンピュータ(101)は、CPU(102)とメイン・メモリ(103)とを備えており、これらはバス(104)に接続されている。CPU(102)は好ましくは、32ビット又は64ビットのアーキテクチャに基づくものであり、例えば、インテル社のCore i(商標)シリーズ、Core 2(商標)シリーズ、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(B)及びKILL(B)を作成する;
(2)検出部(221)は、各ブロックの先頭における変数の集合(以下、IN(B)ともいう)を、各ブロックの終わりにおける変数の集合(以下、OUT(B)ともいう)、上記GEN(B)及び上記KILL(B)から求める;
(3)検出部(221)は、各ブロック内の各命令において変更された集合情報を上記各ブロック内の各命令に付加情報としてそれぞれ設定する;
(4)検出部(221)は、上記各命令に設定された付加情報について、各変数が連続している領域を、当該変数に対する副作用となり得る命令のない領域とする。上記集合情報は、上記IN(B)を基にして求められる。
GEN(B)は、バイナリコード中の各ブロックにおいて、副作用となり得る命令の後にアクセスがある変数の集合体である。
KILL(B)は、バイナリコード中の各ブロックにおいて、副作用となり得る命令が存在する場合には変数全体の集合体(ただし、副作用となり得る命令が存在しない場合には空集合である)である。
検出部(221)は、上記(1)の上記の作成において、下記処理(1a)〜(1c)を行う。すなわち、
(1a)検出部(221)は、各ブロック内の命令が変数へのアクセスであるかどうか、及び、上記命令が副作用となり得る命令であるかどうかを判定する;
(1b)検出部(221)は、上記判定を各命令の実行順に繰り返す;
(1c)検出部(221)は、上記判定の結果から、上記GEN(B)及び上記KILL(B)を作成する。
検出部(221)は、上記OUT(B)及び上記IN(B)を、下記データ・フロー方程式から求める。OUT(N)は、下記式で処理中のブロックBの直前にあるブロックNの終わりにおける変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である。
OUT(B) = (IN(B) - KILL(B)) ∪ GEN(B)
IN(B) = ∩N∈Pred(B) OUT(N)
検出部(221)は、上記(3)の上記付加情報の設定において、下記処理(3a)〜(3c)を行う。すなわち、
(3a)検出部(221)は、各ブロック内の命令が変数へのアクセスであるかどうか、及び、上記命令が副作用となり得る命令であるかどうかを判定し、上記IN(B)の集合情報を変更する;
(3b)検出部(221)は、上記各ブロック内の各命令において変更された集合情報を上記各ブロック内の各命令に付加情報としてそれぞれ設定する;
(3c)検出部(221)は、上記判定及び上記IN(B)の集合情報の変更を各命令の実行順に繰り返す。上記集合情報は上記IN(B)を基にして求められる。
処理部(222)は、上記検出された領域内において、ゾーン10進数形式の変数を2進型へ変換する処理(図3Aのステップ303を参照)、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを上記バイナリコードから削除する処理(同ステップ314を参照)、及びそれらの組み合わせの処理(同ステップ323及び324を参照)のうちの1つを行う。PACK/UNPACKは、COBOLにおいて周知の命令である。
処理部(222)は、ゾーン10進数形式の変数を2進型へ変換する処理を、当業者に知られている任意の方法を使用して行いうる。
処理部(222)は、ゾーン10進数形式の変数を2進型へ変換する上記処理を、当該変換処理前後のコスト差を見積もり、変換処理後の見積もりコストが変換処理前の見積もりコストよりも小さいことを条件に行い、次に、
上記PACK/UNPACKのコードを上記バイナリコードから削除する処理を、上記コスト差の見積もりの計算によって上記変換する処理がされなかった部分について行いうる。
処理部(222)は、上記変換処理前後の上記コスト差を、下記足し算の式に従い求める。すなわち、
コスト差=(変数がゾーン10進数形式である場合と2進型である場合とでの当該変数へアクセスする命令のコスト差にその実行頻度を乗じた値)
+(2進型への変換コストに各上記検出された領域内へ入る実行頻度を乗じた値)
+(ゾーン10進数形式への変換コストに各上記検出された領域から出る実行頻度を乗じた値)
+(桁合わせをするための剰余算命令のコストにその剰余算命令の実行頻度を乗じた値)
ここで、上記式のうち、変数がゾーン10進数形式である場合と2進型である場合とでの当該変数へアクセスする命令のコスト差にその実行頻度を乗じた値において、「その実行頻度」とは、ゾーン10進数形式又は2進型のいずれの実行頻度であってもよい。なぜならば、変数がアクセスする場所が同じであるので、実行頻度はいずれも同じであるからである。
処理部(222)は、PACK/UNPACKのコードをバイナリコードから削除するために、下記処理(c1)〜(c2)を行う。すなわち、
(c1)処理部(222)は、副作用となり得る命令のない上記領域中に書き込みがある変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン10進数形式の変数に対するPACK/UNPACKのコードのうち、最初と最後の型変換命令以外のコードを上記バイナリコードから削除する;
(c2)処理部(222)は、副作用となり得る命令のない上記領域中に書き込みがない変数の場合に、上記副作用となり得る命令のない上記領域内にあるゾーン10進数形式の変数に対するPACK/UNPACKのコードのうち、最初の型変換命令以外のコードを上記バイナリコードから削除する。
処理部(222)は、さらに、(c3)上記(c1)及び/又は(c2)の上記型変換命令以外のコードを削除する際に、当該削除するコードに付随する符号処理のコードを上記バイナリコードから削除する。
削除部(223)は、ゾーン10進数形式の変数を2進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを上記バイナリコードから削除する処理、及びそれらの組み合わせの処理のうちのいずれか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)は、上記剰余を求める演算を下記式に置き換えることによって、演算子強度の軽減を行う。すなわち、剰余を求める演算は、式:
結果 = (分子 < 分母 && 分子 >= 0) ? 分子 : (分子 % 分母)
に置き換えられる。
図3Aは、本発明の実施形態における、ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードの最適化処理全体のフローチャートを示す。
最適化処理は、下記の点で3つのフローチャートに分けられうる。
A.ステップ301で開始する最適化処理(以下、最適化処理301という)では、最適化は、ゾーン10進数形式の変数を2進型へ変換する処理(ステップ303)を含む。
B.ステップ311で開始する最適化処理(以下、最適化処理311という)では、最適化は、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードをバイナリコードから削除する処理(ステップ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進型への型変換を行うと処理矛盾を起こし得る命令、又は、PACK/UNPACKのコードを削除すると処理矛盾を起こし得る命令である。
本発明の一つの実施態様において、副作用となり得る命令とは、コンパイル・スコープ外の命令を実行する命令、アプリケーションから観測可能な(又は見える)例外を起こし得る命令、及び、上記変数のベースアドレス・レジスタ又はインデックス・レジスタを変更する命令の少なくとも1つを包含する。
コンパイル・スコープ外の命令を実行する命令とは、例えば、call命令、又はindirect branch命令である。
アプリケーションから観測可能な例外を起こし得る命令とは、例えば、例外が発生した場合に、アプリケーションがその例外を捕らえて処理を行わないことがコンパイル時にわかるような例外を起こしうる命令である。「例外」は、アプリケーションに見えるものを対象としうる。例外を起こしうる命令の代表的なものは、メモリ・アクセスのための命令に関連する命令である。
アプリケーションから観測される例外を起こし得る命令において、米国特許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で検出された最適化対象領域内において、PACK/UNPACKのコードを削除する処理を行う。削除するPACK/UNPACKのコードは、ステップ311で検出された最適化対象領域内にあり、PACK/UNPACKのコードを削除してもPACK/UNPACKにより変換された結果が変わらないPACK/UNPACKのコードである。本発明の実施態様に従うPACK/UNPACKのコードの削除の例については、下記図14及び図15に示されている。
上記PACK/UNPACKのコードをバイナリコードから削除する処理は、例えば下記の処理に従い行われる。
処理部(222)は、副作用となり得る命令のない領域中に書き込みがある変数(更新のある変数ともいう)であるか、又は、副作用となり得る命令のない領域中に書き込みがない変数(更新のない変数ともいう)であるかを判定する。
処理部(222)は、更新のある変数の場合に、上記副作用となり得る命令のない領域内にあるゾーン10進数形式の変数に対するPACK/UNPACKのコードのうち、最初と最後の型変換命令以外のコードをバイナリコードから削除する。言い換えれば、最初と最後の型変換命令は削除されないので、当該最初と最後の型変換命令は、最適化されたバイナリコードの実行において実行される。また、処理部(222)は、上記削除するコードに付随する符号処理のコードも上記バイナリコードから削除しうる。
一方、処理部(222)は、更新のない変数の場合に、上記副作用となり得る命令のない領域内にあるゾーン10進数形式の変数に対するPACK/UNPACKのコードのうち、最初の型変換命令以外のコードをバイナリコードから削除する。言い換えれば、最初の型変換命令は削除されないので、当該最初の型変換命令は、最適化されたバイナリコードの実行において実行される。また、処理部(222)は、上記削除するコードに付随する符号処理のコードも上記バイナリコードから削除しうる。削除するコードに付随する符号処理のコードは、例えば、図14のバイナリコード(1402)中のコード(1412)内及び図15のバイナリコード(1502)中のコード(1512)内に記載されている「OI」のコードである。
PACK/UNPACKの削除において上記最初と最後の型変換命のコードの検出は、下記に従い行われる。処理部(222)は、KILL(B)がφであり、IN(B)及びOUT(B)が変数vであるとするならば途中のブロックであり、それ以外の条件のブロックにおいて、最初及び/又は最後の型変換命令のコードが含まれると判断する。
C.最適化処理321
ステップ321〜ステップ322、ステップ323及びステップ325〜327は、最適化処理301のステップ301〜302、ステップ303及びステップ305〜307にそれぞれ対応する。
ステップ324は、下記点を除き、最適化処理311のステップ314に対応する。
ステップ324では、処理部(222)は、ステップ322において検出された最適化対象領域のうち、ステップ323の変換処理がされなかった部分(例えば、コスト計算によって変換処理が行われなかった部分)について、PACK/UNPACKのコードを削除する処理を行う。
なお、処理部(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で検出された最適化対象領域内において、PACK/UNPACKのコードを削除する処理を行う。なお、処理部(222)は、ステップ335に記載の処理をステップ334に記載の処理よりも先行して行ってもよい。この場合、ステップ334では、処理部(222)は、ステップ333において検出された最適化対象領域のうち、ステップ335に記載の処理がされなかった部分について、ゾーン10進数形式の変数を2進型へ変換する処理を行う。PACK/UNPACKのコードを削除する処理は、図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(B)及びKILL(B)を作成する。GEN(B)は、バイナリコード中の各ブロックBにおいて、副作用となり得る命令の後にアクセスがある変数の集合体である。KILL(B)は、上記各ブロックBにおいて、副作用となり得る命令が1個でも存在する場合には変数全体の集合体である(ただし、副作用となりうる命令が存在しない場合には空集合である)。GEN(B)及びKILL(B)は、下記ステップ403に示すデータ・フロー解析で使用するデータ・フロー方程式の入力データである。GEN(B)及びKILL(B)の作成については、下記図5に記載のフローチャートに従い説明する。
ステップ403では、検出部(221)は、図4に記載のデータ・フロー方程式を用いて、当該データ・フロー方程式にステップ402で作成されたGEN(B)及びKILL(B)を適用してIN(B)を求める。
IN(B)は、各ブロックBの先頭における変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である。IN(B)を基にして、下記ステップ404及び405において、副作用となり得る命令のない領域が、バイナリコード中から検出される。
データ・フロー方程式のうち、IN(B)を求める式中のOUT(N)は、データ・フロー方程式で処理中のブロックBの直前にあるブロックNの終わりにおける変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である。ブロックNは、ブロックBの直前に処理される任意のブロックであって、1又は複数である。ブロックNは、複数であることが多い。
データ・フロー方程式のうち、IN(B)を求める式中のN∈Pred(B)は、処理中のブロックBの直前にあるブロックNに対して行われる処理であることを意味する。
ステップ404では、検出部(221)は、各ブロックB内の各命令iに、VSETの集合情報の内容を付加情報として設定する。付加情報は、例えば作業領域であるVSETの集合情報から命令i毎に設定される。VSETは、例えばメモリ内の作業領域である。付加情報は、「メモリ内に読み込まれたバイナリコード中において、ゾーン10進数形式の変数vへのアクセスを含み且つ副作用となり得る命令のない領域」を特定するための情報である。各ブロック内の各命令iにVSETの集合情報の内容を付加情報として設定するためのフローチャートが、下記図6に示されている。また、集合情報の内容の例が下記図11において示されており、例えば、ブロック1102の上から順に、IN(B)、V1、V1,V2、φ、そしてV1である。
ステップ405では、検出部(221)は、ステップ404において各命令iに設定した付加情報について、各変数が連続している領域を、その変数に対する副作用となり得る命令のない領域とする。
ステップ406では、検出部(221)は、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する処理を終了する。
ステップ404の処理を疑似コードで書くと、下記の通りである。
VSET = IN(B);
for (each i ∈ ブロックB内の各命令iを実行順にスキャン){
if (i はvへのアクセス){
VSET |= v;
} else if (i ∈ 副作用となり得る命令){
VSET = φ;
}
i にVSETの集合情報の内容を付加情報として設定;
}
図5は、図4に示す検出処理のうち、GEN(B)及びKILL(B)を作成する処理(ステップ402)のフローチャートを示す。
ステップ501では、検出部(221)は、GEN(B)及びKILL(B)を作成する処理を開始する。
ステップ502では、検出部(221)は、GEN(B)及びKILL(B)を空集合(φ)で初期化する。
ステップ503では、検出部(221)は、ブロックB内の各命令iを実行順にスキャンする。
ステップ504では、検出部(221)は、命令iが変数vへのアクセスであるかどうかを検査する。命令iが変数vへのアクセスである場合、検出部(221)は、ステップ505に進む。一方、命令iが変数vへのアクセスでない場合、検出部(221)は、ステップ506に進む。
ステップ505では、検出部(221)は、ステップ504で判定された命令iからGEN(B) |= vを求める。
ステップ506では、検出部(221)は、命令iが副作用となり得る命令かどうかを検査する。命令iが副作用となり得る命令である場合、検出部(221)は、ステップ507に進む。一方、命令iが変数vへのアクセスでない場合、検出部(221)は、ステップ508に進む。
ステップ507では、検出部(221)は、ステップ506で判定された命令iから、KILL(B) = φの補集合を求める。また、検出部(221)は、GEN(B)を空集合(φ)で初期化する。
ステップ508では、検出部(221)は、各ブロックB内の各命令iについて実行順にステップ503〜507を繰り返す。検出部(221)は、全ての命令iについて、ステップ503〜507の処理が終了することに応じて、ステップ509に進む。
ステップ509では、検出部(221)は、GEN(B)及びKILL(B)を作成する処理を終了する。
図6は、図4に示す検出処理のうち、各ブロックB内の命令iに、VSETの集合情報の内容を付加情報として設定する処理(ステップ404)のフローチャートを示す。
ステップ601では、検出部(221)は、各ブロックB内の各命令iに、作業領域であるVSETの集合情報の内容を付加情報として設定する処理を開始する。
ステップ602では、検出部(221)は、VSETにIN(B)の内容をコピーする。
ステップ603では、検出部(221)は、ブロックB内の各命令iを実行順にスキャンする。
ステップ604では、検出部(221)は、命令iが変数vへのアクセスであるかどうかを検査する。命令iが変数vへのアクセスである場合、検出部(221)は、ステップ605に進む。一方、命令iが変数vへのアクセスでない場合、検出部(221)は、ステップ606に進む。
ステップ605では、検出部(221)は、ステップ604で判定された命令iからGEN(B) |= vを求める。
ステップ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(REM, I, NDIGITS)に従い判定される。既に桁が合っているため問題無いことは、下記のAnalyzeDEF(J, NDIGITS)に従い判定される。
ステップ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(REM, I, NDIGITS)に従い判定する。AnalyzeUSE(REM, I, NDIGITS)については、下記図9に記載のフローチャートにおいて説明する。
ステップ805では、削除部(223)は、全ての使用Iについて不必要であるかどうかを判定する。削除部(223)は、全ての使用Iについて不必要である場合にステップ808に進みREMを削除し、一方、全ての使用Iについて不必要でない場合にステップ806に進む。
ステップ806では、削除部(223)は、剰余算命令REMの各定義Jについて、剰余算命令の必要性をAnalyzeDEF(J, NDIGITS)に従い判定する。AnalyzeDEF(J, NDIGITS)については、下記図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)は、剰余を求める演算を、結果 = (分子 < 分母 && 分子 >= 0) ? 分子 : (分子 % 分母)に置き換えることによって、上記演算子強度の軽減を果たす。当該置き換えは、上記剰余を求める演算が、最適化対象領域内に限定されず、バイナリコード中の剰余算命令について削除されなかった残りの個々の剰余算命令について行われうる。軽減部(224)は、演算子強度の軽減後に、処理を削除部(223)に戻す。削除部は、軽減部(224)での演算子強度の軽減が終わることに応じて、ステップ810に進む。
ステップ810では、削除部(223)は、1つの剰余算命令についての削除処理を終了する。
図9は、図8に示す剰余算命令を最適化する処理のうち、剰余算命令REMの各使用Iについて剰余の必要又は不必要をチェックする処理 AnalyzeUSE(REM, I, NDIGITS)(ステップ804)のフローチャートを示す。
ステップ901では、削除部(223)は、REMの各使用Iについて剰余の必要性をチェックする処理 AnalyzeUSE(REM, I, NDIGITS)に従い、使用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(REM, I, NDIGITS)を終了する。
ステップ9011では、削除部(223)は、使用Iの分母が、10のn乗&& NDIGITS >= n であるかどうかを判定する。削除部(223)は、使用Iの分母が10のn乗&& NDIGITS >= n である場合に当該使用Iは不必要であると判定し(9013)、一方、使用Iの分母が10のn乗 && NDIGITS >= n でない場合に当該使用Iは必要であると判定する(9012)。NDIGITS>= nである場合には、その剰余算命令は必要であることから(9012)削除できない。一方、NDIGITS >= nである場合には、その剰余算命令は必要でないことから(9013)削除しうる。NDIGITS>= n において、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(REM, K, NDIGITS)に従い判定する。AnalyzeUSE(REM, K, NDIGITS)については、図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(REM, I, NDIGITS)を終了する。
図10は、図8に示す剰余算命令を最適化する処理のうち、剰余算命令REMの各定義Jについて剰余の必要又は不必要をチェックする処理 AnalyzeDEF(J, NDIGITS)(ステップ806)のフローチャートを示す。
ステップ1001では、削除部(223)は、REMの各定義Jについて剰余の必要性をチェックする処理 AnalyzeUSE(REM, I, NDIGITS)に従い、定義Jが必要であるか又は不必要であるかの判定を開始する。
ステップ1002では、削除部(223)は、定義Jが桁及び符号とも正しいかどうかを判定する。削除部(223)は、定義Jが桁及び符号とも正しくない場合にステップ1003に進み、一方、定義Jが桁及び符号とも正しい場合に当該定義Jが不必要であると判定する(1004)。
ステップ1003では、削除部(223)は、定義Jの入力について剰余が不必要と判断された場合に当該定義Jの出力についても不必要であるかどうかを判定する。削除部(223)は、上記出力についても不必要である場合にステップ1005に進み、一方、上記出力についても不必要でない場合に当該定義Jが必要であると判定する(1006)。
ステップ1005では、削除部(223)は、定義Jの各定義Lについて剰余の必要性をAnalyzeDEF(L, NDIGITS)に従い判定する。AnalyzeDEF(L, NDIGITS)については、図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(B)はV1となり、KILL(B)はV1、V2となる。
ブロック(1102)において、最初にVSETにIN(B)の内容をコピーする。次に、変数V1へのアクセスがあることから、VSETにV1が追加される(ステップ605)。次に、変数V2へのアクセスがあることから、VSETにV1,V2が追加される(副作用となり得る命令の直前まで)(ステップ605)。次に、副作用となり得る命令があるのでVSETは空集合(φ)で初期化される(ステップ607)。次に、副作用となり得る命令の次に変数V1へのアクセスがあることから、VSETにV1が追加される(ステップ605)。
図12は、COBOLコード、最適化対象であるバイナリコード、及び、本発明の実施態様に従い、ゾーン10進数形式の変数を2進型へ変換して最適化されたコードを示す。
COBOLコード(1201)は最適化対象であるバイナリコード(1202)へ変換する前のソースコードである。
バイナリコード(1202)は、COBOLコード(1201)をCOBOLコンパイラによって変換した結果のコードである。
最適化されたコード(1203)は、バイナリコード(1202)を本発明の実施態様に従う最適化技法で最適化されたバイナリコードである。
COBOLコード(1201)のうち、「01 dat PIC 9(7).」(1行目)は、符号なし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倍(命令のサイクル数を基に計算)のパフォーマンス向上が確認された。
また、上記最適化によってさらに別の最適化が可能になり、例えばdat = dat + 2という変形が容易になる。
図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のコードの直後にそれぞれ剰余算命令のコードが挿入される。しかし、本発明に従う最適化技法によって、最後のAR(10行目)のコードの直後に剰余算命令を挿入するだけで済んでいる。すなわち、バイナリコード(1302)中の最後の1回の剰余算命令以外の剰余算命令のコードが除去されている。従って、バイナリコード(1302)中の最後の1回に対応する剰余算命令だけが実行される。
バイナリコード(1302)及び最適化されたコード(1303)のそれぞれについて、命令のサイクル数に基づいて各コードのパフォーマンスを比較した。その結果、バイナリコード(1302)では91サイクルであったものが、最適化されたコード(1302)では27サイクルであった。従って、上記最適化によって、約4.6倍(命令のサイクル数を基に計算)のパフォーマンス向上が確認された。
また、上記最適化によってさらに別の最適化が可能になり、例えばdat = dat + 2という変形が容易になる。
図14は、COBOLコード、最適化対象であるバイナリコード、及び、本発明の実施態様に従い、更新がある変数idxに対するPACK/UNPACKのバイナリコードを削除して最適化されたコードを示す。
COBOLコード(1401)は最適化対象であるバイナリコード(1402)へ変換する前のソースコードである。
バイナリコード(1402)は、COBOLコード(1401)をCOBOLコンパイラによって変換した結果のコードである。
最適化されたコード(1403)は、バイナリコード(1402)を本発明の実施態様に従う最適化技法で最適化されたバイナリコードである。
COBOLコード(1401)のうち、「01 dat PIC 9(7).」(1行目)は、符号なし7桁の数を示す。
また、バイナリコード(1402)は、副作用となり得る命令のない領域中に書き込みがある変数(すなわち、更新がある変数)の場合の例である。更新がある変数であることは、バイナリコード(1402)から特定できる。
処理部(222)は、検出部(221)によって検出された最適化対象領域内において、4行目のUNPACのコード「UNPK 0(8,8),256(4,13)」及びそれに付随する5行目の符号処理のコード「OI 7(8),X'F0'」、並びに6行目のPACKのコード「PACK 256(4,13),0(8,8)」及びそれに付随する7行目の符号処理のコード「OI 259(13),X'0F'」をバイナリコード(1402)から削除する。すなわち、処理部(222)は、PACK/UNPACKのコードのうち、最初(1行目)と最後(最後から2行目)の型変換命令以外のコード(4〜7行目)(1412)を削除している。当該削除の結果、最適化されたコード(1403)が得られる。
バイナリコード(1402)及び最適化されたコード(1403)のそれぞれについて、命令のサイクル数に基づいて各コードのパフォーマンスを比較した。その結果、その結果、最適化されたコード(1403)の実行速度は、同一ハードウェア環境において、最適化前のバイナリコード(1402)の実行速度と比べて、約25%(命令のサイクル数を基に計算)のパフォーマンス向上が観察された。
また、上記最適化によってさらに別の最適化が可能になり、例えばdat = dat + 2という変形が容易になる。
図15は、COBOLコード、最適化対象であるバイナリコード、及び、本発明の実施態様に従い、更新がない変数idx2に対するPACK/UNPACKのバイナリコードを削除して最適化されたコードを示す。
COBOLコード(1501)は最適化対象であるバイナリコード(1502)へ変換する前のソースコードである。
バイナリコード(1502)は、COBOLコード(1501)をCOBOLコンパイラによって変換した結果のコードである。
最適化されたコード(1503)は、バイナリコード(1502)を本発明の実施態様に従う最適化技法で最適化されたバイナリコードである。
COBOLコード(1501)は、符号あり7桁の数を示す。更新がない変数idx2に対する最適化処理を示す。
また、バイナリコード(1502)は、副作用となり得る命令のない領域中に書き込みがない変数(すなわち、更新がない変数)の場合の例である。更新がない変数であることは、バイナリコード(1502)から特定できる。
処理部(222)は、検出部(221)によって検出された最適化対象領域内において、5行目のPACKのコード「PACK 256(16,13),40(7,8)」及びそれに付随する6行目の符号処理のコード「OI 271(13),X'0F'」をバイナリコード(1502)から削除する。すなわち、処理部(222)は、変数idx2に対するPACK/UNPACKのコードのうち、最初(1行目)の型変換命令以外のコード(5〜6行目)を削除している。当該削除の結果、最適化されたコード(1503)が得られる。
なお、変数idxに対するPACK/UNPACKのコードであるPACKのコード(下から5行目)及びUNPKのコード(下から2行目)も除去可能である。
バイナリコード(1502)及び最適化されたコード(1503)のそれぞれについて、命令のサイクル数に基づいて各コードのパフォーマンスを比較した。その結果、最適化されたコード(1503)の実行速度は、同一ハードウェア環境において、最適化前のバイナリコード(1502)の実行速度と比べて、約9%(命令のサイクル数を基に計算)のパフォーマンス向上が観察された。

Claims (20)

  1. ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する方法であって、コンピュータが、
    メモリ内に読み込まれた前記バイナリコード中から、各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出するステップと、
    前記検出された領域内において、ゾーン10進数形式の変数を2進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを前記バイナリコードから削除する処理、又はそれらの組み合わせの処理を行うステップと
    を実行することを含む、前記方法。
  2. 前記処理を行うステップの後に、前記コンピュータが、桁合わせをするための剰余算命令のコードを前記バイナリコードから削除するステップをさらに実行することを含む、請求項1に記載の方法。
  3. 前記桁合わせをするための剰余算命令のコードを前記バイナリコードから削除するステップが、
    (A)前記変数がn1桁であり、さらに当該変数をn2桁にする剰余算命令についてn1≧n2の条件を満たす場合には、前記n1桁に桁合わせをするための剰余算命令のコードを前記バイナリコードから削除するステップと、
    (B)前記(A)の条件下にない場合には、
    (a)前記変数が符号なしの場合に、
    (a1)前記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、前記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを前記バイナリコードから削除するステップと、
    (a2)前記(a1)以外の場合において、当該(a1)の条件を満たさない演算の前で桁が正しいことを保証するステップと、
    (b)前記変数が符号ありの場合に、
    (b1)前記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、当該連続している一連の演算の式の途中で符号が変わらないこと及び2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、前記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを前記バイナリコードから削除するステップと、
    (b2)前記(b1)以外の場合において、当該(b1)の条件を満たさない演算の前で桁が正しいことを保証するステップと
    を含む、請求項2に記載の方法。
  4. 前記桁合わせをするための剰余算命令のコードを前記バイナリコードから削除するステップの後に、前記コンピュータが、前記バイナリコード中の残った個々の剰余算命令に対して、演算子強度の軽減を行うステップをさらに実行することを含み、
    前記軽減が、前記剰余を求める演算を下記式:
    結果 = (分子 < 分母 && 分子 >= 0) ? 分子 : (分子 % 分母)
    に置き換えることによって行われる、請求項2に記載の方法。
  5. 前記(a2)の保証するステップが、前記(a1)の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを前記バイナリコードに挿入するステップを含む、請求項3に記載の方法。
  6. 前記(b2)の保証するステップが、前記(b1)の条件を満たさない演算の前で桁が正しいことを保証する剰余算命令のコードを生成し、当該生成した剰余算命令のコードを前記バイナリコードに挿入するステップを含む、請求項3に記載の方法。
  7. 前記検出するステップが、
    前記バイナリコード中の各ブロックにおいて、副作用となり得る命令の後にアクセスがある変数の集合体(以下、GEN(B)ともいう)及び前記各ブロックにおいて、副作用となり得る命令が存在する場合には変数全体の集合体(以下、KILL(B)ともいう)を作成するステップであって、前記KILL(B)は、副作用となり得る命令が存在しない場合には空集合である、前記作成するステップと、
    各ブロックの先頭における変数の集合(以下、IN(B)ともいう)を、各ブロックの終わりにおける変数の集合(以下、OUT(B)ともいう)、前記GEN(B)及び前記KILL(B)から求めるステップと、
    各ブロック内の各命令において変更された集合情報を前記各ブロック内の各命令に付加情報としてそれぞれ設定するステップであって、前記集合情報は前記IN(B)を基にして求められる、前記設定するステップと、
    前記各命令に設定された付加情報について、各変数が連続している領域を、当該変数に対する副作用となり得る命令のない領域とするステップと
    を含む、請求項1に記載の方法。
  8. 前記作成するステップが、
    各ブロック内の命令が変数へのアクセスであるかどうか、及び、前記命令が副作用となり得る命令であるかどうかを判定するステップと、
    前記判定を各命令の実行順に繰り返すステップと、
    前記判定の結果から、前記GEN(B)及び前記KILL(B)を作成するステップと
    を含む、請求項7に記載の方法。
  9. 前記OUT(B)及び前記IN(B)が、
    OUT(B) = (IN(B) - KILL(B)) ∪ GEN(B)
    IN(B) = ∩N∈Pred(B) OUT(N)
    のデータ・フロー方程式から求められ、OUT(N)は、上記式で処理中のブロックBの直前にあるブロックNの終わりにおける変数の集合であり、副作用となり得る命令の後でアクセスがあった変数の集合である、請求項7に記載の方法。
  10. 前記設定するステップが、
    各ブロック内の命令が変数へのアクセスであるかどうか、及び、前記命令が副作用となり得る命令であるかどうかを判定し、前記IN(B)の集合情報を変更するステップと、
    前記各ブロック内の各命令において変更された集合情報を前記ブロック内の各命令に付加情報としてそれぞれ設定するステップであって、前記集合情報は前記IN(B)を基にして求められる、上記設定するステップと、
    前記判定及び前記IN(B)の集合情報の変更を各命令の実行順に繰り返すステップと
    を含む、請求項7に記載の方法。
  11. 前記PACK/UNPACKのコードを前記バイナリコードから削除する前記処理が、
    (c1)副作用となり得る命令のない前記領域中に書き込みがある変数の場合に、前記副作用となり得る命令のない前記領域内にあるゾーン10進数形式の変数に対するPACK/UNPACKのコードのうち、最初と最後の型変換命令以外のコードを前記バイナリコードから削除する処理と、
    (c2)副作用となり得る命令のない前記領域中に書き込みがない変数の場合に、前記副作用となり得る命令のない前記領域内にあるゾーン10進数形式の変数に対するPACK/UNPACKのコードのうち、最初の型変換命令以外のコードを前記バイナリコードから削除する処理と
    を含む、請求項1に記載の方法。
  12. 前記PACK/UNPACKのコードを前記バイナリコードから削除する前記処理が、
    (c3)前記(c1)及び/又は(c2)の前記型変換命令以外のコードを削除する際に、当該削除するコードに付随する符号処理のコードを前記バイナリコードからさらに削除する処理をさらに含む、請求項11に記載の方法。
  13. ゾーン10進数形式の変数を2進型へ変換する前記処理が、当該変換処理前後のコスト差を見積もり、変換処理後の見積もりコストが変換処理前の見積もりコストよりも小さいことを条件に行われ、次に、
    前記PACK/UNPACKのコードを前記バイナリコードから削除する処理が、前記コスト差の見積もりの計算によって前記変換する処理がされなかった部分について行われる、請求項1に記載の方法。
  14. 前記変換処理前後の前記コスト差が、下記式:
    コスト差=変数がゾーン10進数形式である場合と2進型である場合とでの当該変数へアクセスする命令のコスト差にその実行頻度を乗じた値
    +2進型への変換コストに各前記検出された領域内へ入る実行頻度を乗じた値
    +ゾーン10進数形式への変換コストに各前記検出された領域から出る実行頻度を乗じた値
    +桁合わせをするための剰余算命令のコストにその剰余算命令の実行頻度を乗じた値
    によって求められる、請求項13に記載の方法。
  15. 前記副作用となり得る命令が、ゾーン10進数形式の変数を2進型への型変換を行うと処理矛盾を起こし得る命令、又は、PACK/UNPACKのコードを削除すると処理矛盾を起こし得る命令である、請求項1に記載の方法。
  16. 前記副作用となり得る命令が、
    コンパイル・スコープ外の命令を実行する命令、
    アプリケーションから観測可能な例外を起こし得る命令、及び、
    前記変数のベースアドレス・レジスタ又はインデックス・レジスタを変更する命令
    の少なくとも1つである、請求項1に記載の方法。
  17. ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する装置であって、
    各変数について、ゾーン10進数形式の変数へのアクセスを含み且つ副作用となり得る命令のない領域を検出する検出部と、
    前記検出された領域内において、ゾーン10進数形式の変数を2進型へ変換する処理、PACK/UNPACKのコードを削除しても変換された結果が変わらないPACK/UNPACKのコードを前記バイナリコードから削除する処理、及びそれらの組み合わせの処理のうちの1つを行う処理部と
    を備えている、前記装置。
  18. 前記処理が前記処理部によって行われた後に、桁合わせをするための剰余算命令のコードを前記バイナリコードから削除する削除部をさらに備えており、
    前記削除部は、
    (A)前記変数がn1桁であり、さらに当該変数をn2桁にする剰余算命令についてn1≧n2の条件を満たす場合には、前記n1桁に桁合わせをするための剰余算命令のコードを前記バイナリコードから削除し、
    (B)前記(A)の条件下にない場合には、
    (a)前記変数が符号なしの場合に、
    (a1)前記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、前記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを前記バイナリコードから削除し、
    (a2)前記(a1)以外の場合において、当該(a1)の条件を満たさない演算の前で桁が正しいことを保証し、
    (b)前記変数が符号ありの場合に、
    (b1)前記検出された領域内において、足し算、掛け算又は引き算の演算が連続している場合において、当該連続している一連の演算の式の途中で符号が変わらないこと及び2進計算のオーバーフローが起きないことが保証できる演算の範囲がコンパイル時にわかる場合にのみ、前記保証できる連続した演算のうち、最後の一回の剰余算命令のコード以外の剰余算命令のコードを前記バイナリコードから削除し、
    (b2)前記(b1)以外の場合において、当該(b1)の条件を満たさない演算の前で桁が正しいことを保証する、
    請求項17に記載の装置。
  19. ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する装置であって、
    前記バイナリコードを読み込むためのメモリと、
    前記メモリ上で前記バイナリコードを最適化するためのプロセッサと
    を備えており、
    前記最適化が、請求項1〜16のいずれか一項に記載の方法の各ステップを実行することによって行われる、前記装置。
  20. ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化するためのコンピュータ・プログラムであって、コンピュータに、請求項1〜16のいずれか一項に記載の方法の各ステップを実行させる、前記コンピュータ・プログラム。
JP2011121446A 2011-05-31 2011-05-31 ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する方法、並びにその最適化装置及びコンピュータ・プログラム Expired - Fee Related JP5689366B2 (ja)

Priority Applications (3)

Application Number Priority Date Filing Date Title
JP2011121446A JP5689366B2 (ja) 2011-05-31 2011-05-31 ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する方法、並びにその最適化装置及びコンピュータ・プログラム
US13/483,300 US20120311550A1 (en) 2011-05-31 2012-05-30 Method for optimizing binary codes in language having access to zoned decimal type variable, optimization apparatus and computer program for the same
US13/591,330 US20120317560A1 (en) 2011-05-31 2012-08-22 Method for optimizing binary codes in language having access to zoned decimal type variable, optimization apparatus and computer program for the same

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2011121446A JP5689366B2 (ja) 2011-05-31 2011-05-31 ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する方法、並びにその最適化装置及びコンピュータ・プログラム

Publications (2)

Publication Number Publication Date
JP2012248139A JP2012248139A (ja) 2012-12-13
JP5689366B2 true JP5689366B2 (ja) 2015-03-25

Family

ID=47262721

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2011121446A Expired - Fee Related JP5689366B2 (ja) 2011-05-31 2011-05-31 ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する方法、並びにその最適化装置及びコンピュータ・プログラム

Country Status (2)

Country Link
US (2) US20120311550A1 (ja)
JP (1) JP5689366B2 (ja)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8856759B2 (en) * 2010-02-01 2014-10-07 Bull Hn Information Systems Inc. Method and apparatus providing COBOL decimal type arithmetic functions with improved performance
JP5967618B2 (ja) 2013-04-17 2016-08-10 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation 二進化十進数型変数へのアクセスを有する言語のバイナリコードを最適化する方法、並びにそのコンピュータ及びコンピュータ・プログラム
US9858058B2 (en) * 2014-03-31 2018-01-02 International Business Machines Corporation Partition mobility for partitions with extended code
FR3030077B1 (fr) * 2014-12-10 2016-12-02 Arnault Ioualalen Procede d'ajustement de la precision d'un programme d'ordinateur manipulant au moins un nombre a virgule.
US10083015B2 (en) 2016-12-15 2018-09-25 International Business Machines Corporation Mobile accessibility evaluation from application binary
US10713145B2 (en) * 2018-01-05 2020-07-14 International Business Machines Corporation Automated debugging with combined static and dynamic analysis
US11144840B2 (en) 2018-07-26 2021-10-12 International Business Machines Corporation Completing decision logic to avoid a side effect
US11221835B2 (en) * 2020-02-10 2022-01-11 International Business Machines Corporation Determining when to perform and performing runtime binary slimming
US11442726B1 (en) 2021-02-26 2022-09-13 International Business Machines Corporation Vector pack and unpack instructions

Family Cites Families (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4141005A (en) * 1976-11-11 1979-02-20 International Business Machines Corporation Data format converting apparatus for use in a digital data processor
JPH0721033A (ja) * 1993-07-07 1995-01-24 Nec Corp 言語処理装置及びその方法
US6041177A (en) * 1997-02-26 2000-03-21 Fujitsu Limited Program analyzing apparatus which categorizes variables into domains and method thereof
US6064817A (en) * 1997-07-23 2000-05-16 International Business Machines Corporation Compiler-assisted or interpreter-assisted solution to the year 2000 problem for computer programs
US7383529B2 (en) * 2004-02-13 2008-06-03 The Regents Of The University Of California Method and apparatus for designing circuits using high-level synthesis
EP1643362A3 (en) * 2004-10-01 2006-04-26 Electronic Data Systems Corporation System and method for optimizing mainframe applications
US7389499B2 (en) * 2004-10-21 2008-06-17 International Business Machines Corporation Method and apparatus for automatically converting numeric data to a processor efficient format for performing arithmetic operations
US7730471B2 (en) * 2005-07-13 2010-06-01 Compuware Corporation Method and system for processing COBOL language record description entries that specify data items that include a varying length characteristic and computer readable storage medium for storing instructions for performing the method
US7873952B2 (en) * 2006-03-09 2011-01-18 Oracle America, Inc. Code transformation to optimize fragments that implement constant loading
US8140608B1 (en) * 2007-05-31 2012-03-20 Nvidia Corporation Pipelined integer division using floating-point reciprocal
US20100251227A1 (en) * 2009-03-25 2010-09-30 Microsoft Corporation Binary resource format and compiler

Also Published As

Publication number Publication date
US20120311550A1 (en) 2012-12-06
US20120317560A1 (en) 2012-12-13
JP2012248139A (ja) 2012-12-13

Similar Documents

Publication Publication Date Title
JP5689366B2 (ja) ゾーン10進数形式の変数へのアクセスを有する言語のバイナリコードを最適化する方法、並びにその最適化装置及びコンピュータ・プログラム
US9733913B2 (en) Methods and systems to vectorize scalar computer program loops having loop-carried dependences
KR101381274B1 (ko) 효율적인 동적 이진 변환을 위한 레지스터 매핑 방법, 시스템 및 컴퓨터 판독가능 저장 매체
US7873952B2 (en) Code transformation to optimize fragments that implement constant loading
US9858054B2 (en) Method for optimizing binary code in language having access to binary coded decimal variable, and computer and computer program
EP0732650B1 (en) Resource assigning apparatus
US8447956B2 (en) Running subtract and running divide instructions for processing vectors
US20100095286A1 (en) Register reduction and liveness analysis techniques for program code
US20120159461A1 (en) Program optimizing apparatus, program optimizing method, and program optimizing article of manufacture
JPH0695311B2 (ja) コード最適化方法
JP2009110299A (ja) プログラムを最適化するコンパイラ
US8332833B2 (en) Procedure control descriptor-based code specialization for context sensitive memory disambiguation
JPH096627A (ja) 最適化装置
JP2007286671A (ja) ソフトウェア/ハードウェア分割プログラム、および分割方法。
WO2014136611A1 (ja) コスト算出装置、コスト算出方法、及びコンピュータ読み取り可能な記録媒体
US8056066B2 (en) Method and apparatus for address taken refinement using control flow information
JP6366033B2 (ja) プログラム中のif文の最適化方法
US6584611B2 (en) Critical path optimization—unload hard extended scalar block
JP6481515B2 (ja) 情報処理装置、コンパイル方法、及びコンパイラプログラム
JP6409639B2 (ja) コンパイラプログラム、システム、方法、及び装置
El Moussawi et al. Superword level parallelism aware word length optimization
JP2002312176A (ja) 変換プログラム、コンパイラ、コンピュータ装置、プログラム変換方法及び記憶媒体
JP6627630B2 (ja) コンパイル方法、コンパイルプログラム及び情報処理装置
JP4768214B2 (ja) コンパイル方法、及びデータ処理装置。
JPH11149380A (ja) コンパイラとプログラム最適化方法およびその処理プログラムを記録した記録媒体

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20140210

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20141211

TRDD Decision of grant or rejection written
A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A821

Effective date: 20150107

RD14 Notification of resignation of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7434

Effective date: 20150107

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20150107

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20150128

R150 Certificate of patent or registration of utility model

Ref document number: 5689366

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees