JP5846581B2 - コードを投機的に最適化するための方法、並びにそのコンピュータ及びコンピュータ・プログラム - Google Patents
コードを投機的に最適化するための方法、並びにそのコンピュータ及びコンピュータ・プログラム Download PDFInfo
- Publication number
- JP5846581B2 JP5846581B2 JP2012099873A JP2012099873A JP5846581B2 JP 5846581 B2 JP5846581 B2 JP 5846581B2 JP 2012099873 A JP2012099873 A JP 2012099873A JP 2012099873 A JP2012099873 A JP 2012099873A JP 5846581 B2 JP5846581 B2 JP 5846581B2
- Authority
- JP
- Japan
- Prior art keywords
- dictionary
- key
- code
- value
- address
- 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
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又は複数の辞書を所定の順序で検索し、シンボル名をキーとして上記1又は複数の辞書から上記シンボル名に関連付けられたバリューを取り出すステップと、
コード中のシンボルを上記取り出されたバリューで置換する最適化を行って、上記最適化されたコードの全部又は一部を含むコンパイル対象のコードをコンパイルするステップと、
上記1又は複数の辞書のうちの1つの辞書に関する変化が検出されることに応じて、上記変化が検出された辞書の上記所定の順序における段数m(mは1以上の整数)を、上記取り出されたバリューを有する辞書の上記所定の順序における段数n(nは1以上の整数)と比較するステップと、
上記段数の比較の結果と上記変化の種類に応じて、上記変化が検出された辞書に関連付けられたコンパイル済みコードのうち、上記取り出されたバリューで置換する最適化によって最適化されたコードを無効化するステップと
を含む。上記コンパイルするステップにおいてコンパイル処理されたコードを、以下において「本発明に従うコンパイル済みコード」と言及し、上記コンパイルするステップ以外のコンパイル処理されたコードを、以下において「他のコンパイル済みコード」と言及する場合がある。
・段数m<段数nである場合に、上記辞書に関する変化が、キーの追加、キーの削除、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーがアドレスが変更される前の当該辞書のキーと一致しないこと;又は、
・段数m=段数nである場合に、上記辞書に関する変化が、キーの削除、異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された当該辞書のキー及びバリューが当該アドレスが変更される前の辞書のキー及びバリューの少なくとも一方と一致しないこと。
但し、上記辞書に関する変化の種類にかかわらず、段数m>段数nである場合には、上記無効化は禁止される。
・段数m<段数nである場合に、上記辞書に関する変化が、同じバリューでの若しくは異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーが当該アドレスが変更される前の当該辞書のキーと一致すること;
・段数m=段数nである場合に、上記辞書に関する変化が、キーの追加、同じバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキー及びバリューが当該アドレスが変更される前の当該辞書のキー及びバリューのいずれとも一致すること;又は、
・上記辞書に関する変化の種類にかかわらず、段数m>段数nであること。
キー及び当該キーに関連付けられたバリューの1又は複数の組を保持する1又は複数の辞書を所定の順序で検索し、シンボル名をキーとして上記1又は複数の辞書から上記シンボル名に関連付けられたバリューを取り出すバリュー取り出し部と、
コード中のシンボルを上記取り出されたバリューで置換する最適化を行って、上記最適化されたコードの全部又は一部を含むコンパイル対象のコードをコンパイルするコンパイル部と、
上記1又は複数の辞書のうちの1つの辞書に関する変化が検出されることに応じて、上記変化が検出された辞書の上記所定の順序における段数m(mは1以上の整数)を、上記取り出されたバリューを有する辞書の上記所定の順序における段数n(nは1以上の整数)と比較する比較部と、
上記段数の比較の結果と上記変化の種類に応じて、上記変化が検出された辞書に関連付けられたコンパイル済みコードのうち、上記取り出されたバリューで置換する最適化によって最適化されたコードを無効化する無効化部と
を備えている。
コンピュータ(201)は、図1に従うハードウェア構成を有しうる。コンピュータ(201)は、メモリ(202)、コンパイル部(203)、取り出し部(204)、最適化部(205)、実行部(206)、監視部(207)、比較部(208)、及び無効化部(209)を備えている。コンパイル部(203)は、取り出し部(204)及び最適化部(205)を包含しうる。メモリ(202)は、図1のメイン・メモリ(103)に対応しうる。記憶装置(210)は、図1のディスク(108)に対応しうる。また、コンピュータ(201)は記憶装置(210)を内蔵しているか、又は、コンピュータ(201)外にある記憶装置(210)に有線的に又は無線的に接続されうる。
(a)無効化する必要が起きた場合にコンパイル済みコードは使わずにインタプリタで実行する;
(b)無効化する必要が起きた場合に一度はインタプリタで実行し、次回の実行の際にバリューで置換する最適化を適用しないで再コンパイルを行い、当該再コンパイル済みコードを実行する;及び、
(c)最適化を行う際に、バリューで置換する最適化が予め適用されたコード、及びバリューで置換する最適化が適用されていないコードの両方を用意して、最初に最適化が予め適用された上記コードを実行し、次に、無効化する必要が生じた場合に、最適化が適用されてない上記コードを実行する。
辞書は、キー及び当該キーに関連付けられたバリューの1又は複数の組を有する。辞書は、例えばパイソン言語において定義されうる型でありうる。辞書は、他の言語において、連想記憶(associated memory)又は連想配列(associative array)という名前でも言及されうる。本発明でいう「辞書」は、連想記憶及び連想配列辞書、並びにキーでインデクス化されているその他の呼称で呼ばれうるものを包含する。
・辞書dの変化の種類が同じバリューでの更新である場合、コンピュータは、処理をステップ505に進める。
・辞書dの変化の種類がキーの追加、キーの削除、又は異なるバリューでの更新である場合、コンピュータは、処理をステップ506に進める。
・辞書dの変化の種類が辞書dのアドレスの変更である場合、コンピュータは、処理をステップ507に進める。
・段数m>段数nの場合、比較部(208)は、処理をステップ706に進める。
・段数m=段数nの場合、比較部(208)は、処理を図7Bに示すステップ721に進める。
・段数m<段数nの場合、比較部(208)は、処理を図7Cに示すステップ731に進める。
・辞書dの変化の種類がキーの追加又は同じバリューでの更新である場合、比較部(208)は、処理をステップ722に進める。
・辞書dの変化の種類がキーの削除又は異なるバリューでの更新である場合、比較部(208)は、処理をステップ723に進める。
・辞書dの変化の種類が辞書dのアドレスの変更である場合、コンピュータは、処理をステップ724に進める。
・変更後の辞書のキー及びバリューが元の辞書のキー及びバリューと完全一致しない場合、すなわち変更後の辞書のキー及びバリューが元の辞書のキー及びバリューの少なくとも一方と一致しない場合、比較部(208)は、処理をステップ725に進める。
・変更後の辞書のキー及びバリューが元の辞書のキー及びバリューと完全一致する場合、比較部(208)は、処理をステップ726に進める。
比較部(208)は、元の辞書のキーとバリューをメタデータ(213)から取得しうる。
・辞書dの変化の種類が同じバリューでの更新又は異なるバリューでの更新である場合、比較部(208)は、処理をステップ732に進める。
・辞書dの変化の種類がキーの追加又はキーの削除である場合、比較部(208)は、処理をステップ733に進める。
・辞書dの変化の種類が辞書dのアドレスの変更である場合、コンピュータは、処理をステップ734に進める。
・変更後の辞書のキーが元の辞書のキーと一致しない場合、比較部(208)は、処理をステップ735に進める。
・変更後の辞書のキーが元の辞書のキーと一致する場合、比較部(208)は、処理をステップ736に進める。
比較部(208)は、変更が検出された元の辞書のキーをメタデータ(213)から取得しうる。
・段数mが段数nよりも小さい場合に、当該辞書に関する変化が、キーの追加、キーの削除、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーがアドレスが変更される前の当該辞書のキーと一致しないこと;又は、
・段数mが段数nに等しい場合に、当該辞書に関する変化が、キーの削除、異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された当該辞書のキー及びバリューが当該アドレスが変更される前の辞書のキー及びバリューの少なくとも一方と一致しないこと。
但し、段数mが段数nよりも大きい場合には、当該辞書に関する変化の種類にかかわらず、上記変化が検出された辞書に関連付けられたコンパイル済みコードの無効化はされない。
・段数nが1である場合、すなわち、投機的に行った最適化が1段目(n=1)の辞書中のバリューを利用してシンボルの置換が行われた場合において、
・段数mが1である場合(m=n)に、当該辞書に関する変化が、キーの削除、又は、異なるバリューでの更新であること;、
・段数nが1よりも大きい段数である場合(n>1)、すなわち、投機的に行った最適化が1段目よりも後にある段数の辞書中のバリューを利用してシンボルの置換が行われた場合において、
・段数mが1〜n−1である場合(m=1〜n−1)に、当該辞書に関する変化が、キーの追加、又は、キーの削除であることこと;、
・段数mがnに等しい場合(m=n)に、当該辞書に関する変化が、キーの削除、又は、異なるバリューでの更新であること;、
・段数nが1又は1よりも大きい段数である場合(n>=1)、すなわち、投機的に行った最適化が1段目又は1段目よりも後にある段数の辞書中のバリューを利用してシンボルの置換が行われた場合において、
・段数mが1〜n−1である場合に(m=1〜n−1)、当該辞書に関する変化が、当該辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーがアドレスが変更される前の当該辞書のキーと一致しないこと;、又は、
・段数mがnに等しい場合(m=n)に、当該辞書に関する変化が、当該辞書のアドレスが変更されており且つアドレスが変更された当該辞書のキー及びバリューがアドレスが変更される前の当該辞書のキー及びバリューの少なくとも一方と一致しないこと。
但し、下記条件の場合には、上記変化が検出された辞書に関連付けられたコンパイル済みコードの無効化はされない。
・段数nが1である場合(n=1)において、
・当該辞書に関する変化の種類にかかわらず、段数mが2以上であること;、又は、
・段数nが1又は1よりも大きい段数である場合において、
・当該辞書のアドレスが変更されているか又は変更されていないかにかかわらず、段数mがn+1以上であること。
・段数mが1である場合に、グローバル変数又は関数の辞書に関する変化が、キーの削除、又は、異なるバリューでの更新であること;、又は、
・段数mが1である場合に、上記グローバル変数又は関数の辞書に関する変化が、当該辞書のアドレスが変更されており且つアドレスが変更された当該辞書のキー及びバリューがアドレスが変更される前の当該辞書のキー及びバリューの少なくとも一方と一致しないこと。
但し、下記条件の場合には、上記変化が検出された辞書に関連付けられたコンパイル済みコードの無効化はされない。
・ビルトイン変数又は関数の辞書に関する変化の種類にかかわらず、段数mが2であること。
・段数mが1である場合に、グローバル変数又は関数の辞書に関する変化が、キーの追加、又はキーの削除であること;
・段数mが2である場合に、ビルトイン変数又は関数の辞書に関する変化が、キーの削除、又は、異なるバリューでの更新であること;
・段数mが1である場合に、グローバル変数又は関数の辞書に関する変化が、当該辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーがアドレスが変更される前の当該辞書のキーと一致しないこと;又は、
・段数mが2である場合に、ビルトイン変数又は関数の辞書に関する変化が、当該辞書のアドレスが変更されており且つアドレスが変更された当該辞書のキー及びバリューがアドレスが変更される前の当該辞書のキー及びバリューの少なくとも一方と一致しないこと。
・段数mが段数nよりも小さい場合に、当該辞書に関する変化が、同じバリューでの若しくは異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーが当該アドレスが変更される前の当該辞書のキーと一致すること;
・段数mが段数nに等しい場合に、当該辞書に関する変化が、キーの追加、同じバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキー及びバリューが当該アドレスが変更される前の当該辞書のキー及びバリューのいずれとも一致すること;又は、
・当該辞書に関する変化の種類に関係無しに、段数mが段数nよりも大きいこと。
・段数nが1である場合(n=1)、すなわち投機的に行った最適化が1段目の辞書中のバリューを利用してシンボルの置換が行われた場合において、
・段数mが1である場合(m=n)に、当該辞書に関する変化が、キーの追加、又は、同じバリューでの更新であること;
・段数mが2以上である場合(m>n)に、当該辞書に関する変化が、キーの追加、キーの削除、又は、同じバリューでの若しくは異なるバリューでの更新であること;
・段数nが1よりも大きい段数である場合(n>1)、すなわち、投機的に行った最適化が1段目よりも後にある段数の辞書中のバリューを利用してシンボルの置換が行われた場合において、
・段数mが1〜n−1である場合(m=1〜n−1)に、当該辞書に関する変化が、同じバリューでの若しくは異なるバリューでの更新であること;
・段数mがnに等しい場合(m=n)に、当該辞書に関する変化が、キーの追加、又は、同じバリューでの更新であること;
・段数mがn+1以上である場合(m>=n+1)に、当該辞書に関する変化が、キーの追加、キーの削除、又は、同じバリューでの若しくは異なるバリューでの更新であること;
・段数nが1又は1よりも大きい段数である場合(n>=1)、すなわち、投機的に行った最適化が1段目又は1段目よりも後にある段数の辞書中のバリューを利用してシンボルの置換が行われた場合において、
・段数mが1〜n−1である場合(m=1〜n−1)に、当該辞書に関する変化が、当該辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーが当該アドレスが変更される前の当該辞書のキーと一致すること;
・段数mがn(m=n)に等しい場合に、当該辞書に関する変化が、当該辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキー及びバリューがアドレスが変更される前の当該辞書のキー及びバリューのいずれとも一致すること;又は、
・当該辞書のアドレスが変更されているか又は変更されていないかにかかわらず、段数mがn+1以上であること(m>=n+1)。
・段数mが1である場合に、グローバル変数又は関数の辞書に関する変化が、キーの追加、又は、同じバリューでの更新であること;
・段数mが2である場合に、ビルトイン変数又は関数の辞書に関する変化が、キーの追加、キーの削除、又は、同じバリューでの若しくは異なるバリューでの更新であること;
・段数mが1である場合に、グローバル変数又は関数の辞書に関する変化が、当該辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキー及びバリューがアドレスが変更される前の当該辞書のキー及びバリューのいずれとも一致すること;又は、
・ビルトイン変数又は関数の辞書のアドレスが変更されているか又は変更されていないかにかかわらず、段数mが2であること。
・段数mが1である場合に、グローバル変数又は関数の辞書に関する変化が、同じバリューでの若しくは異なるバリューでの更新であることこと;
・段数mが2である場合に、ビルトイン変数又は関数の辞書に関する変化が、キーの追加、又は、同じバリューでの更新であることこと;
・段数mが1である場合に、グローバル変数又は関数の辞書に関する変化が、当該辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーが当該アドレスが変更される前の当該辞書のキーと一致すること;又は、
・段数mが2である場合に、ビルトイン変数又は関数の辞書に関する変化が、当該辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキー及びバリューがアドレスが変更される前の当該辞書のキー及びバリューのいずれとも一致すること。
上記態様は、ビルトイン関数「abs」の飛び先(すなわち呼び出し先)を「x:0」の飛び先に書き換えた例である。
符号801で示される図は、ビルトイン関数の辞書(211)において、関数「abs」が当該辞書(211)にキーとして追加された後の辞書を示す(05〜10行)。
04行は、ビルトイン関数のキーを表示するコマンドが入力されていることを示す。
05行は、キー「abs」が追加されていることを示す。
13行は、キー「abs」の飛び先をオリジナルから「x:0」に書き換えたことを示す。
符号811及び符号812でそれぞれ示される図は、ビルトイン関数の辞書中のキー及びバリューを示す。
符号811で示される図は、ビルトイン関数の辞書中にキー「abs」が存在していること、及びキーの飛び先がオリジナルであることを示す。
符号812で示される図は、ビルトイン関数の辞書を書き換えることによって上記ビルトイン関数の飛び先がオリジナルから「x:0」に書き換えられていることを示す。
上記態様は、空の辞書に、グローバル変数「abs」で「999」を入れた例である。
符号821で示される図は、グローバル変数で図8Aにおいて追加したキー「abs」を、同じ名前で宣言するように書き換える態様を示す。
06行は、キー「abs」をグローバル変数で宣言していることを示す。
07行は、当該キーに関連付けられたバリューとして「999」を入れたことを示す。
符号831及び符号832でそれぞれ示される図は、グローバル変数の辞書中のキー及びバリューを示す。
符号831で示される図は、キー及び当該キーに関連付けられたバリューが無い状態(空の辞書)を示す。
符号832で示される図は、上記06及び07行に示すコマンドによって、キーとして「abs」及び当該キーに関連付けられたバリューとして「999」がグローバル変数の辞書中に格納されたことを示す。
以下のコード(901〜906)では、複数の辞書がグローバル変数の辞書とビルトイン関数の辞書であるとする。コード(901〜906)では、投機的に行った最適化がグローバル変数の値の定数化、すなわちコード中のグローバル変数を辞書から取り出したバリューで置換して定数で扱うことであったとする。コード(901〜906)では、投機的に行った最適化がビルトイン関数の呼び出し先の静的決定、すなわち当該コード(901〜906)中のビルトイン関数の飛び先(すなわち呼び出し先)を辞書から取り出したバリューで置換して定数として扱うことであったとする。
従来の実施態様に従うと(図5及び図6を参照)、コード(901〜906)において、当該コード(901〜906)中のメソッドfoo()のコンパイル済みコードが無効化されるために、上記メソッドfoo()のコンパイル済みコードを実行し続けることができなかった。一方、本発明の実施態様に従うと(図6、図7A〜図7Cを参照)、上記メソッドfoo()のコンパイル済みコードが特定の条件下においてのみ無効化されるために、すなわち特定の条件下において上記メソッドfoo()のコンパイル済みコードの無効化が禁止されるために、コード(901〜906)中のメソッドfoo()のコンパイル済みコードを実行し続けることができる。
1行目でg=1というキーを新しく追加し、11行目でfoo()を100回実行し、3行目のメソッドfoo()に飛び、4行目でgを呼び出す。メソッドfoo()の100回目の呼び出し時に、メソッドfoo()がコンパイルされてコンパイル済みコードが生成されるものとする。次に、12行目に飛んで、6行目のメソッドbar()に飛び実行する。そして、8行目においてグローバル変数の辞書(1段目の辞書、m)にhというシンボルのキーを追加し、バリューとして−1を設定する。従って、上記例では、m=nであり、且つグローバル変数の辞書にhのキーが追加されただけなのでコードの無効化は行われずに、コード(901)中のメソッドfoo()のコンパイル済みコードを実行し続けることができる(図7Bのステップ722)。
1行目でg=1というキーを新しく追加し、10行目でfoo()を100回実行し、3行目のメソッドfoo()に飛び、4行目でgを呼び出す。メソッドfoo()の100回目の呼び出し時に、メソッドfoo()がコンパイルされてコンパイル済みコードが生成されるものとする。次に、11行目に飛んで、6行目のメソッドbar()に飛び実行する。そして、7行目においてビルトイン関数の辞書(2段目の辞書、m)に、キーとして「abs」、及び当該キーに関連付けられたバリューとして飛び先である(x:0)で更新することを示す。従って、上記例では、m>nであり、且つビルトイン関数の辞書に存在するキーに対応するバリューが更新されただけなのでコードの無効化は行われずに、コード(902)中のメソッドfoo()のコンパイル済みコードを実行し続けることができる(図7Aのステップ706)。
8行目でbar()を100回実行し、2行目のbar()というメソッド中に5行目のexecというメソッドがあり、sと言う文字列に渡されたプログラムを実行する。メソッドfoo()の100回目の呼び出し時に、メソッドfoo()がコンパイルされてコンパイル済みコードが生成されるものとする。この際にグローバル変数の辞書(1段目の辞書、m)として5行目のinの後ろにある辞書gdicを渡す。3行目に見られるように、gdicはgがキーであり、1が当該キーgに関連付けられたバリューとして取り出される。3行目が実行される度に新しい辞書が作られるので辞書gdicのアドレスが変わり、5行目で実行されるfoo()に渡されるグローバル変数の辞書のアドレスは毎回異なる。しかし、gdicのエントリはキーがgであり且つバリューが1のまま変更されない。よって、辞書gdicのアドレスが変更されるが、変更後の辞書gdicのキー及びバリューは、元の辞書gdicのキー及びバリューといずれとも一致する。従って、上記例では、m=nであり、且つ辞書のアドレスが変更されるが、変更後の辞書のキー及びバリューは元の辞書のキー及びバリューといずれとも一致するので、コードの無効化は行われずに、コード(903)中のメソッドfoo()のコンパイル済みコードを実行し続けることができる(図7Bのステップ726)。
1行目でg=1というキーを新しく追加し、10行目でfoo(1)を100回実行し、3行目のメソッドfoo()に飛び、4行目でビルトイン関数abs()を呼ぶ。メソッドfoo()の100回目の呼び出し時に、メソッドfoo()がコンパイルされてコンパイル済みコードが生成されるものとする。次に、7行目においてグローバル変数の辞書(1段目の辞書、m)において、gというシンボルのキーのバリューを−1で置き換える。従って、上記例では、m<nであり、且つグローバル変数の辞書にgのバリューが更新されただけなのでコードの無効化は行われずに、コード(904)中のメソッドfoo()のコンパイル済みコードを実行し続けることができる(図7Cのステップ732)。
8行目でfoo(1)を100回実行し、2行目のメソッドfoo()に飛び、3行目でビルトイン関数abs()を呼ぶ。メソッドfoo()の100回目の呼び出し時に、メソッドfoo()がコンパイルされてコンパイル済みコードが生成されるものとする。次に、9行目に飛んで、5行目のメソッドbar()に飛び実行する。そして、5行目においてビルトイン関数の辞書(2段目の辞書、m)に、キーとして「abc」、及び当該キーに関連付けられたバリューとして飛び先である(x:0)を追加することを示す。従って、上記例では、m=nであり、且つビルトイン関数の辞書にキーが追加されただけなのでコードの無効化は行われずに、コード(905)中のメソッドfoo()のコンパイル済みコードを実行し続けることができる(図7Bのステップ722)。
8行目でbar(1)を100回実行し、2行目のbar()というメソッド中に5行目のexecというメソッドがあり、sと言う文字列に渡されたプログラムを実行する。メソッドfoo()の100回目の呼び出し時に、メソッドfoo()がコンパイルされてコンパイル済みコードが生成されるものとする。この際にグローバル変数の辞書(1段目の辞書、m)として5行目のinの後ろにある辞書gdicを渡す。4行目にあるint()メソッドがビルトイン関数(2段目の辞書、n)である。3行目が実行される度に新しい辞書が作られるので辞書gdicのアドレスが変わり、5行目で実行されるfoo()に渡されるグローバル変数の辞書のアドレスは毎回異なる。5行目で実行されるfoo()に渡されるグローバル変数の辞書のアドレスは毎回異なる。3行目に見られるように、gdicはgがキーであり、xが当該キーgに関連付けられたバリューとして取り出されるバリューである。当該xは変数なので前回と違うかも知れないが、3行目でキーはgで常に一致している。従って、上記例では、m<nであり、且つ辞書のアドレスが変更されるが、変更後の辞書のキーが元の辞書のキーと一致するので、コードの無効化は行われずに、コード(906)中のメソッドfoo()のコンパイル済みコードを実行し続けることができる(図7Cのステップ736)。
パイソンの処理系において、本発明を適用した場合と、本発明を適用しない場合とを比較する実験を行った。その結果、本発明を適用した場合に本発明を適用しない場合と比べて、実行時間を34.2%高速化することができた。測定験環境は下記の通りである。
・対象プログラムは、Unladen swallow benchmark(非特許文献7を参照)のdjango(150x150 cellのhtml tableを生成)を、Facebook(登録商標)が開発しているTornadoというweb framework (非特許文献8を参照)へポーティングしたものである。
・実行環境は、CPUがx86 Westmere-EP(インテル社(登録商標)) 2.93GHzであり、オペレーティング・システムがRed Hat Enterprise Linux 6.0である。
・更新されることが少ないグローバル変数(非特許文献1を参照)を、定数としてコンパイルすること;及び、
・ビルトイン関数の呼び出しの際に、飛び先アドレスの決定の高速化。
Claims (20)
- コードを投機的に最適化するための方法であって、コンピュータが、
キー及び当該キーに関連付けられたバリューの1又は複数の組を保持する1又は複数の辞書を所定の順序で検索し、シンボル名をキーとして前記1又は複数の辞書から前記シンボル名に関連付けられたバリューを取り出すステップと、
コード中のシンボルを前記取り出されたバリューで置換する最適化を行って、前記最適化されたコードの全部又は一部を含むコンパイル対象のコードをコンパイルするステップと、
前記1又は複数の辞書のうちの1つの辞書に関する変化が検出されることに応じて、前記変化が検出された辞書の前記所定の順序における段数m(mは1以上の整数)を、前記取り出されたバリューを有する辞書の前記所定の順序における段数n(nは1以上の整数)と比較するステップと、
前記段数の比較の結果と前記変化の種類に応じて、前記変化が検出された辞書に関連付けられたコンパイル済みコードのうち、前記取り出されたバリューで置換する最適化によって最適化されたコードを無効化するステップと
を実行することを含む、前記方法。 - 前記辞書に関する変化が、キーの追加、キーの削除、同じバリューでの若しくは異なるバリューでの更新、又は、辞書アドレスの変更である、請求項1に記載の方法。
- 前記無効化するステップが、
前記段数mが前記段数nよりも小さい場合に、前記辞書に関する変化が、キーの追加、キーの削除、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーがアドレスが変更される前の当該辞書のキーと一致しないこと;又は、
前記段数mが前記段数nに等しい場合に、前記辞書に関する変化が、キーの削除、異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された当該辞書のキー及びバリューが当該アドレスが変更される前の辞書のキー及びバリューの少なくとも一方と一致しないこと;
の条件下で前記無効化を行う、請求項2に記載の方法。 - 前記コンピュータが、
前記段数nを記録するステップ
をさらに実行するステップを含む、請求項3に記載の方法。 - 前記段数nを記録するステップが、
前記段数n、当該段数nまでの前記辞書が有するキー及びバリューの組、並びに、前記段数nまでの前記辞書のアドレスを、前記コンパイル済みコードに関連付けられたデータとして保存するステップ
をさらに含む、請求項4に記載の方法。 - 前記比較するステップが、
前記変化が検出された辞書に関連付けられたコンパイル済みコードを特定するステップと、
前記コンパイル済みコードに関連付けられた前記データから、前記段数nを取り出すステップと
をさらに含む、請求項5に記載の方法。 - 前記無効化するステップが、
前記特定されたコンパイル済みコードに関連付けられた前記データから、キー、バリュー若しくは辞書のアドレス、又はその組み合わせを取り出すステップ
をさらに含む、請求項5又は6に記載の方法。 - 前記コンパイルするステップの後において、前記コンパイル済みコードの実行中又は前記コンパイルするステップにおいてコンパイルされていないコードの実行中に、前記比較するステップ及び前記無効化するステップが実行される、請求項1〜7のいずれか一項に記載の方法。
- 前記シンボルを前記取り出されたバリューで置換する最適化が、前記1又は複数の辞書を参照することによってバリューが決定されるコード中のシンボルを対象に行われる、請求項1〜8のいずれか一項に記載の方法。
- 前記コンピュータが、
前記コンパイル済みコードを、当該コンパイル済みコードのコンパイル中の最適化において使用されたバリューが取り出された辞書に関連付けるステップ
をさらに実行するステップを含む、請求項1〜8のいずれか一項に記載の方法。 - 前記コンピュータが、
前記1又は複数の辞書のうちの前記検索のために参照された辞書、すなわちn段目までの辞書に関する変化又は前記1又は複数の辞書の全てに関する変化の監視を開始するステップ
をさらに実行するステップを含む、請求項1〜10のいずれか一項に記載の方法。 - 前記コンピュータが、前記無効化するステップの後に、
前記1又は複数の辞書のうちの1つの辞書に関する変化が検出されるたびに、前記比較するステップと前記無効化するステップとを繰り返すステップ
をさらに実行するステップを含む、請求項1〜11のいずれか一項に記載の方法。 - 前記無効化するステップが、
前記段数mが前記段数nよりも小さい場合に、前記辞書に関する変化が、同じバリューでの若しくは異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーが当該アドレスが変更される前の当該辞書のキーと一致すること;
前記段数mが前記段数nに等しい場合に、前記辞書に関する変化が、キーの追加、同じバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキー及びバリューが当該アドレスが変更される前の当該辞書のキー及びバリューのいずれとも一致すること;又は、
前記辞書に関する変化の種類にかかわらず、前記段数mが前記段数nよりも大きい場合であること
の条件下で前記無効化を禁止する、請求項2又は3に記載の方法。 - 前記複数の辞書が、グローバル変数又は関数の辞書とビルトイン変数又は関数の辞書とを含み、
前記所定の順序が段数1がグローバル変数又は関数の辞書であり、段数2がビルトイン変数又は関数の辞書であり、前記所定の順序は段数1が段数2よりも優先する、請求項1〜13のいずれか一項に記載の方法。 - 前記コードがパイソン(Python)に従い記述されたコードである、請求項14に記載の方法。
- コードを投機的に最適化するためのコンピュータであって、
キー及び当該キーに関連付けられたバリューの1又は複数の組を保持する1又は複数の辞書を所定の順序で検索し、シンボル名をキーとして前記1又は複数の辞書から前記シンボル名に関連付けられたバリューを取り出すバリュー取り出し部と、
コード中のシンボルを前記取り出されたバリューで置換する最適化を行って、前記最適化されたコードの全部又は一部を含むコンパイル対象のコードをコンパイルするコンパイル部と、
前記1又は複数の辞書のうちの1つの辞書に関する変化が検出されることに応じて、前記変化が検出された辞書の前記所定の順序における段数m(mは1以上の整数)を、前記取り出されたバリューを有する辞書の前記所定の順序における段数n(nは1以上の整数)と比較する比較部と、
前記段数の比較の結果と前記変化の種類に応じて、前記変化が検出された辞書に関連付けられたコンパイル済みコードのうち、前記取り出されたバリューで置換する最適化によって最適化されたコードを無効化する無効化部と
を備えている、前記コンピュータ。 - 前記辞書に関する変化が、キーの追加、キーの削除、同じバリューでの若しくは異なるバリューでの更新、又は、辞書アドレスの変更である、請求項16に記載のコンピュータ。
- 前記無効化部が、
前記段数mが前記段数nよりも小さい場合に、前記辞書に関する変化が、キーの追加、キーの削除、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーがアドレスが変更される前の当該辞書のキーと一致しないこと;又は、
前記段数mが前記段数nに等しい場合に、前記辞書に関する変化が、キーの削除、異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された当該辞書のキー及びバリューが当該アドレスが変更される前の辞書のキー及びバリューの少なくとも一方と一致しないこと
の条件下で前記無効化を行う、請求項17に記載のコンピュータ。 - 前記無効化部が、
前記段数mが前記段数nよりも小さい場合に、前記辞書に関する変化が、同じバリューでの若しくは異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーが当該アドレスが変更される前の当該辞書のキーと一致すること;
前記段数mが前記段数nに等しい場合に、前記辞書に関する変化が、キーの追加、同じバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキー及びバリューが当該アドレスが変更される前の当該辞書のキー及びバリューのいずれとも一致すること;又は、
前記辞書に関する変化の種類にかかわらず、前記段数mが前記段数nよりも大きい場合であること
の条件下で前記無効化を禁止する、請求項17又は18に記載のコンピュータ。 - コードを投機的に最適化するためのコンピュータ・プログラムであって、コンピュータに、請求項1〜15のいずれか一項に記載の方法の各ステップを実行させるコンピュータ・プログラム。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2012099873A JP5846581B2 (ja) | 2012-04-25 | 2012-04-25 | コードを投機的に最適化するための方法、並びにそのコンピュータ及びコンピュータ・プログラム |
US13/836,369 US9027008B2 (en) | 2012-04-25 | 2013-03-15 | Method, computer, and computer program for speculatively optimizing code |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2012099873A JP5846581B2 (ja) | 2012-04-25 | 2012-04-25 | コードを投機的に最適化するための方法、並びにそのコンピュータ及びコンピュータ・プログラム |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2013228845A JP2013228845A (ja) | 2013-11-07 |
JP5846581B2 true JP5846581B2 (ja) | 2016-01-20 |
Family
ID=49478522
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2012099873A Expired - Fee Related JP5846581B2 (ja) | 2012-04-25 | 2012-04-25 | コードを投機的に最適化するための方法、並びにそのコンピュータ及びコンピュータ・プログラム |
Country Status (2)
Country | Link |
---|---|
US (1) | US9027008B2 (ja) |
JP (1) | JP5846581B2 (ja) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9176845B2 (en) * | 2010-03-19 | 2015-11-03 | Red Hat, Inc. | Use of compiler-introduced identifiers to improve debug information pertaining to user variables |
US10353679B2 (en) * | 2014-10-31 | 2019-07-16 | Microsoft Technology Licensing, Llc. | Collecting profile data for modified global variables |
US9256406B1 (en) * | 2015-01-20 | 2016-02-09 | The Mathworks, Inc. | Graphically scoped C-functions inside stateflow |
CN108037926B (zh) * | 2017-12-26 | 2020-05-05 | 网易(杭州)网络有限公司 | 字节码的优化方法、装置、存储介质、处理器及终端 |
JP6950634B2 (ja) * | 2018-07-03 | 2021-10-13 | オムロン株式会社 | 制御装置および制御方法 |
Family Cites Families (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5475851A (en) * | 1986-04-14 | 1995-12-12 | National Instruments Corporation | Method and apparatus for improved local and global variable capabilities in a graphical data flow program |
US5790861A (en) * | 1995-07-07 | 1998-08-04 | Sun Microsystems, Inc. | Method and apparatus for generating executable code from object-oriented C++ source code |
US5784553A (en) * | 1996-01-16 | 1998-07-21 | Parasoft Corporation | Method and system for generating a computer program test suite using dynamic symbolic execution of JAVA programs |
JPH11154094A (ja) * | 1997-11-25 | 1999-06-08 | Sony Corp | 演算方法および装置、並びに伝送媒体 |
GB2381358A (en) * | 2000-08-15 | 2003-04-30 | Seagate Technology Llc | Dual mode data compression for operating code |
US20030033594A1 (en) * | 2001-01-29 | 2003-02-13 | Matt Bowen | System, method and article of manufacture for parameterized expression libraries |
US7093231B2 (en) * | 2003-05-06 | 2006-08-15 | David H. Alderson | Grammer for regular expressions |
JP4093484B2 (ja) | 2004-01-28 | 2008-06-04 | インターナショナル・ビジネス・マシーンズ・コーポレーション | コンパイラ、コンパイル方法、コンパイルプログラム、及び記録媒体 |
JP2006107339A (ja) * | 2004-10-08 | 2006-04-20 | Matsushita Electric Ind Co Ltd | プログラム処理装置 |
US7284167B2 (en) * | 2005-01-24 | 2007-10-16 | Spansion Llc | Automated tests for built-in self test |
US8666928B2 (en) * | 2005-08-01 | 2014-03-04 | Evi Technologies Limited | Knowledge repository |
US8739137B2 (en) * | 2006-10-19 | 2014-05-27 | Purdue Research Foundation | Automatic derivative method for a computer programming language |
JP2008102748A (ja) | 2006-10-19 | 2008-05-01 | Hitachi Ltd | プログラム実行方法、言語処理系、及び実行時ルーチン |
US9146759B2 (en) * | 2010-07-30 | 2015-09-29 | Apple Inc. | Assumption-based compilation |
US8732660B2 (en) * | 2011-02-02 | 2014-05-20 | Novell, Inc. | User input auto-completion |
-
2012
- 2012-04-25 JP JP2012099873A patent/JP5846581B2/ja not_active Expired - Fee Related
-
2013
- 2013-03-15 US US13/836,369 patent/US9027008B2/en not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
US20130290942A1 (en) | 2013-10-31 |
US9027008B2 (en) | 2015-05-05 |
JP2013228845A (ja) | 2013-11-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8972960B2 (en) | Optimization of an application to reduce local memory usage | |
US8997040B2 (en) | Variable closure | |
JP5602597B2 (ja) | 外来情報を区分けすることにより仮想マシン・コードをメモリ最適化する方法、コンピュータ・プログラム、およびシステム | |
US9530006B2 (en) | Method and system for performing a memory safety check of a program written in an unmanaged programming language | |
US9128723B2 (en) | Method and apparatus for dynamic document object model (DOM) aware code editing | |
JP5846581B2 (ja) | コードを投機的に最適化するための方法、並びにそのコンピュータ及びコンピュータ・プログラム | |
US20120030653A1 (en) | Assumption-based compilation | |
JP6418696B2 (ja) | 命令セットシミュレータおよびそのシミュレータ生成方法 | |
Schulte et al. | Repairing COTS router firmware without access to source code or test suites: A case study in evolutionary software repair | |
US20160274878A1 (en) | Methods and systems for removing plt stubs from dynamically linked binaries | |
US20100218174A1 (en) | Dynamic compiling and loading at runtime | |
CN110058861B (zh) | 源码处理方法及装置、存储介质、电子设备 | |
US9098355B2 (en) | Method and apparatus for substituting compiler built-in helper functions with machine instructions | |
JP5536593B2 (ja) | 最適化装置、最適化方法およびコンパイラ・プログラム | |
US10922107B2 (en) | Apparatus and method for realizing runtime system for programming language | |
US8898625B2 (en) | Optimized storage of function variables | |
Blyth et al. | ProIO: An event-based I/O stream format for protobuf messages | |
US20150178075A1 (en) | Enhancing understandability of code using code clones | |
JP2000222219A (ja) | 多次元配列オブジェクトの処理方法及び装置 | |
JP6770335B2 (ja) | 解析装置及びプログラム | |
CN107239395B (zh) | 一种源代码中无效函数的查找方法和设备 | |
JP2008102748A (ja) | プログラム実行方法、言語処理系、及び実行時ルーチン | |
Mehta et al. | Reusing Just-in-Time Compiled Code | |
JP2024118113A (ja) | コンパイラ依存性抽出装置およびソースコード解析システム | |
Jenke et al. | Towards Generic Malware Unpacking: A Comprehensive Study on the Unpacking Behavior of Malicious Run-Time Packers |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20141001 |
|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20151014 |
|
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: 20151026 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20151028 |
|
RD14 | Notification of resignation of power of sub attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7434 Effective date: 20151028 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20151117 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 5846581 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
LAPS | Cancellation because of no payment of annual fees |