JP2017204080A - 情報処理装置、コンパイル方法及びコンパイラプログラム - Google Patents

情報処理装置、コンパイル方法及びコンパイラプログラム Download PDF

Info

Publication number
JP2017204080A
JP2017204080A JP2016094763A JP2016094763A JP2017204080A JP 2017204080 A JP2017204080 A JP 2017204080A JP 2016094763 A JP2016094763 A JP 2016094763A JP 2016094763 A JP2016094763 A JP 2016094763A JP 2017204080 A JP2017204080 A JP 2017204080A
Authority
JP
Japan
Prior art keywords
copy
call
class
constructor
unit
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.)
Granted
Application number
JP2016094763A
Other languages
English (en)
Other versions
JP6651974B2 (ja
Inventor
司睦 田原
Tsuguchika Tabaru
司睦 田原
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.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
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 Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2016094763A priority Critical patent/JP6651974B2/ja
Priority to US15/484,547 priority patent/US10169008B2/en
Publication of JP2017204080A publication Critical patent/JP2017204080A/ja
Application granted granted Critical
Publication of JP6651974B2 publication Critical patent/JP6651974B2/ja
Active 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/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented

Landscapes

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

Abstract

【課題】暗黙のコピーコンストラクタ及び暗黙の代入演算子に関してメモリアクセス回数を減らすこと。
【解決手段】周辺探索部23が、最適化対象クラスのコピーコンストラクタ及び代入演算の呼び出し及び該呼び出しの周辺を探索し、該呼び出しにより実行されるコピー処理のコピー元及びコピー先のメンバ変数へのアクセス回数を算出する。そして、生成部24が、デフォルトのコピー処理を行った場合の該呼び出し及び該呼び出しの周辺のコピー元及びコピー先に関するメモリアクセス回数と周辺探索部23により算出されたアクセス回数とを比較する。そして、生成部24は、周辺探索部23により算出されたアクセス回数が小さい場合に、コピーコンストラクタ及び代入演算子についてメンバ変数単位でコピー処理を行う定義をAST3に追加する。そして、生成部24は、該呼び出しについて追加した定義を用いるようにAST3を修正する。
【選択図】図3

Description

本発明は、情報処理装置、コンパイル方法及びコンパイラプログラムに関する。
C++等のオブジェクト指向言語では、コピーコンストラクタ又は代入演算子が用いられるとコピー処理が行われる。図14は、コピーコンストラクタ又は代入演算子が用いられたときのコピー処理を説明するための図である。
図14に示すように、コピーコンストラクタとは、変数を定義する際、同じ型の別の変数を元に定義するものであり、代入演算子とは、同じ型の別の変数を元に値を更新するものである。例えば、aをクラスがClass_Cである変数とすると、Class_C b(a)は、変数bを同じClass_Cの変数aを元に定義するコピーコンストラクタである。このとき、変数bは変数aで初期化される。すなわち、変数bの値として変数aの値がコピーされる。
また、a、bをクラスがClass_Cである変数とすると、b=aは、変数aを元にbの値を更新する代入演算子である。このとき、変数bは変数aで更新される。すなわち、変数bの値として変数aの値がコピーされる。
なお、コンパイル技術に関して、文字操作手続きのインライン展開に用いるオブジェクトとして文字操作手続きの実行時間を最小にするスカラ命令又はベクトル命令の一方を選択することで、ベクトル演算機能を持つ計算機のコンパイル性能を向上させる技術がある。
また、コンパイル段階でプログラムの構造の特徴を解析してロード命令に先立ってデータキャッシュに必要なメモリの内容をコピーしておくようにすることで、実行時性能を向上するコンパイル装置がある。
また、値渡し引数を持つ関数を間接的に呼び出す可能性のある関数がなく、かつ値渡し引数が該値渡し引数を持つ関数の定義内で更新されない場合に、値渡し引数を持つ関数を呼び出す関数を参照渡し引数を持つ関数を呼び出す関数に変換するコンパイル技術がある。このコンパイル技術により、コードサイズを小さくすることができる。
特開平6−214800号公報 特開平11−212802号公報 特開2005−182562号公報
図14に示した変数間コピーには、無駄なメモリアクセスがあるという問題がある。図15は、図14に示した変数間コピーの問題を説明するための図である。図15において、Class_Cは、16ビット整数型の変数m、n、o、pをメンバ変数とするクラスであり、a、bは、型がClass_Cである変数である。そして、b=aのように代入演算子が用いられると、a.m、a.n、a.o及びa.pの値がb.m、b.n、b.o及びb.pにそれぞれコピーされる。このコピーはデフォルトのコピー処理ではバイト単位に行われる。
b=aのすぐ後でc=b.m+b.n+b.o+b.pの計算が行われる場合、b=aの処理でメモリから読み出されたa.m、a.n、a.o及びa.pの値を用いることができれば、無駄なメモリアクセスを減らすことができる。しかしながら、b.m、b.n、b.o及びb.pは2バイト単位でメモリ読み出しが行われるため、バイト単位でメモリから読み出されたa.m、a.n、a.o及びa.pの値を用いることはできない。したがって、b.m、b.n、b.o及びb.pが再度メモリから読み出され、メモリへの無駄なアクセスが発生し、メモリアクセス数が増加する。
本発明は、1つの側面では、メモリアクセス数を減らすことを目的とする。
1つの態様では、情報処理装置は、抽出部と特定部と算出部と生成部とを有する。抽出部は、ソースコード上の暗黙のコピーコンストラクタ及び暗黙の代入演算子の少なくともいずれかを用いるクラスを抽出する。特定部は、抽出部により抽出されたクラスに含まれるクラスのコピーコンストラクタ及び代入演算の少なくともいずれかの呼び出しを特定する。算出部は、特定部により特定された呼び出し及び該呼び出しの周辺における、該呼び出しにより実行されるコピー処理のコピー元及びコピー先のメンバ変数へのアクセス回数を算出する。生成部は、該呼び出しにより実行されるデフォルトのコピー処理を行った場合の該呼び出し及び該呼び出しの周辺のコピー元及びコピー先に関するメモリアクセス数と算出部により算出されたアクセス回数を比較する。そして、生成部は、算出部により算出されたアクセス回数が小さいと判定した場合に、コピーコンストラクタ及び代入演算子の少なくともいずれかについてメンバ変数単位でコピー処理を行う定義を追加する中間コードを生成する。また、生成部は、該呼び出しについて追加した定義を用いる中間コードを生成する。
1つの側面では、メモリアクセス数を減らすことができる。
図1は、実施例に係るコンパイラによる最適化を説明するための図である。 図2Aは、最適化の第1の条件を説明するための図である。 図2Bは、最適化の第2の条件を説明するための図である。 図3は、実施例に係る情報処理装置の構成を示す図である。 図4は、ASTの一例を示す図である。 図5Aは、周辺探索を説明するための第1の図である。 図5Bは、周辺探索を説明するための第2の図である。 図5Cは、周辺探索を説明するための第3の図である。 図5Dは、周辺探索を説明するための第4の図である。 図5Eは、周辺探索を説明するための第5の図である。 図5Fは、周辺探索を説明するための第6の図である。 図5Gは、周辺探索を説明するための第7の図である。 図6Aは、最適化コピーコンストラクタ及び最適化コピーメソッドの定義例を示す図である。 図6Bは、最適化コピーコンストラクタ及び最適化コピーメソッドへの置き換え例を示す図である。 図7は、最適化処理のフローを示すフローチャートである。 図8は、対象クラス取得処理のフローを示すフローチャートである。 図9は、周辺探索処理のフローを示すフローチャートである。 図10は、代入演算子最適化処理のフローを示すフローチャートである。 図11は、コピーコンストラクタ最適化処理のフローを示すフローチャートである。 図12は、メソッドM追加処理のフローを示すフローチャートである。 図13は、実施例に係るコンパイラプログラムを実行するコンピュータのハードウェア構成を示す図である。 図14は、コピーコンストラクタ又は代入演算子が用いられたときのコピー処理を説明するための図である。 図15は、図14に示した変数間コピーの問題を説明するための図である。
以下に、本願の開示する情報処理装置、コンパイル方法及びコンパイラプログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。
まず、実施例に係るコンパイラによる最適化について説明する。図1は、実施例に係るコンパイラによる最適化を説明するための図である。図1に示すように、実施例に係るコンパイラは、例えば、b=aの直後にc=b.m+b.n+b.o+b.pのように、メモリから読み出したデータを再利用する文(statement)があることを検出する。そして、実施例に係るコンパイラは、b=aにより実行されるコピー処理に関して、c=b.m+b.n+b.o+b.pにおいてメモリから読み出す形式と同じ形式でメモリを読み出すコードを生成する。
すなわち、c=b.m+b.n+b.o+b.pでは2バイト単位でデータが読み出されるため、実施例に係るコンパイラは、b=aにより実行されるコピー処理においても2バイト単位すなわちメンバ変数単位でメモリからデータを読み出すコードを生成する。
したがって、実施例に係るコンパイラは、コピー処理においてメモリから読み出されてレジスタにあるデータを使いまわすことを可能とし、メモリアクセス回数を減らすことができる。
実施例に係るコンパイラは、最適化を行う場合に、2つの条件を確認する。図2Aは、最適化の第1の条件を説明するための図である。図2Aに示すように、実施例に係るコンパイラは、b=aの前後に同じ変数の要素(メンバ変数)へのアクセスがあるか否かを確認し、同じ変数の要素へのアクセスがない場合には、b=aにより実行されるコピー処理において要素単位のコピーを行うコードは生成しない。なお、多バイト長コピー命令がある場合には、b=aのコピー処理において多バイト長コピー命令を使用した方がコピー速度は速くなる。
図2Bは、最適化の第2の条件を説明するための図である。図2Bに示すように、実施例に係るコンパイラは、b=aの前後に同じ変数の要素へのアクセスがある場合でも、アクセス数が多くなる場合には、b=aのコピー処理において要素単位のコピーを行うコードは生成しない。図2Bにおいて、b=aの直後にc=b.m+b.nがあると、要素単位のコピーにおけるメモリアクセス回数は、4回となる。一方、8バイト長コピー命令を使用できる場合、メモリアクセス回数は、aへのアクセス、b.mへのアクセス、b.nへのアクセスの3回である。
このように、実施例に係るコンパイラは、図2A及び図2Bに示した2つの条件を確認して最適化を行うことによって、最適化によるメモリアクセス数の増加を防ぐことができる。
なお、コピーコンストラクタ及び代入演算子には、ユーザーが処理を定義するユーザー指定コピーコンストラクタ及びユーザー指定代入演算子があるが、ここでは、ユーザー指定コピーコンストラクタ及びユーザー指定代入演算子は対象としない。実施例に係るコンパイラは、ユーザーの定義がない暗黙のコピーコンストラクタ及び暗黙の代入演算子を最適化の対象とする。
また、以下では、暗黙のコピーコンストラクタ及び暗黙の代入演算子であることが明らかである場合には、暗黙のコピーコンストラクタ及び暗黙の代入演算子をそれぞれ単にコピーコンストラクタ及び代入演算子と呼ぶことがある。
次に、実施例に係る情報処理装置の構成について説明する。図3は、実施例に係る情報処理装置の構成を示す図である。図3に示すように、実施例に係る情報処理装置1は、情報を処理する装置であり、コンパイル部1aを有する。コンパイル部1aは、ソースファイル2を読み込んで、実行コード7を生成する。
コンパイル部1aは、フロントエンド部10と、最適化処理部20と、バックエンド部30とを有する。フロントエンド部10は、ソースファイル2を読み込み、語彙解析、構文解析等を行って、AST(Abstract Syntax Tree:抽象構文木)3を出力する。
最適化処理部20は、AST3を入力し、コピーコンストラクタ及び代入演算子に関する最適化を行ってAST3を修正し、修正AST4を出力する。また、最適化処理部20は、最適化の処理中に、最適化の対象となるクラスを示す対象クラス5を作成する。また、最適化処理部20は、最適化の処理中に、最適化の対象となるクラスのコピーコンストラクタ呼び出し及び代入演算呼び出しにより実行されるコピー処理のコピー元及びコピー先のメンバ変数へのアクセス個所を示す変更箇所リスト6を作成する。
なお、最適化処理部20は、AST3から手続き間最適化及びインライン化を適用したASTを作成し、作成したASTを用いてコピーコンストラクタ及び代入演算子に対する最適化を行ってもよい。
最適化処理部20は、コピーコンストラクタ及び代入演算子を用いるクラスを特定し、コピーコンストラクタ及び代入演算子を用いる箇所を特定する。そして、最適化処理部20は、最適化条件を確認し、コピーコンストラクタ及び代入演算子の最適化を実施する。そして、最適化処理部20は、AST3を修正して修正AST4を作成する。
なお、最適化処理部20は、修正AST4を作成する前に他の最適化を行ってもよい。また、最適化処理部20は、AST3の代わりに他のIR(Intermediate Representation:中間表現)やビットコードのレベルでコピーコンストラクタ及び代入演算子の最適化を実施してもよい。
バックエンド部30は、修正AST4を入力し、情報処理装置1又は他の情報処理装置で実行される実行コード7を出力する。なお、コンパイル部1aは、実行コード7の実行速度等を向上させるために、フロントエンド部10及びバックエンド部30において様々な最適化を行ってもよい。
最適化処理部20は、取得部21と、特定部22と、周辺探索部23と、生成部24とを有する。取得部21は、AST3を解析し、暗黙のコピーコンストラクタ又は暗黙の代入演算子を用いるクラスを最適化の対象となるクラスとして取得する。図4は、AST3の一例を示す図である。図4は、test.ccという名前のソースファイル2に対応するAST3を示す。
図4に示すように、AST3は、ソースファイル2の構文解析結果を示す木であり、ソースファイル2に対応するファイルをルートとする。各ノードは構文要素を示し、ノード間のリンクは構文要素の親子関係を示す。例えば、test.ccという名前のファイルは、Cという名前のクラス定義とmainという名前の関数定義から構成される。
ノード間のリンクについて、親ノード及び子ノードがそれぞれ子ノード及び親ノードへのポインタを有し、親ノードと子ノードのどちらからもリンクをたどることができる。また、図4において、リンクのエッジの番号は、親のリスト中の子ノードの番号であり、ソースファイル2における出現順につけられる。
取得部21は、AST3のノードをルートから順にたどることによって、最適化の対象となるクラスを取得し、対象クラス5を作成する。取得部21は、他のクラスを継承しているクラス、メンバ変数に基本型以外の型を含むクラス、メンバ変数の数が所定の上限値を超えるクラスは最適化の対象としない。
特定部22は、AST3を解析し、最適化対象クラスのコピーコンストラクタ呼び出し及び代入演算呼び出しを特定する。
周辺探索部23は、最適化対象クラスのコピーコンストラクタ又は代入演算の呼び出し及び当該呼び出しの周辺を探索し、当該呼び出しにより実行されるコピー処理のコピー元及びコピー先のメンバ変数へのアクセス数を計算する。ここで、周辺とは、例えば、最適化対象クラスのコピーコンストラクタ又は代入演算の呼び出しを含む文の前後の所定の数の文である。
周辺探索部23は、最適化対象クラスのコピーコンストラクタ又は代入演算の呼び出しの前の文については、コピー元インスタンスの要素へのアクセスに関してアクセス数を算出する。また、周辺探索部23は、最適化対象クラスのコピーコンストラクタ又は代入演算の呼び出しの後の文については、コピー元インスタンスの要素及びコピー先インスタンスの要素へのアクセスに関してアクセス数を算出する。
なお、最適化対象クラスのコピーコンストラクタ又は代入演算の呼び出しを含む文の前後の文は、制御フローグラフとデータフローグラフの解析により特定することが可能である。分岐が含まれる場合には、周辺探索部23は、分岐確率に基づいてアクセス数を算出してもよい。
図5A〜図5Gは、周辺探索を説明するための図である。図5Aは、周辺探索が行われるfor文の例と対応するAST3を示す。図5Aに示すfor文では、{で始まる本体に含まれる4番目の文C b(a)がコピーコンストラクタの呼び出しであり、nはAST3においてC b(a)に対応するノードである。
図5Bは、型がCであり、名前がbである変数定義文がnとして特定されたことを示す。nが文でない場合には、周辺探索部23は、AST3を文までさかのぼるが、この例では、nは文なので、さかのぼる必要はない。図5Cに示すように、周辺探索部23は、アクセスリストを空にする。ここで、アクセスリストは、最適化の対象となるクラスの変数のメンバ変数へのアクセス個所を示すリストであり、図3に示した変更箇所リスト6に対応する。
ここでは、nの周辺をnの前後の2文ずつとすると、周辺探索部23は、図5Dに示すように、nの前の2文として、a.ma=5とa.mb=5+a.maを特定する。そして、周辺探索部23は、図5Eに示すように、AST3上で番号2が付けられた式文の子ノードをたどり、コピー元の変数のメンバ変数へのアクセスを見つける。図5Eでは、番号2が付けられた式文の子ノードとして、代入演算、ドット演算、名前がaの変数参照、名前がmaのメンバ変数参照のノードが順にたどられてコピー元の変数のメンバ変数a.maが見つけられる。
そして、周辺探索部23は、図5Fに示すように、アクセスリストにコピー元のmaへのアクセスを追加する。なお、周辺探索部23は、見つけたメンバ変数がアクセスリストに登録されている場合には、アクセスリストへの追加は行わない。
そして、周辺探索部23は、図5Gに示すように、AST3上で番号3が付けられた式文に対しても同様の処理を行って、コピー元の変数のメンバ変数a.mbを見つけ、アクセスリストに追加する。そして、周辺探索部23は、図5Gでは後続の文として示される式文(番号5及び番号6が付けられた文)に対しても同様の処理を行う。
生成部24は、周辺探索部23が算出したアクセス数とデフォルトのコピー処理の場合のメモリアクセス数を比較し、周辺探索部23が算出したアクセス数が小さい場合に最適化を実施し、修正AST4を生成する。
なお、実行コード7を実行するCPU(Central Processing Unit)がSIMD(Single Instruction Multiple Data)命令を有する場合には、生成部24は、デフォルトのコピー処理の場合のメモリアクセス数を、SIMD命令の利用に基づく数としてもよい。また、ソフトウェアパイプラインが組める場合には、生成部24は、デフォルトのコピー処理の場合のメモリアクセス数を、長いレジスタ+シフト命令の利用に基づく数としてもよい。
最適化として、具体的には、生成部24は、メンバ変数単位でコピーするメソッドを追加し、定義部分に関し、最適化対象のクラスに最適化コピーコンストラクタの定義及び最適化コピーメソッドの定義を追加する。そして、生成部24は、利用部分に関し、最適化対象のコピーコンストラクタを最適化コピーコンストラクタで置き換え、最適化対象の代入演算を最適化コピーメソッドで置き換える。
図6Aは、最適化コピーコンストラクタ及び最適化コピーメソッドの定義例を示す図である。図6Aに示すように、コピーコンストラクトの場合には、AST3において、型がCであり、最適化コピーコンストラクタが用いられるメソッド定義文を親とする部分木がクラス定義中に追加される。また、代入演算子の場合には、AST3において、最適化コピーメソッド定義文を親とする部分木がクラス定義中に追加される。
図6Bは、最適化コピーコンストラクタ及び最適化コピーメソッドへの置き換え例を示す図である。図6Bに示すように、コピーコンストラクタについては、AST3において、変数定義文のコピーコンストラクタが、最適化コピーコンストラクタに置き換えられる。また、代入演算子については、AST3において、代入演算が最適化コピーメソッドに置き換えられる。
次に、最適化処理のフローについて説明する。図7は、最適化処理のフローを示すフローチャートである。図7に示すように、最適化処理部20は、最適化対象のクラスを取得する対象クラス取得処理を実行する(ステップS1)。対象クラス取得処理の実行によって、Lcに暗黙のコピーコンスラクタに関して最適化対象クラスのリストが代入され、Laに暗黙の代入演算子に関して最適化対象クラスのリストが代入される。なお、「←」は、代入を表す。また、Lc及びLaは、図3に示した対象クラス5に対応する。
そして、最適化処理部20は、AST3のルートから順番にノードを取り出してnに代入し、ステップS2とステップS13で挟まれる処理すなわちステップS3〜ステップS12の処理を繰り返す。
ステップS3〜ステップS12の処理では、最適化処理部20は、nはコピーコンストラクタ呼び出しであるか否かを判定し(ステップS3)、コピーコンストラクタ呼び出しである場合には、Lcにnのクラスが登録されているか否かを判定する(ステップS4)。その結果、Lcにnのクラスが登録されていない場合には、最適化処理部20は、次のノードをnに代入してステップS3へ戻る。
一方、Lcにnのクラスが登録されている場合には、最適化処理部20は、n及びnの周辺を探索して対象要素へのアクセス回数を算出する周辺探索処理を実行する(ステップS5)。ここで、対象要素とは、nに代入されているコピーコンストラクタ又は代入演算子の呼び出しにより実行されるコピー処理のコピー元及びコピー先のメンバ変数である。周辺探索処理の実行によって、Naにn及びnの周辺での対象要素へのアクセス回数が代入される。
そして、最適化処理部20は、暗黙のコピーコンストラクタに関してデフォルトのコピー処理を行った場合のn及びnの周辺のコピー元及びコピー先に関するメモリアクセス回数よりNaが小さいか否かを判定する(ステップS6)。その結果、小さくない場合には、最適化処理部20は、次のノードをnに代入してステップS3へ戻る。一方、小さい場合には、最適化処理部20は、コピーコンストラクタに関する最適化を行うコピーコンストラクタ最適化処理を実行し(ステップS7)、次のノードをnに代入してステップS3へ戻る。
また、nがコピーコンストラクタ呼び出しでない場合には、最適化処理部20は、nは代入演算呼び出しであるか否かを判定し(ステップS8)、代入演算呼び出しでない場合には、次のノードをnに代入してステップS3へ戻る。一方、nが代入演算呼び出しである場合には、最適化処理部20は、Laにnのクラスが登録されているか否かを判定する(ステップS9)。その結果、Laにnのクラスが登録されていない場合には、最適化処理部20は、次のノードをnに代入してステップS3へ戻る。
一方、Laにnのクラスが登録されている場合には、最適化処理部20は、周辺探索処理を実行する(ステップS10)。そして、最適化処理部20は、暗黙の代入演算子に関してデフォルトのコピー処理を行った場合のn及びnの周辺のコピー元及びコピー先に関するメモリアクセス回数よりNaが小さいか否かを判定し(ステップS11)、小さくない場合には、次のノードをnに代入してステップS3へ戻る。一方、Naが小さい場合には、最適化処理部20は、代入演算子に関する最適化を行う代入演算子最適化処理を実行し(ステップS12)、次のノードをnに代入してステップS3へ戻る。
このように、最適化処理部20は、最適化対象のコピーコンストラクタ又は代入演算の呼び出し及び該呼び出しの周辺の対象要素へのアクセス数を算出する。そして、最適化処理部20は、算出したアクセス数がコピーコンストラクタ又は代入演算子に関してデフォルトのコピー処理を行った場合のn及びnの周辺のコピー元及びコピー先に関するメモリアクセス回数より小さいか否かを判定する。そして、最適化処理部20は、算出したアクセス数が小さい場合に、コピーコンストラクタ又は代入演算子の最適化を行う。したがって、コンパイル部1aは、実行時にメモリアクセス数を減らす実行コード7を生成することができる。
次に、対象クラス取得処理のフローについて説明する。図8は、対象クラス取得処理のフローを示すフローチャートである。図8に示すように、取得部21は、リストLcとリストLaを空に初期化する(ステップS21)。
そして、取得部21は、AST3のルートから順番にノードを取り出してnに代入し、ステップS22とステップS36で挟まれる処理すなわちステップS23〜ステップS35の処理を繰り返す。ステップS23〜ステップS35の処理では、取得部21は、nはクラス宣言か否かを判定し(ステップS23)、クラス宣言でない場合には、nはクラス定義か否かを判定する(ステップS24)。その結果、クラス定義でない場合には、取得部21は、次のノードをnに代入してステップS23へ戻る。
一方、nがクラス定義である場合には、取得部21は、nをmに代入し(ステップS25)、ステップS28へ進む。また、nがクラス宣言である場合には、取得部21は、nのクラス定義があるか否かを判定し(ステップS26)、nのクラス定義がない場合には、次のノードをnに代入してステップS23へ戻る。一方、nのクラス定義がある場合には、取得部21は、nのクラス定義をmに代入し(ステップS27)、ステップS28へ進む。
そして、取得部21は、mは他のクラスを継承しているか否かを判定し(ステップS28)、他のクラスを継承している場合には、次のノードをnに代入してステップS23へ戻る。一方、mが他のクラスを継承していない場合には、取得部21は、mのメンバ変数は全て基本型であるか否かを判定し(ステップS29)、mのメンバ変数に基本型でないものがある場合には、次のノードをnに代入してステップS23へ戻る。
一方、mのメンバ変数が全て基本型である場合には、取得部21は、Nvにmの基本型のメンバ変数の数を代入し(ステップS30)、Nvは予め与えられた上限以下か否かを判定する(ステップS31)。その結果、Nvがあらかじめ与えられた上限を超える場合には、取得部21は、次のノードをnに代入してステップS23へ戻る。
一方、Nvが予め与えられた上限以下である場合には、取得部21は、ユーザー定義のコピーコンストラクタがあるか否かを判定し(ステップS32)、ない場合には、Lcにmを追加する(ステップS33)。そして、取得部21は、ユーザー定義の代入演算子があるか否かを判定し(ステップS34)、ない場合には、Laにmを追加する(ステップS35)。
このように、取得部21がAST3のノードを順番にたどって最適化対象のクラスのリストを作成することによって、最適化処理部20はリストに含まれるクラスを対象として最適化を行うことができる。
次に、周辺探索処理のフローについて説明する。図9は、周辺探索処理のフローを示すフローチャートである。図9に示すように、周辺探索部23は、nは文のノードか否かを判定する(ステップS41)。そして、周辺探索部23は、nが文のノードである場合には、sにnを代入し(ステップS42)、nが文のノードでない場合には、nからAST3をさかのぼって、最初に出てきた文をsに代入する(ステップS43)。
そして、周辺探索部23は、アクセスリストを空に初期化し(ステップS44)、sの親が持つ子リストのうち、sとsの前後r個のノードのリストをLに代入する(ステップS45)。そして、周辺探索部23は、Lの要素の文を順番にpに代入してステップS46とステップS54で挟まれる処理すなわちステップS47〜ステップS53の処理を繰り返す。
ステップS47〜ステップS53の処理では、周辺探索部23は、p以下のノードを順番にqに代入して、ステップS47とステップS53で挟まれる処理すなわちステップS48〜ステップS52の処理を繰り返す。ステップS48〜ステップS52の処理では、周辺探索部23は、qはnのコピー元のメンバ変数へのアクセスか否かを判定し(ステップS48)、nのコピー元のメンバ変数へのアクセスである場合には、ステップS51へ進む。
一方、nのコピー元のメンバ変数へのアクセスでない場合には、周辺探索部23は、pはsよりも前にある文であるか否かを判定し(ステップS49)、pがsよりも前にある文である場合には、次のノードをqに代入してステップS48へ戻る。一方、pがsよりも前にある文でない場合には、周辺探索部23は、qはnのコピー先のメンバ変数へのアクセスか否かを判定し(ステップS50)、qがnのコピー先のメンバ変数へのアクセスでない場合には、次のノードをqに代入してステップS48へ戻る。一方、qがnのコピー先のメンバ変数へのアクセスである場合には、周辺探索部23は、ステップS51へ進む。
そして、周辺探索部23は、アクセスされるメンバ変数が、アクセスリストに登録されたメンバ変数か否かを判定し(ステップS51)、アクセスリストに登録されたメンバ変数である場合には、次のノードをqに代入してステップS48へ戻る。一方、アクセスリストに登録されたメンバ変数でない場合には、周辺探索部23は、アクセスリストにメンバ変数を追加し(ステップS52)、次のノードをqに代入してステップS48へ戻る。
次のノードをqに代入する際に、p以下の全ノードについてステップS48〜ステップS52の処理を終了した場合には、周辺探索部23は、Lの次の要素をpに代入して、ステップS47〜ステップS53の処理を実行する。
そして、ステップS47〜ステップS53の処理を全てのLの要素に対して実行すると、周辺探索部23は、アクセスリストの要素数をアクセス数Naとして返却する(ステップS55)。
このように、周辺探索部23がn及びnの周辺でコピー元及びコピー先のメンバ変数へのアクセス数を算出することで、最適化処理部20は、最適化によりメモリアクセス数が増加することを防ぐことができる。
次に、代入演算子最適化処理のフローについて説明する。図10は、代入演算子最適化処理のフローを示すフローチャートである。図10に示すように、生成部24は、nのクラスで、最適化コピーメソッドを定義したか否かを判定する(ステップS61)。
その結果、生成部24は、定義していない場合には、メンバ変数単位でコピーするメソッドMを追加するメソッドM追加処理を実行し(ステップS62)、nのクラスCLASSに以下の最適化コピーメソッドAの定義を追加する(ステップS63)。
public:
CLASS& A(const CLASS& src){
M(src);
return * this;
そして、生成部24は、nの代入演算子を最適化コピーメソッドAで置き換える(ステップS64)。
このように、生成部24が、nのクラスにメソッドM及び最適化コピーメソッドAの定義を追加し、nの代入演算子を最適化コピーメソッドAで置き換えることで、最適化処理部20は、代入演算子の最適化を行うことができる。
次に、コピーコンストラクタ最適化処理のフローについて説明する。図11は、コピーコンストラクタ最適化処理のフローを示すフローチャートである。図11に示すように、生成部24は、nのクラスで、最適化コピーコンストラクタを定義したか否かを判定する(ステップS71)。
その結果、生成部24は、定義していない場合には、メソッドM追加処理を実行し(ステップS72)、nのクラスCLASSに以下の最適化コピーコンストラクタCの定義を追加する(ステップS73)。
public:
C(const CLASS& src,
const CLASS* dummy){
M(src);
そして、生成部24は、nのコピーコンストラクタを最適化コピーコンストラクタCで置き換える(ステップS74)。
このように、生成部24が、nのクラスにメソッドM及び最適化コピーコンストラクタCの定義を追加し、nのコピーコンストラクタを最適化コピーコンストラクタCで置き換えることで、最適化処理部20は、コピーコンストラクタの最適化を行うことができる。
次に、メソッドM追加処理のフローについて説明する。図12は、メソッドM追加処理のフローを示すフローチャートである。図12に示すように、生成部24は、nのクラスに、すでにメンバ変数単位でコピーするメソッドMの定義を追加したか否かを判定し(ステップS81)、追加した場合には、処理を終了する。
一方、メソッドMを追加していない場合には、生成部24は、nのクラスCLASSに以下のメッドMの定義を追加する(ステップS82)。
private:
void M(const CLASS& src){

/* COPY STATEMENT PLACE */

そして、生成部24は、nのクラスのメンバ変数を順にvに代入し、ステップS83とステップS85で挟まれた処理すなわちステップS84の処理を繰り返す。ステップS84では、生成部24は、以下の文をメソッドMの定義の/* COPY STATEMENT PLACE */の直前に追加する(ステップS84)。
v=src.v;
このように、生成部24は、メンバ変数単位でコピーするメソッドMの定義を追加することで、最適化コピーコンストラクタ及び最適化コピーメソッドでメソッドMを使用することができる。
上述してきたように、実施例では、取得部21が、AST3を解析し、暗黙のコピーコンストラクタ及び暗黙の代入演算子を用いるクラスを最適化対象のクラスとして取得する。そして、特定部22が、AST3を解析し、最適化対象クラスのコピーコンストラクタ及び代入演算の呼び出しを特定する。
そして、周辺探索部23が、最適化対象クラスのコピーコンストラクタ及び代入演算の呼び出し並びに該呼び出しの周辺を探索し、該呼び出しにより実行されるコピー処理のコピー元及びコピー先のメンバ変数へのアクセス回数を算出する。
そして、生成部24が、コピーコンストラクタ及び代入演算の呼び出しに関してデフォルトのコピー処理を行った場合の該呼び出し及び該呼び出しの周辺のコピー元及びコピー先に関するメモリアクセス回数と周辺探索部23により算出されたアクセス回数とを比較する。そして、生成部24は、周辺探索部23により算出されたアクセス回数が小さい場合に、コピーコンストラクタ又は代入演算子についてメンバ変数単位でコピー処理を行う定義をAST3に追加する。そして、生成部24は、コピーコンストラクタ又は代入演算の呼び出しについて追加した定義を用いるようにAST3を修正する。
したがって、コンパイル部1aは、コピーコンストラクタ又は代入演算の呼び出しに関してデフォルトのコピー処理を行う場合と比較してメモリアクセス回数を減らす実行コード7を生成することができる。
また、実施例では、周辺探索部23は、周辺を探索する際に、コピーコンストラクタ又は代入演算の呼び出しの前では、コピー元のメンバ変数を対象とし、コピーコンストラクタ又は代入演算の呼び出しの後では、コピー元及びコピー先のメンバ変数を対象としてアクセス回数を算出する。したがって、周辺探索部23は、コピーコンストラクタ又は代入演算の呼び出しに関するアクセス回数を正確に算出することができる。
また、実施例では、取得部21は、他のクラスの継承がなく、メンバ変数の型が全て基本型であり、かつ、メンバ変数の数が所定の上限値以下のクラスを最適化対象のクラスとするので、複雑な処理を行うことなく、最適化対象のクラスを取得することができる。
なお、実施例では、コンパイル部1aについて説明したが、コンパイル部1aが有する構成をソフトウェアによって実現することで、同様の機能を有するコンパイラプログラムを得ることができる。そこで、コンパイラプログラムを実行するコンピュータについて説明する。なお、コンパイラプログラムを実行するコンピュータは、情報処理装置1であっても、情報処理装置1とは異なるコンピュータであってもよい。
図13は、実施例に係るコンパイラプログラムを実行するコンピュータのハードウェア構成を示す図である。図13に示すように、コンピュータ60は、メモリ61と、CPU62と、LAN(Local Area Network)インタフェース63と、HDD(Hard Disk Drive)64とを有する。また、コンピュータ60は、スーパーIO(Input Output)65と、DVI(Digital Visual Interface)66と、ODD(Optical Disk Drive)67とを有する。
メモリ61は、プログラムやプログラムの実行途中結果などを記憶するメモリである。CPU62は、メモリ61からプログラムを読出して実行する中央処理装置である。CPU62は、メモリコントローラを有するチップセットを含む。
LANインタフェース63は、コンピュータ60をLAN経由で他のコンピュータに接続するためのインタフェースである。HDD64は、プログラムやデータを格納するディスク装置であり、スーパーIO65は、マウスやキーボードなどの入力装置を接続するためのインタフェースである。DVI66は、液晶表示装置を接続するインタフェースであり、ODD67は、DVDの読み書きを行う装置である。
LANインタフェース63は、PCIエクスプレス(PCIe)によりCPU62に接続され、HDD64及びODD67は、SATA(Serial Advanced Technology Attachment)によりCPU62に接続される。スーパーIO65は、LPC(Low Pin Count)によりCPU62に接続される。
そして、コンピュータ60において実行されるデータ処理プログラムは、DVDに記憶され、ODD67によってDVDから読出されてコンピュータ60にインストールされる。あるいは、データ処理プログラムは、LANインタフェース63を介して接続された他のコンピュータシステムのデータベースなどに記憶され、これらのデータベースから読出されてコンピュータ60にインストールされる。そして、インストールされたデータ処理プログラムは、HDD64に記憶され、メモリ61に読出されてCPU62によって実行される。
1 情報処理装置
1a コンパイル部
2 ソースファイル
3 AST
4 修正AST
5 対象クラス
6 変更箇所リスト
7 実行コード
10 フロントエンド部
20 最適化処理部
21 取得部
22 特定部
23 周辺探索部
24 生成部
30 バックエンド部
60 コンピュータ
61 メモリ
62 CPU
63 LANインタフェース
64 HDD
65 スーパーIO
66 DVI
67 ODD

Claims (5)

  1. ソースコード上の暗黙のコピーコンストラクタ及び暗黙の代入演算子の少なくともいずれかを用いるクラスを抽出する抽出部と、
    前記抽出部により抽出されたクラスに含まれるクラスのコピーコンストラクタ及び代入演算の少なくともいずれかの呼び出しを特定する特定部と、
    前記特定部により特定された呼び出し及び該呼び出しの周辺における、該呼び出しにより実行されるコピー処理のコピー元及びコピー先のメンバ変数へのアクセス回数を算出する算出部と、
    前記呼び出しにより実行されるデフォルトのコピー処理を行った場合の該呼び出し及び該呼び出しの周辺のコピー元及びコピー先に関するメモリアクセス数と前記算出部により算出されたアクセス回数を比較し、前記算出部により算出されたアクセス回数が小さいと判定した場合に、前記コピーコンストラクタ及び前記代入演算子の少なくともいずれかについてメンバ変数単位でコピー処理を行う定義を追加する中間コードを生成すると共に、前記呼び出しについて追加した定義を用いる中間コードを生成する生成部と
    を有することを特徴とする情報処理装置。
  2. 前記算出部は、前記特定部により特定された呼び出しより前においては、前記コピー処理のコピー元のメンバ変数を対象とし、前記特定部により特定された呼び出しより後においては、前記コピー処理のコピー元及びコピー先のメンバ変数を対象としてアクセス回数を算出することを特徴とする請求項1に記載の情報処理装置。
  3. 前記抽出部は、他のクラスを継承していないクラスであり、メンバ変数の型が全て基本型であり、かつ、メンバ変数の数が所定の上限値以下であるクラスを抽出することを特徴とする請求項1又は2に記載の情報処理装置。
  4. コンピュータが、
    ソースコード上の暗黙のコピーコンストラクタ及び暗黙の代入演算子の少なくともいずれかを用いるクラスを抽出し、
    抽出したクラスに含まれるクラスのコピーコンストラクタ及び代入演算の少なくともいずれかの呼び出しを特定し、
    特定した呼び出し及び該呼び出しの周辺における、該呼び出しにより実行されるコピー処理のコピー元及びコピー先のメンバ変数へのアクセス回数を算出し、
    前記呼び出しにより実行されるデフォルトのコピー処理を行った場合の該呼び出し及び該呼び出しの周辺のコピー元及びコピー先に関するメモリアクセス数と前記アクセス回数を比較し、前記アクセス回数が小さいと判定した場合に、前記コピーコンストラクタ及び前記代入演算子の少なくともいずれかについてメンバ変数単位でコピー処理を行う定義を追加する中間コードを生成すると共に、前記呼び出しについて追加した定義を用いる中間コードを生成する
    処理を実行することを特徴とするコンパイル方法。
  5. コンピュータに、
    ソースコード上の暗黙のコピーコンストラクタ及び暗黙の代入演算子の少なくともいずれかを用いるクラスを抽出し、
    抽出したクラスに含まれるクラスのコピーコンストラクタ及び代入演算の少なくともいずれかの呼び出しを特定し、
    特定した呼び出し及び該呼び出しの周辺における、該呼び出しにより実行されるコピー処理のコピー元及びコピー先のメンバ変数へのアクセス回数を算出し、
    前記呼び出しにより実行されるデフォルトのコピー処理を行った場合の該呼び出し及び該呼び出しの周辺のコピー元及びコピー先に関するメモリアクセス数と前記アクセス回数を比較し、前記アクセス回数が小さいと判定した場合に、前記コピーコンストラクタ及び前記代入演算子の少なくともいずれかについてメンバ変数単位でコピー処理を行う定義を追加する中間コードを生成すると共に、前記呼び出しについて追加した定義を用いる中間コードを生成する
    処理を実行させることを特徴とするコンパイラプログラム。
JP2016094763A 2016-05-10 2016-05-10 情報処理装置、コンパイル方法及びコンパイラプログラム Active JP6651974B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2016094763A JP6651974B2 (ja) 2016-05-10 2016-05-10 情報処理装置、コンパイル方法及びコンパイラプログラム
US15/484,547 US10169008B2 (en) 2016-05-10 2017-04-11 Information processing device and compilation method

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2016094763A JP6651974B2 (ja) 2016-05-10 2016-05-10 情報処理装置、コンパイル方法及びコンパイラプログラム

Publications (2)

Publication Number Publication Date
JP2017204080A true JP2017204080A (ja) 2017-11-16
JP6651974B2 JP6651974B2 (ja) 2020-02-19

Family

ID=60297012

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2016094763A Active JP6651974B2 (ja) 2016-05-10 2016-05-10 情報処理装置、コンパイル方法及びコンパイラプログラム

Country Status (2)

Country Link
US (1) US10169008B2 (ja)
JP (1) JP6651974B2 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109947430A (zh) * 2019-03-26 2019-06-28 山东浪潮通软信息科技有限公司 一种基于动态编译的代码编译生成工具和一种动态编译方法

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111240772A (zh) * 2020-01-22 2020-06-05 腾讯科技(深圳)有限公司 一种基于区块链的数据处理方法、装置及存储介质
US11481201B2 (en) * 2020-03-05 2022-10-25 Intuit Inc. Integrated development environment for developing and compiling query language schemas for application program interfaces

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH06214800A (ja) 1993-01-21 1994-08-05 Hitachi Ltd 目的プログラムの最適化処理システム
US6158024A (en) * 1998-03-31 2000-12-05 International Business Machines Corporation Method and apparatus for structured memory analysis of data processing systems and applications
JP3918274B2 (ja) 1998-01-27 2007-05-23 富士通株式会社 コンパイル装置、コンパイル方法およびコンパイラプログラムを記録した記録媒体
US20020151334A1 (en) * 2001-04-11 2002-10-17 Motorola, Inc Communications device with call frequency analyzer
GB0314874D0 (en) * 2003-06-26 2003-07-30 Ibm Generating a model of software in execution
JP4652680B2 (ja) 2003-12-22 2011-03-16 パナソニック株式会社 コンパイル方法および装置、ならびにコンパイラ
US8789028B2 (en) * 2006-06-30 2014-07-22 International Business Machines Corporation Memory access monitoring

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109947430A (zh) * 2019-03-26 2019-06-28 山东浪潮通软信息科技有限公司 一种基于动态编译的代码编译生成工具和一种动态编译方法

Also Published As

Publication number Publication date
US10169008B2 (en) 2019-01-01
JP6651974B2 (ja) 2020-02-19
US20170329584A1 (en) 2017-11-16

Similar Documents

Publication Publication Date Title
US6662354B1 (en) Determining destinations of a dynamic branch
Mulligan et al. Lem: reusable engineering of real-world semantics
KR100334995B1 (ko) 방향성 비사이클 그래프 내의 트리 패턴을 정합함으로써최적화 코드를 리타겟팅하는 프로그래밍 방법 및 장치
KR101099212B1 (ko) 예외 처리 구조물들을 포함하는 소프트웨어의 소스 언어 독립형 중간 표현을 처리하는 방법, 다수의 소스 코드 언어들에 대한 소스 언어 독립형 예외 처리 중간 표현들을 구현하기 위한 시스템 및 컴퓨터 판독가능 저장 매체
CN108139891B (zh) 用于生成建议以纠正未定义标记错误的方法和系统
US8181171B2 (en) Method and apparatus for analyzing large scale program and generation of code from degenerated program dependence graph
EP2829970A1 (en) A method and apparatus for porting source code
JP6911059B2 (ja) Cpu利用およびコードリファクタリングのためのクエリオプティマイザー
US11579856B2 (en) Multi-chip compatible compiling method and device
JP2001166949A (ja) シンボリック実行を用いてソースコードをコンパイルするための方法及び装置
US20100185669A1 (en) Efficient incremental parsing of context sensitive programming languages
US20140298290A1 (en) Identification of code changes using language syntax and changeset data
JP6651974B2 (ja) 情報処理装置、コンパイル方法及びコンパイラプログラム
CN115017516A (zh) 一种基于符号执行的模糊测试方法
KR20080038306A (ko) 널가능과 후 바인딩
Naik et al. Sporq: An interactive environment for exploring code using query-by-example
JP2001166946A (ja) 階層の平坦化によりソースコードをコンパイルする方法及び装置
US8914782B2 (en) Optimization of declarative queries
Nacke et al. Learn LLVM 17: A beginner's guide to learning LLVM compiler tools and core libraries with C++
US20230113783A1 (en) Cross-platform code conversion method and device
KR102614967B1 (ko) 자바스크립트의 중간 언어 기반 의미론 추출 자동화 시스템 및 방법
JP5600301B2 (ja) システム表現およびハンドリング技術
JP5932707B2 (ja) 計算機、プログラム及びデータ生成方法
CN111796832A (zh) 热补丁文件生成方法、装置、设备及存储介质
Färber et al. Metis-based Paramodulation Tactic for HOL Light.

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20190212

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20191216

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20191224

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20200106

R150 Certificate of patent or registration of utility model

Ref document number: 6651974

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150