(57)【特許請求の範囲】
【請求項１】
コードを投機的に最適化するための方法であって、コンピュータが、
キー及び当該キーに関連付けられたバリューの１又は複数の組を保持する１又は複数の辞書を所定の順序で検索し、シンボル名をキーとして前記１又は複数の辞書から前記シンボル名に関連付けられたバリューを取り出すステップと、
コード中のシンボルを前記取り出されたバリューで置換する最適化を行って、前記最適化されたコードの全部又は一部を含むコンパイル対象のコードをコンパイルするステップと、
前記１又は複数の辞書のうちの１つの辞書に関する変化が検出されることに応じて、前記変化が検出された辞書の前記所定の順序における段数ｍ（ｍは１以上の整数）を、前記取り出されたバリューを有する辞書の前記所定の順序における段数ｎ（ｎは１以上の整数）と比較するステップと、
前記段数の比較の結果と前記変化の種類に応じて、前記変化が検出された辞書に関連付けられたコンパイル済みコードのうち、前記取り出されたバリューで置換する最適化によって最適化されたコードを無効化するステップと
を実行することを含む、前記方法。
【請求項２】
前記辞書に関する変化が、キーの追加、キーの削除、同じバリューでの若しくは異なるバリューでの更新、又は、辞書アドレスの変更である、請求項１に記載の方法。
【請求項３】
前記無効化するステップが、
前記段数ｍが前記段数ｎよりも小さい場合に、前記辞書に関する変化が、キーの追加、キーの削除、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーがアドレスが変更される前の当該辞書のキーと一致しないこと；又は、
前記段数ｍが前記段数ｎに等しい場合に、前記辞書に関する変化が、キーの削除、異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された当該辞書のキー及びバリューが当該アドレスが変更される前の辞書のキー及びバリューの少なくとも一方と一致しないこと；
の条件下で前記無効化を行う、請求項２に記載の方法。
【請求項４】
前記コンピュータが、
前記段数ｎを記録するステップ
をさらに実行するステップを含む、請求項３に記載の方法。
【請求項５】
前記段数ｎを記録するステップが、
前記段数ｎ、当該段数ｎまでの前記辞書が有するキー及びバリューの組、並びに、前記段数ｎまでの前記辞書のアドレスを、前記コンパイル済みコードに関連付けられたデータとして保存するステップ
をさらに含む、請求項４に記載の方法。
【請求項６】
前記比較するステップが、
前記変化が検出された辞書に関連付けられたコンパイル済みコードを特定するステップと、
前記コンパイル済みコードに関連付けられた前記データから、前記段数ｎを取り出すステップと
をさらに含む、請求項５に記載の方法。
【請求項７】
前記無効化するステップが、
前記特定されたコンパイル済みコードに関連付けられた前記データから、キー、バリュー若しくは辞書のアドレス、又はその組み合わせを取り出すステップ
をさらに含む、請求項５又は６に記載の方法。
【請求項８】
前記コンパイルするステップの後において、前記コンパイル済みコードの実行中又は前記コンパイルするステップにおいてコンパイルされていないコードの実行中に、前記比較するステップ及び前記無効化するステップが実行される、請求項１〜７のいずれか一項に記載の方法。
【請求項９】
前記シンボルを前記取り出されたバリューで置換する最適化が、前記１又は複数の辞書を参照することによってバリューが決定されるコード中のシンボルを対象に行われる、請求項１〜８のいずれか一項に記載の方法。
【請求項１０】
前記コンピュータが、
前記コンパイル済みコードを、当該コンパイル済みコードのコンパイル中の最適化において使用されたバリューが取り出された辞書に関連付けるステップ
をさらに実行するステップを含む、請求項１〜８のいずれか一項に記載の方法。
【請求項１１】
前記コンピュータが、
前記１又は複数の辞書のうちの前記検索のために参照された辞書、すなわちｎ段目までの辞書に関する変化又は前記１又は複数の辞書の全てに関する変化の監視を開始するステップ
をさらに実行するステップを含む、請求項１〜１０のいずれか一項に記載の方法。
【請求項１２】
前記コンピュータが、前記無効化するステップの後に、
前記１又は複数の辞書のうちの１つの辞書に関する変化が検出されるたびに、前記比較するステップと前記無効化するステップとを繰り返すステップ
をさらに実行するステップを含む、請求項１〜１１のいずれか一項に記載の方法。
【請求項１３】
前記無効化するステップが、
前記段数ｍが前記段数ｎよりも小さい場合に、前記辞書に関する変化が、同じバリューでの若しくは異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーが当該アドレスが変更される前の当該辞書のキーと一致すること；
前記段数ｍが前記段数ｎに等しい場合に、前記辞書に関する変化が、キーの追加、同じバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキー及びバリューが当該アドレスが変更される前の当該辞書のキー及びバリューのいずれとも一致すること；又は、
前記辞書に関する変化の種類にかかわらず、前記段数ｍが前記段数ｎよりも大きい場合であること
の条件下で前記無効化を禁止する、請求項２又は３に記載の方法。
【請求項１４】
前記複数の辞書が、グローバル変数又は関数の辞書とビルトイン変数又は関数の辞書とを含み、
前記所定の順序が段数１がグローバル変数又は関数の辞書であり、段数２がビルトイン変数又は関数の辞書であり、前記所定の順序は段数１が段数２よりも優先する、請求項１〜１３のいずれか一項に記載の方法。
【請求項１５】
前記コードがパイソン（Ｐｙｔｈｏｎ）に従い記述されたコードである、請求項１４に記載の方法。
【請求項１６】
コードを投機的に最適化するためのコンピュータであって、
キー及び当該キーに関連付けられたバリューの１又は複数の組を保持する１又は複数の辞書を所定の順序で検索し、シンボル名をキーとして前記１又は複数の辞書から前記シンボル名に関連付けられたバリューを取り出すバリュー取り出し部と、
コード中のシンボルを前記取り出されたバリューで置換する最適化を行って、前記最適化されたコードの全部又は一部を含むコンパイル対象のコードをコンパイルするコンパイル部と、
前記１又は複数の辞書のうちの１つの辞書に関する変化が検出されることに応じて、前記変化が検出された辞書の前記所定の順序における段数ｍ（ｍは１以上の整数）を、前記取り出されたバリューを有する辞書の前記所定の順序における段数ｎ（ｎは１以上の整数）と比較する比較部と、
前記段数の比較の結果と前記変化の種類に応じて、前記変化が検出された辞書に関連付けられたコンパイル済みコードのうち、前記取り出されたバリューで置換する最適化によって最適化されたコードを無効化する無効化部と
を備えている、前記コンピュータ。
【請求項１７】
前記辞書に関する変化が、キーの追加、キーの削除、同じバリューでの若しくは異なるバリューでの更新、又は、辞書アドレスの変更である、請求項１６に記載のコンピュータ。
【請求項１８】
前記無効化部が、
前記段数ｍが前記段数ｎよりも小さい場合に、前記辞書に関する変化が、キーの追加、キーの削除、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーがアドレスが変更される前の当該辞書のキーと一致しないこと；又は、
前記段数ｍが前記段数ｎに等しい場合に、前記辞書に関する変化が、キーの削除、異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された当該辞書のキー及びバリューが当該アドレスが変更される前の辞書のキー及びバリューの少なくとも一方と一致しないこと
の条件下で前記無効化を行う、請求項１７に記載のコンピュータ。
【請求項１９】
前記無効化部が、
前記段数ｍが前記段数ｎよりも小さい場合に、前記辞書に関する変化が、同じバリューでの若しくは異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーが当該アドレスが変更される前の当該辞書のキーと一致すること；
前記段数ｍが前記段数ｎに等しい場合に、前記辞書に関する変化が、キーの追加、同じバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキー及びバリューが当該アドレスが変更される前の当該辞書のキー及びバリューのいずれとも一致すること；又は、
前記辞書に関する変化の種類にかかわらず、前記段数ｍが前記段数ｎよりも大きい場合であること
の条件下で前記無効化を禁止する、請求項１７又は１８に記載のコンピュータ。
【請求項２０】
コードを投機的に最適化するためのコンピュータ・プログラムであって、コンピュータに、請求項１〜１５のいずれか一項に記載の方法の各ステップを実行させるコンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はコードを最適化する技法に関し、特には、本発明はコードを投機的に最適化し、当該最適化されたコードのコンパイル済みコードが特定の条件下において無効化されるのを防止するための方法、並びにそのコンピュータ、コンピュータ・プログラム及びコンピュータ・プログラム製品に関する。
【背景技術】
【０００２】
ローカル（local）変数と、グローバル（global）変数又は関数とを持つプログラム言語において、グローバル変数又は関数が更新される頻度がグローバル変数又は関数以外の他の変数又は関数（ローカル変数を含む）と比べて少ないという挙動が知られている（下記非特許文献１を参照）。この挙動を利用して、グローバル変数又は関数をコンパイル時の値を用いて定数とし、当該定数としたコードを投機的（speculative）に最適化し、当該最適化されたコードのコンパイル済みコードを実行し、当該実行時において定数とした値が変更された可能性がある場合に当該コンパイル済みコードを無効化する、という技術がある（下記非特許文献２を参照）。
【０００３】
パイソン（Python）言語は、Ｌｉｎｕｘ（登録商標）、Ｍａｃ ＯＳ Ｘ（登録商標）、Ｗｉｎｄｏｗｓ（登録商標）などの、ほとんどのオペレーティング・システム上で実行することが可能である。また、パイソン言語は、Ｇｏｏｇｌｅ（登録商標）やＮＡＳＡ（アメリカ航空宇宙局）の内部で利用されているという実績がある。それら理由の故に、パイソン言語は、世界的に利用者が増えている勢いのある言語である。
【０００４】
パイソン言語では、構文スコープ（lexical scope）での検索順序が、ローカル変数、外側の（エンクロージング）関数、グローバル（global）変数又は関数、次にビルトイン（Built-in）変数又は関数となっている（非特許文献３を参照）。構文スコープは静的スコープ（static scope）とも呼ばれ、構文上で決定できるスコープのみを使用する方法である。上記順序での検索、すなわちグローバル変数又は関数の辞書（dictionary）、次にビルトイン変数又は関数の辞書の順序での検索は、１バイトコード命令（LOAD_GLOBAL）で行われる（下記非特許文献４を参照）。従って、LOAD_GLOBAL命令に対して上記した無効化技術を適用すると、（１）グローバル変数又は関数の値の定数化（「定数伝播」（constant propagation）ともいう）、及び、（２）ビルトイン変数又は関数の呼出先の静的決定とコード特殊化（「code specialization」ともいう）、の２つの場合の最適化において投機的に最適化が可能である。一方、コンパイル済みコードに関連するグローバル変数又は関数の辞書又はビルトイン変数又は関数の辞書のいずれかが更新された場合に、コンパイル済みコードが無効化される（下記非特許文献２を参照）。
【０００５】
パイソン言語において、exec文はパイソン・コードの動的な実行をサポートする。exec文で、グローバル変数又は関数の辞書を渡して任意の文（statements）を実行することが可能である（下記非特許文献５を参照）。従って、渡されるグローバル変数又は関数の辞書のアドレスが変更された場合においても、上記定数とした値が更新された可能性があるので、最適化されたコードのコンパイル済みコードが無効化される。
【０００６】
下記特許文献１は、最適化の対象プログラムにおいて、変数の内容又は変数により指定される記憶領域の内容を更新する更新命令を検出する更新命令検出部と、前記対象プログラムにおいて、他の命令列に制御を移す制御移行命令により制御が移行されて、前記変数の内容又は前記記憶領域の内容に応じて異なる処理を行う命令列を検出する命令列検出部と、検出した当該命令列を、前記変数の内容又は前記記憶領域の内容が予め定められた特定の内容である場合の処理に最適化してコンパイルする命令列コンパイル部と、前記対象プログラムにおける、前記更新命令から前記制御移行命令までの間に、前記変数の内容又は前記記憶領域の内容が前記特定の内容である場合に実行され、前記制御移行命令の移行先アドレスを、前記命令列コンパイル部により最適化された前記命令列のアドレスに設定する設定命令を生成する設定命令生成部とを備える最適化コンパイラを記載する（請求項１）。すなわち、特許文献１では、複数の記憶領域（変数、配列）が更新されたかどうかを検出して、再コンパイルなどの動作を行う。
【０００７】
下記特許文献２は、変数名を通じて変数の値を上書きする機能を原因とする最適化の抑止を回避し，プログラムの実行を高速化することが可能なプログラム実行方法、言語処理系、及び実行時ルーチンを提供することを目的とし（段落００１５）、記憶部と処理部とを有する計算機システムにおいて、前記記憶部に記憶した言語処理系のプログラムを使って、前記記憶部に記憶した実行対象のプログラムを実行するプログラム実行方法であって、前記実行対象のプログラムを、前記言語処理系の動的コンパイラを使って、前記記憶部の所定領域に記憶している変数の保持する値が不変であると仮定して最適化を適用し、前記言語処理系の実行時ルーチンを使って，前記実行対象のプログラムが、前記所定領域を、前記所定領域に対応する変数名を通じて上書きしうるか監視し、前記上書きの可能性が生じた場合に，前記動的コンパイラが前記所定領域に対応する前記変数の保持する値が不変と仮定して最適化を適用しつつ生成したコードを無効化するプログラム実行方法（請求項１）を記載する。すなわち、特許文献２では、変数の集合に属する値が上書きされたかどうかに基づいて、最適化を適用したコードを無効化するかどうかを決定する。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２００５−２１５８３０号公報
【特許文献２】特開２００８−１０２７４８号公報
【非特許文献】
【０００９】
【非特許文献１】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）の機会を失うことはない。しかし、上記辞書全ての変更を監視し且つ無効化するには、コストが高すぎて、実用的ではない。
【００１１】
パイソン言語において、非特許文献２では、グローバル変数又は関数の辞書又はビルトイン変数又は関数の辞書のいずれかが更新された場合に、キー又はバリューのいずれかの変更にかかわらず、コンパイル済みコードが無効化される。しかしながら、特定の条件下において上記辞書が更新された場合において、コンパイル済みコードを無効化する必要がない場合があるということを考慮していない。従って、上記無効化の方法では、性能改善の余地が失われている。
【００１２】
また、パイソン言語において、コードに渡されるグローバル変数又は関数の辞書のアドレスが更新された場合に、コンパイル済みコードが常に無効化されている（非特許文献２を参照）。しかしながら、特定の条件下においてアドレスの更新がされた場合において、コンパイル済みコードを無効化する必要がない場合があるということを考慮していない。従って、上記無効化の方法では、性能改善の余地が失われている。 
【００１３】
従って、本発明は、コンパイル済みコードを無効化する必要がない場合にまで無効化されることを防止し、それによって性能改善を図ることを目的とする。
【課題を解決するための手段】
【００１４】
本発明はコードを投機的に最適化するための技法であり、当該技法は、上記課題を解決するために、１又は複数の辞書を所定の順序で検索し、シンボル名をキーとして上記辞書からシンボル名に関連付けられたバリューを取り出し、当該取り出されたバリューでコード中のシンボルを置換する最適化を行い、当該最適化されたコードの全部又は一部を含むコンパイル対象のコードをコンパイルすること、当該コンパイルが行われた後に、上記辞書中の１つの辞書に関する変化が検出されることに応じて、当該変化が検出された辞書の段数ｍ（ｍは１以上の整数）を当該取り出されたバリューを有する辞書の段数ｎ（ｎは１以上の整数）と比較すること、そして上記段数の比較の結果と上記変化の種類に応じて、上記変化が検出された辞書に関連付けられたコンパイル済みコードのうち、上記取り出されたバリューで置換する最適化によって最適化されたコードを無効化すること、を特徴とする。
【００１５】
本発明はコードを投機的に最適化するための方法を提供し、当該方法は、
キー及び当該キーに関連付けられたバリューの１又は複数の組を保持する１又は複数の辞書を所定の順序で検索し、シンボル名をキーとして上記１又は複数の辞書から上記シンボル名に関連付けられたバリューを取り出すステップと、
コード中のシンボルを上記取り出されたバリューで置換する最適化を行って、上記最適化されたコードの全部又は一部を含むコンパイル対象のコードをコンパイルするステップと、
上記１又は複数の辞書のうちの１つの辞書に関する変化が検出されることに応じて、上記変化が検出された辞書の上記所定の順序における段数ｍ（ｍは１以上の整数）を、上記取り出されたバリューを有する辞書の上記所定の順序における段数ｎ（ｎは１以上の整数）と比較するステップと、
上記段数の比較の結果と上記変化の種類に応じて、上記変化が検出された辞書に関連付けられたコンパイル済みコードのうち、上記取り出されたバリューで置換する最適化によって最適化されたコードを無効化するステップと
を含む。上記コンパイルするステップにおいてコンパイル処理されたコードを、以下において「本発明に従うコンパイル済みコード」と言及し、上記コンパイルするステップ以外のコンパイル処理されたコードを、以下において「他のコンパイル済みコード」と言及する場合がある。
【００１６】
本発明の１つの実施態様において、上記辞書に関する変化が、キーの追加、キーの削除、同じバリューでの若しくは異なるバリューでの更新、又は、辞書アドレスの変更でありうる。
【００１７】
本発明の１つの実施態様において、上記無効化が、以下の条件のいずれかを満たす場合に行われる：
・段数ｍ＜段数ｎである場合に、上記辞書に関する変化が、キーの追加、キーの削除、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーがアドレスが変更される前の当該辞書のキーと一致しないこと；又は、
・段数ｍ＝段数ｎである場合に、上記辞書に関する変化が、キーの削除、異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された当該辞書のキー及びバリューが当該アドレスが変更される前の辞書のキー及びバリューの少なくとも一方と一致しないこと。
但し、上記辞書に関する変化の種類にかかわらず、段数ｍ＞段数ｎである場合には、上記無効化は禁止される。
【００１８】
本発明の１つの実施態様において、上記無効化が、以下の条件のいずれかを満たす場合に行われない。すなわち、上記変化が検出された辞書に関連付けられたコンパイル済みコードは、以下の条件のいずれかを満たす場合にその実行が継続される：
・段数ｍ＜段数ｎである場合に、上記辞書に関する変化が、同じバリューでの若しくは異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーが当該アドレスが変更される前の当該辞書のキーと一致すること；
・段数ｍ＝段数ｎである場合に、上記辞書に関する変化が、キーの追加、同じバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキー及びバリューが当該アドレスが変更される前の当該辞書のキー及びバリューのいずれとも一致すること；又は、
・上記辞書に関する変化の種類にかかわらず、段数ｍ＞段数ｎであること。
【００１９】
本発明の１つの実施態様において、上記方法が、上記取り出されたバリューを有する辞書の上記所定の順序における段数ｎを記録するステップをさらに含みうる。
【００２０】
本発明の１つの実施態様において、上記段数ｎを記録するステップが、上記段数ｎ、当該段数ｎまでの上記辞書が有するキー及びバリューの組、並びに上記段数ｎまでの上記辞書のアドレスを、上記コンパイル済みコードに関連付けられたデータとして保存するステップをさらに含みうる。
【００２１】
本発明の１つの実施態様において、上記方法は、上記コンパイル済みコードを、上記コンパイル済みコードのコンパイル中の最適化において使用されたバリューが取り出された辞書に関連付けるステップをさらに含みうる。
【００２２】
本発明の１つの実施態様において、上記方法は、上記１又は複数の辞書のうちの上記検索のために参照された辞書、すなわちｎ段目までの辞書に関する変化又は上記１又は複数の辞書の全てに関する変化の監視を開始するステップをさらに含みうる。
【００２３】
本発明の１つの実施態様において、上記方法は、上記コンパイルするステップの後において、上記コンパイル済みコードの実行中又は上記コンパイルするステップでコンパイルされていないコードの実行中に、上記比較するステップ及び上記無効化するステップを実行しうる。
【００２４】
本発明の１つの実施態様において、上記方法は、上記無効化するステップの後に、上記１又は複数の辞書のうちの１つの辞書に関する変化が検出されるたびに、上記比較するステップと上記無効化するステップとを繰り返しうる。
【００２５】
本発明の１つの実施態様において、上記シンボルを上記取り出されたバリューで置換する最適化が、上記１又は複数の辞書を参照することによってバリューが決定されるコード中のシンボルを対象に行われうる。
【００２６】
本発明の１つの実施態様において、上記比較するステップが、上記変化が検出された辞書に関連付けられたコンパイル済みコードを特定するステップと、上記コンパイル済みコードに関連付けられたデータから、上記段数ｎを取り出すステップをさらに含みうる。
【００２７】
本発明の１つの実施態様において、上記無効化するステップが、上記特定されたコンパイル済みコードに関連付けられたデータから、キー、バリュー若しくは辞書のアドレス、又はその組み合わせを取り出すステップをさらに含みうる。
【００２８】
本発明の１つの実施態様において、上記複数の辞書が、グローバル変数又は関数の辞書とビルトイン変数又は関数の辞書とを含みうる。本発明の１つの実施態様において、上記所定の順序において段数１が段数２よりも優先とすると、段数１がグローバル変数又は関数の辞書であり、段数２がビルトイン変数又は関数の辞書でありうる。
【００２９】
本発明の１つの実施態様において、上記コードがパイソン言語の仕様に従い記述されたコードでありうる。
【００３０】
また、本発明はコードを投機的に最適化するためのコンピュータを提供し、当該コンピュータは、
キー及び当該キーに関連付けられたバリューの１又は複数の組を保持する１又は複数の辞書を所定の順序で検索し、シンボル名をキーとして上記１又は複数の辞書から上記シンボル名に関連付けられたバリューを取り出すバリュー取り出し部と、
コード中のシンボルを上記取り出されたバリューで置換する最適化を行って、上記最適化されたコードの全部又は一部を含むコンパイル対象のコードをコンパイルするコンパイル部と、
上記１又は複数の辞書のうちの１つの辞書に関する変化が検出されることに応じて、上記変化が検出された辞書の上記所定の順序における段数ｍ（ｍは１以上の整数）を、上記取り出されたバリューを有する辞書の上記所定の順序における段数ｎ（ｎは１以上の整数）と比較する比較部と、
上記段数の比較の結果と上記変化の種類に応じて、上記変化が検出された辞書に関連付けられたコンパイル済みコードのうち、上記取り出されたバリューで置換する最適化によって最適化されたコードを無効化する無効化部と
を備えている。
【００３１】
また、本発明はコードを投機的に最適化するためのコンピュータを提供し、当該コンピュータは、プロセッサと、当該プロセッサに接続されたメモリと、上記コード及び上記に記載の方法の各ステップを実行させるコンピュータ・プログラムを格納する記憶装置とを備えており、上記プロセッサが、上記コンピュータ・プログラムを上記メモリに読み出して、当該コンピュータ・プログラムを実行し、上記コードを投機的に最適化する。
【００３２】
また、本発明はコードを投機的に最適化するためのコンピュータ・プログラムを提供し、当該コンピュータ・プログラムはコンピュータに上記に記載の方法の各ステップを実行させる。
【００３３】
本発明の機能を実行するためのコンピュータ・プログラムは、フレキシブル・ディスク、ＭＯ、ＣＤ−ＲＯＭ、ＤＶＤ、ＢＤ、ハードディスク装置、ＵＳＢに接続可能なメモリ媒体、ＲＯＭ、ＭＲＡＭ、ＲＡＭ等の任意のコンピュータ読み取り可能な記録媒体に格納することができる。当該コンピュータ・プログラムは、記録媒体への格納のために、通信回線で接続する他のデータ処理システムからダウンロードしたり、又は他の記録媒体から複製したりすることができる。また、当該コンピュータ・プログラムは、圧縮し、又は複数に分割して、単一又は複数の記録媒体に格納することもできる。また、様々な形態で、本発明を実施するコンピュータ・プログラム製品を提供することも勿論可能であることにも留意されたい。コンピュータ・プログラム製品は、例えば、上記コンピュータ・プログラムを記録した記憶媒体、又は、上記コンピュータ・プログラムを伝送する伝送媒体を包含しうる。
【００３４】
本発明の上記概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの構成要素のコンビネーション又はサブコンビネーションもまた、本発明となりうることに留意すべきである。
【００３５】
本発明の実施態様において使用されるコンピュータの各ハードウェア構成要素を、複数のマシンと組み合わせ、それらに機能を配分し実施する等の種々の変更は当業者によって容易に想定され得ることは勿論である。それらの変更は、当然に本発明の思想に包含される概念である。ただし、これらの構成要素は例示であり、そのすべての構成要素が本発明の必須構成要素となるわけではない。
【００３６】
また、本発明は、ハードウェア、ソフトウェア、又は、ハードウェア及びソフトウェアの組み合わせとして実現可能である。ハードウェアとソフトウェアとの組み合わせによる実行において、上記コンピュータ・プログラムがインストールされた装置における実行が典型的な例として挙げられる。かかる場合、該コンピュータ・プログラムが該装置のメモリにロードされて実行されることにより、該コンピュータ・プログラムは、該装置を制御し、本発明にかかる処理を実行させる。該コンピュータ・プログラムは、任意の言語、コード、又は、表記によって表現可能な命令群から構成されうる。そのような命令群は、該装置が特定の機能を直接的に、又は、１．他の言語、コード若しくは表記への変換、２．他の媒体への複製、のいずれか一方若しくは双方が行われた後に、実行することを可能にするものである。
【発明の効果】
【００３７】
本発明の実施態様によれば、従来技術ではコンパイル済みコードを過剰に無効化していたのに対して、本発明ではより詳細に、すなわちより精度良くコンパイル済みコードを無効化する場合の条件を設定することが可能になる。そのために、最適化されたコンパイル済みコードが無効化される機会が少なくなる。また、本発明は、更新の頻度が稀である乃至は少ない変更又は関数をバリューで置換して定数として扱うことによってより大きな効果を奏する。
【図面の簡単な説明】
【００３８】
【図１】本発明の実施態様に従う装置を実現するための情報処理端末のハードウェア構成の一例を示した図である。
【図２】図１に従うハードウェア構成を好ましくは備えており、本発明の実施態様に従うコンピュータの機能ブロック図である。
【図３】本発明の実施態様において使用されうる辞書を示す。
【図４】従来技術である、コードのコンパイル時の処理のフローチャートを示す。
【図５】従来技術である、コンパイル済みコードの実行時の処理のフローチャートを示す。
【図６】本発明の実施態様に従う、コードのコンパイル時の処理のフローチャートを示す。
【図７Ａ】本発明の実施態様に従う、任意のコードの実行時、例えばコンパイル済みコード若しくは他のコンパイル済みコードの実行時、又は、インタプリタによるコードの実行時における処理のフローチャートを示す。
【図７Ｂ】本発明の実施態様に従う、上記任意のコードの実行時における処理のフローチャートを示す。
【図７Ｃ】本発明の実施態様に従う、上記任意のコードの実行時における処理のフローチャートを示す。
【図８Ａ】本発明の実施態様において使用されうるパイソン言語において、ユーザがビルトイン関数の辞書を書き換える態様を示す。
【図８Ｂ】本発明の実施態様において使用されうるパイソン言語において、ユーザがグローバル変数で同じ名前を宣言するように書き換える態様を示す。
【図９】本発明の実施態様において使用されうるパイソン言語における、コード例を示す。
【発明を実施するための形態】
【００３９】
以下に、本発明を実施するための最良の形態を図面に基づいて詳細に説明するが、以下の実施態様は特許請求の範囲に係る発明を限定するものでなく、また実施態様の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。また、本発明は多くの異なる態様で実施することが可能であり、以下の実施態様において、種々の変更又は改良を加えることが可能であることが当業者に明らかである。
【００４０】
以下において、特に断らない限り、発明を実施するための形態の説明の全体を通じて同じ要素には同じ番号を付している。
【００４１】
図１は、本発明の実施態様に従うコンピュータを実現するためのハードウェア構成の一例を示した図である。
【００４２】
コンピュータ（１０１）は、ＣＰＵ（１０２）とメイン・メモリ（１０３）とを備えており、これらはバス（１０４）に接続されている。ＣＰＵ（１０２）は好ましくは、３２ビット又は６４ビットのアーキテクチャに基づくものであり、例えば、インテル社のＣｏｒｅ  ｉ（商標）シリーズ、Ｃｏｒｅ  ２（商標）シリーズ、Ａｔｏｍ（商標）シリーズ、Ｘｅｏｎ（商標）シリーズ、Ｐｅｎｔｉｕｍ（登録商標）シリーズ、Ｃｅｌｅｒｏｎ（登録商標）シリーズ、ＡＭＤ社のＯｐｔｅｒｏｎ（商標）シリーズ、Ｐｈｅｎｏｍ（商標）シリーズ、Ａｔｈｌｏｎ（商標）シリーズ、Ｔｕｒｉｏｎ（商標）シリーズ、Ｓｅｍｐｒｏｎ（商標）又はＡシリーズが使用されうる。バス（１０４）には、ディスプレイ・コントローラ（１０５）を介して、ディスプレイ（１０６）、例えば液晶ディスプレイ（ＬＣＤ）が接続されうる。ディスプレイ（１０６）は、コンピュータの管理のために、通信回線を介してネットワークに接続されたコンピュータについての情報と、そのコンピュータ上で動作中のソフトウェアについての情報を、適当なグラフィック・インタフェースで表示するために使用される。バス（１０４）にはまた、ＳＡＴＡ又はＩＤＥコントローラ（１０７）を介して、ディスク（１０８）、例えばシリコン・ディスク又はハードディスクが接続されうる。また、バス（１０４）にはまた、ＳＡＴＡ又はＩＤＥコントローラ（１０７）を介して、任意的に、ドライブ（１０９）、例えばＣＤ、ＤＶＤ又はＢＤドライブが接続されうる。バス（１０４）にはさらに、任意的に、キーボード・マウスコントローラ（１１０）又はＵＳＢバス（図示せず）を介して、キーボード（１１１）及びマウス（１１２）が接続されうるが、本発明を実施する上では必要ない。
【００４３】
ディスク（１０８）には、オペレーティング・システム、パイソン処理環境、パイソン・アプリケーション、パイソン実行時コンパイラを提供するプログラム、Ｊ２ＥＥなどのＪａｖａ（登録商標）処理環境、Ｊａｖａ（登録商標）アプリケーション、Ｊａｖａ（登録商標）仮想マシン（ＶＭ）、Ｊａｖａ（登録商標）実行時（ＪＩＴ）コンパイラを提供するプログラム、その他のプログラム、及びデータが、メイン・メモリにロード可能なように記憶されている。また、ディスク（１０８）には、コードの入力乃至は編集を可能にするソフトウェア、文字変換処理ソフトウェアであるフロント・エンド・プロセッサ（ＦＥＰ）がメイン・メモリにロード可能なように記憶されている。オペレーティング・システムは、例えば、ＬＩＮＵＸ（登録商標）ディストリビュータが提供するＬＩＮＵＸ（登録商標）、マイクロソフト・コーポレーションが提供するＷｉｎｄｏｗｓ（登録商標）オペレーティング・システム、アップル・コンピュータ・インコーポレイテッドが提供するＭａｃＯＳ（登録商標）若しくはｉＯＳ（登録商標）、Ｘ  Ｗｉｎｄｏｗ  Ｓｙｓｔｅｍを備えるＵＮＩＸ（登録商標）系システム（たとえば、インターナショナル・ビジネス・マシーンズ・コーポレーション（登録商標）が提供するＡＩＸ（登録商標））でありうる。
【００４４】
ドライブ（１０９）は、必要に応じて、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ又はＢＤからプログラムをディスク（１０８）にインストールするために使用されうる。
【００４５】
通信インタフェース（１１４）は、例えばイーサネット（登録商標）・プロトコルに従う。通信インタフェース（１１４）は、通信コントローラ（１１３）を介してバス（１０４）に接続され、コンピュータ（１０１）を通信回線（１１５）に物理的に接続する役割を担い、コンピュータ（１０１）のオペレーティング・システムの通信機能のＴＣＰ／ＩＰ通信プロトコルに対して、ネットワーク・インタフェース層を提供する。なお、通信回線は、有線ＬＡＮ環境に基づくもの、又は、無線ＬＡＮ環境、例えば、ＩＥＥＥ８０２．１１ａ／ｂ／ｇ／ｎなどのＷｉ−Ｆｉ規格に基づくものであってもよい。
【００４６】
以上から、本発明の実施態様において使用されるコンピュータは、特定のオペレーティング・システム環境に限定されるものではないことを理解することができるであろう。
【００４７】
図２は、図１に従うハードウェア構成を好ましくは備えており、本発明の実施態様に従うコンピュータの機能ブロック図である。
コンピュータ（２０１）は、図１に従うハードウェア構成を有しうる。コンピュータ（２０１）は、メモリ（２０２）、コンパイル部（２０３）、取り出し部（２０４）、最適化部（２０５）、実行部（２０６）、監視部（２０７）、比較部（２０８）、及び無効化部（２０９）を備えている。コンパイル部（２０３）は、取り出し部（２０４）及び最適化部（２０５）を包含しうる。メモリ（２０２）は、図１のメイン・メモリ（１０３）に対応しうる。記憶装置（２１０）は、図１のディスク（１０８）に対応しうる。また、コンピュータ（２０１）は記憶装置（２１０）を内蔵しているか、又は、コンピュータ（２０１）外にある記憶装置（２１０）に有線的に又は無線的に接続されうる。
【００４８】
メモリ（２０２）は、１又は複数の辞書（２１１）、コンパイル済みコード（２１２）、及びメタデータ（２１３）を格納しうる。以下、「辞書（２１１）」と言及する場合には、辞書の数が１又は複数の場合を包含する。
【００４９】
辞書（２１１）は、キー及び当該キーに関連付けられたバリューの１又は複数の組を有する。辞書（２１１）については、下記図３の説明おいて詳述する。
【００５０】
辞書（２１１）は、コードのコンパイル時処理において、又は、下記図６のステップ６０３中のコンパイル処理においてコンパイルされたコンパイル済みコード（以下において、「本発明に従うコンパイル済みコード」ともいう）若しくは同ステップ６０３以外のコンパイル処理においてコンパイルされたコンパイル済みコード（以下において、「他のコンパイル済みコード」ともいう）が実行されているときに、あるいは、コンパイルされていないコードがインタプリタにより実行されているときに記憶装置（２１０）からメモリ（２０２）中に読み出されてもよい。
【００５１】
コンパイル済みコード（２１２）は、記憶装置（２１０）に格納されたコンパイル済みコード（２２２）の一部又は全てであり、コンパイル済みコードの実行時に記憶装置（２１０）からメモリ（２０２）中に読み出されてもよい。コンパイル済みコード（２１２）は、上記した本発明に従うコンパイル済みコード及び他のコンパイル済みコードを包含する。また、コンパイル済みコード（２１２）は、下記に述べるコンパイル部（２０３）によってコンパイルされたコードでありうる。
【００５２】
メタデータ（２１３）は、本発明に従い作成されるものであり、辞書（２１１）中の１つの辞書に関する変化が検出された辞書の所定の順序における段数ｎ、当該段数ｎまでの辞書が有するキー及びバリューの組、並びに、当該段数ｎまでの辞書のアドレスを格納しうる。メタデータ（２１３）は、コンパイル済みコード（２１２）に関連付けられるデータであり、本発明に従うコンパイル済みコード若しくは他のコンパイル済みコードの実行時、又はコンパイルされていないコードがインタプリタにより実行されているときに参照可能なデータでありうる。上記所定の順序は例えば、辞書に付された検索順序、言語体系において定められた辞書の型による検索順序に従いうる。検索順序は例えば、段数１が段数２よりも優先とすると、段数１，２，３，・・・，ｋ（ｋは整数）で表されうるが、これに限定されるものではない。例えばパイソン言語の場合、検索順序がグローバル変数又は関数の辞書、次にビルトイン変数又は関数の辞書となっている。そのために、パイソン言語の場合、取り出し部（２０４）は、グローバル変数又は関数の辞書、そして、ビルトイン変数又は関数の辞書の順に参照しうる。グローバル変数及びグローバル関数の辞書がある場合には、グローバルに関する辞書が存在して、その中にグローバル変数とグローバル・シンボルに関するキーとバリューとが存在することになる。同様に、ビルトイン変数及びビルトイン関数の辞書がある場合には、ビルトインに関する辞書が存在して、その中にビルトイン変数とビルトイン・シンボルに関するキーとバリューとが存在することになる。
【００５３】
取り出し部（２０４）は、辞書（２１１）を上記所定の順序で検索し、シンボル名をキーとして辞書（２１１）からシンボル名に関連付けられたバリューを取り出す。取り出し部（２０４）は、辞書（２１１）が１つである場合に、当該１つの辞書を参照して上記バリューを取り出しうる。取り出し部（２０４）は、辞書（２１１）が複数である場合に、複数の辞書を上記所定の順序に従って参照する。
【００５４】
また、取り出し部（２０４）又はコンパイル部（２０３）は、バリューを取り出した辞書の上記所定の順序における段数ｎ（ｎは１以上の整数）をメタデータ（２１３）中に記録しうる。
【００５５】
最適化部（２０５）は、最適化処理として、コード中のシンボル、例えばグローバル変数、を取り出し部（２０４）によって取り出されたバリューで置換する。すなわち、最適化部（２０５）は、上記置換という最適化を行う。コード中のシンボルが上記取り出されたバリューで置換されることで、当該バリューが定数として扱われる。
【００５６】
コンパイル部（２０３）は、コンパイラとしての機能を有する。コンパイル部（２０３）は、最適化部（２０５）によって最適化されたコードの全部又は一部を含むコンパイル対象のコードをコンパイルする。また、コンパイル部（２０３）は、最適化部（２０５）によって最適化されていない他のコードの全部又は一部を含むコンパイル対象のコードをコンパイルしうる。コンパイル部（２０３）は、上記コンパイルされたコード（コンパイル済みコードである）を記憶装置（２１０）に格納しうる（２２２）。代替的には、コンパイル部（２０３）は、本発明に従うコンパイル済みコード又は他のコンパイル済みコードの実行がコードのコンパイル処理と同時に行われている場合には、コンパイル済みコードをメモリ（２０２）内に直接的に格納しうる（２１２を参照）。
【００５７】
また、コンパイル部（２０３）は、バリューを取り出した辞書の上記所定の順序における段数ｎ（ｎは１以上の整数）、当該段数ｎまでの辞書が有するキー及びバリューの組、並びに、当該段数ｎまでの辞書のアドレスを、例えばメタデータ（２１３）中に記録しうる。
【００５８】
実行部（２０６）は、本発明に従うコンパイル済みコード、若しくは他のコンパイル済みコード、又は、インタプリタによるコードを実行する。実行部（２０６）は、当該コンパイル済みコード若しくは他のコンパイル済みコードの実行を、コンパイル後のどこかで行うことになるが、例えば、コンパイル後すぐに当該コンパイル済みコードの実行を開始する、コンパイル後の最初の対象コードの起動で当該コンパイル済みコードの実行を開始する、コンパイル後のあるメソッドが実行しようとするときに当該コンパイル済みコードの実行を開始する、コンパイル後に対象コードがインタプリタで実行されている最中に当該コンパイル済みコードに実行を移す、ことができるがこれらに制限されるものではない。また、実行部（２０６）は、インタプリタによる実行可能な部分のコードを、上記コンパイル済みコード若しくは他のコンパイル済みコードの実行の前に、その実行と並行して、又はその実行後に実行しうる。
【００５９】
監視部（２０７）は、１又は複数の辞書のうちの検索のために参照された辞書、すなわちｎ段目までの辞書に関する変化の監視しうる。代替的には、監視部（２０７）は、１又は複数の辞書の全てに関する変化の監視しうる。
【００６０】
監視部（２０７）は、辞書に関する変化の監視を、本発明に従うコンパイル済みコード又は他のコンパイル済みコードが生成された直後、又はインタプリタによるコードの実行の開始直後から開始しうる。辞書に関する変化の監視が他のコンパイル済みコードが生成された直後から開始する理由は、辞書に関する変化が他のコンパイル済みコードの実行によって、又はインタプリタによるコードの実行によってもたらされる場合もあるからである。
【００６１】
比較部（２０８）は、監視部（２０７）が１又は複数の辞書のうちの１つの辞書に関する変化が検出されることに応じて、当該変化が検出された辞書の上記所定の順序における段数ｍ（ｍは１以上の整数）を、例えばメタデータ（２１３）中に記録された段数ｎと比較する。すなわち、比較部（２０８）は、段数ｍ＞段数ｎ，段数ｍ＝段数ｎ，又は段数ｍ＜段数ｎのいずれであるかを判断する。比較部（２０８）は、当該判断のために、変化が検出された辞書に関連付けられたコンパイル済みコードを特定し、例えば当該特定されたコンパイル済みコードに関連付けられたメタデータ（２１３）から、上記段数ｎを取り出しうる。
【００６２】
比較部（２０８）は、上記比較を、任意のコードの実行中、すなわち本発明に従うコンパイル済みコード若しくは他のコンパイル済みコードの実行中、又はインタプリタによるコードの実行中において実施しうる。上記比較が、本発明に従うコンパイル済みコード以外の他のコンパイル済みコードで行われる理由は、例えば、「あるシンボルを削除する」という動作が、プログラム中で当該あるシンボルに対してアクセス可能な任意の位置に書くことができるからである。
【００６３】
無効化部（２０９）は、比較部（２０８）による段数の比較の結果と辞書に関する変化の種類に応じて、当該変化が検出された辞書に関連付けられたコンパイル済みコードのうち、上記取り出されたバリューで置換する最適化によって最適化されたコードを無効化する。当該無効化の方法として例えば、下記に示す方法がある：
（ａ）無効化する必要が起きた場合にコンパイル済みコードは使わずにインタプリタで実行する；
（ｂ）無効化する必要が起きた場合に一度はインタプリタで実行し、次回の実行の際にバリューで置換する最適化を適用しないで再コンパイルを行い、当該再コンパイル済みコードを実行する；及び、
（ｃ）最適化を行う際に、バリューで置換する最適化が予め適用されたコード、及びバリューで置換する最適化が適用されていないコードの両方を用意して、最初に最適化が予め適用された上記コードを実行し、次に、無効化する必要が生じた場合に、最適化が適用されてない上記コードを実行する。
【００６４】
段数の比較の結果は、上記した数ｍ＞段数ｎ，段数ｍ＝段数ｎ，又は段数ｍ＜段数ｎである。辞書に関する変化の種類は例えば、キーの追加、キーの削除、同じバリューでの若しくは異なるバリューでの更新、又は辞書アドレスの変更でありうる。
【００６５】
辞書に関連付けられたコンパイル済みコードとは、辞書中のシンボル、例えばグローバル変数又は、グローバル変数をコンパイル中に定数に置き換えたもの、を有するコードをいう。
【００６６】
無効化部（２０９）が、上記無効化をする条件については、下記図７Ａ〜図７Ｃの説明において詳述する。
【００６７】
無効化部（２０９）は、上記比較を、任意のコードの実行中、すなわち本発明に従うコンパイル済みコード若しくは他のコンパイル済みコードの実行中、又はインタプリタによるコードの実行中において実施しうる。上記無効化が、本発明に従うコンパイル済みコード以外の他のコンパイル済みコードで行われる理由は、例えば、「あるシンボルを削除する」という動作が、プログラム中で当該あるシンボルに対してアクセス可能な任意の位置に書くことができるからである。
【００６８】
記憶装置（２１０）は、コード（２２１）及びコンパイル済みコード（２２２）を格納しうる。また、記憶装置（２１０）は、１又は複数の辞書（２２３）を格納しうる。以下、「辞書（２２３）」と言及する場合には、辞書の数が１又は複数の場合を包含する。
【００６９】
コード（２２１）は、最適化対象であるコード又はその一部若しくは全部を包含するコードであり得る。コード（２２１）は、シンボル名をキーとして辞書（２２３）からシンボル名に関連付けられたバリューを取り出すことが可能である言語であれば特に制限されない。本発明の実施態様において使用されうるシンボルは例えば、シンボルの中でその値が変更されにくいものであり、言い換えれば、変更時情報であまり変更されにくいものである。シンボルは例えば、変数、関数、メソッドの飛び先、組み込み関数（例えばビルトイン関数）を挙げることができるがこれらに制限されない。
【００７０】
コンパイル済みコード（２２２）は、本発明に従うコンパイル済みコード、及び他のコンパイル済みコードを包含しうる。また、コンパイル済みコード（２２２）は、コンパイル部（２０３）によってコンパイルされたコード、又は、他のコンピュータによって既にコンパイルされたコードでありうる。
【００７１】
辞書（２２３）は、不揮発性である記憶装置（２１０）中に格納されうる。「辞書（２２３）」は、以下の説明において「辞書（２１１）」と交換的に使用されうる。
【００７２】
図３は、本発明の実施態様において使用されうる辞書を示す。
辞書は、キー及び当該キーに関連付けられたバリューの１又は複数の組を有する。辞書は、例えばパイソン言語において定義されうる型でありうる。辞書は、他の言語において、連想記憶（associated memory）又は連想配列（associative array）という名前でも言及されうる。本発明でいう「辞書」は、連想記憶及び連想配列辞書、並びにキーでインデクス化されているその他の呼称で呼ばれうるものを包含する。
【００７３】
辞書（３０１）は、図２に示す辞書（２１１、２２３）のうちの１つを模式的に例示したものである。辞書（３０１）は、キー（３１１）及び、当該キー（３１１）に関連付けられたバリュー（３１２）の１又は複数の組（「ペア」ともいう）を有する。図３は、辞書（３０１）が、上記組として、３２１−１及び３２２−１の組、３２１−２及び３２２−２の組、３２１−ｎ及び３２２−ｎの組を有している例を示す。キー及びバリューは、それぞれ、名前及び格納される値であり、具体的に述べれば、キーはプログラム中に書かれているものであり、バリューは実行時に埋められる数字又は文字であるといえる。キー及びバリューは、辞書中において順序付けはされてはいないが、キーは辞書中において一意的でなければならない。
【００７４】
キーは、何らかの変更不能な型であり、文字列又は数値をキーにしうる。タプルは、文字列、数値又はその他のタプルのみを含む場合に、キーにしうる。直接的に又は間接的に変更可能なオブジェクトを含むタプルは、キーとして使うことはできない。また、リストをキーとして使うことはできない。この理由は、リストにスライス又はインデクス指定の代入を行ったり、例えばappend()又はextend()のようなメソッドを使ったりすると、インプレースで変更することが可能であるためである。
【００７５】
バリューは、キーによって一意的に決まる値である。当該バリューは、最適化において、コード中のシンボルを置換するために、すなわちコード中のシンボルを定数化するために使用されうる。
【００７６】
辞書の作成方法は当業者に知られており、例えばパイソン言語において、辞書は、例えば「PyDictObject」を用いて作成されうる（非特許文献６を参照）。
【００７７】
辞書の操作方法、例えばキーの追加、キーの削除、同じバリューでの又は異なるバリューでの更新、及び辞書のアドレスの変更、は当業者に知られており、例えばパイソン言語において、当該パイソン言語で書かれたプログラムの実行のために作成される辞書の操作方法はそのソースコードが公開されている（例えば、図９に記載の各コード及びそれに対応する発明の詳細な説明の記載を参照）。但し、パイソン言語において、辞書のアドレスが変更される場合は、実際にはそれほど多くないので、無視できるレベルである。
【００７８】
パイソン言語において、グローバル変数又は関数の辞書、及び、ビルトイン変数又は関数の辞書の順序は、グローバル変数又は関数の辞書、そして、ビルトイン変数又は関数の辞書である。従って、シンボルからバリューを決定する場合に、定められた所定の順序で辞書が参照される必要がある。上記所定の順序が、段数１、２、・・・、ｋ（ｋは整数）で表される場合に、あるシンボルとペアをなすバリューは次のようにして取り出される。ます、段数１の辞書をシンボルで引いて、当該シンボルとペアをなすバリューが存在する場合には当該バリューを取り出す。一方、当該シンボルとペアをなすバリュー存在しない場合には段数２の辞書を上記シンボルで引く、という操作を繰り返す。
【００７９】
図４は、従来技術である、コードのコンパイル時の処理（以下、従来技術に従うコンパイル時処理ともいう）のフローチャートを示す。
【００８０】
ステップ４０１では、コンピュータは、コンパイラを使用してコードのコンパイル時処理を開始する。
【００８１】
ステップ４０２では、コンピュータは、シンボル名をキーとして、辞書を上記所定の順序で検索し、当該キーに関連付けられたバリューを辞書から取り出す。コンピュータは、当該取り出されたバリューを、例えばメモリ中に格納する。
【００８２】
ステップ４０３では、コンピュータは、コードの最適化処理として、コード中のシンボル、例えばグローバル変数若しくは関数、又は、ビルトイン変数若しくは関数、を上記取り出されたバリューに置換する。引き続き、コンピュータは、当該最適化されたコードの全部又は一部を含むコンパイル対象のコードをコンパイルする。コンピュータは、当該コンパイルによって生成されたコンパイル済みコードを記憶装置又はメモリ中に格納する。
【００８３】
ステップ４０５では、コンピュータは、各辞書とコンパイル済みコードとを関連付ける。コンピュータは、当該関連付けしたデータを、例えば当該コンパイル済みコードに関連付けられたメタデータ中に記録しうる。
【００８４】
ステップ４０６では、コンピュータは、バリューを決定するために参照する可能性のある全ての辞書について、監視を開始する。当該辞書の監視は、コンパイル時に参照した辞書であるかどうかにかかわらず行われる。すなわち、例えば多段で構成されている辞書を参照して、段数１の辞書でバリューが取り出された場合であっても、当該辞書の監視は、段数２以降の辞書についても行われる。従って、複数の辞書が監視対象となりうる。
【００８５】
ステップ４０７では、コンピュータは、コンパイル時の処理を終了し、ステップ４０３でコンパイルにより生成されたコンパイル済みコード（以下、図５の説明において、「コンパイル済みコード」という）の実行命令、若しくは当該コンパイル済みコードを参照する他のコンパイル済みコード（以下、図５の説明において、「他のコンパイル済みコード」という）、又はインタプリタ実行するコードの実行命令を待つ。
【００８６】
図５は、従来技術である、コンパイル済みコードの実行時の処理（以下、従来技術に従う実行時処理ともいう）のフローチャートを示す。
【００８７】
ステップ５０１では、コンピュータは、コンパイル済みコード若しくは他のコンパイル済みコードの実行、又はインタプリタによるコードの実行を開始する。
【００８８】
ステップ５０２では、コンピュータは、監視中の辞書dに関する変化を検出する。監視中の辞書dに関する変化は例えば、キーの追加、キーの削除、同じバリューでの若しくは異なるバリューでの更新、又は、辞書アドレスの変更である。監視中の辞書dに関する変化を検出することに応じて、コンピュータは処理をステップ５０３に進める。一方、監視中の辞書dに関する変化が検出されない場合、すなわちプログラムの実行時にどれかの辞書で変化が検出された以外は検出されないとして扱い、コンピュータは処理をステップ５０２に戻して、辞書ｄの監視を継続する。すなわち、コンピュータは監視中の辞書dに関する変化が検出されるまで処理を待つ。
【００８９】
ステップ５０３では、コンピュータは、ステップ５０２において変化が検出された辞書ｄに関連付けられたコンパイル済みコードを、図４のステップ４０５において説明したメタデータ中に記録された、各辞書とコンパイル済みコードとの関連付データから特定する。
【００９０】
ステップ５０４では、コンピュータは、辞書ｄの変化の種類を特定する。辞書ｄの変化の種類が、キーの追加、キーの削除、同じバリューでの若しくは異なるバリューでの更新、又は、辞書アドレスの変更である場合は、下記の通りである：
・辞書ｄの変化の種類が同じバリューでの更新である場合、コンピュータは、処理をステップ５０５に進める。
・辞書ｄの変化の種類がキーの追加、キーの削除、又は異なるバリューでの更新である場合、コンピュータは、処理をステップ５０６に進める。
・辞書ｄの変化の種類が辞書ｄのアドレスの変更である場合、コンピュータは、処理をステップ５０７に進める。
【００９１】
ステップ５０５では、コンピュータは、辞書ｄの変化の種類が同じバリューでの更新であることに応じて、ステップ４０３において無効化の処理を禁止する。そして、コンピュータは、処理をステップ５１１に戻す。
【００９２】
ステップ５０６では、コンピュータは、辞書ｄの変化の種類がキーの追加、キーの削除、又は異なるバリューでの更新であることに応じて、ステップ５０２で変化が検出された辞書ｄに関連付けられたコンパイル済みコードのうち、ステップ４０３の最適化、すなわちステップ４０２で取り出されたバリューでコード中のグローバル変数を置換する最適化によって最適化されたコードを無効化する。当該無効化は、辞書ｄに関連付けられたコンパイル済みコードが複数ある場合には、その全てが対象となる。そして、コンピュータは、処理をステップ５１１に戻す。
【００９３】
ステップ５０７では、コンピュータは、辞書ｄの変化の種類が辞書ｄのアドレスの変更であることに応じて、ステップ５０２で変化が検出された辞書ｄに関連付けられたコンパイル済みコードのうち、ステップ４０３において最適化されたコードを無効化する。そして、コンピュータは、処理をステップ５１１に戻す。
【００９４】
ステップ５１１では、コンピュータは、コード全体、例えば実行対象でありうるコード全体の実行を終了するかどうかを判断する。実行対象でありうるコード全体の実行を終了する場合は、コンピュータは、処理をステップ５１２に進め、実行対象でありうるコード全体の実行処理を終了する。実行対象でありうるコード全体の実行を終了しない場合は、コンピュータは、処理をステップ５０２に戻す。引き続き、コンピュータは、監視中の辞書dの変化が検出されるたびに、図５のフローチャートに記載する操作を繰り返す。
【００９５】
図６は、本発明の実施態様に従う、コードのコンパイル時の処理（以下、本発明に従うコンパイル時処理ともいう）のフローチャートを示す。
【００９６】
ステップ６０１では、コンパイル部（２０３）は、コードのコンパイル時処理を開始する。コードは、例えばパイソン言語の仕様に従い記述されたプログラムでありうる。
【００９７】
ステップ６０２では、取り出し部（２０４）は、シンボル名をキーとして、辞書（２１１）を上記所定の順序で検索し、当該キーに関連付けられたバリューを辞書から取り出す。取り出し部（２０４）は、当該取り出されたバリューを、例えばメモリ（２０２）中に格納する。辞書（２１１）が一つの場合には当該一つの辞書について検索が行われる。また、辞書（２１１）が複数の場合には、例えば、各辞書に関連付けられた優先順序に従って、又は、各プログラム言語により定められた辞書を参照する優先順序に従って、順次、検索されうる。
【００９８】
ステップ６０２において、複数の辞書がグローバル変数又は関数の辞書とビルトイン変数又は関数の辞書である場合、上記所定の順序は、グローバル変数又は関数の辞書、次に、ビルトイン変数又は関数の辞書である。従って、段数１が段数２よりも優先すると、グローバル変数又は関数の辞書が段数１であり、ビルトイン変数又は関数の辞書が段数２である。
【００９９】
ステップ６０３では、最適化部（２０５）は、コードの最適化処理として、コード中のシンボル、例えばグローバル変数若しくは関数、又は、ビルトイン変数若しくは関数、を上記取り出されたバリューに置換する。上記シンボルを有するコードは、上記辞書を参照することによってバリューが決定されるコードでありうる。コード中のシンボルは、例えばグローバル変数でありうる。すなわち、コード中のシンボルをバリューに置換する最適化を行い、当該バリューを定数として扱う。
【０１００】
コンパイル部（２０３）は、引き続き、当該最適化されたコードの全部又は一部を含むコンパイル対象のコードをコンパイルする。コンパイル対象のコードは、実行対象コードのうち、上記コンパイル対象のコードである。すなわち、コンパイル対象のコードは、実行対象コードのうち、上記最適化されたコードの全部又は一部を含むコンパイル対象のコードである。最適化されたコードの一部である理由は、コンパイルをせずに、インタプリタで実行するという選択肢もあるためである。
【０１０１】
コンパイル部（２０３）は、例えば本発明に従うコンパイル済みコード又は他のコンパイル済みコードを、例えば記憶装置（２１０）又はメモリ（２０２）中に格納する（２２２、２１２）。
【０１０２】
ステップ６０３において、上記シンボル名に対応するバリューを取り出した辞書がグローバル変数又は関数の辞書である場合に、上記最適化は、グローバル変数又は関数の参照を上記取り出したバリューで置き換えて定数として扱うことによって行われる。
【０１０３】
ステップ６０３において、上記シンボル名に対応するバリューを取り出した辞書が変数又は関数の辞書である場合に、上記最適化が実行中の更新が稀である（または更新頻度が低い）と判断される変数又は関数の呼び出し先を上記取り出したバリューで置き換えて定数として扱うことによって行われうる。実行中の更新が稀であると判断される変数又は関数は、例えばビルトイン変数又は関数でありうる。ビルトイン変数又は関数の呼び出し先の静的決定においてシンボル名をバリューで置き換えることは、シンボル名であるｍａｘがコード中に出てきた場合に辞書を引いて、当該ｍａｘとペアをなす飛び先（すなわち呼び出し先）というバリューに置き換えて定数として扱うことを意味する。辞書の更新頻度が低いことについては、非特許文献１を参照されたい。
【０１０４】
ステップ６０４では、コンパイル部（２０３）は、ステップ６０２において特定される段数ｎ、並びに、当該段数ｎまでに辞書が有するキー及びバリューの組、並びに当該段数ｎまでの辞書のアドレスを、例えばメタデータ（２１３）中に記録する。メタデータ（２１３）は、図７Ａ〜図７Ｃに示す処理において参照されるように、コンパイル済みコード（２１２、２２２）に関連付けられうる。メタデータ（２１３）中に記録された段数ｎは、下記図７Ａに示すフローチャートのステップ７０４において、段数の比較をするために参照されうる。メタデータ（２１３）中に記録されたキー及びバリューの組は、下記図７Ｂに示すフローチャートのステップ７２１及び下記図７Ｃに示すフローチャートの７３１において、辞書ｄの変化の種類、すなわちキーの追加、キーの削除、又は同じバリューでの若しくは異なるバリューでの更新を判断するために参照されうる。メタデータ（２１３）中に記録された辞書のアドレスは、下記図７Ｂに示すフローチャートのステップ７２１及び下記図７Ｃに示すフローチャートの７３１において、辞書ｄの辞書の変化の種類、すなわち辞書のアドレスの更新を判断するために参照されうる。
【０１０５】
ステップ６０５では、コンパイル部（２０３）は、各辞書とコンパイル済みコードとを関連付ける。コンパイル部（２０３）は、当該関連付けしたデータを、当該コンパイル済みコードに関連付けられたメタデータ（２１３）中に記録しうる。
【０１０６】
ステップ６０６では、監視部（２０７）は、バリューを決定するために参照する可能性のある全ての辞書について、監視を開始する。当該辞書の監視は、コンパイル時に参照した辞書であるかどうかにかかわらず行う。すなわち、例えば多段で構成されている辞書を参照して、段数１の辞書でバリューが取り出された場合であっても、当該辞書の監視は、段数２以降の辞書についても行われる。従って、複数の辞書が監視対象となりうる。当該監視を開始することで、図７Ａ〜図７Ｃに示す任意のコードの実行時のフローチャートにおいて、辞書に関する変化を検出することが可能になる。
【０１０７】
ステップ６０７では、コンパイル部（２０３）は、コンパイル時の処理を終了する。実行部（２０６）は、任意のコードの実行の開始命令、例えばコンパイル済みコード若しくは他のコンパイル済みコードの実行の開始命令、又は、インタプリタによるコードの実行の開始命令を待って、図７Ａのステップ７０１へ処理を進める。
【０１０８】
本発明に従うコンパイル時処理は、従来技術に従うコンパイル時処理と比べて、ステップ６０４の処理をする点で実行するステップが多い。従って、本発明に従うコンパイル時の処理は増大する。しかしながら、その増大する処理量は、コンパイル処理全体に要する時間からみれば１％未満にも満たないと考えられる。上記増大する処理量よりも、下記図７Ａ〜図７Ｃに示す処理によって、コンパイル済みコードの実行の無効化を特定の条件化で行うことができるようにする方がはるかに有用である。
【０１０９】
図７Ａ〜図７Ｃは、本発明の実施態様に従う、任意のコードの実行時、例えばコンパイル済みコード若しくは他のコンパイル済みコードの実行時、又は、インタプリタによるコードの実行時における処理のフローチャート（以下、本発明に従う実行時処理のフローチャートという）を示す。
【０１１０】
以下に、図７Ａについて説明する。
【０１１１】
ステップ７０１では、実行部（２０６）は、任意のコードの実行、例えばコンパイル済みコード若しくは他のコンパイル済みコードの実行、又は、インタプリタによるコードの実行を開始する。
【０１１２】
ステップ７０２では、監視部（２０７）は、監視中の辞書dの変化を検出する。当該変化は例えば、キーの追加、キーの削除、同じバリューでの若しくは異なるバリューでの更新、又は、辞書アドレスの変更である。上記変化を検出することに応じて、監視部（２０７）は処理をステップ７０３に進める。一方、上記変化が検出されない場合は、監視部（２０７）は処理をステップ７０２に戻して、辞書ｄの監視を継続する。
【０１１３】
ステップ７０３では、比較部（２０８）は、ステップ７０２において変化が検出された辞書ｄに関連付けられたコンパイル済みコードを、図６のステップ６０５において説明したメタデータ（２１３）中に記録された、各辞書とコンパイル済みコードとの関連付データから特定する。また、比較部（２０８）は、ステップ７０２において検出された変化が認められた辞書の上記所定の順序における段数ｍを取得する。
【０１１４】
ステップ７０４では、比較部（２０８）は、図６のステップ６０２において特定された段数ｎを、図６のステップ６０４において記録されたメタデータ（２１３）から取得する。
【０１１５】
ステップ７０５では、比較部（２０８）は、ステップ７０４において取得した段数ｎとステップ７０３において取得した段数ｍの大小を比較する。
・段数ｍ＞段数ｎの場合、比較部（２０８）は、処理をステップ７０６に進める。
・段数ｍ＝段数ｎの場合、比較部（２０８）は、処理を図７Ｂに示すステップ７２１に進める。
・段数ｍ＜段数ｎの場合、比較部（２０８）は、処理を図７Ｃに示すステップ７３１に進める。
【０１１６】
ステップ７０６では、無効化部（２０９）は、ｍ＞ｎであることに応じて、無効化の処理を禁止する（すなわち、無効化処理を行わない）。そして、無効化部（２０９）は、処理をステップ７１１に戻す。
【０１１７】
ステップ７１１では、実行部（２０６）は、コード全体、例えば実行対象でありうるコード全体の実行を終了するかどうかを判断する。実行対象でありうるコード全体の実行を終了する場合は、実行部（２０６）は、処理をステップ７１２に進め、監視処理を終了する。コンパイル済みコードの実行を終了しない場合は、実行部（２０６）は、処理をステップ７０２に戻す。引き続き、監視部（２０７）は、監視中の辞書dの変化が検出されるたびに、図７Ａ〜図７Ｃのフローチャートに記載する操作を繰り返す。
【０１１８】
以下に、図７Ｂ（段数ｍ＝段数ｎを満たす場合）について説明する。
【０１１９】
ステップ７２１では、比較部（２０８）は、辞書ｄの変化の種類を特定する。辞書ｄの変化の種類が、キーの追加、キーの削除、同じバリューでの若しくは異なるバリューでの更新、又は、辞書アドレスの変更である場合は、下記の通りである：
・辞書ｄの変化の種類がキーの追加又は同じバリューでの更新である場合、比較部（２０８）は、処理をステップ７２２に進める。
・辞書ｄの変化の種類がキーの削除又は異なるバリューでの更新である場合、比較部（２０８）は、処理をステップ７２３に進める。
・辞書ｄの変化の種類が辞書ｄのアドレスの変更である場合、コンピュータは、処理をステップ７２４に進める。
【０１２０】
ステップ７２２では、無効化部（２０９）は、ｍ＝ｎであり且つ辞書ｄの変化の種類がキーの追加又は同じバリューでの更新であることに応じて、無効化の処理を禁止する。そして、無効化部（２０９）は、処理をステップ７１１に戻す。
【０１２１】
ステップ７２３では、無効化部（２０９）は、ｍ＝ｎであり且つ辞書ｄの変化の種類がキーの削除又は異なるバリューでの更新であることに応じて、ステップ７０２で変化が検出された辞書ｄに関連付けられたコンパイル済みコードのうち、ステップ６０２で取り出されたバリューで置換するステップ６０３の最適化によって最適化されたコードを無効化する。そして、無効化部（２０９）は、処理をステップ７１１に戻す。
【０１２２】
ステップ７２４では、比較部（２０８）は、アドレスが変更された後の辞書（以下、変更後の辞書ともいう）のキー及びバリューがアドレスが変更される前の辞書（以下、元の辞書ともいう）のキー及びバリューと完全一致するかどうかを判断する。
・変更後の辞書のキー及びバリューが元の辞書のキー及びバリューと完全一致しない場合、すなわち変更後の辞書のキー及びバリューが元の辞書のキー及びバリューの少なくとも一方と一致しない場合、比較部（２０８）は、処理をステップ７２５に進める。
・変更後の辞書のキー及びバリューが元の辞書のキー及びバリューと完全一致する場合、比較部（２０８）は、処理をステップ７２６に進める。
比較部（２０８）は、元の辞書のキーとバリューをメタデータ（２１３）から取得しうる。
【０１２３】
ステップ７２５では、無効化部（２０９）は、ｍ＝ｎであり且つ変更後の辞書のキー及びバリューが元の辞書のキー及びバリューと完全一致しないことに応じて、ステップ７０２で変化が検出された辞書ｄに関連付けられたコンパイル済みコードのうち、ステップ６０２で取り出されたバリューで置換するステップ６０３の最適化によって最適化されたコードを無効化する。そして、無効化部（２０９）は、処理をステップ７１１に戻す。
【０１２４】
ステップ７２６では、無効化部（２０９）は、ｍ＝ｎであり且つ変更後の辞書のキー及びバリューが元の辞書のキー及びバリューと完全一致することに応じて、無効化の処理を禁止する。そして、無効化部（２０９）は、処理をステップ７１１に戻す。
【０１２５】
以下に、図７Ｃ（段数ｍ＜段数ｎを満たす場合）について説明する。
【０１２６】
ステップ７３１では、比較部（２０８）は、辞書ｄの変化の種類を特定する。辞書ｄの変化の種類が、キーの追加、キーの削除、同じバリューでの若しくは異なるバリューでの更新、又は、辞書アドレスの変更である場合は、下記の通りである：
・辞書ｄの変化の種類が同じバリューでの更新又は異なるバリューでの更新である場合、比較部（２０８）は、処理をステップ７３２に進める。
・辞書ｄの変化の種類がキーの追加又はキーの削除である場合、比較部（２０８）は、処理をステップ７３３に進める。
・辞書ｄの変化の種類が辞書ｄのアドレスの変更である場合、コンピュータは、処理をステップ７３４に進める。
【０１２７】
ステップ７３２では、比較部（２０８）は、ｍ＜ｎであり且つ辞書ｄの変化の種類が同じバリューでの更新又は異なるバリューでの更新であることに応じて、無効化の処理を禁止する。そして、無効化部（２０９）は、処理をステップ７１１に戻す。
【０１２８】
ステップ７３３では、比較部（２０８）は、ｍ＜ｎであり且つ辞書ｄの変化の種類がキーの追加又はキーの削除であることに応じて、ステップ７０２で変化が検出された辞書ｄに関連付けられたコンパイル済みコードのうち、ステップ６０２で取り出されたバリューで置換するステップ６０３の最適化によって最適化されたコードを無効化する。そして、無効化部（２０９）は、処理をステップ７１１に戻す。
【０１２９】
ステップ７３４では、比較部（２０８）は、アドレスが変更された後の辞書（以下、変更後の辞書ともいう）のキー及びバリューがアドレスが変更される前の辞書（以下、元の辞書ともいう）のキー及びバリューと完全一致するかどうかを判断する。
・変更後の辞書のキーが元の辞書のキーと一致しない場合、比較部（２０８）は、処理をステップ７３５に進める。
・変更後の辞書のキーが元の辞書のキーと一致する場合、比較部（２０８）は、処理をステップ７３６に進める。
比較部（２０８）は、変更が検出された元の辞書のキーをメタデータ（２１３）から取得しうる。
【０１３０】
ステップ７３５では、無効化部（２０９）は、ｍ＜ｎであり且つ変更後の辞書のキーが元の辞書のキーと一致しないことに応じて、ステップ７０２で変化が検出された辞書ｄに関連付けられたコンパイル済みコードのうち、ステップ６０２で取り出されたバリューで置換するステップ６０３の最適化によって最適化されたコードを無効化する。そして、無効化部（２０９）は、処理をステップ７１１に戻す。
【０１３１】
ステップ７３６では、無効化部（２０９）は、ｍ＜ｎであり且つ変更後の辞書のキーが元の辞書のキーと一致することに応じて、無効化の処理を禁止する。そして、無効化部（２０９）は、処理をステップ７１１に戻す。
【０１３２】
図７Ａ〜図７Ｃにおいて示した通り、変化が検出された辞書に関連付けられたコンパイル済みコードのうち、ステップ６０２で取り出されたバリューで置換するステップ６０３の最適化によって最適化されたコードを無効化する条件は、下記に示すとおりである。
・段数ｍが段数ｎよりも小さい場合に、当該辞書に関する変化が、キーの追加、キーの削除、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーがアドレスが変更される前の当該辞書のキーと一致しないこと；又は、
・段数ｍが段数ｎに等しい場合に、当該辞書に関する変化が、キーの削除、異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された当該辞書のキー及びバリューが当該アドレスが変更される前の辞書のキー及びバリューの少なくとも一方と一致しないこと。
但し、段数ｍが段数ｎよりも大きい場合には、当該辞書に関する変化の種類にかかわらず、上記変化が検出された辞書に関連付けられたコンパイル済みコードの無効化はされない。
【０１３３】
また、変化が検出された辞書に関連付けられたコンパイル済みコードのうち、ステップ６０２で取り出されたバリューで置換するステップ６０３の最適化によって最適化されたコードを無効化する条件は、下記のようにもまとめることが可能である。
・段数ｎが１である場合、すなわち、投機的に行った最適化が１段目（ｎ＝１）の辞書中のバリューを利用してシンボルの置換が行われた場合において、
・段数ｍが１である場合（ｍ＝ｎ）に、当該辞書に関する変化が、キーの削除、又は、異なるバリューでの更新であること；、
・段数ｎが１よりも大きい段数である場合（ｎ＞１）、すなわち、投機的に行った最適化が１段目よりも後にある段数の辞書中のバリューを利用してシンボルの置換が行われた場合において、
・段数ｍが１〜ｎ−１である場合（ｍ＝１〜ｎ−１）に、当該辞書に関する変化が、キーの追加、又は、キーの削除であることこと；、
・段数ｍがｎに等しい場合（ｍ＝ｎ）に、当該辞書に関する変化が、キーの削除、又は、異なるバリューでの更新であること；、
・段数ｎが１又は１よりも大きい段数である場合（ｎ＞＝１）、すなわち、投機的に行った最適化が１段目又は１段目よりも後にある段数の辞書中のバリューを利用してシンボルの置換が行われた場合において、
・段数ｍが１〜ｎ−１である場合に（ｍ＝１〜ｎ−１）、当該辞書に関する変化が、当該辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーがアドレスが変更される前の当該辞書のキーと一致しないこと；、又は、
・段数ｍがｎに等しい場合（ｍ＝ｎ）に、当該辞書に関する変化が、当該辞書のアドレスが変更されており且つアドレスが変更された当該辞書のキー及びバリューがアドレスが変更される前の当該辞書のキー及びバリューの少なくとも一方と一致しないこと。
但し、下記条件の場合には、上記変化が検出された辞書に関連付けられたコンパイル済みコードの無効化はされない。
・段数ｎが１である場合（ｎ＝１）において、
・当該辞書に関する変化の種類にかかわらず、段数ｍが２以上であること；、又は、
・段数ｎが１又は１よりも大きい段数である場合において、
・当該辞書のアドレスが変更されているか又は変更されていないかにかかわらず、段数ｍがｎ＋１以上であること。
【０１３４】
また、複数の辞書がグローバル変数又は関数の辞書とビルトイン変数又は関数の辞書である場合において、シンボル名に関連付けられたバリューを取り出した辞書がグローバル変数又は関数の辞書である場合に、変化が検出された辞書に関連付けられたコンパイル済みコードのうち、ステップ６０２で取り出されたバリューで置換するステップ６０３の最適化によって最適化されたコードを無効化する条件は、下記のようにもまとめることが可能である。
・段数ｍが１である場合に、グローバル変数又は関数の辞書に関する変化が、キーの削除、又は、異なるバリューでの更新であること；、又は、
・段数ｍが１である場合に、上記グローバル変数又は関数の辞書に関する変化が、当該辞書のアドレスが変更されており且つアドレスが変更された当該辞書のキー及びバリューがアドレスが変更される前の当該辞書のキー及びバリューの少なくとも一方と一致しないこと。
但し、下記条件の場合には、上記変化が検出された辞書に関連付けられたコンパイル済みコードの無効化はされない。
・ビルトイン変数又は関数の辞書に関する変化の種類にかかわらず、段数ｍが２であること。
【０１３５】
また、複数の辞書がグローバル変数又は関数の辞書とビルトイン変数又は関数の辞書である場合において、シンボル名に関連付けられたバリューを取り出した辞書がビルトイン変数又は関数の辞書である場合に、変化が検出された辞書に関連付けられたコンパイル済みコードのうち、ステップ６０２で取り出されたバリューで置換するステップ６０３の最適化によって最適化されたコードを無効化する条件は、下記のようにもまとめることが可能である。
・段数ｍが１である場合に、グローバル変数又は関数の辞書に関する変化が、キーの追加、又はキーの削除であること；
・段数ｍが２である場合に、ビルトイン変数又は関数の辞書に関する変化が、キーの削除、又は、異なるバリューでの更新であること；
・段数ｍが１である場合に、グローバル変数又は関数の辞書に関する変化が、当該辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーがアドレスが変更される前の当該辞書のキーと一致しないこと；又は、
・段数ｍが２である場合に、ビルトイン変数又は関数の辞書に関する変化が、当該辞書のアドレスが変更されており且つアドレスが変更された当該辞書のキー及びバリューがアドレスが変更される前の当該辞書のキー及びバリューの少なくとも一方と一致しないこと。
【０１３６】
また、辞書の数が１つである場合にはｍ＝ｎ＝１になる。ｍ＝ｎ＝１の場合において、辞書のアドレスが変更されており且つアドレスが変更された当該辞書のキー及びバリューがアドレスが変更される前の当該辞書のキー及びバリューの少なくとも一方と一致しないことを条件に、変化が検出された辞書に関連付けられたコンパイル済みコードのうち、ステップ６０２で取り出されたバリューで置換するステップ６０３の最適化によって最適化されたコードが無効化される。従って、本発明は、辞書の数が１つである場合においても有用である。
【０１３７】
図７Ａ〜図７Ｃにおいて示した通り、変化が検出された辞書に関連付けられたコンパイル済みコードの実行を継続する条件は、下記に示す通りである。
・段数ｍが段数ｎよりも小さい場合に、当該辞書に関する変化が、同じバリューでの若しくは異なるバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーが当該アドレスが変更される前の当該辞書のキーと一致すること；
・段数ｍが段数ｎに等しい場合に、当該辞書に関する変化が、キーの追加、同じバリューでの更新、又は、辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキー及びバリューが当該アドレスが変更される前の当該辞書のキー及びバリューのいずれとも一致すること；又は、
・当該辞書に関する変化の種類に関係無しに、段数ｍが段数ｎよりも大きいこと。
【０１３８】
また、変化が検出された辞書に関連付けられたコンパイル済みコードの実行を継続する条件は、下記のようにもまとめることが可能である。
・段数ｎが１である場合（ｎ＝１）、すなわち投機的に行った最適化が１段目の辞書中のバリューを利用してシンボルの置換が行われた場合において、
・段数ｍが１である場合（ｍ＝ｎ）に、当該辞書に関する変化が、キーの追加、又は、同じバリューでの更新であること；
・段数ｍが２以上である場合（ｍ＞ｎ）に、当該辞書に関する変化が、キーの追加、キーの削除、又は、同じバリューでの若しくは異なるバリューでの更新であること；
・段数ｎが１よりも大きい段数である場合（ｎ＞１）、すなわち、投機的に行った最適化が１段目よりも後にある段数の辞書中のバリューを利用してシンボルの置換が行われた場合において、
・段数ｍが１〜ｎ−１である場合（ｍ＝１〜ｎ−１）に、当該辞書に関する変化が、同じバリューでの若しくは異なるバリューでの更新であること；
・段数ｍがｎに等しい場合（ｍ＝ｎ）に、当該辞書に関する変化が、キーの追加、又は、同じバリューでの更新であること；
・段数ｍがｎ＋１以上である場合（ｍ＞＝ｎ＋１）に、当該辞書に関する変化が、キーの追加、キーの削除、又は、同じバリューでの若しくは異なるバリューでの更新であること；
・段数ｎが１又は１よりも大きい段数である場合（ｎ＞＝１）、すなわち、投機的に行った最適化が１段目又は１段目よりも後にある段数の辞書中のバリューを利用してシンボルの置換が行われた場合において、
・段数ｍが１〜ｎ−１である場合（ｍ＝１〜ｎ−１）に、当該辞書に関する変化が、当該辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーが当該アドレスが変更される前の当該辞書のキーと一致すること；
・段数ｍがｎ（ｍ＝ｎ）に等しい場合に、当該辞書に関する変化が、当該辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキー及びバリューがアドレスが変更される前の当該辞書のキー及びバリューのいずれとも一致すること；又は、
・当該辞書のアドレスが変更されているか又は変更されていないかにかかわらず、段数ｍがｎ＋１以上であること（ｍ＞＝ｎ＋１）。
【０１３９】
また、複数の辞書がグローバル変数又は関数の辞書とビルトイン変数又は関数の辞書である場合において、シンボル名に関連付けられたバリューを取り出した辞書がグローバル変数又は関数の辞書である場合に、変化が検出された辞書に関連付けられたコンパイル済みコードの実行を継続する条件は、下記のようにもまとめることが可能である。
・段数ｍが１である場合に、グローバル変数又は関数の辞書に関する変化が、キーの追加、又は、同じバリューでの更新であること；
・段数ｍが２である場合に、ビルトイン変数又は関数の辞書に関する変化が、キーの追加、キーの削除、又は、同じバリューでの若しくは異なるバリューでの更新であること；
・段数ｍが１である場合に、グローバル変数又は関数の辞書に関する変化が、当該辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキー及びバリューがアドレスが変更される前の当該辞書のキー及びバリューのいずれとも一致すること；又は、
・ビルトイン変数又は関数の辞書のアドレスが変更されているか又は変更されていないかにかかわらず、段数ｍが２であること。
【０１４０】
また、複数の辞書がグローバル変数又は関数の辞書とビルトイン変数又は関数の辞書である場合において、シンボル名に関連付けられたバリューを取り出した辞書がビルトイン変数又は関数である場合に、変化が検出された辞書に関連付けられたコンパイル済みコードの実行を継続する条件は、下記のようにもまとめることが可能である。
・段数ｍが１である場合に、グローバル変数又は関数の辞書に関する変化が、同じバリューでの若しくは異なるバリューでの更新であることこと；
・段数ｍが２である場合に、ビルトイン変数又は関数の辞書に関する変化が、キーの追加、又は、同じバリューでの更新であることこと；
・段数ｍが１である場合に、グローバル変数又は関数の辞書に関する変化が、当該辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキーが当該アドレスが変更される前の当該辞書のキーと一致すること；又は、
・段数ｍが２である場合に、ビルトイン変数又は関数の辞書に関する変化が、当該辞書のアドレスが変更されており且つ当該アドレスが変更された辞書のキー及びバリューがアドレスが変更される前の当該辞書のキー及びバリューのいずれとも一致すること。
【０１４１】
図８Ａは、本発明の実施態様において使用されうるパイソン言語において、ユーザがビルトイン関数の辞書を書き換える態様を示す。なお、符号８０１で表される画面表示において、01〜18の数字は説明を容易にする為に付加したものであって、当該数字は画面上に表示されていなくともよい。
上記態様は、ビルトイン関数「abs」の飛び先（すなわち呼び出し先）を「x:0」の飛び先に書き換えた例である。
符号８０１で示される図は、ビルトイン関数の辞書（２１１）において、関数「abs」が当該辞書（２１１）にキーとして追加された後の辞書を示す（05〜10行）。
04行は、ビルトイン関数のキーを表示するコマンドが入力されていることを示す。
05行は、キー「abs」が追加されていることを示す。
13行は、キー「abs」の飛び先をオリジナルから「x:0」に書き換えたことを示す。
符号８１１及び符号８１２でそれぞれ示される図は、ビルトイン関数の辞書中のキー及びバリューを示す。
符号８１１で示される図は、ビルトイン関数の辞書中にキー「abs」が存在していること、及びキーの飛び先がオリジナルであることを示す。
符号８１２で示される図は、ビルトイン関数の辞書を書き換えることによって上記ビルトイン関数の飛び先がオリジナルから「x:0」に書き換えられていることを示す。
【０１４２】
図８Ｂは、本発明の実施態様において使用されうるパイソン言語において、ユーザがグローバル変数で同じ名前を宣言するように書き換える態様を示す。なお、符号８０１で表される画面表示において、01〜16の数字は説明を容易にする為に付加したものであって、当該数字は画面上に表示されていなくともよい。
上記態様は、空の辞書に、グローバル変数「abs」で「999」を入れた例である。
符号８２１で示される図は、グローバル変数で図８Ａにおいて追加したキー「abs」を、同じ名前で宣言するように書き換える態様を示す。
06行は、キー「abs」をグローバル変数で宣言していることを示す。
07行は、当該キーに関連付けられたバリューとして「999」を入れたことを示す。
符号８３１及び符号８３２でそれぞれ示される図は、グローバル変数の辞書中のキー及びバリューを示す。
符号８３１で示される図は、キー及び当該キーに関連付けられたバリューが無い状態（空の辞書）を示す。
符号８３２で示される図は、上記06及び07行に示すコマンドによって、キーとして「abs」及び当該キーに関連付けられたバリューとして「999」がグローバル変数の辞書中に格納されたことを示す。
【０１４３】
上記図８Ａ及び図８Ｂにおいて、abs()を呼び出す場合には、グローバル変数の辞書、次にビルトイン関数の辞書の順で検索が行われる。
【０１４４】
図９は、本発明の実施態様において使用されうるパイソン言語における、コード例を示す。
以下のコード（９０１〜９０６）では、複数の辞書がグローバル変数の辞書とビルトイン関数の辞書であるとする。コード（９０１〜９０６）では、投機的に行った最適化がグローバル変数の値の定数化、すなわちコード中のグローバル変数を辞書から取り出したバリューで置換して定数で扱うことであったとする。コード（９０１〜９０６）では、投機的に行った最適化がビルトイン関数の呼び出し先の静的決定、すなわち当該コード（９０１〜９０６）中のビルトイン関数の飛び先（すなわち呼び出し先）を辞書から取り出したバリューで置換して定数として扱うことであったとする。
従来の実施態様に従うと（図５及び図６を参照）、コード（９０１〜９０６）において、当該コード（９０１〜９０６）中のメソッドfoo()のコンパイル済みコードが無効化されるために、上記メソッドfoo()のコンパイル済みコードを実行し続けることができなかった。一方、本発明の実施態様に従うと（図６、図７Ａ〜図７Ｃを参照）、上記メソッドfoo()のコンパイル済みコードが特定の条件下においてのみ無効化されるために、すなわち特定の条件下において上記メソッドfoo()のコンパイル済みコードの無効化が禁止されるために、コード（９０１〜９０６）中のメソッドfoo()のコンパイル済みコードを実行し続けることができる。
【０１４５】
以下に、コード（９０１〜９０６）が実行されたときに行われる処理を説明するが、当該説明は当該処理を全て述べたものではないことに留意されたい。各コード（９０１〜９０６）の左側に示す01から始まる数字は説明を容易にする為に付加したものであって、当該数字は画面上に表示されていなくともよい。
【０１４６】
コード９０１は、投機的に行った最適化がグローバル変数の辞書（１段目の辞書、ｎ）から取り出したグローバル変数の値の定数化であり、且つ、グローバル変数の辞書に関する変化がキーの追加である場合に、当該グローバル変数の辞書に関連付けられたコンパイル済みコードのうち、上記グローバル変数の辞書で取り出されたバリューで最適化対象であるコード中のグローバル変数を置換する最適化によって最適化されたコードを無効化せずに、当該最適化されたコードを実行できる例を示す。
１行目でg=1というキーを新しく追加し、１１行目でfoo()を１００回実行し、３行目のメソッドfoo()に飛び、４行目でgを呼び出す。メソッドfoo()の１００回目の呼び出し時に、メソッドfoo()がコンパイルされてコンパイル済みコードが生成されるものとする。次に、１２行目に飛んで、６行目のメソッドbar()に飛び実行する。そして、８行目においてグローバル変数の辞書（１段目の辞書、ｍ）にｈというシンボルのキーを追加し、バリューとして−１を設定する。従って、上記例では、ｍ＝ｎであり、且つグローバル変数の辞書にhのキーが追加されただけなのでコードの無効化は行われずに、コード（９０１）中のメソッドfoo()のコンパイル済みコードを実行し続けることができる（図７Ｂのステップ７２２）。
【０１４７】
コード９０２は、投機的に行った最適化がグローバル変数の辞書（１段目の辞書、ｎ）から取り出したグローバル変数の値の定数化であり、且つ、ビルトイン関数の辞書に関する変化が異なるバリューでの更新である場合に、当該ビルトイン関数の辞書に関連付けられたコンパイル済みコードのうち、上記グローバル変数の辞書で取り出されたバリューで置換する最適化によって最適化されたコードを無効化せずに、当該最適化されたコードを実行できる例を示す。
１行目でg=1というキーを新しく追加し、１０行目でfoo()を１００回実行し、３行目のメソッドfoo()に飛び、４行目でgを呼び出す。メソッドfoo()の１００回目の呼び出し時に、メソッドfoo()がコンパイルされてコンパイル済みコードが生成されるものとする。次に、１１行目に飛んで、６行目のメソッドbar()に飛び実行する。そして、７行目においてビルトイン関数の辞書（２段目の辞書、ｍ）に、キーとして「abs」、及び当該キーに関連付けられたバリューとして飛び先である(x:0)で更新することを示す。従って、上記例では、ｍ＞ｎであり、且つビルトイン関数の辞書に存在するキーに対応するバリューが更新されただけなのでコードの無効化は行われずに、コード（９０２）中のメソッドfoo()のコンパイル済みコードを実行し続けることができる（図７Ａのステップ７０６）。
【０１４８】
コード９０３は、投機的に行った最適化がグローバル変数の辞書（１段目の辞書、ｎ）から取り出したグローバル変数の値の定数化であり、且つ、グローバル変数の辞書に関する変化がアドレスの変更であり且つ当該変更後の辞書のキー及びバリューが元の辞書のキー及びバリューと完全に一致する場合に、当該グローバル変数の辞書に関連付けられたコンパイル済みコードのうち、上記グローバル変数の辞書で取り出されたバリューで置換する最適化によって最適化されたコードを無効化せずに、当該最適化されたコードを実行できる例を示す。
８行目でbar()を１００回実行し、２行目のbar()というメソッド中に５行目のexecというメソッドがあり、sと言う文字列に渡されたプログラムを実行する。メソッドfoo()の１００回目の呼び出し時に、メソッドfoo()がコンパイルされてコンパイル済みコードが生成されるものとする。この際にグローバル変数の辞書（１段目の辞書、ｍ）として５行目のinの後ろにある辞書gdicを渡す。３行目に見られるように、gdicはgがキーであり、１が当該キーgに関連付けられたバリューとして取り出される。３行目が実行される度に新しい辞書が作られるので辞書gdicのアドレスが変わり、５行目で実行されるfoo()に渡されるグローバル変数の辞書のアドレスは毎回異なる。しかし、gdicのエントリはキーがgであり且つバリューが1のまま変更されない。よって、辞書gdicのアドレスが変更されるが、変更後の辞書gdicのキー及びバリューは、元の辞書gdicのキー及びバリューといずれとも一致する。従って、上記例では、ｍ＝ｎであり、且つ辞書のアドレスが変更されるが、変更後の辞書のキー及びバリューは元の辞書のキー及びバリューといずれとも一致するので、コードの無効化は行われずに、コード（９０３）中のメソッドfoo()のコンパイル済みコードを実行し続けることができる（図７Ｂのステップ７２６）。
【０１４９】
コード９０４は、投機的に行った最適化がビルトイン関数の辞書（２段目の辞書、ｎ）から取り出したビルトイン関数の呼び出し先の静的決定であり、且つ、グローバル変数の辞書に関する変化が異なるバリューでの更新である場合に、当該グローバル変数の辞書に関連付けられたコンパイル済みコードのうち、上記ビルトイン関数の呼び出し先を辞書で取り出されたバリューで置換する最適化によって最適化されたコードを無効化せずに、当該最適化されたコードを実行できる例を示す。
１行目でg=1というキーを新しく追加し、１０行目でfoo(1)を１００回実行し、３行目のメソッドfoo()に飛び、４行目でビルトイン関数abs()を呼ぶ。メソッドfoo()の１００回目の呼び出し時に、メソッドfoo()がコンパイルされてコンパイル済みコードが生成されるものとする。次に、７行目においてグローバル変数の辞書（１段目の辞書、ｍ）において、ｇというシンボルのキーのバリューを−１で置き換える。従って、上記例では、ｍ＜ｎであり、且つグローバル変数の辞書にｇのバリューが更新されただけなのでコードの無効化は行われずに、コード（９０４）中のメソッドfoo()のコンパイル済みコードを実行し続けることができる（図７Ｃのステップ７３２）。
【０１５０】
コード９０５は、投機的に行った最適化がビルトイン関数の辞書（２段目の辞書、ｎ）から取り出したビルトイン関数の呼び出し先の静的決定であり、且つ、ビルトイン関数の辞書に関する変化がキーの追加である場合に、当該ビルトイン関数の辞書に関連付けられたコンパイル済みコードのうち、上記ビルトイン関数の呼び出し先を辞書で取り出されたバリューで置換する最適化によって最適化されたコードを無効化せずに、当該最適化されたコードを実行できる例を示す。
８行目でfoo(1)を１００回実行し、２行目のメソッドfoo()に飛び、３行目でビルトイン関数abs()を呼ぶ。メソッドfoo()の１００回目の呼び出し時に、メソッドfoo()がコンパイルされてコンパイル済みコードが生成されるものとする。次に、９行目に飛んで、５行目のメソッドbar()に飛び実行する。そして、５行目においてビルトイン関数の辞書（２段目の辞書、ｍ）に、キーとして「abc」、及び当該キーに関連付けられたバリューとして飛び先である(x:0)を追加することを示す。従って、上記例では、ｍ＝ｎであり、且つビルトイン関数の辞書にキーが追加されただけなのでコードの無効化は行われずに、コード（９０５）中のメソッドfoo()のコンパイル済みコードを実行し続けることができる（図７Ｂのステップ７２２）。
【０１５１】
コード９０６は、投機的に行った最適化がビルトイン関数の辞書（２段目の辞書、ｎ）から取り出したビルトイン関数の呼び出し先の静的決定であり、且つ、グローバル変数の辞書に関する変化がアドレスの変更であり且つ当該変更後の辞書のキーが元の辞書のキーと一致している場合に、当該グローバル変数の辞書に関連付けられたコンパイル済みコードのうち、上記ビルトイン関数の呼び出し先を辞書で取り出されたバリューで置換する最適化によって最適化されたコードを無効化せずに、当該最適化されたコードを実行できる例を示す。
８行目でbar(1)を１００回実行し、２行目のbar()というメソッド中に５行目のexecというメソッドがあり、sと言う文字列に渡されたプログラムを実行する。メソッドfoo()の１００回目の呼び出し時に、メソッドfoo()がコンパイルされてコンパイル済みコードが生成されるものとする。この際にグローバル変数の辞書（１段目の辞書、ｍ）として５行目のinの後ろにある辞書gdicを渡す。４行目にあるint()メソッドがビルトイン関数（２段目の辞書、ｎ）である。３行目が実行される度に新しい辞書が作られるので辞書gdicのアドレスが変わり、５行目で実行されるfoo()に渡されるグローバル変数の辞書のアドレスは毎回異なる。５行目で実行されるfoo()に渡されるグローバル変数の辞書のアドレスは毎回異なる。３行目に見られるように、gdicはgがキーであり、xが当該キーgに関連付けられたバリューとして取り出されるバリューである。当該xは変数なので前回と違うかも知れないが、３行目でキーはgで常に一致している。従って、上記例では、ｍ＜ｎであり、且つ辞書のアドレスが変更されるが、変更後の辞書のキーが元の辞書のキーと一致するので、コードの無効化は行われずに、コード（９０６）中のメソッドfoo()のコンパイル済みコードを実行し続けることができる（図７Ｃのステップ７３６）。
【０１５２】
（実施例）
パイソンの処理系において、本発明を適用した場合と、本発明を適用しない場合とを比較する実験を行った。その結果、本発明を適用した場合に本発明を適用しない場合と比べて、実行時間を34.2%高速化することができた。測定験環境は下記の通りである。
・対象プログラムは、Unladen swallow benchmark（非特許文献７を参照）のdjango(150x150 cellのhtml tableを生成）を、Facebook（登録商標）が開発しているTornadoというweb framework （非特許文献８を参照）へポーティングしたものである。
・実行環境は、ＣＰＵがx86 Westmere-EP（インテル社（登録商標）） 2.93GHzであり、オペレーティング・システムがRed Hat Enterprise Linux 6.0である。
【０１５３】
本発明の１つの実施態様において、コードがパイソンに従い記述されたコードである場合に適用される最適化には、下記のようなものがある：
・更新されることが少ないグローバル変数（非特許文献１を参照）を、定数としてコンパイルすること；及び、
・ビルトイン関数の呼び出しの際に、飛び先アドレスの決定の高速化。
【０１５４】
さらに、上記最適化の結果、他の最適化をさらに適用可能になることもある。他の最適化は例えば、定数伝播及びコード特殊化である。定数伝播とは、コンパイル時に数式内の値を既知の定数値に置き換える手法であり、定数としては、定数畳み込みで述べたようなものの他に、定数値を引数とした Intrinsic Function（コンパイラが関数呼び出しではなく、機械語に置き換えてしまうような関数）も定数となる。コード特殊化とは、動的又は静的に得られた型情報とあわせて、より単純な命令で置き換え可能であることをいう。
【０１５５】
本発明では、ある変数についての辞書を管理する記憶領域が更新されたかどうかの情報に基づくので複数の辞書に属する変数を監視対象とする。さらに、本発明では、コンパイル時の情報（すなわち、バリューを取り出した段数ｎ）を利用して、記憶領域が更新された場合であっても、特定の条件下において辞書に関する変化が検出された辞書に関連付けられたコンパイル済みコードのうち、上記取り出されたバリューで置換する最適化によって最適化されたコードのみを無効化すればよいと判断することが可能である。
【図１】
0005846581.tif 000002
【図２】
0005846581.tif 000003
【図３】
0005846581.tif 000004
【図４】
0005846581.tif 000005
【図５】
0005846581.tif 000006
【図６】
0005846581.tif 000007
【図７Ａ】
0005846581.tif 000008
【図７Ｂ】
0005846581.tif 000009
【図７Ｃ】
0005846581.tif 000010
【図８Ａ】
0005846581.tif 000011
【図８Ｂ】
0005846581.tif 000012
【図９】
0005846581.tif 000013