JP5846581B2 - コードを投機的に最適化するための方法、並びにそのコンピュータ及びコンピュータ・プログラム - Google Patents

コードを投機的に最適化するための方法、並びにそのコンピュータ及びコンピュータ・プログラム Download PDF

Info

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
Application number
JP2012099873A
Other languages
English (en)
Other versions
JP2013228845A (ja
Inventor
一明 石崎
一明 石崎
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP2012099873A priority Critical patent/JP5846581B2/ja
Priority to US13/836,369 priority patent/US9027008B2/en
Publication of JP2013228845A publication Critical patent/JP2013228845A/ja
Application granted granted Critical
Publication of JP5846581B2 publication Critical patent/JP5846581B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

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

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

本発明はコードを最適化する技法に関し、特には、本発明はコードを投機的に最適化し、当該最適化されたコードのコンパイル済みコードが特定の条件下において無効化されるのを防止するための方法、並びにそのコンピュータ、コンピュータ・プログラム及びコンピュータ・プログラム製品に関する。
ローカル(local)変数と、グローバル(global)変数又は関数とを持つプログラム言語において、グローバル変数又は関数が更新される頻度がグローバル変数又は関数以外の他の変数又は関数(ローカル変数を含む)と比べて少ないという挙動が知られている(下記非特許文献1を参照)。この挙動を利用して、グローバル変数又は関数をコンパイル時の値を用いて定数とし、当該定数としたコードを投機的(speculative)に最適化し、当該最適化されたコードのコンパイル済みコードを実行し、当該実行時において定数とした値が変更された可能性がある場合に当該コンパイル済みコードを無効化する、という技術がある(下記非特許文献2を参照)。
パイソン(Python)言語は、Linux(登録商標)、Mac OS X(登録商標)、Windows(登録商標)などの、ほとんどのオペレーティング・システム上で実行することが可能である。また、パイソン言語は、Google(登録商標)やNASA(アメリカ航空宇宙局)の内部で利用されているという実績がある。それら理由の故に、パイソン言語は、世界的に利用者が増えている勢いのある言語である。
パイソン言語では、構文スコープ(lexical scope)での検索順序が、ローカル変数、外側の(エンクロージング)関数、グローバル(global)変数又は関数、次にビルトイン(Built-in)変数又は関数となっている(非特許文献3を参照)。構文スコープは静的スコープ(static scope)とも呼ばれ、構文上で決定できるスコープのみを使用する方法である。上記順序での検索、すなわちグローバル変数又は関数の辞書(dictionary)、次にビルトイン変数又は関数の辞書の順序での検索は、1バイトコード命令(LOAD_GLOBAL)で行われる(下記非特許文献4を参照)。従って、LOAD_GLOBAL命令に対して上記した無効化技術を適用すると、(1)グローバル変数又は関数の値の定数化(「定数伝播」(constant propagation)ともいう)、及び、(2)ビルトイン変数又は関数の呼出先の静的決定とコード特殊化(「code specialization」ともいう)、の2つの場合の最適化において投機的に最適化が可能である。一方、コンパイル済みコードに関連するグローバル変数又は関数の辞書又はビルトイン変数又は関数の辞書のいずれかが更新された場合に、コンパイル済みコードが無効化される(下記非特許文献2を参照)。
パイソン言語において、exec文はパイソン・コードの動的な実行をサポートする。exec文で、グローバル変数又は関数の辞書を渡して任意の文(statements)を実行することが可能である(下記非特許文献5を参照)。従って、渡されるグローバル変数又は関数の辞書のアドレスが変更された場合においても、上記定数とした値が更新された可能性があるので、最適化されたコードのコンパイル済みコードが無効化される。
下記特許文献1は、最適化の対象プログラムにおいて、変数の内容又は変数により指定される記憶領域の内容を更新する更新命令を検出する更新命令検出部と、前記対象プログラムにおいて、他の命令列に制御を移す制御移行命令により制御が移行されて、前記変数の内容又は前記記憶領域の内容に応じて異なる処理を行う命令列を検出する命令列検出部と、検出した当該命令列を、前記変数の内容又は前記記憶領域の内容が予め定められた特定の内容である場合の処理に最適化してコンパイルする命令列コンパイル部と、前記対象プログラムにおける、前記更新命令から前記制御移行命令までの間に、前記変数の内容又は前記記憶領域の内容が前記特定の内容である場合に実行され、前記制御移行命令の移行先アドレスを、前記命令列コンパイル部により最適化された前記命令列のアドレスに設定する設定命令を生成する設定命令生成部とを備える最適化コンパイラを記載する(請求項1)。すなわち、特許文献1では、複数の記憶領域(変数、配列)が更新されたかどうかを検出して、再コンパイルなどの動作を行う。
下記特許文献2は、変数名を通じて変数の値を上書きする機能を原因とする最適化の抑止を回避し,プログラムの実行を高速化することが可能なプログラム実行方法、言語処理系、及び実行時ルーチンを提供することを目的とし(段落0015)、記憶部と処理部とを有する計算機システムにおいて、前記記憶部に記憶した言語処理系のプログラムを使って、前記記憶部に記憶した実行対象のプログラムを実行するプログラム実行方法であって、前記実行対象のプログラムを、前記言語処理系の動的コンパイラを使って、前記記憶部の所定領域に記憶している変数の保持する値が不変であると仮定して最適化を適用し、前記言語処理系の実行時ルーチンを使って,前記実行対象のプログラムが、前記所定領域を、前記所定領域に対応する変数名を通じて上書きしうるか監視し、前記上書きの可能性が生じた場合に,前記動的コンパイラが前記所定領域に対応する前記変数の保持する値が不変と仮定して最適化を適用しつつ生成したコードを無効化するプログラム実行方法(請求項1)を記載する。すなわち、特許文献2では、変数の集合に属する値が上書きされたかどうかに基づいて、最適化を適用したコードを無効化するかどうかを決定する。
特開2005−215830号公報 特開2008−102748号公報
Alex Holkner et al.,"Evaluating the dynamic behaviour of Python applications.", In Proceedings of the Thirty-Second Australasian Conference on Computer Science, Volume 91, pp.19-28, 2009. "Issue 109043: Optimize LOAD_GLOBAL - Code Review"、インターネット〈http://codereview.appspot.com/109043/〉 "9.2. Python Scopes and Namespaces"、Python v2.7.3 documentation、インターネット〈http://docs.python.org/tutorial/classes.html〉、対応日本語文献は下記URLより入手可能〈http://www.python.jp/doc/2.4/tut/node11.html〉 "dis/inspectモジュールとceval.cを使ったPythonのハッキング"、インターネット〈http://www.nasuinfo.or.jp/FreeSpace/kenji/sf/python/virtualMachine/PyVM.htm#functionCall〉 "6.14 The exec statement"、Python Reference Manual、インターネット〈http://docs.python.org/release/2.5.2/ref/exec.html〉、対応日本語文献は下記URLより入手可能〈http://www.python.jp/doc/2.5/ref/exec.html〉 "Dictionary Objects"、Python v2.6.5c2 documentation、インターネット〈http://www.python.org/doc//current/c-api/dict.html〉、対応日本語文献は下記URLより入手可能〈http://www.python.jp/doc/nightly/c-api/dict.html〉 "Benchmarks - unladen-swallow"、インターネット〈http://code.google.com/p/unladen-swallow/wiki/Benchmark〉 "Tornado"、インターネット〈http://www.tornadoweb.org/〉
グローバル変数又は関数の辞書とビルトイン変数又は関数の辞書全て、すなわちこれら辞書本体全てとそれらの中にあるキーとバリュー(value)の変更を全て監視し、あるキー又はあるバリューが変更された場合に、当該変更された辞書に関連付けられたコンパイル済みコードだけを無効化すれば、投機的最適化(speculative optimization)の機会を失うことはない。しかし、上記辞書全ての変更を監視し且つ無効化するには、コストが高すぎて、実用的ではない。
パイソン言語において、非特許文献2では、グローバル変数又は関数の辞書又はビルトイン変数又は関数の辞書のいずれかが更新された場合に、キー又はバリューのいずれかの変更にかかわらず、コンパイル済みコードが無効化される。しかしながら、特定の条件下において上記辞書が更新された場合において、コンパイル済みコードを無効化する必要がない場合があるということを考慮していない。従って、上記無効化の方法では、性能改善の余地が失われている。
また、パイソン言語において、コードに渡されるグローバル変数又は関数の辞書のアドレスが更新された場合に、コンパイル済みコードが常に無効化されている(非特許文献2を参照)。しかしながら、特定の条件下においてアドレスの更新がされた場合において、コンパイル済みコードを無効化する必要がない場合があるということを考慮していない。従って、上記無効化の方法では、性能改善の余地が失われている。
従って、本発明は、コンパイル済みコードを無効化する必要がない場合にまで無効化されることを防止し、それによって性能改善を図ることを目的とする。
本発明はコードを投機的に最適化するための技法であり、当該技法は、上記課題を解決するために、1又は複数の辞書を所定の順序で検索し、シンボル名をキーとして上記辞書からシンボル名に関連付けられたバリューを取り出し、当該取り出されたバリューでコード中のシンボルを置換する最適化を行い、当該最適化されたコードの全部又は一部を含むコンパイル対象のコードをコンパイルすること、当該コンパイルが行われた後に、上記辞書中の1つの辞書に関する変化が検出されることに応じて、当該変化が検出された辞書の段数m(mは1以上の整数)を当該取り出されたバリューを有する辞書の段数n(nは1以上の整数)と比較すること、そして上記段数の比較の結果と上記変化の種類に応じて、上記変化が検出された辞書に関連付けられたコンパイル済みコードのうち、上記取り出されたバリューで置換する最適化によって最適化されたコードを無効化すること、を特徴とする。
本発明はコードを投機的に最適化するための方法を提供し、当該方法は、
キー及び当該キーに関連付けられたバリューの1又は複数の組を保持する1又は複数の辞書を所定の順序で検索し、シンボル名をキーとして上記1又は複数の辞書から上記シンボル名に関連付けられたバリューを取り出すステップと、
コード中のシンボルを上記取り出されたバリューで置換する最適化を行って、上記最適化されたコードの全部又は一部を含むコンパイル対象のコードをコンパイルするステップと、
上記1又は複数の辞書のうちの1つの辞書に関する変化が検出されることに応じて、上記変化が検出された辞書の上記所定の順序における段数m(mは1以上の整数)を、上記取り出されたバリューを有する辞書の上記所定の順序における段数n(nは1以上の整数)と比較するステップと、
上記段数の比較の結果と上記変化の種類に応じて、上記変化が検出された辞書に関連付けられたコンパイル済みコードのうち、上記取り出されたバリューで置換する最適化によって最適化されたコードを無効化するステップと
を含む。上記コンパイルするステップにおいてコンパイル処理されたコードを、以下において「本発明に従うコンパイル済みコード」と言及し、上記コンパイルするステップ以外のコンパイル処理されたコードを、以下において「他のコンパイル済みコード」と言及する場合がある。
本発明の1つの実施態様において、上記辞書に関する変化が、キーの追加、キーの削除、同じバリューでの若しくは異なるバリューでの更新、又は、辞書アドレスの変更でありうる。
本発明の1つの実施態様において、上記無効化が、以下の条件のいずれかを満たす場合に行われる:
・段数m<段数nである場合に、上記辞書に関する変化が、キーの追加、キーの削除、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーがアドレスが変更される前の当該辞書のキーと一致しないこと;又は、
・段数m=段数nである場合に、上記辞書に関する変化が、キーの削除、異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された当該辞書のキー及びバリューが当該アドレスが変更される前の辞書のキー及びバリューの少なくとも一方と一致しないこと。
但し、上記辞書に関する変化の種類にかかわらず、段数m>段数nである場合には、上記無効化は禁止される。
本発明の1つの実施態様において、上記無効化が、以下の条件のいずれかを満たす場合に行われない。すなわち、上記変化が検出された辞書に関連付けられたコンパイル済みコードは、以下の条件のいずれかを満たす場合にその実行が継続される:
・段数m<段数nである場合に、上記辞書に関する変化が、同じバリューでの若しくは異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーが当該アドレスが変更される前の当該辞書のキーと一致すること;
・段数m=段数nである場合に、上記辞書に関する変化が、キーの追加、同じバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキー及びバリューが当該アドレスが変更される前の当該辞書のキー及びバリューのいずれとも一致すること;又は、
・上記辞書に関する変化の種類にかかわらず、段数m>段数nであること。
本発明の1つの実施態様において、上記方法が、上記取り出されたバリューを有する辞書の上記所定の順序における段数nを記録するステップをさらに含みうる。
本発明の1つの実施態様において、上記段数nを記録するステップが、上記段数n、当該段数nまでの上記辞書が有するキー及びバリューの組、並びに上記段数nまでの上記辞書のアドレスを、上記コンパイル済みコードに関連付けられたデータとして保存するステップをさらに含みうる。
本発明の1つの実施態様において、上記方法は、上記コンパイル済みコードを、上記コンパイル済みコードのコンパイル中の最適化において使用されたバリューが取り出された辞書に関連付けるステップをさらに含みうる。
本発明の1つの実施態様において、上記方法は、上記1又は複数の辞書のうちの上記検索のために参照された辞書、すなわちn段目までの辞書に関する変化又は上記1又は複数の辞書の全てに関する変化の監視を開始するステップをさらに含みうる。
本発明の1つの実施態様において、上記方法は、上記コンパイルするステップの後において、上記コンパイル済みコードの実行中又は上記コンパイルするステップでコンパイルされていないコードの実行中に、上記比較するステップ及び上記無効化するステップを実行しうる。
本発明の1つの実施態様において、上記方法は、上記無効化するステップの後に、上記1又は複数の辞書のうちの1つの辞書に関する変化が検出されるたびに、上記比較するステップと上記無効化するステップとを繰り返しうる。
本発明の1つの実施態様において、上記シンボルを上記取り出されたバリューで置換する最適化が、上記1又は複数の辞書を参照することによってバリューが決定されるコード中のシンボルを対象に行われうる。
本発明の1つの実施態様において、上記比較するステップが、上記変化が検出された辞書に関連付けられたコンパイル済みコードを特定するステップと、上記コンパイル済みコードに関連付けられたデータから、上記段数nを取り出すステップをさらに含みうる。
本発明の1つの実施態様において、上記無効化するステップが、上記特定されたコンパイル済みコードに関連付けられたデータから、キー、バリュー若しくは辞書のアドレス、又はその組み合わせを取り出すステップをさらに含みうる。
本発明の1つの実施態様において、上記複数の辞書が、グローバル変数又は関数の辞書とビルトイン変数又は関数の辞書とを含みうる。本発明の1つの実施態様において、上記所定の順序において段数1が段数2よりも優先とすると、段数1がグローバル変数又は関数の辞書であり、段数2がビルトイン変数又は関数の辞書でありうる。
本発明の1つの実施態様において、上記コードがパイソン言語の仕様に従い記述されたコードでありうる。
また、本発明はコードを投機的に最適化するためのコンピュータを提供し、当該コンピュータは、
キー及び当該キーに関連付けられたバリューの1又は複数の組を保持する1又は複数の辞書を所定の順序で検索し、シンボル名をキーとして上記1又は複数の辞書から上記シンボル名に関連付けられたバリューを取り出すバリュー取り出し部と、
コード中のシンボルを上記取り出されたバリューで置換する最適化を行って、上記最適化されたコードの全部又は一部を含むコンパイル対象のコードをコンパイルするコンパイル部と、
上記1又は複数の辞書のうちの1つの辞書に関する変化が検出されることに応じて、上記変化が検出された辞書の上記所定の順序における段数m(mは1以上の整数)を、上記取り出されたバリューを有する辞書の上記所定の順序における段数n(nは1以上の整数)と比較する比較部と、
上記段数の比較の結果と上記変化の種類に応じて、上記変化が検出された辞書に関連付けられたコンパイル済みコードのうち、上記取り出されたバリューで置換する最適化によって最適化されたコードを無効化する無効化部と
を備えている。
また、本発明はコードを投機的に最適化するためのコンピュータを提供し、当該コンピュータは、プロセッサと、当該プロセッサに接続されたメモリと、上記コード及び上記に記載の方法の各ステップを実行させるコンピュータ・プログラムを格納する記憶装置とを備えており、上記プロセッサが、上記コンピュータ・プログラムを上記メモリに読み出して、当該コンピュータ・プログラムを実行し、上記コードを投機的に最適化する。
また、本発明はコードを投機的に最適化するためのコンピュータ・プログラムを提供し、当該コンピュータ・プログラムはコンピュータに上記に記載の方法の各ステップを実行させる。
本発明の機能を実行するためのコンピュータ・プログラムは、フレキシブル・ディスク、MO、CD−ROM、DVD、BD、ハードディスク装置、USBに接続可能なメモリ媒体、ROM、MRAM、RAM等の任意のコンピュータ読み取り可能な記録媒体に格納することができる。当該コンピュータ・プログラムは、記録媒体への格納のために、通信回線で接続する他のデータ処理システムからダウンロードしたり、又は他の記録媒体から複製したりすることができる。また、当該コンピュータ・プログラムは、圧縮し、又は複数に分割して、単一又は複数の記録媒体に格納することもできる。また、様々な形態で、本発明を実施するコンピュータ・プログラム製品を提供することも勿論可能であることにも留意されたい。コンピュータ・プログラム製品は、例えば、上記コンピュータ・プログラムを記録した記憶媒体、又は、上記コンピュータ・プログラムを伝送する伝送媒体を包含しうる。
本発明の上記概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの構成要素のコンビネーション又はサブコンビネーションもまた、本発明となりうることに留意すべきである。
本発明の実施態様において使用されるコンピュータの各ハードウェア構成要素を、複数のマシンと組み合わせ、それらに機能を配分し実施する等の種々の変更は当業者によって容易に想定され得ることは勿論である。それらの変更は、当然に本発明の思想に包含される概念である。ただし、これらの構成要素は例示であり、そのすべての構成要素が本発明の必須構成要素となるわけではない。
また、本発明は、ハードウェア、ソフトウェア、又は、ハードウェア及びソフトウェアの組み合わせとして実現可能である。ハードウェアとソフトウェアとの組み合わせによる実行において、上記コンピュータ・プログラムがインストールされた装置における実行が典型的な例として挙げられる。かかる場合、該コンピュータ・プログラムが該装置のメモリにロードされて実行されることにより、該コンピュータ・プログラムは、該装置を制御し、本発明にかかる処理を実行させる。該コンピュータ・プログラムは、任意の言語、コード、又は、表記によって表現可能な命令群から構成されうる。そのような命令群は、該装置が特定の機能を直接的に、又は、1.他の言語、コード若しくは表記への変換、2.他の媒体への複製、のいずれか一方若しくは双方が行われた後に、実行することを可能にするものである。
本発明の実施態様によれば、従来技術ではコンパイル済みコードを過剰に無効化していたのに対して、本発明ではより詳細に、すなわちより精度良くコンパイル済みコードを無効化する場合の条件を設定することが可能になる。そのために、最適化されたコンパイル済みコードが無効化される機会が少なくなる。また、本発明は、更新の頻度が稀である乃至は少ない変更又は関数をバリューで置換して定数として扱うことによってより大きな効果を奏する。
本発明の実施態様に従う装置を実現するための情報処理端末のハードウェア構成の一例を示した図である。 図1に従うハードウェア構成を好ましくは備えており、本発明の実施態様に従うコンピュータの機能ブロック図である。 本発明の実施態様において使用されうる辞書を示す。 従来技術である、コードのコンパイル時の処理のフローチャートを示す。 従来技術である、コンパイル済みコードの実行時の処理のフローチャートを示す。 本発明の実施態様に従う、コードのコンパイル時の処理のフローチャートを示す。 本発明の実施態様に従う、任意のコードの実行時、例えばコンパイル済みコード若しくは他のコンパイル済みコードの実行時、又は、インタプリタによるコードの実行時における処理のフローチャートを示す。 本発明の実施態様に従う、上記任意のコードの実行時における処理のフローチャートを示す。 本発明の実施態様に従う、上記任意のコードの実行時における処理のフローチャートを示す。 本発明の実施態様において使用されうるパイソン言語において、ユーザがビルトイン関数の辞書を書き換える態様を示す。 本発明の実施態様において使用されうるパイソン言語において、ユーザがグローバル変数で同じ名前を宣言するように書き換える態様を示す。 本発明の実施態様において使用されうるパイソン言語における、コード例を示す。
以下に、本発明を実施するための最良の形態を図面に基づいて詳細に説明するが、以下の実施態様は特許請求の範囲に係る発明を限定するものでなく、また実施態様の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。また、本発明は多くの異なる態様で実施することが可能であり、以下の実施態様において、種々の変更又は改良を加えることが可能であることが当業者に明らかである。
以下において、特に断らない限り、発明を実施するための形態の説明の全体を通じて同じ要素には同じ番号を付している。
図1は、本発明の実施態様に従うコンピュータを実現するためのハードウェア構成の一例を示した図である。
コンピュータ(101)は、CPU(102)とメイン・メモリ(103)とを備えており、これらはバス(104)に接続されている。CPU(102)は好ましくは、32ビット又は64ビットのアーキテクチャに基づくものであり、例えば、インテル社のCore i(商標)シリーズ、Core 2(商標)シリーズ、Atom(商標)シリーズ、Xeon(商標)シリーズ、Pentium(登録商標)シリーズ、Celeron(登録商標)シリーズ、AMD社のOpteron(商標)シリーズ、Phenom(商標)シリーズ、Athlon(商標)シリーズ、Turion(商標)シリーズ、Sempron(商標)又はAシリーズが使用されうる。バス(104)には、ディスプレイ・コントローラ(105)を介して、ディスプレイ(106)、例えば液晶ディスプレイ(LCD)が接続されうる。ディスプレイ(106)は、コンピュータの管理のために、通信回線を介してネットワークに接続されたコンピュータについての情報と、そのコンピュータ上で動作中のソフトウェアについての情報を、適当なグラフィック・インタフェースで表示するために使用される。バス(104)にはまた、SATA又はIDEコントローラ(107)を介して、ディスク(108)、例えばシリコン・ディスク又はハードディスクが接続されうる。また、バス(104)にはまた、SATA又はIDEコントローラ(107)を介して、任意的に、ドライブ(109)、例えばCD、DVD又はBDドライブが接続されうる。バス(104)にはさらに、任意的に、キーボード・マウスコントローラ(110)又はUSBバス(図示せず)を介して、キーボード(111)及びマウス(112)が接続されうるが、本発明を実施する上では必要ない。
ディスク(108)には、オペレーティング・システム、パイソン処理環境、パイソン・アプリケーション、パイソン実行時コンパイラを提供するプログラム、J2EEなどのJava(登録商標)処理環境、Java(登録商標)アプリケーション、Java(登録商標)仮想マシン(VM)、Java(登録商標)実行時(JIT)コンパイラを提供するプログラム、その他のプログラム、及びデータが、メイン・メモリにロード可能なように記憶されている。また、ディスク(108)には、コードの入力乃至は編集を可能にするソフトウェア、文字変換処理ソフトウェアであるフロント・エンド・プロセッサ(FEP)がメイン・メモリにロード可能なように記憶されている。オペレーティング・システムは、例えば、LINUX(登録商標)ディストリビュータが提供するLINUX(登録商標)、マイクロソフト・コーポレーションが提供するWindows(登録商標)オペレーティング・システム、アップル・コンピュータ・インコーポレイテッドが提供するMacOS(登録商標)若しくはiOS(登録商標)、X Window Systemを備えるUNIX(登録商標)系システム(たとえば、インターナショナル・ビジネス・マシーンズ・コーポレーション(登録商標)が提供するAIX(登録商標))でありうる。
ドライブ(109)は、必要に応じて、CD−ROM、DVD−ROM又はBDからプログラムをディスク(108)にインストールするために使用されうる。
通信インタフェース(114)は、例えばイーサネット(登録商標)・プロトコルに従う。通信インタフェース(114)は、通信コントローラ(113)を介してバス(104)に接続され、コンピュータ(101)を通信回線(115)に物理的に接続する役割を担い、コンピュータ(101)のオペレーティング・システムの通信機能のTCP/IP通信プロトコルに対して、ネットワーク・インタフェース層を提供する。なお、通信回線は、有線LAN環境に基づくもの、又は、無線LAN環境、例えば、IEEE802.11a/b/g/nなどのWi−Fi規格に基づくものであってもよい。
以上から、本発明の実施態様において使用されるコンピュータは、特定のオペレーティング・システム環境に限定されるものではないことを理解することができるであろう。
図2は、図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)に有線的に又は無線的に接続されうる。
メモリ(202)は、1又は複数の辞書(211)、コンパイル済みコード(212)、及びメタデータ(213)を格納しうる。以下、「辞書(211)」と言及する場合には、辞書の数が1又は複数の場合を包含する。
辞書(211)は、キー及び当該キーに関連付けられたバリューの1又は複数の組を有する。辞書(211)については、下記図3の説明おいて詳述する。
辞書(211)は、コードのコンパイル時処理において、又は、下記図6のステップ603中のコンパイル処理においてコンパイルされたコンパイル済みコード(以下において、「本発明に従うコンパイル済みコード」ともいう)若しくは同ステップ603以外のコンパイル処理においてコンパイルされたコンパイル済みコード(以下において、「他のコンパイル済みコード」ともいう)が実行されているときに、あるいは、コンパイルされていないコードがインタプリタにより実行されているときに記憶装置(210)からメモリ(202)中に読み出されてもよい。
コンパイル済みコード(212)は、記憶装置(210)に格納されたコンパイル済みコード(222)の一部又は全てであり、コンパイル済みコードの実行時に記憶装置(210)からメモリ(202)中に読み出されてもよい。コンパイル済みコード(212)は、上記した本発明に従うコンパイル済みコード及び他のコンパイル済みコードを包含する。また、コンパイル済みコード(212)は、下記に述べるコンパイル部(203)によってコンパイルされたコードでありうる。
メタデータ(213)は、本発明に従い作成されるものであり、辞書(211)中の1つの辞書に関する変化が検出された辞書の所定の順序における段数n、当該段数nまでの辞書が有するキー及びバリューの組、並びに、当該段数nまでの辞書のアドレスを格納しうる。メタデータ(213)は、コンパイル済みコード(212)に関連付けられるデータであり、本発明に従うコンパイル済みコード若しくは他のコンパイル済みコードの実行時、又はコンパイルされていないコードがインタプリタにより実行されているときに参照可能なデータでありうる。上記所定の順序は例えば、辞書に付された検索順序、言語体系において定められた辞書の型による検索順序に従いうる。検索順序は例えば、段数1が段数2よりも優先とすると、段数1,2,3,・・・,k(kは整数)で表されうるが、これに限定されるものではない。例えばパイソン言語の場合、検索順序がグローバル変数又は関数の辞書、次にビルトイン変数又は関数の辞書となっている。そのために、パイソン言語の場合、取り出し部(204)は、グローバル変数又は関数の辞書、そして、ビルトイン変数又は関数の辞書の順に参照しうる。グローバル変数及びグローバル関数の辞書がある場合には、グローバルに関する辞書が存在して、その中にグローバル変数とグローバル・シンボルに関するキーとバリューとが存在することになる。同様に、ビルトイン変数及びビルトイン関数の辞書がある場合には、ビルトインに関する辞書が存在して、その中にビルトイン変数とビルトイン・シンボルに関するキーとバリューとが存在することになる。
取り出し部(204)は、辞書(211)を上記所定の順序で検索し、シンボル名をキーとして辞書(211)からシンボル名に関連付けられたバリューを取り出す。取り出し部(204)は、辞書(211)が1つである場合に、当該1つの辞書を参照して上記バリューを取り出しうる。取り出し部(204)は、辞書(211)が複数である場合に、複数の辞書を上記所定の順序に従って参照する。
また、取り出し部(204)又はコンパイル部(203)は、バリューを取り出した辞書の上記所定の順序における段数n(nは1以上の整数)をメタデータ(213)中に記録しうる。
最適化部(205)は、最適化処理として、コード中のシンボル、例えばグローバル変数、を取り出し部(204)によって取り出されたバリューで置換する。すなわち、最適化部(205)は、上記置換という最適化を行う。コード中のシンボルが上記取り出されたバリューで置換されることで、当該バリューが定数として扱われる。
コンパイル部(203)は、コンパイラとしての機能を有する。コンパイル部(203)は、最適化部(205)によって最適化されたコードの全部又は一部を含むコンパイル対象のコードをコンパイルする。また、コンパイル部(203)は、最適化部(205)によって最適化されていない他のコードの全部又は一部を含むコンパイル対象のコードをコンパイルしうる。コンパイル部(203)は、上記コンパイルされたコード(コンパイル済みコードである)を記憶装置(210)に格納しうる(222)。代替的には、コンパイル部(203)は、本発明に従うコンパイル済みコード又は他のコンパイル済みコードの実行がコードのコンパイル処理と同時に行われている場合には、コンパイル済みコードをメモリ(202)内に直接的に格納しうる(212を参照)。
また、コンパイル部(203)は、バリューを取り出した辞書の上記所定の順序における段数n(nは1以上の整数)、当該段数nまでの辞書が有するキー及びバリューの組、並びに、当該段数nまでの辞書のアドレスを、例えばメタデータ(213)中に記録しうる。
実行部(206)は、本発明に従うコンパイル済みコード、若しくは他のコンパイル済みコード、又は、インタプリタによるコードを実行する。実行部(206)は、当該コンパイル済みコード若しくは他のコンパイル済みコードの実行を、コンパイル後のどこかで行うことになるが、例えば、コンパイル後すぐに当該コンパイル済みコードの実行を開始する、コンパイル後の最初の対象コードの起動で当該コンパイル済みコードの実行を開始する、コンパイル後のあるメソッドが実行しようとするときに当該コンパイル済みコードの実行を開始する、コンパイル後に対象コードがインタプリタで実行されている最中に当該コンパイル済みコードに実行を移す、ことができるがこれらに制限されるものではない。また、実行部(206)は、インタプリタによる実行可能な部分のコードを、上記コンパイル済みコード若しくは他のコンパイル済みコードの実行の前に、その実行と並行して、又はその実行後に実行しうる。
監視部(207)は、1又は複数の辞書のうちの検索のために参照された辞書、すなわちn段目までの辞書に関する変化の監視しうる。代替的には、監視部(207)は、1又は複数の辞書の全てに関する変化の監視しうる。
監視部(207)は、辞書に関する変化の監視を、本発明に従うコンパイル済みコード又は他のコンパイル済みコードが生成された直後、又はインタプリタによるコードの実行の開始直後から開始しうる。辞書に関する変化の監視が他のコンパイル済みコードが生成された直後から開始する理由は、辞書に関する変化が他のコンパイル済みコードの実行によって、又はインタプリタによるコードの実行によってもたらされる場合もあるからである。
比較部(208)は、監視部(207)が1又は複数の辞書のうちの1つの辞書に関する変化が検出されることに応じて、当該変化が検出された辞書の上記所定の順序における段数m(mは1以上の整数)を、例えばメタデータ(213)中に記録された段数nと比較する。すなわち、比較部(208)は、段数m>段数n,段数m=段数n,又は段数m<段数nのいずれであるかを判断する。比較部(208)は、当該判断のために、変化が検出された辞書に関連付けられたコンパイル済みコードを特定し、例えば当該特定されたコンパイル済みコードに関連付けられたメタデータ(213)から、上記段数nを取り出しうる。
比較部(208)は、上記比較を、任意のコードの実行中、すなわち本発明に従うコンパイル済みコード若しくは他のコンパイル済みコードの実行中、又はインタプリタによるコードの実行中において実施しうる。上記比較が、本発明に従うコンパイル済みコード以外の他のコンパイル済みコードで行われる理由は、例えば、「あるシンボルを削除する」という動作が、プログラム中で当該あるシンボルに対してアクセス可能な任意の位置に書くことができるからである。
無効化部(209)は、比較部(208)による段数の比較の結果と辞書に関する変化の種類に応じて、当該変化が検出された辞書に関連付けられたコンパイル済みコードのうち、上記取り出されたバリューで置換する最適化によって最適化されたコードを無効化する。当該無効化の方法として例えば、下記に示す方法がある:
(a)無効化する必要が起きた場合にコンパイル済みコードは使わずにインタプリタで実行する;
(b)無効化する必要が起きた場合に一度はインタプリタで実行し、次回の実行の際にバリューで置換する最適化を適用しないで再コンパイルを行い、当該再コンパイル済みコードを実行する;及び、
(c)最適化を行う際に、バリューで置換する最適化が予め適用されたコード、及びバリューで置換する最適化が適用されていないコードの両方を用意して、最初に最適化が予め適用された上記コードを実行し、次に、無効化する必要が生じた場合に、最適化が適用されてない上記コードを実行する。
段数の比較の結果は、上記した数m>段数n,段数m=段数n,又は段数m<段数nである。辞書に関する変化の種類は例えば、キーの追加、キーの削除、同じバリューでの若しくは異なるバリューでの更新、又は辞書アドレスの変更でありうる。
辞書に関連付けられたコンパイル済みコードとは、辞書中のシンボル、例えばグローバル変数又は、グローバル変数をコンパイル中に定数に置き換えたもの、を有するコードをいう。
無効化部(209)が、上記無効化をする条件については、下記図7A〜図7Cの説明において詳述する。
無効化部(209)は、上記比較を、任意のコードの実行中、すなわち本発明に従うコンパイル済みコード若しくは他のコンパイル済みコードの実行中、又はインタプリタによるコードの実行中において実施しうる。上記無効化が、本発明に従うコンパイル済みコード以外の他のコンパイル済みコードで行われる理由は、例えば、「あるシンボルを削除する」という動作が、プログラム中で当該あるシンボルに対してアクセス可能な任意の位置に書くことができるからである。
記憶装置(210)は、コード(221)及びコンパイル済みコード(222)を格納しうる。また、記憶装置(210)は、1又は複数の辞書(223)を格納しうる。以下、「辞書(223)」と言及する場合には、辞書の数が1又は複数の場合を包含する。
コード(221)は、最適化対象であるコード又はその一部若しくは全部を包含するコードであり得る。コード(221)は、シンボル名をキーとして辞書(223)からシンボル名に関連付けられたバリューを取り出すことが可能である言語であれば特に制限されない。本発明の実施態様において使用されうるシンボルは例えば、シンボルの中でその値が変更されにくいものであり、言い換えれば、変更時情報であまり変更されにくいものである。シンボルは例えば、変数、関数、メソッドの飛び先、組み込み関数(例えばビルトイン関数)を挙げることができるがこれらに制限されない。
コンパイル済みコード(222)は、本発明に従うコンパイル済みコード、及び他のコンパイル済みコードを包含しうる。また、コンパイル済みコード(222)は、コンパイル部(203)によってコンパイルされたコード、又は、他のコンピュータによって既にコンパイルされたコードでありうる。
辞書(223)は、不揮発性である記憶装置(210)中に格納されうる。「辞書(223)」は、以下の説明において「辞書(211)」と交換的に使用されうる。
図3は、本発明の実施態様において使用されうる辞書を示す。
辞書は、キー及び当該キーに関連付けられたバリューの1又は複数の組を有する。辞書は、例えばパイソン言語において定義されうる型でありうる。辞書は、他の言語において、連想記憶(associated memory)又は連想配列(associative array)という名前でも言及されうる。本発明でいう「辞書」は、連想記憶及び連想配列辞書、並びにキーでインデクス化されているその他の呼称で呼ばれうるものを包含する。
辞書(301)は、図2に示す辞書(211、223)のうちの1つを模式的に例示したものである。辞書(301)は、キー(311)及び、当該キー(311)に関連付けられたバリュー(312)の1又は複数の組(「ペア」ともいう)を有する。図3は、辞書(301)が、上記組として、321−1及び322−1の組、321−2及び322−2の組、321−n及び322−nの組を有している例を示す。キー及びバリューは、それぞれ、名前及び格納される値であり、具体的に述べれば、キーはプログラム中に書かれているものであり、バリューは実行時に埋められる数字又は文字であるといえる。キー及びバリューは、辞書中において順序付けはされてはいないが、キーは辞書中において一意的でなければならない。
キーは、何らかの変更不能な型であり、文字列又は数値をキーにしうる。タプルは、文字列、数値又はその他のタプルのみを含む場合に、キーにしうる。直接的に又は間接的に変更可能なオブジェクトを含むタプルは、キーとして使うことはできない。また、リストをキーとして使うことはできない。この理由は、リストにスライス又はインデクス指定の代入を行ったり、例えばappend()又はextend()のようなメソッドを使ったりすると、インプレースで変更することが可能であるためである。
バリューは、キーによって一意的に決まる値である。当該バリューは、最適化において、コード中のシンボルを置換するために、すなわちコード中のシンボルを定数化するために使用されうる。
辞書の作成方法は当業者に知られており、例えばパイソン言語において、辞書は、例えば「PyDictObject」を用いて作成されうる(非特許文献6を参照)。
辞書の操作方法、例えばキーの追加、キーの削除、同じバリューでの又は異なるバリューでの更新、及び辞書のアドレスの変更、は当業者に知られており、例えばパイソン言語において、当該パイソン言語で書かれたプログラムの実行のために作成される辞書の操作方法はそのソースコードが公開されている(例えば、図9に記載の各コード及びそれに対応する発明の詳細な説明の記載を参照)。但し、パイソン言語において、辞書のアドレスが変更される場合は、実際にはそれほど多くないので、無視できるレベルである。
パイソン言語において、グローバル変数又は関数の辞書、及び、ビルトイン変数又は関数の辞書の順序は、グローバル変数又は関数の辞書、そして、ビルトイン変数又は関数の辞書である。従って、シンボルからバリューを決定する場合に、定められた所定の順序で辞書が参照される必要がある。上記所定の順序が、段数1、2、・・・、k(kは整数)で表される場合に、あるシンボルとペアをなすバリューは次のようにして取り出される。ます、段数1の辞書をシンボルで引いて、当該シンボルとペアをなすバリューが存在する場合には当該バリューを取り出す。一方、当該シンボルとペアをなすバリュー存在しない場合には段数2の辞書を上記シンボルで引く、という操作を繰り返す。
図4は、従来技術である、コードのコンパイル時の処理(以下、従来技術に従うコンパイル時処理ともいう)のフローチャートを示す。
ステップ401では、コンピュータは、コンパイラを使用してコードのコンパイル時処理を開始する。
ステップ402では、コンピュータは、シンボル名をキーとして、辞書を上記所定の順序で検索し、当該キーに関連付けられたバリューを辞書から取り出す。コンピュータは、当該取り出されたバリューを、例えばメモリ中に格納する。
ステップ403では、コンピュータは、コードの最適化処理として、コード中のシンボル、例えばグローバル変数若しくは関数、又は、ビルトイン変数若しくは関数、を上記取り出されたバリューに置換する。引き続き、コンピュータは、当該最適化されたコードの全部又は一部を含むコンパイル対象のコードをコンパイルする。コンピュータは、当該コンパイルによって生成されたコンパイル済みコードを記憶装置又はメモリ中に格納する。
ステップ405では、コンピュータは、各辞書とコンパイル済みコードとを関連付ける。コンピュータは、当該関連付けしたデータを、例えば当該コンパイル済みコードに関連付けられたメタデータ中に記録しうる。
ステップ406では、コンピュータは、バリューを決定するために参照する可能性のある全ての辞書について、監視を開始する。当該辞書の監視は、コンパイル時に参照した辞書であるかどうかにかかわらず行われる。すなわち、例えば多段で構成されている辞書を参照して、段数1の辞書でバリューが取り出された場合であっても、当該辞書の監視は、段数2以降の辞書についても行われる。従って、複数の辞書が監視対象となりうる。
ステップ407では、コンピュータは、コンパイル時の処理を終了し、ステップ403でコンパイルにより生成されたコンパイル済みコード(以下、図5の説明において、「コンパイル済みコード」という)の実行命令、若しくは当該コンパイル済みコードを参照する他のコンパイル済みコード(以下、図5の説明において、「他のコンパイル済みコード」という)、又はインタプリタ実行するコードの実行命令を待つ。
図5は、従来技術である、コンパイル済みコードの実行時の処理(以下、従来技術に従う実行時処理ともいう)のフローチャートを示す。
ステップ501では、コンピュータは、コンパイル済みコード若しくは他のコンパイル済みコードの実行、又はインタプリタによるコードの実行を開始する。
ステップ502では、コンピュータは、監視中の辞書dに関する変化を検出する。監視中の辞書dに関する変化は例えば、キーの追加、キーの削除、同じバリューでの若しくは異なるバリューでの更新、又は、辞書アドレスの変更である。監視中の辞書dに関する変化を検出することに応じて、コンピュータは処理をステップ503に進める。一方、監視中の辞書dに関する変化が検出されない場合、すなわちプログラムの実行時にどれかの辞書で変化が検出された以外は検出されないとして扱い、コンピュータは処理をステップ502に戻して、辞書dの監視を継続する。すなわち、コンピュータは監視中の辞書dに関する変化が検出されるまで処理を待つ。
ステップ503では、コンピュータは、ステップ502において変化が検出された辞書dに関連付けられたコンパイル済みコードを、図4のステップ405において説明したメタデータ中に記録された、各辞書とコンパイル済みコードとの関連付データから特定する。
ステップ504では、コンピュータは、辞書dの変化の種類を特定する。辞書dの変化の種類が、キーの追加、キーの削除、同じバリューでの若しくは異なるバリューでの更新、又は、辞書アドレスの変更である場合は、下記の通りである:
・辞書dの変化の種類が同じバリューでの更新である場合、コンピュータは、処理をステップ505に進める。
・辞書dの変化の種類がキーの追加、キーの削除、又は異なるバリューでの更新である場合、コンピュータは、処理をステップ506に進める。
・辞書dの変化の種類が辞書dのアドレスの変更である場合、コンピュータは、処理をステップ507に進める。
ステップ505では、コンピュータは、辞書dの変化の種類が同じバリューでの更新であることに応じて、ステップ403において無効化の処理を禁止する。そして、コンピュータは、処理をステップ511に戻す。
ステップ506では、コンピュータは、辞書dの変化の種類がキーの追加、キーの削除、又は異なるバリューでの更新であることに応じて、ステップ502で変化が検出された辞書dに関連付けられたコンパイル済みコードのうち、ステップ403の最適化、すなわちステップ402で取り出されたバリューでコード中のグローバル変数を置換する最適化によって最適化されたコードを無効化する。当該無効化は、辞書dに関連付けられたコンパイル済みコードが複数ある場合には、その全てが対象となる。そして、コンピュータは、処理をステップ511に戻す。
ステップ507では、コンピュータは、辞書dの変化の種類が辞書dのアドレスの変更であることに応じて、ステップ502で変化が検出された辞書dに関連付けられたコンパイル済みコードのうち、ステップ403において最適化されたコードを無効化する。そして、コンピュータは、処理をステップ511に戻す。
ステップ511では、コンピュータは、コード全体、例えば実行対象でありうるコード全体の実行を終了するかどうかを判断する。実行対象でありうるコード全体の実行を終了する場合は、コンピュータは、処理をステップ512に進め、実行対象でありうるコード全体の実行処理を終了する。実行対象でありうるコード全体の実行を終了しない場合は、コンピュータは、処理をステップ502に戻す。引き続き、コンピュータは、監視中の辞書dの変化が検出されるたびに、図5のフローチャートに記載する操作を繰り返す。
図6は、本発明の実施態様に従う、コードのコンパイル時の処理(以下、本発明に従うコンパイル時処理ともいう)のフローチャートを示す。
ステップ601では、コンパイル部(203)は、コードのコンパイル時処理を開始する。コードは、例えばパイソン言語の仕様に従い記述されたプログラムでありうる。
ステップ602では、取り出し部(204)は、シンボル名をキーとして、辞書(211)を上記所定の順序で検索し、当該キーに関連付けられたバリューを辞書から取り出す。取り出し部(204)は、当該取り出されたバリューを、例えばメモリ(202)中に格納する。辞書(211)が一つの場合には当該一つの辞書について検索が行われる。また、辞書(211)が複数の場合には、例えば、各辞書に関連付けられた優先順序に従って、又は、各プログラム言語により定められた辞書を参照する優先順序に従って、順次、検索されうる。
ステップ602において、複数の辞書がグローバル変数又は関数の辞書とビルトイン変数又は関数の辞書である場合、上記所定の順序は、グローバル変数又は関数の辞書、次に、ビルトイン変数又は関数の辞書である。従って、段数1が段数2よりも優先すると、グローバル変数又は関数の辞書が段数1であり、ビルトイン変数又は関数の辞書が段数2である。
ステップ603では、最適化部(205)は、コードの最適化処理として、コード中のシンボル、例えばグローバル変数若しくは関数、又は、ビルトイン変数若しくは関数、を上記取り出されたバリューに置換する。上記シンボルを有するコードは、上記辞書を参照することによってバリューが決定されるコードでありうる。コード中のシンボルは、例えばグローバル変数でありうる。すなわち、コード中のシンボルをバリューに置換する最適化を行い、当該バリューを定数として扱う。
コンパイル部(203)は、引き続き、当該最適化されたコードの全部又は一部を含むコンパイル対象のコードをコンパイルする。コンパイル対象のコードは、実行対象コードのうち、上記コンパイル対象のコードである。すなわち、コンパイル対象のコードは、実行対象コードのうち、上記最適化されたコードの全部又は一部を含むコンパイル対象のコードである。最適化されたコードの一部である理由は、コンパイルをせずに、インタプリタで実行するという選択肢もあるためである。
コンパイル部(203)は、例えば本発明に従うコンパイル済みコード又は他のコンパイル済みコードを、例えば記憶装置(210)又はメモリ(202)中に格納する(222、212)。
ステップ603において、上記シンボル名に対応するバリューを取り出した辞書がグローバル変数又は関数の辞書である場合に、上記最適化は、グローバル変数又は関数の参照を上記取り出したバリューで置き換えて定数として扱うことによって行われる。
ステップ603において、上記シンボル名に対応するバリューを取り出した辞書が変数又は関数の辞書である場合に、上記最適化が実行中の更新が稀である(または更新頻度が低い)と判断される変数又は関数の呼び出し先を上記取り出したバリューで置き換えて定数として扱うことによって行われうる。実行中の更新が稀であると判断される変数又は関数は、例えばビルトイン変数又は関数でありうる。ビルトイン変数又は関数の呼び出し先の静的決定においてシンボル名をバリューで置き換えることは、シンボル名であるmaxがコード中に出てきた場合に辞書を引いて、当該maxとペアをなす飛び先(すなわち呼び出し先)というバリューに置き換えて定数として扱うことを意味する。辞書の更新頻度が低いことについては、非特許文献1を参照されたい。
ステップ604では、コンパイル部(203)は、ステップ602において特定される段数n、並びに、当該段数nまでに辞書が有するキー及びバリューの組、並びに当該段数nまでの辞書のアドレスを、例えばメタデータ(213)中に記録する。メタデータ(213)は、図7A〜図7Cに示す処理において参照されるように、コンパイル済みコード(212、222)に関連付けられうる。メタデータ(213)中に記録された段数nは、下記図7Aに示すフローチャートのステップ704において、段数の比較をするために参照されうる。メタデータ(213)中に記録されたキー及びバリューの組は、下記図7Bに示すフローチャートのステップ721及び下記図7Cに示すフローチャートの731において、辞書dの変化の種類、すなわちキーの追加、キーの削除、又は同じバリューでの若しくは異なるバリューでの更新を判断するために参照されうる。メタデータ(213)中に記録された辞書のアドレスは、下記図7Bに示すフローチャートのステップ721及び下記図7Cに示すフローチャートの731において、辞書dの辞書の変化の種類、すなわち辞書のアドレスの更新を判断するために参照されうる。
ステップ605では、コンパイル部(203)は、各辞書とコンパイル済みコードとを関連付ける。コンパイル部(203)は、当該関連付けしたデータを、当該コンパイル済みコードに関連付けられたメタデータ(213)中に記録しうる。
ステップ606では、監視部(207)は、バリューを決定するために参照する可能性のある全ての辞書について、監視を開始する。当該辞書の監視は、コンパイル時に参照した辞書であるかどうかにかかわらず行う。すなわち、例えば多段で構成されている辞書を参照して、段数1の辞書でバリューが取り出された場合であっても、当該辞書の監視は、段数2以降の辞書についても行われる。従って、複数の辞書が監視対象となりうる。当該監視を開始することで、図7A〜図7Cに示す任意のコードの実行時のフローチャートにおいて、辞書に関する変化を検出することが可能になる。
ステップ607では、コンパイル部(203)は、コンパイル時の処理を終了する。実行部(206)は、任意のコードの実行の開始命令、例えばコンパイル済みコード若しくは他のコンパイル済みコードの実行の開始命令、又は、インタプリタによるコードの実行の開始命令を待って、図7Aのステップ701へ処理を進める。
本発明に従うコンパイル時処理は、従来技術に従うコンパイル時処理と比べて、ステップ604の処理をする点で実行するステップが多い。従って、本発明に従うコンパイル時の処理は増大する。しかしながら、その増大する処理量は、コンパイル処理全体に要する時間からみれば1%未満にも満たないと考えられる。上記増大する処理量よりも、下記図7A〜図7Cに示す処理によって、コンパイル済みコードの実行の無効化を特定の条件化で行うことができるようにする方がはるかに有用である。
図7A〜図7Cは、本発明の実施態様に従う、任意のコードの実行時、例えばコンパイル済みコード若しくは他のコンパイル済みコードの実行時、又は、インタプリタによるコードの実行時における処理のフローチャート(以下、本発明に従う実行時処理のフローチャートという)を示す。
以下に、図7Aについて説明する。
ステップ701では、実行部(206)は、任意のコードの実行、例えばコンパイル済みコード若しくは他のコンパイル済みコードの実行、又は、インタプリタによるコードの実行を開始する。
ステップ702では、監視部(207)は、監視中の辞書dの変化を検出する。当該変化は例えば、キーの追加、キーの削除、同じバリューでの若しくは異なるバリューでの更新、又は、辞書アドレスの変更である。上記変化を検出することに応じて、監視部(207)は処理をステップ703に進める。一方、上記変化が検出されない場合は、監視部(207)は処理をステップ702に戻して、辞書dの監視を継続する。
ステップ703では、比較部(208)は、ステップ702において変化が検出された辞書dに関連付けられたコンパイル済みコードを、図6のステップ605において説明したメタデータ(213)中に記録された、各辞書とコンパイル済みコードとの関連付データから特定する。また、比較部(208)は、ステップ702において検出された変化が認められた辞書の上記所定の順序における段数mを取得する。
ステップ704では、比較部(208)は、図6のステップ602において特定された段数nを、図6のステップ604において記録されたメタデータ(213)から取得する。
ステップ705では、比較部(208)は、ステップ704において取得した段数nとステップ703において取得した段数mの大小を比較する。
・段数m>段数nの場合、比較部(208)は、処理をステップ706に進める。
・段数m=段数nの場合、比較部(208)は、処理を図7Bに示すステップ721に進める。
・段数m<段数nの場合、比較部(208)は、処理を図7Cに示すステップ731に進める。
ステップ706では、無効化部(209)は、m>nであることに応じて、無効化の処理を禁止する(すなわち、無効化処理を行わない)。そして、無効化部(209)は、処理をステップ711に戻す。
ステップ711では、実行部(206)は、コード全体、例えば実行対象でありうるコード全体の実行を終了するかどうかを判断する。実行対象でありうるコード全体の実行を終了する場合は、実行部(206)は、処理をステップ712に進め、監視処理を終了する。コンパイル済みコードの実行を終了しない場合は、実行部(206)は、処理をステップ702に戻す。引き続き、監視部(207)は、監視中の辞書dの変化が検出されるたびに、図7A〜図7Cのフローチャートに記載する操作を繰り返す。
以下に、図7B(段数m=段数nを満たす場合)について説明する。
ステップ721では、比較部(208)は、辞書dの変化の種類を特定する。辞書dの変化の種類が、キーの追加、キーの削除、同じバリューでの若しくは異なるバリューでの更新、又は、辞書アドレスの変更である場合は、下記の通りである:
・辞書dの変化の種類がキーの追加又は同じバリューでの更新である場合、比較部(208)は、処理をステップ722に進める。
・辞書dの変化の種類がキーの削除又は異なるバリューでの更新である場合、比較部(208)は、処理をステップ723に進める。
・辞書dの変化の種類が辞書dのアドレスの変更である場合、コンピュータは、処理をステップ724に進める。
ステップ722では、無効化部(209)は、m=nであり且つ辞書dの変化の種類がキーの追加又は同じバリューでの更新であることに応じて、無効化の処理を禁止する。そして、無効化部(209)は、処理をステップ711に戻す。
ステップ723では、無効化部(209)は、m=nであり且つ辞書dの変化の種類がキーの削除又は異なるバリューでの更新であることに応じて、ステップ702で変化が検出された辞書dに関連付けられたコンパイル済みコードのうち、ステップ602で取り出されたバリューで置換するステップ603の最適化によって最適化されたコードを無効化する。そして、無効化部(209)は、処理をステップ711に戻す。
ステップ724では、比較部(208)は、アドレスが変更された後の辞書(以下、変更後の辞書ともいう)のキー及びバリューがアドレスが変更される前の辞書(以下、元の辞書ともいう)のキー及びバリューと完全一致するかどうかを判断する。
・変更後の辞書のキー及びバリューが元の辞書のキー及びバリューと完全一致しない場合、すなわち変更後の辞書のキー及びバリューが元の辞書のキー及びバリューの少なくとも一方と一致しない場合、比較部(208)は、処理をステップ725に進める。
・変更後の辞書のキー及びバリューが元の辞書のキー及びバリューと完全一致する場合、比較部(208)は、処理をステップ726に進める。
比較部(208)は、元の辞書のキーとバリューをメタデータ(213)から取得しうる。
ステップ725では、無効化部(209)は、m=nであり且つ変更後の辞書のキー及びバリューが元の辞書のキー及びバリューと完全一致しないことに応じて、ステップ702で変化が検出された辞書dに関連付けられたコンパイル済みコードのうち、ステップ602で取り出されたバリューで置換するステップ603の最適化によって最適化されたコードを無効化する。そして、無効化部(209)は、処理をステップ711に戻す。
ステップ726では、無効化部(209)は、m=nであり且つ変更後の辞書のキー及びバリューが元の辞書のキー及びバリューと完全一致することに応じて、無効化の処理を禁止する。そして、無効化部(209)は、処理をステップ711に戻す。
以下に、図7C(段数m<段数nを満たす場合)について説明する。
ステップ731では、比較部(208)は、辞書dの変化の種類を特定する。辞書dの変化の種類が、キーの追加、キーの削除、同じバリューでの若しくは異なるバリューでの更新、又は、辞書アドレスの変更である場合は、下記の通りである:
・辞書dの変化の種類が同じバリューでの更新又は異なるバリューでの更新である場合、比較部(208)は、処理をステップ732に進める。
・辞書dの変化の種類がキーの追加又はキーの削除である場合、比較部(208)は、処理をステップ733に進める。
・辞書dの変化の種類が辞書dのアドレスの変更である場合、コンピュータは、処理をステップ734に進める。
ステップ732では、比較部(208)は、m<nであり且つ辞書dの変化の種類が同じバリューでの更新又は異なるバリューでの更新であることに応じて、無効化の処理を禁止する。そして、無効化部(209)は、処理をステップ711に戻す。
ステップ733では、比較部(208)は、m<nであり且つ辞書dの変化の種類がキーの追加又はキーの削除であることに応じて、ステップ702で変化が検出された辞書dに関連付けられたコンパイル済みコードのうち、ステップ602で取り出されたバリューで置換するステップ603の最適化によって最適化されたコードを無効化する。そして、無効化部(209)は、処理をステップ711に戻す。
ステップ734では、比較部(208)は、アドレスが変更された後の辞書(以下、変更後の辞書ともいう)のキー及びバリューがアドレスが変更される前の辞書(以下、元の辞書ともいう)のキー及びバリューと完全一致するかどうかを判断する。
・変更後の辞書のキーが元の辞書のキーと一致しない場合、比較部(208)は、処理をステップ735に進める。
・変更後の辞書のキーが元の辞書のキーと一致する場合、比較部(208)は、処理をステップ736に進める。
比較部(208)は、変更が検出された元の辞書のキーをメタデータ(213)から取得しうる。
ステップ735では、無効化部(209)は、m<nであり且つ変更後の辞書のキーが元の辞書のキーと一致しないことに応じて、ステップ702で変化が検出された辞書dに関連付けられたコンパイル済みコードのうち、ステップ602で取り出されたバリューで置換するステップ603の最適化によって最適化されたコードを無効化する。そして、無効化部(209)は、処理をステップ711に戻す。
ステップ736では、無効化部(209)は、m<nであり且つ変更後の辞書のキーが元の辞書のキーと一致することに応じて、無効化の処理を禁止する。そして、無効化部(209)は、処理をステップ711に戻す。
図7A〜図7Cにおいて示した通り、変化が検出された辞書に関連付けられたコンパイル済みコードのうち、ステップ602で取り出されたバリューで置換するステップ603の最適化によって最適化されたコードを無効化する条件は、下記に示すとおりである。
・段数mが段数nよりも小さい場合に、当該辞書に関する変化が、キーの追加、キーの削除、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーがアドレスが変更される前の当該辞書のキーと一致しないこと;又は、
・段数mが段数nに等しい場合に、当該辞書に関する変化が、キーの削除、異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された当該辞書のキー及びバリューが当該アドレスが変更される前の辞書のキー及びバリューの少なくとも一方と一致しないこと。
但し、段数mが段数nよりも大きい場合には、当該辞書に関する変化の種類にかかわらず、上記変化が検出された辞書に関連付けられたコンパイル済みコードの無効化はされない。
また、変化が検出された辞書に関連付けられたコンパイル済みコードのうち、ステップ602で取り出されたバリューで置換するステップ603の最適化によって最適化されたコードを無効化する条件は、下記のようにもまとめることが可能である。
・段数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以上であること。
また、複数の辞書がグローバル変数又は関数の辞書とビルトイン変数又は関数の辞書である場合において、シンボル名に関連付けられたバリューを取り出した辞書がグローバル変数又は関数の辞書である場合に、変化が検出された辞書に関連付けられたコンパイル済みコードのうち、ステップ602で取り出されたバリューで置換するステップ603の最適化によって最適化されたコードを無効化する条件は、下記のようにもまとめることが可能である。
・段数mが1である場合に、グローバル変数又は関数の辞書に関する変化が、キーの削除、又は、異なるバリューでの更新であること;、又は、
・段数mが1である場合に、上記グローバル変数又は関数の辞書に関する変化が、当該辞書のアドレスが変更されており且つアドレスが変更された当該辞書のキー及びバリューがアドレスが変更される前の当該辞書のキー及びバリューの少なくとも一方と一致しないこと。
但し、下記条件の場合には、上記変化が検出された辞書に関連付けられたコンパイル済みコードの無効化はされない。
・ビルトイン変数又は関数の辞書に関する変化の種類にかかわらず、段数mが2であること。
また、複数の辞書がグローバル変数又は関数の辞書とビルトイン変数又は関数の辞書である場合において、シンボル名に関連付けられたバリューを取り出した辞書がビルトイン変数又は関数の辞書である場合に、変化が検出された辞書に関連付けられたコンパイル済みコードのうち、ステップ602で取り出されたバリューで置換するステップ603の最適化によって最適化されたコードを無効化する条件は、下記のようにもまとめることが可能である。
・段数mが1である場合に、グローバル変数又は関数の辞書に関する変化が、キーの追加、又はキーの削除であること;
・段数mが2である場合に、ビルトイン変数又は関数の辞書に関する変化が、キーの削除、又は、異なるバリューでの更新であること;
・段数mが1である場合に、グローバル変数又は関数の辞書に関する変化が、当該辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーがアドレスが変更される前の当該辞書のキーと一致しないこと;又は、
・段数mが2である場合に、ビルトイン変数又は関数の辞書に関する変化が、当該辞書のアドレスが変更されており且つアドレスが変更された当該辞書のキー及びバリューがアドレスが変更される前の当該辞書のキー及びバリューの少なくとも一方と一致しないこと。
また、辞書の数が1つである場合にはm=n=1になる。m=n=1の場合において、辞書のアドレスが変更されており且つアドレスが変更された当該辞書のキー及びバリューがアドレスが変更される前の当該辞書のキー及びバリューの少なくとも一方と一致しないことを条件に、変化が検出された辞書に関連付けられたコンパイル済みコードのうち、ステップ602で取り出されたバリューで置換するステップ603の最適化によって最適化されたコードが無効化される。従って、本発明は、辞書の数が1つである場合においても有用である。
図7A〜図7Cにおいて示した通り、変化が検出された辞書に関連付けられたコンパイル済みコードの実行を継続する条件は、下記に示す通りである。
・段数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である場合に、ビルトイン変数又は関数の辞書に関する変化が、当該辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキー及びバリューがアドレスが変更される前の当該辞書のキー及びバリューのいずれとも一致すること。
図8Aは、本発明の実施態様において使用されうるパイソン言語において、ユーザがビルトイン関数の辞書を書き換える態様を示す。なお、符号801で表される画面表示において、01〜18の数字は説明を容易にする為に付加したものであって、当該数字は画面上に表示されていなくともよい。
上記態様は、ビルトイン関数「abs」の飛び先(すなわち呼び出し先)を「x:0」の飛び先に書き換えた例である。
符号801で示される図は、ビルトイン関数の辞書(211)において、関数「abs」が当該辞書(211)にキーとして追加された後の辞書を示す(05〜10行)。
04行は、ビルトイン関数のキーを表示するコマンドが入力されていることを示す。
05行は、キー「abs」が追加されていることを示す。
13行は、キー「abs」の飛び先をオリジナルから「x:0」に書き換えたことを示す。
符号811及び符号812でそれぞれ示される図は、ビルトイン関数の辞書中のキー及びバリューを示す。
符号811で示される図は、ビルトイン関数の辞書中にキー「abs」が存在していること、及びキーの飛び先がオリジナルであることを示す。
符号812で示される図は、ビルトイン関数の辞書を書き換えることによって上記ビルトイン関数の飛び先がオリジナルから「x:0」に書き換えられていることを示す。
図8Bは、本発明の実施態様において使用されうるパイソン言語において、ユーザがグローバル変数で同じ名前を宣言するように書き換える態様を示す。なお、符号801で表される画面表示において、01〜16の数字は説明を容易にする為に付加したものであって、当該数字は画面上に表示されていなくともよい。
上記態様は、空の辞書に、グローバル変数「abs」で「999」を入れた例である。
符号821で示される図は、グローバル変数で図8Aにおいて追加したキー「abs」を、同じ名前で宣言するように書き換える態様を示す。
06行は、キー「abs」をグローバル変数で宣言していることを示す。
07行は、当該キーに関連付けられたバリューとして「999」を入れたことを示す。
符号831及び符号832でそれぞれ示される図は、グローバル変数の辞書中のキー及びバリューを示す。
符号831で示される図は、キー及び当該キーに関連付けられたバリューが無い状態(空の辞書)を示す。
符号832で示される図は、上記06及び07行に示すコマンドによって、キーとして「abs」及び当該キーに関連付けられたバリューとして「999」がグローバル変数の辞書中に格納されたことを示す。
上記図8A及び図8Bにおいて、abs()を呼び出す場合には、グローバル変数の辞書、次にビルトイン関数の辞書の順で検索が行われる。
図9は、本発明の実施態様において使用されうるパイソン言語における、コード例を示す。
以下のコード(901〜906)では、複数の辞書がグローバル変数の辞書とビルトイン関数の辞書であるとする。コード(901〜906)では、投機的に行った最適化がグローバル変数の値の定数化、すなわちコード中のグローバル変数を辞書から取り出したバリューで置換して定数で扱うことであったとする。コード(901〜906)では、投機的に行った最適化がビルトイン関数の呼び出し先の静的決定、すなわち当該コード(901〜906)中のビルトイン関数の飛び先(すなわち呼び出し先)を辞書から取り出したバリューで置換して定数として扱うことであったとする。
従来の実施態様に従うと(図5及び図6を参照)、コード(901〜906)において、当該コード(901〜906)中のメソッドfoo()のコンパイル済みコードが無効化されるために、上記メソッドfoo()のコンパイル済みコードを実行し続けることができなかった。一方、本発明の実施態様に従うと(図6、図7A〜図7Cを参照)、上記メソッドfoo()のコンパイル済みコードが特定の条件下においてのみ無効化されるために、すなわち特定の条件下において上記メソッドfoo()のコンパイル済みコードの無効化が禁止されるために、コード(901〜906)中のメソッドfoo()のコンパイル済みコードを実行し続けることができる。
以下に、コード(901〜906)が実行されたときに行われる処理を説明するが、当該説明は当該処理を全て述べたものではないことに留意されたい。各コード(901〜906)の左側に示す01から始まる数字は説明を容易にする為に付加したものであって、当該数字は画面上に表示されていなくともよい。
コード901は、投機的に行った最適化がグローバル変数の辞書(1段目の辞書、n)から取り出したグローバル変数の値の定数化であり、且つ、グローバル変数の辞書に関する変化がキーの追加である場合に、当該グローバル変数の辞書に関連付けられたコンパイル済みコードのうち、上記グローバル変数の辞書で取り出されたバリューで最適化対象であるコード中のグローバル変数を置換する最適化によって最適化されたコードを無効化せずに、当該最適化されたコードを実行できる例を示す。
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)。
コード902は、投機的に行った最適化がグローバル変数の辞書(1段目の辞書、n)から取り出したグローバル変数の値の定数化であり、且つ、ビルトイン関数の辞書に関する変化が異なるバリューでの更新である場合に、当該ビルトイン関数の辞書に関連付けられたコンパイル済みコードのうち、上記グローバル変数の辞書で取り出されたバリューで置換する最適化によって最適化されたコードを無効化せずに、当該最適化されたコードを実行できる例を示す。
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)。
コード903は、投機的に行った最適化がグローバル変数の辞書(1段目の辞書、n)から取り出したグローバル変数の値の定数化であり、且つ、グローバル変数の辞書に関する変化がアドレスの変更であり且つ当該変更後の辞書のキー及びバリューが元の辞書のキー及びバリューと完全に一致する場合に、当該グローバル変数の辞書に関連付けられたコンパイル済みコードのうち、上記グローバル変数の辞書で取り出されたバリューで置換する最適化によって最適化されたコードを無効化せずに、当該最適化されたコードを実行できる例を示す。
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)。
コード904は、投機的に行った最適化がビルトイン関数の辞書(2段目の辞書、n)から取り出したビルトイン関数の呼び出し先の静的決定であり、且つ、グローバル変数の辞書に関する変化が異なるバリューでの更新である場合に、当該グローバル変数の辞書に関連付けられたコンパイル済みコードのうち、上記ビルトイン関数の呼び出し先を辞書で取り出されたバリューで置換する最適化によって最適化されたコードを無効化せずに、当該最適化されたコードを実行できる例を示す。
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)。
コード905は、投機的に行った最適化がビルトイン関数の辞書(2段目の辞書、n)から取り出したビルトイン関数の呼び出し先の静的決定であり、且つ、ビルトイン関数の辞書に関する変化がキーの追加である場合に、当該ビルトイン関数の辞書に関連付けられたコンパイル済みコードのうち、上記ビルトイン関数の呼び出し先を辞書で取り出されたバリューで置換する最適化によって最適化されたコードを無効化せずに、当該最適化されたコードを実行できる例を示す。
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)。
コード906は、投機的に行った最適化がビルトイン関数の辞書(2段目の辞書、n)から取り出したビルトイン関数の呼び出し先の静的決定であり、且つ、グローバル変数の辞書に関する変化がアドレスの変更であり且つ当該変更後の辞書のキーが元の辞書のキーと一致している場合に、当該グローバル変数の辞書に関連付けられたコンパイル済みコードのうち、上記ビルトイン関数の呼び出し先を辞書で取り出されたバリューで置換する最適化によって最適化されたコードを無効化せずに、当該最適化されたコードを実行できる例を示す。
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つの実施態様において、コードがパイソンに従い記述されたコードである場合に適用される最適化には、下記のようなものがある:
・更新されることが少ないグローバル変数(非特許文献1を参照)を、定数としてコンパイルすること;及び、
・ビルトイン関数の呼び出しの際に、飛び先アドレスの決定の高速化。
さらに、上記最適化の結果、他の最適化をさらに適用可能になることもある。他の最適化は例えば、定数伝播及びコード特殊化である。定数伝播とは、コンパイル時に数式内の値を既知の定数値に置き換える手法であり、定数としては、定数畳み込みで述べたようなものの他に、定数値を引数とした Intrinsic Function(コンパイラが関数呼び出しではなく、機械語に置き換えてしまうような関数)も定数となる。コード特殊化とは、動的又は静的に得られた型情報とあわせて、より単純な命令で置き換え可能であることをいう。
本発明では、ある変数についての辞書を管理する記憶領域が更新されたかどうかの情報に基づくので複数の辞書に属する変数を監視対象とする。さらに、本発明では、コンパイル時の情報(すなわち、バリューを取り出した段数n)を利用して、記憶領域が更新された場合であっても、特定の条件下において辞書に関する変化が検出された辞書に関連付けられたコンパイル済みコードのうち、上記取り出されたバリューで置換する最適化によって最適化されたコードのみを無効化すればよいと判断することが可能である。

Claims (20)

  1. コードを投機的に最適化するための方法であって、コンピュータが、
    キー及び当該キーに関連付けられたバリューの1又は複数の組を保持する1又は複数の辞書を所定の順序で検索し、シンボル名をキーとして前記1又は複数の辞書から前記シンボル名に関連付けられたバリューを取り出すステップと、
    コード中のシンボルを前記取り出されたバリューで置換する最適化を行って、前記最適化されたコードの全部又は一部を含むコンパイル対象のコードをコンパイルするステップと、
    前記1又は複数の辞書のうちの1つの辞書に関する変化が検出されることに応じて、前記変化が検出された辞書の前記所定の順序における段数m(mは1以上の整数)を、前記取り出されたバリューを有する辞書の前記所定の順序における段数n(nは1以上の整数)と比較するステップと、
    前記段数の比較の結果と前記変化の種類に応じて、前記変化が検出された辞書に関連付けられたコンパイル済みコードのうち、前記取り出されたバリューで置換する最適化によって最適化されたコードを無効化するステップと
    を実行することを含む、前記方法。
  2. 前記辞書に関する変化が、キーの追加、キーの削除、同じバリューでの若しくは異なるバリューでの更新、又は、辞書アドレスの変更である、請求項1に記載の方法。
  3. 前記無効化するステップが、
    前記段数mが前記段数nよりも小さい場合に、前記辞書に関する変化が、キーの追加、キーの削除、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーがアドレスが変更される前の当該辞書のキーと一致しないこと;又は、
    前記段数mが前記段数nに等しい場合に、前記辞書に関する変化が、キーの削除、異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された当該辞書のキー及びバリューが当該アドレスが変更される前の辞書のキー及びバリューの少なくとも一方と一致しないこと;
    の条件下で前記無効化を行う、請求項2に記載の方法。
  4. 前記コンピュータが、
    前記段数nを記録するステップ
    をさらに実行するステップを含む、請求項3に記載の方法。
  5. 前記段数nを記録するステップが、
    前記段数n、当該段数nまでの前記辞書が有するキー及びバリューの組、並びに、前記段数nまでの前記辞書のアドレスを、前記コンパイル済みコードに関連付けられたデータとして保存するステップ
    をさらに含む、請求項4に記載の方法。
  6. 前記比較するステップが、
    前記変化が検出された辞書に関連付けられたコンパイル済みコードを特定するステップと、
    前記コンパイル済みコードに関連付けられた前記データから、前記段数nを取り出すステップと
    をさらに含む、請求項5に記載の方法。
  7. 前記無効化するステップが、
    前記特定されたコンパイル済みコードに関連付けられた前記データから、キー、バリュー若しくは辞書のアドレス、又はその組み合わせを取り出すステップ
    をさらに含む、請求項5又は6に記載の方法。
  8. 前記コンパイルするステップの後において、前記コンパイル済みコードの実行中又は前記コンパイルするステップにおいてコンパイルされていないコードの実行中に、前記比較するステップ及び前記無効化するステップが実行される、請求項1〜7のいずれか一項に記載の方法。
  9. 前記シンボルを前記取り出されたバリューで置換する最適化が、前記1又は複数の辞書を参照することによってバリューが決定されるコード中のシンボルを対象に行われる、請求項1〜8のいずれか一項に記載の方法。
  10. 前記コンピュータが、
    前記コンパイル済みコードを、当該コンパイル済みコードのコンパイル中の最適化において使用されたバリューが取り出された辞書に関連付けるステップ
    をさらに実行するステップを含む、請求項1〜8のいずれか一項に記載の方法。
  11. 前記コンピュータが、
    前記1又は複数の辞書のうちの前記検索のために参照された辞書、すなわちn段目までの辞書に関する変化又は前記1又は複数の辞書の全てに関する変化の監視を開始するステップ
    をさらに実行するステップを含む、請求項1〜10のいずれか一項に記載の方法。
  12. 前記コンピュータが、前記無効化するステップの後に、
    前記1又は複数の辞書のうちの1つの辞書に関する変化が検出されるたびに、前記比較するステップと前記無効化するステップとを繰り返すステップ
    をさらに実行するステップを含む、請求項1〜11のいずれか一項に記載の方法。
  13. 前記無効化するステップが、
    前記段数mが前記段数nよりも小さい場合に、前記辞書に関する変化が、同じバリューでの若しくは異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーが当該アドレスが変更される前の当該辞書のキーと一致すること;
    前記段数mが前記段数nに等しい場合に、前記辞書に関する変化が、キーの追加、同じバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキー及びバリューが当該アドレスが変更される前の当該辞書のキー及びバリューのいずれとも一致すること;又は、
    前記辞書に関する変化の種類にかかわらず、前記段数mが前記段数nよりも大きい場合であること
    の条件下で前記無効化を禁止する、請求項2又は3に記載の方法。
  14. 前記複数の辞書が、グローバル変数又は関数の辞書とビルトイン変数又は関数の辞書とを含み、
    前記所定の順序が段数1がグローバル変数又は関数の辞書であり、段数2がビルトイン変数又は関数の辞書であり、前記所定の順序は段数1が段数2よりも優先する、請求項1〜13のいずれか一項に記載の方法。
  15. 前記コードがパイソン(Python)に従い記述されたコードである、請求項14に記載の方法。
  16. コードを投機的に最適化するためのコンピュータであって、
    キー及び当該キーに関連付けられたバリューの1又は複数の組を保持する1又は複数の辞書を所定の順序で検索し、シンボル名をキーとして前記1又は複数の辞書から前記シンボル名に関連付けられたバリューを取り出すバリュー取り出し部と、
    コード中のシンボルを前記取り出されたバリューで置換する最適化を行って、前記最適化されたコードの全部又は一部を含むコンパイル対象のコードをコンパイルするコンパイル部と、
    前記1又は複数の辞書のうちの1つの辞書に関する変化が検出されることに応じて、前記変化が検出された辞書の前記所定の順序における段数m(mは1以上の整数)を、前記取り出されたバリューを有する辞書の前記所定の順序における段数n(nは1以上の整数)と比較する比較部と、
    前記段数の比較の結果と前記変化の種類に応じて、前記変化が検出された辞書に関連付けられたコンパイル済みコードのうち、前記取り出されたバリューで置換する最適化によって最適化されたコードを無効化する無効化部と
    を備えている、前記コンピュータ。
  17. 前記辞書に関する変化が、キーの追加、キーの削除、同じバリューでの若しくは異なるバリューでの更新、又は、辞書アドレスの変更である、請求項16に記載のコンピュータ。
  18. 前記無効化部が、
    前記段数mが前記段数nよりも小さい場合に、前記辞書に関する変化が、キーの追加、キーの削除、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーがアドレスが変更される前の当該辞書のキーと一致しないこと;又は、
    前記段数mが前記段数nに等しい場合に、前記辞書に関する変化が、キーの削除、異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された当該辞書のキー及びバリューが当該アドレスが変更される前の辞書のキー及びバリューの少なくとも一方と一致しないこと
    の条件下で前記無効化を行う、請求項17に記載のコンピュータ。
  19. 前記無効化部が、
    前記段数mが前記段数nよりも小さい場合に、前記辞書に関する変化が、同じバリューでの若しくは異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーが当該アドレスが変更される前の当該辞書のキーと一致すること;
    前記段数mが前記段数nに等しい場合に、前記辞書に関する変化が、キーの追加、同じバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキー及びバリューが当該アドレスが変更される前の当該辞書のキー及びバリューのいずれとも一致すること;又は、
    前記辞書に関する変化の種類にかかわらず、前記段数mが前記段数nよりも大きい場合であること
    の条件下で前記無効化を禁止する、請求項17又は18に記載のコンピュータ。
  20. コードを投機的に最適化するためのコンピュータ・プログラムであって、コンピュータに、請求項1〜15のいずれか一項に記載の方法の各ステップを実行させるコンピュータ・プログラム。
JP2012099873A 2012-04-25 2012-04-25 コードを投機的に最適化するための方法、並びにそのコンピュータ及びコンピュータ・プログラム Expired - Fee Related JP5846581B2 (ja)

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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 演算方法および装置、並びに伝送媒体
WO2002015408A2 (en) * 2000-08-15 2002-02-21 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
JP2008102748A (ja) 2006-10-19 2008-05-01 Hitachi Ltd プログラム実行方法、言語処理系、及び実行時ルーチン
US8739137B2 (en) * 2006-10-19 2014-05-27 Purdue Research Foundation Automatic derivative method for a computer programming language
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

Also Published As

Publication number Publication date
US9027008B2 (en) 2015-05-05
JP2013228845A (ja) 2013-11-07
US20130290942A1 (en) 2013-10-31

Similar Documents

Publication Publication Date Title
US8843912B2 (en) Optimization of an application to reduce local memory usage
US8997040B2 (en) Variable closure
JP5602597B2 (ja) 外来情報を区分けすることにより仮想マシン・コードをメモリ最適化する方法、コンピュータ・プログラム、およびシステム
US9875173B2 (en) Time travel debugging in managed runtime
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
Schulte et al. Repairing COTS router firmware without access to source code or test suites: A case study in evolutionary software repair
JP6418696B2 (ja) 命令セットシミュレータおよびそのシミュレータ生成方法
US20160274878A1 (en) Methods and systems for removing plt stubs from dynamically linked binaries
CN110058861B (zh) 源码处理方法及装置、存储介质、电子设备
JP2012038231A (ja) バイナリコードを最適化するコンパイル方法、及びそのコンパイラシステム、並びにコンピュータ・プログラム
US20100218174A1 (en) Dynamic compiling and loading at runtime
US9098355B2 (en) Method and apparatus for substituting compiler built-in helper functions with machine instructions
JP5536593B2 (ja) 最適化装置、最適化方法およびコンパイラ・プログラム
US8898625B2 (en) Optimized storage of function variables
Blyth et al. ProIO: An event-based I/O stream format for protobuf messages
JP2000222219A (ja) 多次元配列オブジェクトの処理方法及び装置
Bhatt et al. Peephole Optimization Technique for analysis and review of Compile Design and Construction
JP6770335B2 (ja) 解析装置及びプログラム
CN107239395B (zh) 一种源代码中无效函数的查找方法和设备
US8769221B2 (en) Preemptive page eviction
JP2008102748A (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