JP4806060B2 - コンパイラ・プログラム、コンパイル方法及びコンピュータ・システム - Google Patents
コンパイラ・プログラム、コンパイル方法及びコンピュータ・システム Download PDFInfo
- Publication number
- JP4806060B2 JP4806060B2 JP2009212881A JP2009212881A JP4806060B2 JP 4806060 B2 JP4806060 B2 JP 4806060B2 JP 2009212881 A JP2009212881 A JP 2009212881A JP 2009212881 A JP2009212881 A JP 2009212881A JP 4806060 B2 JP4806060 B2 JP 4806060B2
- Authority
- JP
- Japan
- Prior art keywords
- code
- delay
- source code
- computer
- generating
- 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
Links
Images
Classifications
-
- 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
- G06F8/4441—Reducing the execution time required by the program code
- G06F8/4443—Inlining
-
- 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/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
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
1.高い実行時コストをもち、かつ安全に移動することが可能なデータの生成サイトのコード・フラグメントを解析によって判定し、この部分に対して評価を遅延するコードを生成する(レベル1コンパイル)。
2.ステップ1で生成された遅延が高頻度で強制される場所(データの使用サイト)を実行時フィードバックに基づいて推定し、この遅延をこの使用サイトのコードにインライン展開することでコード移動を実現し、部分評価などの強力な最適化を可能にする(レベル2コンパイル)。
という二つのコンパイルステップで実現される。
<?php
$user = "akihiko"; $date = date(DATE_RFC822);
start();
?>
function login() {
global $user, $date;
echo "user $user logined at $date";
}
Felleisen. The essence of compiling with continuations. In Proceedings of
the ACM SIGPLAN ’93 Conference on Programming Language Design and
Implementation, pages 237-247, 1993. In ACM SIGPLAN Notices, 28(6), June 1993などを参照されたい。また、SSAとは、静的単一代入形式(Static Simple Assignment)のことであり、変数の定義が字面上唯一になるように添字をつけた中間表現形式であり、コンパイラにおけるデータフロー解析や最適化を見通しよく行うのに適した形式のことである。
let _0 = date(DATE_RFC822) in
let _ = delay_global(fun _ ->
let _ = upd_global "user" "akihiko" in
upd_global "date" _0)
in
start()
let login _ =
let _0 = load_global "user" in
let _1 = load_global "date" in
echo ("user ". _0."logined at"._1)
もし、start()からlogin()までの間にglobal変数の定義がなければ、load_globalの実行時に先ほど遅延されたクロージャc = (fn,record) が実行系から取り出され処理される。実行時プロファイラは、クロージャcがこのlogin()の実行時に強制されたことをプロファイルしておく。
let (fn’, record) = delayed_global() in
if (fn’ == fn) then
let _ = upd_global "user" "akihiko" in
let _ = upd_global "date" record#_0 in
let _0 = load_global "user" in
let _1 = load_global "date" in
echo("user" . _0 . "logined at" ._1)
else login()
let login_fast _ =
let (fn’, record) = delayed_global () in
if (fn’ == fn) then
echo("user akihiko logined at" . record#_0)
else login()
すなわち、定数畳み込みや中間データ構造除去の効果を大域的なデータフローの解析なしで得ることができるようになった。また遅延したグローバル変数テーブルの更新処理をこの場所では省くことができた。もし、このlogin()以降にもうグローバル変数の更新がないなら、グローバル変数テーブル生成のコストを完全に除去することができたことになる。
なお、PHPの仕様については、http://www.php.net/などを参照されたい。
次に、個々のステップの具体的処理について説明する。
ここでは、 A正規形やCPSなどの各関数定義の実体 (制御グラフの基本ブロックに対応している) について、 データの依存解析をおこない、 遅延できる箇所を特定する方法を示す。例えば、以下のようなコードを考える。今回は $x, $y, $z などはローカル変数であるとし、最初は I/Oの遅延については考えないとする。
0: let $x = 1 in
1: let $y = 2 in
2: let $z = $x + $y in
3: let _ = echo $x in (* 副作用 *)
4: let _ = callfunc "foo" $z in (* 副作用 *)
5: () (* 副作用 = この関数の継続で副作用が起こるため *)
依存解析は、図5(a)のグラフを生成し、 その後支配木は、図5(b)のようである。この処理は、図4のステップ402に対応する。
0’: let $x = delay (fun _ ->
0: 1) in
2’: let $z = delay ( fun _ ->
1: let $y = 2 in
2: $x + $y)
3: let _ = echo $x in
4: let _ = callfunc "foo" $z in
5: ()
PHPの場合、連想配列のデータ構造は、デフォルトではエイリアスを含まない。すなわち
$x = null;
$x["key"] = "hello";
$y = $x;
$y["key"] = "world";
echo $x["key"]; // hello
let $x = null in .
let $x = update "key" "hello" $x in
let $y = $x in
let $y = update "key" "world" $y in
echo (load "key" $x)
let foo $x $y =
let $x = update "abc" "def" $x in
let _ = echo $y in
bar $x
let foo $x $y =
let $x = delay (fun _ -> update "abc" "def" $x)
let _ = echo $y in
bar $x
let foo $x $y =
let delay_ok = not $x#contains_alias in
let $x = delay (fun _ -> update "abc" "def" $x)
let $x = if delay_ok then $x else force $x in
let _ = echo $y in
bar $x
function foo($o1, $o2) {
$o1->name = "akihiko";
$o1->address = "yamato";
echo $o2->name;
bar($o1);
}
let foo $o1 $o2 =
let fields = $o1#fields in
let delay_ok = not fields#contains_alias in
let fields = delay (fun _ ->
let fields = update "name" "akihiko" fields in
update "address" "yamato" fields)
in
let _= $o1#fields <- (if delay_ok then fields else force fields) in
let _ = echo (load $o2#fields "name") in
bar $o1
<レベル1コンパイラ>の節で説明した手法でのデータ依存グラフ生成の際に, 副作用間の詳細なデータ依存関係を明らかにするようにするとより精緻な遅延が可能になる。これにより、例えば前述のように、グローバルテーブル操作が副作用で表現されている場合でも、操作を遅延することができるようになる。
- GW: グローバル変数への書き込み
- GR: グローバル変数の読み込み
- IO: IO 処理
- T: 最大の副作用
0: letIO _0 = date(DATE_RFC822) in
1: letGW _ = upd_global "user" "akihiko" in
2: letGW _ =upd_global "date" _0 in
3: letT _ = start () in
4: ()
IO: 直近のTあるいはIOのうち近い方への枝を追加する。
T: 直近がTならば枝を追加する。Tより近いGWおよびIOについては双方への依存を追加する。
let _0 = date(DATE_RFC822) in
let _ = delay_global (fun _ ->
let _ = upd_global "user" "akihiko" in
upd_global "date"_0)
in
start ()
プロファイラは、遅延がどこで強制されたかをプロファイルする。以下で述べる処理は、図4のステップ406に対応する。いま、データの遅延の強制は通常データの読みこみ (例えばecho文)や、データへの書き込み (連想配列のupdate操作) などのためにライブラリ内で起こるが、実際のプロファイルはそれよりも外側のユーザレベルコードの地点で行いたい。理由は:
- PHPでは連想配列などのデータ構造の操作などは、Cで書かれたネイティブ・ライブラリ内で起こるため、そのライブラリ内部のレベルでのプロファイルはしにくい。
- またライブラリは多くの箇所から呼ばれるため、ライブラリ内 (例えば、echoの実装の中で) で遅延強制のプロファイルを行った場合、よくヒットするようなガードは生成できない可能性が高い。
- echo xの引数x
- update k v xのキーkおよび配列x (配列に入る値vは即座には使わないことに注意)
- ・・・
を列挙することができる。このような操作と引数の組に対して、レベル1コンパイラが、ユーザレベルコード中に
let x = profile x 0 in echo x
let k = profile k 1 in let x = profile x 2 in update k v x
のような形でprofile操作を入れる。このprofile操作の第1引数は遅延であるかもしれない値であり、第2引数はすべてのprofile操作に対してユニークなコールサイトの識別子である。コードの実行時にはprofile x id 操作はプロファイルする値xとコールサイトの識別子idを引数として取り、もしxが遅延クロージャ(fn, record)であれば、このfnとコールサイト識別子idとの組を大域的な場所に記憶しておく。
レベル2コンパイラは2つの処理を行う。
1) 各コールサイト識別子idについて対応するprofile操作で高頻度で強制されたクロージャのコードfnがあると判定された場合、このコードをガード付でコールサイトにインラインする。これは、図4のステップ408に対応する。
2) 結果として得られたコードを部分評価によって、最適化する。
LetGW _ = upd_global "user" "akihiko" in
LetGW _ = upd_global "date" record#_0 in
LetGR _0 = load_global "user" in
letGR _1 = load_global "date" in
echo ("user " . _0 . "logined at " . _1)
fun global->
let global = upd_global "user" "akihiko" global in
let global = upd_global "date" record#_0 global in
let _0 = load_global "user" global in
let _1 = load_global "date" global in
echo ("user " . _0 . "logined at " . _1)
letGW _ = e1 in e2 -> fun global -> let global = e1 global in e2 global
letGR x = e1 in e2 -> fun global -> let x = e1 global in e2 global
と書き換えたあとで、これをベータ簡約で簡単化すれば実現できる。
upd_global key val arry = fun cons nil -> cons key val (arry cons nil)
load_global key arry = arry (fun key’ val a -> if key = key’ then val else a) error
fun global -> echo ("user akhiko logined at " . record#_0)
echo ("user akhiko logined at " . record#_0)
以下の処理は、図4のステップ410に対応する。遅延処理にはコストがかかるので、もし遅延のコストを上回るような利得がレベル2コンパイルによって得られない場合は、 遅延処理をキャンセルするような再コンパイルを行ってもよい。このようなケースには次の二通りがあると考えられる。
2. 遅延を生成し、それがユーザーレベルコード中で高頻度で強制されるが、レベル2コンパイルを試行してみたところ、あまり性能があがるようなコスト削減が期待できなかった場合。
104 CPU
110 キーボード
112 マウス
114 ディスプレイ
106 主記憶
108 ハードディスク・ドライブ
202 ソース・プログラム
204 変換モジュール
206 コンパイラ
208 実行系
210 プロファイル情報
Claims (12)
- コンピュータの処理によって、ソースコードを、実行可能コードに変換するためのコンパイル方法であって、
前記コンピュータの処理によって、前記コンピュータの記憶装置に格納された前記ソースコードを読み込むステップと、
前記コンピュータの処理によって、前記ソースコードの解析においてデータおよび副作用の依存グラフを生成し、その後支配木を元に遅延できるプログラムの部分を特定するステップと、
前記コンピュータの処理によって、遅延を行うコードを生成するステップと、
前記コンピュータの処理によって、プロファイラの作用で、前記遅延がどこで強制されたかをプロファイルするステップと、
前記コンピュータの処理によって、前記プロファイルによって高頻度で強制されると判定された遅延クロージャのコードをその強制される箇所にインラインすることで移動し、さらに部分評価を適用してコードを生成するステップと、
前記コンピュータの処理によって、前記生成されたコードにおいて、中間データ構造を部分評価で除去するステップを有する、
コンパイル方法。 - 前記遅延を行うコードを生成するステップが、データ構造の更新を遅延していいかどうかの判断がエイリアスの可能性のため難しい場合、データ構造内部のエイリアスの可能性を調べ、安全な場合のみに実行される、請求項1に記載のコンパイル方法。
- 遅延を行うコードを生成するステップの前に、前記ソースコードをSSA変換するステップを有する、請求項1に記載のコンパイル方法。
- 前記ソースコードがPHPで書かれている、請求項1に記載のコンパイル方法。
- コンピュータの処理によって、ソースコードを、実行可能コードに変換するためのコンパイラ・プログラムであって、
前記コンピュータをして、
前記コンピュータの記憶装置に格納された前記ソースコードを読み込むステップと、
前記ソースコードの解析においてデータおよび副作用の依存グラフを生成し、その後支配木を元に遅延できるプログラムの部分を特定するステップと、
遅延を行うコードを生成するステップと、
プロファイラの作用により、前記遅延がどこで強制されたかをプロファイルするステップと、
前記プロファイルによって高頻度で強制されると判定された遅延クロージャのコードをその強制される箇所にインラインすることで移動し、さらに部分評価を適用してコードを生成するステップと、
前記生成されたコードにおいて、中間データ構造を部分評価で除去するステップを実行させる、
コンパイラ・プログラム。 - 前記遅延を行うコードを生成するステップが、データ構造の更新を遅延していいかどうかの判断がエイリアスの可能性のため難しい場合、データ構造内部のエイリアスの可能性を調べ、安全な場合のみに実行される、請求項5に記載のコンパイラ・プログラム。
- 遅延を行うコードを生成するステップの前に、前記ソースコードをSSA変換するステップを有する、請求項5に記載のコンパイラ・プログラム。
- 前記ソースコードがPHPで書かれている、請求項5に記載のコンパイラ・プログラム。
- ソースコードを、実行可能コードに変換する処理を行うコンピュータ・システムであって、
前記ソースコードを格納した記憶装置と、
主記憶と、
前記ソースコードを前記主記憶に読み込む手段と、
前記ソースコードの解析においてデータおよび副作用の依存グラフを生成し、その後支配木を元に遅延できるプログラムの部分を特定する手段と、
遅延を行うコードを生成する手段と、
プロファイラの作用により、前記遅延がどこで強制されたかをプロファイルする手段と、
前記プロファイルによって高頻度で強制されると判定された遅延クロージャのコードをその強制される箇所にインラインすることで移動し、さらに部分評価を適用してコードを生成する手段と、
前記生成されたコードにおいて、中間データ構造を部分評価で除去する手段を含む、
コンピュータ・システム。 - 前記遅延を行うコードを生成する手段が、データ構造の更新を遅延していいかどうかの判断がエイリアスの可能性のため難しい場合、データ構造内部のエイリアスの可能性を調べ、安全な場合のみに実行される、請求項9に記載のコンピュータ・システム。
- 遅延を行うコードを生成する手段に入力するために、前記ソースコードをSSA変換する手段をさらに有する、請求項9に記載のコンピュータ・システム。
- 前記ソースコードがPHPで書かれている、請求項9に記載のコンピュータ・システム。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2009212881A JP4806060B2 (ja) | 2009-09-15 | 2009-09-15 | コンパイラ・プログラム、コンパイル方法及びコンピュータ・システム |
US12/881,667 US20110067018A1 (en) | 2009-09-15 | 2010-09-14 | Compiler program, compilation method, and computer system |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2009212881A JP4806060B2 (ja) | 2009-09-15 | 2009-09-15 | コンパイラ・プログラム、コンパイル方法及びコンピュータ・システム |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2011065220A JP2011065220A (ja) | 2011-03-31 |
JP4806060B2 true JP4806060B2 (ja) | 2011-11-02 |
Family
ID=43731735
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2009212881A Expired - Fee Related JP4806060B2 (ja) | 2009-09-15 | 2009-09-15 | コンパイラ・プログラム、コンパイル方法及びコンピュータ・システム |
Country Status (2)
Country | Link |
---|---|
US (1) | US20110067018A1 (ja) |
JP (1) | JP4806060B2 (ja) |
Families Citing this family (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8370821B2 (en) * | 2007-08-21 | 2013-02-05 | International Business Machines Corporation | Method for enabling profile-based call site tailor-ing using profile gathering of cloned functions |
US20120143866A1 (en) * | 2010-12-02 | 2012-06-07 | Microsoft Corporation | Client Performance Optimization by Delay-Loading Application Files with Cache |
US8943476B2 (en) | 2011-06-14 | 2015-01-27 | Google Inc. | System and method to in-line script dependencies |
US8924945B1 (en) * | 2012-10-04 | 2014-12-30 | Google Inc. | Managing dependencies on multi-threaded environment |
US9830134B2 (en) * | 2015-06-15 | 2017-11-28 | Qualcomm Incorporated | Generating object code from intermediate code that includes hierarchical sub-routine information |
US20170090890A1 (en) * | 2015-09-30 | 2017-03-30 | Semmle Limited | Virtual compositions |
US9495141B1 (en) | 2015-12-01 | 2016-11-15 | International Business Machines Corporation | Expanding inline function calls in nested inlining scenarios |
US11755382B2 (en) | 2017-11-03 | 2023-09-12 | Coherent Logix, Incorporated | Programming flow for multi-processor system |
US11288046B2 (en) | 2019-10-30 | 2022-03-29 | International Business Machines Corporation | Methods and systems for program optimization utilizing intelligent space exploration |
US11221835B2 (en) * | 2020-02-10 | 2022-01-11 | International Business Machines Corporation | Determining when to perform and performing runtime binary slimming |
CN114356311B (zh) * | 2022-01-07 | 2024-07-19 | 北京字节跳动网络技术有限公司 | 代码性能数据的交互方法、装置、介质及电子设备 |
Family Cites Families (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH11149380A (ja) * | 1997-11-18 | 1999-06-02 | Hitachi Ltd | コンパイラとプログラム最適化方法およびその処理プログラムを記録した記録媒体 |
JP3651774B2 (ja) * | 2000-09-12 | 2005-05-25 | インターナショナル・ビジネス・マシーンズ・コーポレーション | コンパイラ及びそのレジスタ割付方法 |
JP2002259135A (ja) * | 2001-02-28 | 2002-09-13 | Internatl Business Mach Corp <Ibm> | プログラムの最適化方法及びこれを用いたコンパイラ |
WO2004015570A1 (en) * | 2002-08-02 | 2004-02-19 | Telefonaktiebolaget Lm Ericsson (Publ) | Optimised code generation |
JP4184900B2 (ja) * | 2003-08-26 | 2008-11-19 | 富士通株式会社 | 変数の統計処理を行うコンパイル処理プログラム、およびその記録媒体、およびその処理方法ならびにその処理装置 |
JP4093484B2 (ja) * | 2004-01-28 | 2008-06-04 | インターナショナル・ビジネス・マシーンズ・コーポレーション | コンパイラ、コンパイル方法、コンパイルプログラム、及び記録媒体 |
US7882498B2 (en) * | 2006-03-31 | 2011-02-01 | Intel Corporation | Method, system, and program of a compiler to parallelize source code |
JP4747209B2 (ja) * | 2009-04-17 | 2011-08-17 | インターナショナル・ビジネス・マシーンズ・コーポレーション | 高速ウェブサーバ |
-
2009
- 2009-09-15 JP JP2009212881A patent/JP4806060B2/ja not_active Expired - Fee Related
-
2010
- 2010-09-14 US US12/881,667 patent/US20110067018A1/en not_active Abandoned
Also Published As
Publication number | Publication date |
---|---|
JP2011065220A (ja) | 2011-03-31 |
US20110067018A1 (en) | 2011-03-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4806060B2 (ja) | コンパイラ・プログラム、コンパイル方法及びコンピュータ・システム | |
Gal et al. | Trace-based just-in-time type specialization for dynamic languages | |
Würthinger et al. | One VM to rule them all | |
US7493610B1 (en) | Versioning optimization for dynamically-typed languages | |
US20090024986A1 (en) | Runtime code modification | |
US8843920B2 (en) | Systems and methods for deferring software implementation decisions until load time | |
US8510724B2 (en) | Reconstructing program control flow | |
US9134973B2 (en) | Dynamic compiling and loading at runtime | |
Castanos et al. | On the benefits and pitfalls of extending a statically typed language JIT compiler for dynamic scripting languages | |
US20090328013A1 (en) | Componentization of compiler functionality | |
EP3084598B1 (en) | Execution guards in dynamic programming | |
US20240103821A1 (en) | Optimising computer program code | |
Fourtounis et al. | Deep static modeling of invokedynamic | |
Garcia et al. | Design and implementation of an efficient hybrid dynamic and static typing language | |
US11379195B2 (en) | Memory ordering annotations for binary emulation | |
US20210303283A1 (en) | Generating compilable machine code programs from dynamic language code | |
Ali et al. | Constructing call graphs of Scala programs | |
JP2013186647A (ja) | 難読化装置、難読化方法、及び難読化プログラム、並びに難読化されたソースコード | |
Mosaner et al. | Supporting on-stack replacement in unstructured languages by loop reconstruction and extraction | |
Ali et al. | Type-based call graph construction algorithms for Scala | |
Hu et al. | A static timing analysis environment using Java architecture for safety critical real-time systems | |
Mohan | Comparative Analysis Of JavaScript And WebAssembly In The Browser Environment | |
EP4196874A1 (en) | Representing asynchronous state machine in intermediate code | |
Snavely et al. | Unpredication, unscheduling, unspeculation: reverse engineering Itanium executables | |
Munsters et al. | Oron: Towards a dynamic analysis instrumentation platform for AssemblyScript |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20110712 |
|
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: 20110726 |
|
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20110811 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20140819 Year of fee payment: 3 |
|
LAPS | Cancellation because of no payment of annual fees |