JP2014063285A - ガベージ・コレクションのためのコード変換方法、プログラム及びシステム - Google Patents
ガベージ・コレクションのためのコード変換方法、プログラム及びシステム Download PDFInfo
- Publication number
- JP2014063285A JP2014063285A JP2012207105A JP2012207105A JP2014063285A JP 2014063285 A JP2014063285 A JP 2014063285A JP 2012207105 A JP2012207105 A JP 2012207105A JP 2012207105 A JP2012207105 A JP 2012207105A JP 2014063285 A JP2014063285 A JP 2014063285A
- Authority
- JP
- Japan
- Prior art keywords
- basic block
- code
- basic
- alive
- variable
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 37
- 238000006243 chemical reaction Methods 0.000 title claims 3
- 238000012545 processing Methods 0.000 claims description 17
- 230000004044 response Effects 0.000 claims description 4
- 238000003780 insertion Methods 0.000 description 9
- 230000037431 insertion Effects 0.000 description 9
- 230000004083 survival effect Effects 0.000 description 8
- 238000005457 optimization Methods 0.000 description 5
- KDYFGRWQOYBRFD-UHFFFAOYSA-N succinic acid Chemical compound OC(=O)CCC(O)=O KDYFGRWQOYBRFD-UHFFFAOYSA-N 0.000 description 4
- 238000004891 communication Methods 0.000 description 3
- 238000010586 diagram Methods 0.000 description 3
- 230000006870 function Effects 0.000 description 3
- 238000007796 conventional method Methods 0.000 description 1
- 230000003247 decreasing effect Effects 0.000 description 1
- 238000004904 shortening Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45516—Runtime code conversion or optimisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Prevention of errors by analysis, debugging or testing of software
- G06F11/362—Debugging of software
- G06F11/3636—Debugging of software by tracing the execution of the program
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3836—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/445—Exploiting fine grain parallelism, i.e. parallelism at instruction level
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Devices For Executing Special Programs (AREA)
- Memory System (AREA)
Abstract
【課題】 ガベージ・コレクション技法において、リファレンス・カウントのためのコードを挿入するための改善された技法を提供する。
【解決手段】 基本ブロックが2つ以上の後続基本ブロックをもつ場合に、上記後続基本ブロックのうち、1つ以上の基本ブロックの先頭において、ある変数が生きて(live)おり、他の基本ブロックSでその変数が生きていない場合、元の基本ブロックと、変数が生きていない後続基本ブロックの間に新しい基本ブロックを挿入し、その新しい基本ブロック内に、その変数に関するRC-を生成する。
【選択図】 図7
【解決手段】 基本ブロックが2つ以上の後続基本ブロックをもつ場合に、上記後続基本ブロックのうち、1つ以上の基本ブロックの先頭において、ある変数が生きて(live)おり、他の基本ブロックSでその変数が生きていない場合、元の基本ブロックと、変数が生きていない後続基本ブロックの間に新しい基本ブロックを挿入し、その新しい基本ブロック内に、その変数に関するRC-を生成する。
【選択図】 図7
Description
この発明は、コンピュータにおけるガベージ・コレクション技法に関し、より詳しくは、リファレンス・カウント(reference counting)方式のガベージ・コレクション技法に関する。
リファレンス・カウント方式のガベージ・コレクション(GC)は、停止時間の短さ、ガベージ・コレクションをもたない言語(例えば、C言語)との親和性の高さから、いくつかの言語の実装で実際に採用されている。
リファレンス・カウント方式のガベージ・コレクションを実現するためには、オブジェクト毎にもつ使用回数を示す整数のカウンタ(incする(RC+)、decする(RC-))のコードを適切に挿入する必要がある。RC-では、カウンタが0になったら、オブジェクトを回収する。
リファレンス・カウント方式のガベージ・コレクションの典型的な従来技術として下記のような公開公報に記載された技法が知られている。
特開2003−50740号公報は、アプリケーションプログラムの動作によりメモリセルの被参照数が瞬間的に大きなピーク値をとる場合にメモリ使用量を抑えて有効なガベージコレクションを行う装置において、各メモリセル内にメモリセルの被参照数のピーク値が表せない程度に小さいビット列であるカウンタを設けておき、ガベージコレクション装置が、アプリケーションプログラムによるメモリセルへのポインタの変更時にカウンタ変更部によりそのビット列で表せる最大値以下の範囲内でカウンタを増減しカウンタが0になればセル解放部によりメモリセルを解放し、また、メモリ不足時等に再カウント部により、ルートポインタからポインタチェーンを辿ることで各メモリセルが参照されている数を調査し、その結果が0のメモリセルは解放し、0以外のメモリセルのカウンタにはカウンタ再設定部により調査結果の数を設定することを開示する。
上記従来技術では、コードの所定位置に最初から明示的にRC+/RC-が挿入されるが、より最近になって、http://www.hpl.hp.com/personal/Pramod_Joisha/Publications/vee08.pdf、あるいは米国特許第7693919号公報に記述されているように、中間言語レベルで、最初はRC+/RC-を挿入せずに最適化を行い、最後にRC+/RC-を挿入する技法が提案されている。このようにする方がコンパイラの最適化の適用が容易である。
しかし、http://www.hpl.hp.com/personal/Pramod_Joisha/Publications/vee08.pdfや米国特許第7693919号公報に記述されている技法に従いRC+/RC-を挿入した場合、1) オブジェクトのlast useの後にオブジェクトのアドレスをNULLにする操作が必要であり、2) 基本ブロック(BB)内で生存期間(life time)が閉じる変数についても後続BBでRC-が必要であり、3) RC-でオブジェクトがNULLかどうかの検査が必要という、実行パスを長くする操作が要求される、という問題があった。
http://www.hpl.hp.com/personal/Pramod_Joisha/Publications/vee08.pdf
この発明の目的は、リファレンス・カウント方式のガベージ・コレクション技法において、従来技術よりも改善された態様でリファレンス・カウントのためのコードを挿入できるようにすることにある。
この発明は、上記の課題を解決するためになされたものであり、基本ブロック(basic block、以下BBとも記す)が2つ以上の後続基本ブロック(successor BB)をもつ場合に、
(a) 上記後続基本ブロックのうち、1つ以上の基本ブロックSの先頭において、ある変数が生きて(live)おり、他の基本ブロックSでその変数が生きていない場合、元の基本ブロックと、変数が生きていない後続基本ブロックの間に新しい基本ブロックを挿入し、その新しい基本ブロック内に、その変数に関するRC-を生成する。
(a) 上記後続基本ブロックのうち、1つ以上の基本ブロックSの先頭において、ある変数が生きて(live)おり、他の基本ブロックSでその変数が生きていない場合、元の基本ブロックと、変数が生きていない後続基本ブロックの間に新しい基本ブロックを挿入し、その新しい基本ブロック内に、その変数に関するRC-を生成する。
式で書くと次のとおりである。
この式が空でない変数について、基本ブロックBと基本ブロックSの間に、新しい基本ブロックを生成し、RC-を生成する。なおこの式で、Succ(B)は、基本ブロックBの後続基本ブロックの集合であり、livein(s)は、基本ブロックsの入口生存である変数の集合である。さらに、SはSucc(B)に含まれる。
(b) この発明の別の側面として、上記後続基本ブロックのうち、1つ以上の基本ブロックの先頭において、ある変数が生きており、他の1つ以上の基本ブロックでその変数が生きていない場合、
変数が生きていない後続基本ブロックSの先行基本ブロックの数が1である場合、後続基本ブロックの先頭にRC-を生成する。
変数が生きていない後続基本ブロックSの先行基本ブロックの数が2以上である場合、全ての先行基本ブロックの最後において変数が生きていれば、後続基本ブロックの先頭にRC-を生成する。そうでない場合は、上記(a)の手法を適用する。
変数が生きていない後続基本ブロックSの先行基本ブロックの数が1である場合、後続基本ブロックの先頭にRC-を生成する。
変数が生きていない後続基本ブロックSの先行基本ブロックの数が2以上である場合、全ての先行基本ブロックの最後において変数が生きていれば、後続基本ブロックの先頭にRC-を生成する。そうでない場合は、上記(a)の手法を適用する。
この発明のリファレンス・カウント方式のガベージ・コレクションは、従来技術に比較して、以下の操作が不要となることによって、よりコード生成量が少なく、実行パスを短くすることができる。
- オブジェクトのlast useの後にオブジェクトのアドレスをNULLにすること。
- 基本ブロック内で生存期間(life time)が閉じる変数について後続基本ブロックでRC-すること。
- RC-で、オブジェクトがNULLかどうかの検査。
- オブジェクトのlast useの後にオブジェクトのアドレスをNULLにすること。
- 基本ブロック内で生存期間(life time)が閉じる変数について後続基本ブロックでRC-すること。
- RC-で、オブジェクトがNULLかどうかの検査。
以下、図面に従って、本発明の実施例を説明する。これらの実施例は、本発明の好適な態様を説明するためのものであり、発明の範囲をここで示すものに限定する意図はないことを理解されたい。また、以下の図を通して、特に断わらない限り、同一符号は、同一の対象を指すものとする。
図1を参照すると、本発明の一実施例に係るシステム構成及び処理を実現するためのコンピュータ・ハードウェアのブロック図が示されている。図1において、システム・バス102には、CPU104と、主記憶(RAM)106と、ハードディスク・ドライブ(HDD)108と、キーボード110と、マウス112と、ディスプレイ114が接続されている。CPU104は、好適には、32ビットまたは64ビットのアーキテクチャに基づくものであり、例えば、インテル社のPentium(商標)4、インテル社のCore(商標) 2 DUO、AMD社のAthlon(商標)などを使用することができる。主記憶106は、好適には、2GB以上の容量、より好ましくは、4GB以上の容量をもつものである。
ハードディスク・ドライブ108には、オペレーティング・システム(OS)202(図2)が、格納されている。オペレーティング・システム202は、Linux(商標)、マイクロソフト社のWindows(商標) 7、Windows XP(商標)、Windows(商標)2003サーバ、アップルコンピュータのMac OS X(商標)などの、CPU104に適合する任意のものでよい。
ハードディスク・ドライブ108にはまた、Apacheなどの、Webサーバとしてシステムを動作させるためのプログラムが保存され、システムの起動時に、主記憶106にロードされる。
ハードディスク・ドライブ108にはさらに、Python仮想マシン(PVM)204(図2)を実現するためのCPythonプログラムが保存され、システムの起動時に、主記憶106にロードされる。
ハードディスク・ドライブ108にはさらに、アプリケーション・プログラムのバイトコード206(図2)が保存されている。
ハードディスク・ドライブ108にはさらに、PVM204上で動作し、バイトコード206を、ネイティブ・コード210に変換するJITコンパイラ208が保存されている。JITコンパイラ208は、バイトコード206を構文解析し、コントロール・フロー・グラフを作成して変数の生存解析などを行い、中間処理言語レベルで最適化を行い、最後に、ガベージ・コレクションのためのRC+/RC-のコードを挿入する処理を行う。図2には特に、JITコンパイラ208が含む処理ルーチンとして、生存解析ルーチン208aと、リファレンス・カウント・コード挿入ルーチン208bとが代表的が表示されている。PVM204には、リファレンス・カウント・コード挿入ルーチン208bによって挿入されたコードに従い、オブジェクトに関連するリファレンス・カウントがゼロになったとき、当該実装オブジェクトを回収するガベージ・コレクション機能が実装されている。JITコンパイラ208のリファレンス・カウント・コード挿入ルーチン208bの動作の詳細は、図3及び図4のフローチャートを参照して後で説明する。
なお、図示しないが、ハードディスク・ドライブ108には、Pythonのソースコードと、Pythonのソースコードをバイトコードに変換する、バイトコードコンパイラなどのプログラムが格納されていてもよい。
キーボード110及びマウス112は、オペレーティング・システム(OS)202が提供するグラフィック・ユーザ・インターフェースに従い、ディスプレイ114に表示されたアイコン、タスクバー、テキストボックスなどのグラフィック・オブジェクトを操作するために使用される。
ディスプレイ114は、これには限定されないが、好適には、1024×768以上の解像度をもち、32ビットtrue colorのLCDモニタである。ディスプレイ114は例えば、PVM上で実行されるアプリケーション・プログラムによる動作の結果を表示するために使用される。
通信インターフェース116は、好適には、イーサネット(R)プロトコルにより、ネットワークと接続されている。通信インターフェース116は、クライアント・コンピュータ(図示しない)からApacheが提供する機能により、TCP/IPなどの通信プロトコルに従い、処理リクエストを受け取り、あるいは処理結果を、クライアント・コンピュータ(図示しない)に返す。
アプリケーション・プログラムのバイトコード206は、キーボード110またはマウス112の操作に応答してオペレーティング・システム202がPVM204を介してJITコンパイラ208を起動することにより、JITコンパイラ208によって読み込まれ、ネイティブ・コード210に変換される。このようにして生成されたネイティブ・コード210は、オペレーティング・システム202によって実行されることになる。
次に、図3のフローチャートを参照して、JITコンパイラ208のリファレンス・カウント・コードを挿入する処理を説明する。以下の処理は主としてJITコンパイラ208のリファレンス・カウント・コード挿入ルーチン208bによって実行されるが、リファレンス・カウント・コード挿入ルーチン208bはJITコンパイラ208の一部であるので、便宜上、JITコンパイラ208が主体であるとして説明する。
図3において、JITコンパイラ208は、ステップ302で、プログラムPを読み込む。ここでは、プログラムPは、Pythonのバイトコード206である。
ステップ304で、JITコンパイラ208は、プログラムPのコントロール・フロー・グラフ(CFG) Cを作成する。
次に、ステップ306で、JITコンパイラ208は、コントロール・フロー・グラフに基づき、生存解析ルーチン208aを呼び出して、C上の変数の生存解析を行なう。なお、コントロール・フロー・グラフの作成とそれに基づく生存解析は、Andrew W. Appel, "Modern Compiler Implementation in ML", Cambridge University Press, 1998の第10章などに記述されているので、ここでは詳細は説明は行なわない。
次に、ステップ308で、JITコンパイラ208は、Cから基本ブロックBを1つ取り出すことを試みる。ここで、基本ブロックとは、コンパイラの分野で周知の概念で、制御のフローがその開始地点から始まり、その最終地点を除き停止や分岐の可能性なく最終地点で終るような連続的なステートメントの並びのことである。
そして、ステップ310で取り出すべき基本ブロックBがないと判断すると、JITコンパイラ208は処理を終る。
ステップ310で取り出すべき基本ブロックBがあると、JITコンパイラ208はステップ312で、Bの後続基本ブロックの集合BSを作成する。
JITコンパイラ208はステップ314で、BSの要素が1つ以下かどうかを判断するし、もしそうなら、処理はステップ308に戻り、まだ取り出していない別の基本ブロックBを取り出そうと試みる。
ステップ314でJITコンパイラ208が、BSの要素が2つ以上だと判断すると、JITコンパイラ208はステップ316で、プログラムP中のすべての変数を含む集合Vを作成する。そしてステップ318でBSから基本ブロックbを1つ取り出すことを試みる。
ステップ320で取り出すべき基本ブロックbがないと判断すると、処理はステップ308に戻り、JITコンパイラ208は、Cから、まだ取り出していない別の基本ブロックBを取り出そうと試みる。
ステップ320で取り出すべき基本ブロックbがあったなら、JITコンパイラ208は、ステップ322で、bの先頭で生きている変数集合Uを作成し、U = U ∩ Vとする。
ステップ324でJITコンパイラ208は、Uから変数uを1つ取り出すことを試みる。そしてステップ326でuがあるかどうか判断し、もしないなら、ステップ318に戻る。一方、uがあるなら、JITコンパイラ208は、ステップ328で、BS - b、すなわちBSからbを除いた集合の先頭でuが生きていない基本ブロックの集合BD(u)を作成する。
JITコンパイラ208は、ステップ330で、BD(u)が空かどうか判断し、もしそうなら、ステップ324に戻る。
BD(u)が空でないなら、JITコンパイラ208は、ステップ332で、BD(u)が含むそれそれの基本ブロックbbについて、Bとbbの間に新しい基本ブロックを生成し、その基本ブロックにRC-(u)を生成して、V = V - uにより、変数集合Vから変数uを取り去り、ステップ324に戻る。
以上の処理をまとめると、次のようになる。
基本ブロックが2つ以上の後続基本ブロックをもつ場合に、上記後続基本ブロックのうち、1つ以上の基本ブロックの先頭において、ある変数が生きて(live)おり、他の基本ブロックSでその変数が生きていない場合、元の基本ブロックと、変数が生きていない後続基本ブロックの間に新しい基本ブロックを挿入し、その新しい基本ブロック内に、その変数に関するRC-を生成する。
基本ブロックが2つ以上の後続基本ブロックをもつ場合に、上記後続基本ブロックのうち、1つ以上の基本ブロックの先頭において、ある変数が生きて(live)おり、他の基本ブロックSでその変数が生きていない場合、元の基本ブロックと、変数が生きていない後続基本ブロックの間に新しい基本ブロックを挿入し、その新しい基本ブロック内に、その変数に関するRC-を生成する。
以上の処理を、式を用いて説明すると、以下のとおりである。
プログラムにおいて、この式が空でない変数について、基本ブロックBと基本ブロックSの間に、新しい基本ブロックを生成し、RC-を生成する。なおこの式で、Succ(B)は、基本ブロックBの後続基本ブロックの集合であり、livein(s)は、基本ブロックsの入口生存である変数の集合である。さらに、SはSucc(B)に含まれる。
プログラムにおいて、この式が空でない変数について、基本ブロックBと基本ブロックSの間に、新しい基本ブロックを生成し、RC-を生成する。なおこの式で、Succ(B)は、基本ブロックBの後続基本ブロックの集合であり、livein(s)は、基本ブロックsの入口生存である変数の集合である。さらに、SはSucc(B)に含まれる。
次に、図4のフローチャートを参照して、図3に示す処理の別の実施例を説明する。図4のフローチャートの処理は、かなりの部分が図3のフローチャートの処理と同一である。すなわち、図4のフローチャートのステップ402〜430はそれぞれ、図3のフローチャートのステップ302〜330と実質的に同一である。例えば、ステップ402がステップ302に対応し、ステップ404がステップ304に対応し、・・・、ステップ430がステップ330に対応する。
そこで、ステップ402〜430については、上記ステップ302〜330についての説明を援用することにして、図4のフローチャートの処理の説明を、ステップ430から開始すると、JITコンパイラ208は、ステップ430で、BD(u)が空かどうか判断し、もしそうなら、ステップ424に戻る。
一方、JITコンパイラ208は、ステップ430でBD(u)が空でないと判断すると、ステップ432でBD(u)から基本ブロックb1を取り出すことを試みる。
ステップ434でJITコンパイラ208は、b1があるかどうか判断し、もしないなら、ステップ424に戻る。
ステップ434でb1があると判断すると、JITコンパイラ208はステップ436で、b1の先行基本ブロックの数が1かどうか判断し、もしそうなら、ステップ438で、b1の先頭にRC-(u)を生成し、V = V - uにより、Vからuを取り去る。そしてステップ424に戻る。
b1の先行基本ブロックの数が1でないなら、JITコンパイラ208はステップ440で、b1の全ての基本ブロックの最後でuが生きているかどうか判断し、もしそうならステップ438で、b1の先頭にRC-(u)を生成し、V = V - uにより、Vからuを取り去り、ステップ424に戻る。
テップ440で、b1の全ての基本ブロックの最後でuが生きているわけではないと判断すると、JITコンパイラ208はステップ442で、BD(u)が含むそれそれの基本ブロックbbについて、Bとbbの間に新しい基本ブロックを生成し、その基本ブロックにRC-(u)を生成して、V = V - uにより、変数集合Vから変数uを取り去り、ステップ424に戻る。なお、ステップ442は、図3のステップ332と処理内容が同一である。
次に、本発明を下記のようなコードに適用した例を説明する。
foo(x, y, z) {
if (z != 0) {
t == x.add(y)
if ((t == x) { return x; }
}
return z;
}
foo(x, y, z) {
if (z != 0) {
t == x.add(y)
if ((t == x) { return x; }
}
return z;
}
比較のため先ず、米国特許第7693919号公報あるいはhttp://www.hpl.hp.com/personal/Pramod_Joisha/Publications/vee08.pdfに示す技法を適用した場合について示す。
すると、図5に示すような、BB1、BB2、BB3、BB4及びBB5の5つの基本ブロックに分割される。
http://www.hpl.hp.com/personal/Pramod_Joisha/Publications/vee08.pdfには下記の式が示されている。
この式で、defmust()は、必須の定義を示す。
この式で、defmust()は、必須の定義を示す。
この式を用いて、図5の場合の計算をしてみる。
B’= BB3について
B= BB2: livein(BB2) = {x,y,z}, defsmust(s in BB2) = {t}
livein(BB3) = {x}
この値を用いて
D’ for BB3
= (livein(BB2) ∪ defsmust(s in BB2)) - livein(BB3)
= ({x, y, z} ∪ {t}) - {x} = {y, z, t}
B’= BB4について
B= BB1: livein(BB1) = {x,y,z}, defsmust(s in BB1) = {}
B= BB2: livein(BB2) = {x,y,z}, defsmust(s in BB2) = {t}
livein(BB4) = {z}
この値を用いて
D’ for BB4
= ((livein(BB1) ∪ defsmust(s in BB1)) ∪ (livein(BB2) ∪ defsmust(s in BB2))) - livein(BB4)
= (({x, y, z}) ∪ ({x, y, z} ∪ {t})) - {z}
= {x, y, z, t} - {z}
= {x, y, t}
B’= BB3について
B= BB2: livein(BB2) = {x,y,z}, defsmust(s in BB2) = {t}
livein(BB3) = {x}
この値を用いて
D’ for BB3
= (livein(BB2) ∪ defsmust(s in BB2)) - livein(BB3)
= ({x, y, z} ∪ {t}) - {x} = {y, z, t}
B’= BB4について
B= BB1: livein(BB1) = {x,y,z}, defsmust(s in BB1) = {}
B= BB2: livein(BB2) = {x,y,z}, defsmust(s in BB2) = {t}
livein(BB4) = {z}
この値を用いて
D’ for BB4
= ((livein(BB1) ∪ defsmust(s in BB1)) ∪ (livein(BB2) ∪ defsmust(s in BB2))) - livein(BB4)
= (({x, y, z}) ∪ ({x, y, z} ∪ {t})) - {z}
= {x, y, z, t} - {z}
= {x, y, t}
例えば変数yは、BB2において、x.add(y)でlastuseであり、dieacross(x.add(y)) = yとなりx.add(y)の後ろにRC-(y)が挿入される。ここで、RC-()とは、RC-()の中ではreference countがdecrementされた後にy=NULLが代入されるものである(DAN semantics)。さらに、D’に従って、BB3とBB4の前にRC_-(y)を挿入する。RC_-(y)とは、yがNULLでないときのみRC(y)を呼ぶものである。
ここで、もし米国特許第7693919号公報あるいはhttp://www.hpl.hp.com/personal/Pramod_Joisha/Publications/vee08.pdfには記述されていない、定数伝搬の最適化を導入するならば、 RC_-(var)について、BB3に到達するyが常にNULLであることがわかるので、RC_-(y)を削除することは可能である。
CPythonやYARVのように実装上オブジェクトのアドレスがNULLにならない、という知識を利用して、BB3のRC_-(z)はRC-(z)に、BB4のRC_-(x)はRC-(x)に、置き換え可能である。このようにして最適化した後のコードを図6に示す。すなわち、BB4では、yがNULLであるかどうかのチェックが常に行われBB2から到達した場合必要ないにもかかわらず、実行命令数を増やす。
CPythonやYARVのように実装上オブジェクトのアドレスがNULLにならない、という知識を利用して、BB3のRC_-(z)はRC-(z)に、BB4のRC_-(x)はRC-(x)に、置き換え可能である。このようにして最適化した後のコードを図6に示す。すなわち、BB4では、yがNULLであるかどうかのチェックが常に行われBB2から到達した場合必要ないにもかかわらず、実行命令数を増やす。
本発明を適用した場合は、図7のようになる。ここで、
livein(BB2) = {x,y,z}, livein(BB4) = {z}である。
BB B = BB1, BB S = BB4、の場合を考えると、
livein(BB2) ∩¬ livein(BB4) = {x,y}
となり、BB1とBB4の間に新しいBB5を挿入し、RC-(x)とRC-(y)を生成する。すると、BB1->BB4のパスで、使われないオブジェクトxとyを回収可能である。
同様にBB2->BB4のパスにBB6を挿入し、RC-(x)を生成する。
livein(BB2) = {x,y,z}, livein(BB4) = {z}である。
BB B = BB1, BB S = BB4、の場合を考えると、
livein(BB2) ∩¬ livein(BB4) = {x,y}
となり、BB1とBB4の間に新しいBB5を挿入し、RC-(x)とRC-(y)を生成する。すると、BB1->BB4のパスで、使われないオブジェクトxとyを回収可能である。
同様にBB2->BB4のパスにBB6を挿入し、RC-(x)を生成する。
なお、以上の説明では、RC+のコードを挿入する処理については言及されていないが、RC+は従来技術に従い挿入してよい。
図7のコードは、図5あるいは図6のコードと比較して、以下の操作が不要となる。
- オブジェクトのlast useの後にオブジェクトのアドレスをNULLにすること。
- 基本ブロック内で生存期間(life time)が閉じる変数について後続基本ブロックでRC-すること。
- RC-で、オブジェクトがNULLかどうかの検査。
- オブジェクトのlast useの後にオブジェクトのアドレスをNULLにすること。
- 基本ブロック内で生存期間(life time)が閉じる変数について後続基本ブロックでRC-すること。
- RC-で、オブジェクトがNULLかどうかの検査。
以上のように本発明を、Python上のJITコンパイラに実装した例として説明してきたが、本発明はこれには限定されず、PHPなど、レファレンス・カウント方式のガベージ・コレクションを実装する任意の処理系に適当であることを理解されたい。
104・・・CPU
106・・・RAM
108・・・HDD
202・・・OS
204・・・PVM
206・・・バイトコード
208・・・JITコンパイラ
208a・・・生存解析ルーチン
208b・・・リファリンス・カウント・コード挿入ルーチン
106・・・RAM
108・・・HDD
202・・・OS
204・・・PVM
206・・・バイトコード
208・・・JITコンパイラ
208a・・・生存解析ルーチン
208b・・・リファリンス・カウント・コード挿入ルーチン
Claims (12)
- コンピュータの処理により、プログラム・コードを読み込んで、第1の基本ブロックに続く2つ以上の後継基本ブロックをもつコードに、レファレンス・カウントを減らすコードRC-を挿入する方法であって、
前記後継基本ブロックのうちの第2の基本ブロックの先頭において生きている変数と同一の変数が、前記後継基本ブロックのうちの該第2の基本ブロックとは別の第3の基本ブロックにおいて生きていないことに応答して、前記第1の基本ブロックと、前記第3の基本ブロックの間に新たな第4の基本ブロックを挿入し、該基本ブロック内に該変数に関するRC-のコードを挿入するステップを有する、
コード変換方法。 - 前記プログラム・コードがPythonバイトコードであり、前記RC-が、Python仮想マシン(PVM)上のJITコンパイラにより生成されるネイティブ・コードに挿入される、請求項1に記載の方法。
- コンピュータの処理により、プログラム・コードを読み込んで、第1の基本ブロックに続く2つ以上の後継基本ブロックをもつコードに、レファレンス・カウントを減らすコードRC-を挿入する方法であって、
前記後継基本ブロックのうちの第2の基本ブロックの先頭において生きている変数と同一の変数が、前記後継基本ブロックのうちの該第2の基本ブロックとは別の第3の基本ブロックにおいて生きていない場合:
(a) 前記第3の基本ブロックの先行基本ブロックの数が1の場合、前記第3の基本ブロックの先頭にRC-のコードを挿入し、
(b) 前記第3の基本ブロックの先行基本ブロックの数が2以上の場合、前記先行基本ブロックのすべての基本ブロックの最後において前記変数が生きているなら、前記第3の基本ブロックの先頭にRC-のコードを挿入するステップを有する、
コード変換方法。 - 前記プログラム・コードがPythonバイトコードであり、前記RC-が、Python仮想マシン(PVM)上のJITコンパイラにより生成されるネイティブ・コードに挿入される、請求項3に記載の方法。
- コンピュータの処理により、プログラム・コードを読み込んで、第1の基本ブロックに続く2つ以上の後継基本ブロックをもつコードに、レファレンス・カウントを減らすコードRC-を挿入するプログラムであって、
前記コンピュータに、
前記後継基本ブロックのうちの第2の基本ブロックの先頭において生きている変数と同一の変数が、前記後継基本ブロックのうちの該第2の基本ブロックとは別の第3の基本ブロックにおいて生きていないことに応答して、前記第1の基本ブロックと、前記第3の基本ブロックの間に新たな第4の基本ブロックを挿入し、該基本ブロック内に該変数に関するRC-のコードを挿入するステップを実行させる、
コード変換プログラム。 - 前記プログラム・コードがPythonバイトコードであり、前記RC-が、Python仮想マシン(PVM)上のJITコンパイラにより生成されるネイティブ・コードに挿入される、請求項5に記載のプログラム。
- コンピュータの処理により、プログラム・コードを読み込んで、第1の基本ブロックに続く2つ以上の後継基本ブロックをもつコードに、レファレンス・カウントを減らすコードRC-を挿入するプログラムであって、
前記コンピュータに、
前記後継基本ブロックのうちの第2の基本ブロックの先頭において生きている変数と同一の変数が、前記後継基本ブロックのうちの該第2の基本ブロックとは別の第3の基本ブロックにおいて生きていない場合:
(a) 前記第3の基本ブロックの先行基本ブロックの数が1の場合、前記第3の基本ブロックの先頭にRC-のコードを挿入し、
(b) 前記第3の基本ブロックの先行基本ブロックの数が2以上の場合、前記先行基本ブロックのすべての基本ブロックの最後において前記変数が生きているなら、前記第3の基本ブロックの先頭にRC-のコードを挿入するステップを実行させる、
コード変換プログラム。 - 前記プログラム・コードがPythonバイトコードであり、前記RC-が、Python仮想マシン(PVM)上のJITコンパイラにより生成されるネイティブ・コードに挿入される、請求項7に記載のプログラム。
- コンピュータの処理により、プログラム・コードを読み込んで、第1の基本ブロックに続く2つ以上の後継基本ブロックをもつコードに、レファレンス・カウントを減らすコードRC-を挿入するシステムであって、
前記後継基本ブロックのうちの第2の基本ブロックの先頭において生きている変数と同一の変数が、前記後継基本ブロックのうちの該第2の基本ブロックとは別の第3の基本ブロックにおいて生きていないことに応答して、前記第1の基本ブロックと、前記第3の基本ブロックの間に新たな第4の基本ブロックを挿入し、該基本ブロック内に該変数に関するRC-のコードを挿入する手段を有する、
システム。 - 前記プログラム・コードがPythonバイトコードであり、前記RC-が、Python仮想マシン(PVM)上のJITコンパイラにより生成されるネイティブ・コードに挿入される、請求項9に記載のシステム。
- コンピュータの処理により、プログラム・コードを読み込んで、第1の基本ブロックに続く2つ以上の後継基本ブロックをもつコードに、レファレンス・カウントを減らすコードRC-を挿入するシステムであって、
前記後継基本ブロックのうちの第2の基本ブロックの先頭において生きている変数と同一の変数が、前記後継基本ブロックのうちの該第2の基本ブロックとは別の第3の基本ブロックにおいて生きていない場合:
(a) 前記第3の基本ブロックの先行基本ブロックの数が1の場合、前記第3の基本ブロックの先頭にRC-のコードを挿入し、
(b) 前記第3の基本ブロックの先行基本ブロックの数が2以上の場合、前記先行基本ブロックのすべての基本ブロックの最後において前記変数が生きているなら、前記第3の基本ブロックの先頭にRC-のコードを挿入する手段を有する、
システム。 - 前記プログラム・コードがPythonバイトコードであり、前記RC-が、Python仮想マシン(PVM)上のJITコンパイラにより生成されるネイティブ・コードに挿入される、請求項11に記載のシステム。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2012207105A JP2014063285A (ja) | 2012-09-20 | 2012-09-20 | ガベージ・コレクションのためのコード変換方法、プログラム及びシステム |
US14/028,579 US9098319B2 (en) | 2012-09-20 | 2013-09-17 | Code conversion method, program, and system for garbage collection |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2012207105A JP2014063285A (ja) | 2012-09-20 | 2012-09-20 | ガベージ・コレクションのためのコード変換方法、プログラム及びシステム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2014063285A true JP2014063285A (ja) | 2014-04-10 |
Family
ID=50275869
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2012207105A Pending JP2014063285A (ja) | 2012-09-20 | 2012-09-20 | ガベージ・コレクションのためのコード変換方法、プログラム及びシステム |
Country Status (2)
Country | Link |
---|---|
US (1) | US9098319B2 (ja) |
JP (1) | JP2014063285A (ja) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110188029A (zh) * | 2019-03-15 | 2019-08-30 | 中山大学 | 一种基于定值到达分析方法的Java空指针分析系统 |
Family Cites Families (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3470948B2 (ja) * | 1999-01-28 | 2003-11-25 | インターナショナル・ビジネス・マシーンズ・コーポレーション | 動的コンパイル時期決定方法、バイトコード実行モード選択方法、及びコンピュータ |
JP4041347B2 (ja) | 2001-05-29 | 2008-01-30 | 松下電器産業株式会社 | ガベージコレクション装置及びガベージコレクション方法 |
US7024437B2 (en) * | 2002-12-06 | 2006-04-04 | Sun Microsystems, Inc. | Better placement of objects reachable from special objects during collection based on the train algorithm |
US20050240914A1 (en) * | 2004-04-21 | 2005-10-27 | Intel Corporation | Portable just-in-time compilation in managed runtime environments |
US7620943B1 (en) * | 2004-06-30 | 2009-11-17 | Sun Microsystems, Inc. | Using class properties to segregate objects in a generation managed by the train algorithm |
US7565386B2 (en) * | 2006-02-10 | 2009-07-21 | Microsoft Corporation | Reference-counting subsumption analysis |
US7693919B2 (en) * | 2006-02-10 | 2010-04-06 | Microsoft Corporation | Eager reference-counting garbage collection |
US20080147696A1 (en) * | 2006-12-19 | 2008-06-19 | International Business Machines Corporation | Method for reducing memory size allocated by a string class using unicode |
US20090094301A1 (en) * | 2007-10-05 | 2009-04-09 | Microsoft Corporation | Applications of overlooking root information for improving nondeferred reference-counting garbage collection |
US8103706B2 (en) * | 2007-10-05 | 2012-01-24 | Microsoft Corporation | Nondeferred reference-counting garbage collection using overlooking roots |
JP4852621B2 (ja) * | 2009-03-03 | 2012-01-11 | インターナショナル・ビジネス・マシーンズ・コーポレーション | プログラム中のオブジェクトの割り付け場所を追跡する方法、並びにそのコンピュータ・システム及びコンピュータ・プログラム |
JP2010277440A (ja) * | 2009-05-29 | 2010-12-09 | Internatl Business Mach Corp <Ibm> | プログラム実行時における文字列の処理を最適化する方法、並びにそのコンピュータ・システム及びコンピュータ・プログラム |
US8543991B2 (en) * | 2011-03-10 | 2013-09-24 | Microsoft Corporation | Profile driven multicore background compilation |
US8533699B2 (en) * | 2011-03-31 | 2013-09-10 | Oracle International Corporation | System and method for optimizing a code section by forcing a code section to be executed atomically |
US9329975B2 (en) * | 2011-07-07 | 2016-05-03 | Oracle International Corporation | Continuous query language (CQL) debugger in complex event processing (CEP) |
US8819649B2 (en) * | 2011-09-09 | 2014-08-26 | Microsoft Corporation | Profile guided just-in-time (JIT) compiler and byte code generation |
US9176769B2 (en) * | 2012-06-29 | 2015-11-03 | Microsoft Technology Licensing, Llc | Partitioned array objects in a distributed runtime |
US8990789B2 (en) * | 2013-04-18 | 2015-03-24 | Facebook, Inc. | Optimizing intermediate representation of script code by eliminating redundant reference count operations |
US9298433B2 (en) * | 2013-05-02 | 2016-03-29 | Facebook, Inc. | Optimizing intermediate representation of script code for fast path execution |
-
2012
- 2012-09-20 JP JP2012207105A patent/JP2014063285A/ja active Pending
-
2013
- 2013-09-17 US US14/028,579 patent/US9098319B2/en not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
US9098319B2 (en) | 2015-08-04 |
US20140082598A1 (en) | 2014-03-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Cheung et al. | Automatic partitioning of database applications | |
US6957422B2 (en) | Dynamic classification of sections of software | |
US7203941B2 (en) | Associating a native resource with an application | |
US6499137B1 (en) | Reversible load-time dynamic linking | |
US6988271B2 (en) | Heavyweight and lightweight instrumentation | |
US8984497B2 (en) | Source code converting, method program, and systems for first programming language to a code in a second programming language | |
EP3964948B1 (en) | Hardware acceleration method, compiler, and device | |
CN103250141B (zh) | 联网的客户端-服务器体系结构中的预读处理 | |
US8296745B2 (en) | Method and apparatus for portable stub generation | |
US20110246974A1 (en) | Dynamic compiler program, dynamic compiling method and dynamic compiling device | |
US8806432B2 (en) | Method, system, and program for executing program | |
US20140189708A1 (en) | Terminal and method for executing application in same | |
Calder et al. | Reducing transfer delay using Java class file splitting and prefetching | |
JP2015519646A (ja) | マルチテナント型アプリケーション・ドメイン及びメモリの管理を伴う修正されたjvm | |
US9244708B2 (en) | Enhanced java array | |
US8938728B2 (en) | Dynamic compiler program, dynamic compiling method and dynamic compiling device | |
JP2014063285A (ja) | ガベージ・コレクションのためのコード変換方法、プログラム及びシステム | |
JP5871589B2 (ja) | 情報処理装置、配列の初期サイズ調整プログラム及び方法 | |
Pickett et al. | Return value prediction in a Java virtual machine | |
JP2006163686A (ja) | コンパイル方法、コンパイルプログラム、コンパイル装置およびコンパイル用の記録媒体 | |
JP5889270B2 (ja) | スタック・スキャンのコストを削減するための方法、プログラム及びシステム | |
JP5950288B2 (ja) | プログラミング言語の処理系を実現する装置及び方法 | |
Li et al. | Key elements tracing method for parallel XML parsing in multi-core system | |
Reijers et al. | Ahead-of-Time Compilation of Stack-Based JVM Bytecode on Resource-Constrained Devices. | |
JP6173031B2 (ja) | コンピュータにおいてオブジェクトを管理するための方法、プログラム及びシステム |