(57)【要約】【課題】ソフトウェアプログラムの効率を高める方法等を提供する。【解決手段】実施形態の一態様に従って、方法は、動的型付きプログラミング言語に基づき作成されるソフトウェアプログラムを実行することを含んでよい。方法は、ソフトウェアプログラムの実行の間、ソフトウェアプログラムに含まれる変数についてタイプ情報を決定することを更に含んでよい。加えて、方法は、ソフトウェアプログラム及びタイプ情報に基づき、修正されたソフトウェアプログラムを生成し、その修正されたソフトウェアプログラムを配信することを含んでよい。【選択図】図３
2014186728.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウェアプログラムの効率を高める方法であって、
動的型付きプログラミング言語に基づき作成されるソフトウェアプログラムを実行し、
前記ソフトウェアプログラムの実行の間、該ソフトウェアプログラムに含まれる変数についてタイプ情報を決定し、
前記ソフトウェアプログラム及び前記タイプ情報に基づき、修正されたソフトウェアプログラムを生成し、
前記修正されたソフトウェアプログラムを配信する
方法。
【請求項２】
前記修正されたソフトウェアプログラムを生成することは、前記ソフトウェアプログラムのデータ構造において前記変数についての前記タイプ情報を格納することを含み、前記データ構造の夫々は、前記変数の少なくとも１つを用いる前記ソフトウェアプログラムのコールサイトに関連する、
請求項１に記載の方法。
【請求項３】
更に、
前記ソフトウェアプログラムをプロファイリングし、
前記ソフトウェアプログラムのプロファイリングに基づき前記タイプ情報を決定する
請求項１に記載の方法。
【請求項４】
更に、
前記ソフトウェアプログラムのプロファイリングに基づき該ソフトウェアプログラムの使用頻度の高い関数を決定し、
前記ソフトウェアプログラムにおける前記変数の少なくとも１つについて、該少なくとも１つの変数が前記使用頻度の高い関数において含まれることに基づき前記タイプ情報を決定する
請求項３に記載の方法。
【請求項５】
更に、
前記ソフトウェアプログラムのプロファイリングに基づき該ソフトウェアプログラムの実行の間の変数タイプの使用の頻度を決定し、
前記変数タイプの使用の頻度に基づき前記タイプ情報を決定する
請求項３に記載の方法。
【請求項６】
更に、前記タイプ情報を決定するようランタイム・メソッド・バインディングを実行する
請求項１に記載の方法。
【請求項７】
更に、前記ソフトウェアプログラムのデータ構造において前記変数についての前記タイプ情報を格納するようインライン・キャッシングを実行し、前記データ構造の夫々は、前記変数の少なくとも１つを用いる前記ソフトウェアプログラムのコールサイトに関連する、
請求項１に記載の方法。
【請求項８】
更に、前記ソフトウェアプログラムを実行するよう該ソフトウェアプログラムの記号的実行を実行する
請求項１に記載の方法。
【請求項９】
更に、前記ソフトウェアプログラムを実行するよう該ソフトウェアプログラムへテストスイートを適用する、
請求項１に記載の方法。
【請求項１０】
システムにソフトウェアプログラムの効率を高めさせるようにコンピュータ可読媒体からのコンピュータ命令を実行するよう構成されるプロセッサであって、
前記命令は、
動的型付きプログラミング言語に基づき作成されるソフトウェアプログラムを実行し、
前記ソフトウェアプログラムの実行の間、該ソフトウェアプログラムに含まれる変数についてタイプ情報を決定し、
前記ソフトウェアプログラム及び前記タイプ情報に基づき、修正されたソフトウェアプログラムを生成し、
前記修正されたソフトウェアプログラムを配信する
ことを含む、プロセッサ。
【請求項１１】
前記修正されたソフトウェアプログラムを生成することは、前記ソフトウェアプログラムのデータ構造において前記変数についての前記タイプ情報を格納することを含み、前記データ構造の夫々は、前記変数の少なくとも１つを用いる前記ソフトウェアプログラムのコールサイトに関連する、
請求項１０に記載のプロセッサ。
【請求項１２】
前記命令は、
前記ソフトウェアプログラムをプロファイリングし、
前記ソフトウェアプログラムのプロファイリングに基づき前記タイプ情報を決定する
ことを更に含む、請求項１０に記載のプロセッサ。
【請求項１３】
前記命令は、
前記ソフトウェアプログラムのプロファイリングに基づき該ソフトウェアプログラムの使用頻度の高い関数を決定し、
前記ソフトウェアプログラムにおける前記変数の少なくとも１つについて、該少なくとも１つの変数が前記使用頻度の高い関数において含まれることに基づき前記タイプ情報を決定する
ことを更に含む、請求項１２に記載のプロセッサ。
【請求項１４】
前記命令は、
前記ソフトウェアプログラムのプロファイリングに基づき該ソフトウェアプログラムの実行の間の変数タイプの使用の頻度を決定し、
前記変数タイプの使用の頻度に基づき前記タイプ情報を決定する
ことを更に含む、請求項１２に記載のプロセッサ。
【請求項１５】
前記命令は、前記タイプ情報を決定するようランタイム・メソッド・バインディングを実行することを更に含む、
請求項１０に記載のプロセッサ。
【請求項１６】
前記命令は、前記ソフトウェアプログラムのデータ構造において前記変数についての前記タイプ情報を格納するようインライン・キャッシングを実行することを更に含み、前記データ構造の夫々は、前記変数の少なくとも１つを用いる前記ソフトウェアプログラムのコールサイトに関連する、
請求項１０に記載のプロセッサ。
【請求項１７】
前記命令は、前記ソフトウェアプログラムを実行するよう該ソフトウェアプログラムの記号的実行を実行することを更に含む、
請求項１０に記載のプロセッサ。
【請求項１８】
前記命令は、前記ソフトウェアプログラムを実行するよう該ソフトウェアプログラムへテストスイートを適用することを更に含む、
請求項１０に記載のプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本願で論じられる実施形態は、動的型付きソフトウェアの効率を高めることに関する。
【背景技術】
【０００２】
電子機器の使用が増えるにつれて、それらの機器で実行されるソフトウェアプログラムの数も増える。そのようなソフトウェアプログラムの多くは、「動的型付きソフトウェア」とも呼ばれ得る動的型付きプログラミング言語を用いて作成される。動的型付きソフトウェアのコードは、ソフトウェアプログラムが実行されるまでタイプをチェックされない変数を含むことがある。然るに、変数についてのタイプ情報は、主として動的型付きソフトウェアの実行中に（ランタイム時に）決定され得る。動的型付き言語は、静的型付きプログラミング言語と比較してプログラミング時の柔軟性が高い。しかしながら、動的型付きソフトウェアにおいて変数のタイプ情報を決定するためのランタイム動作に一部起因して、動的型付きソフトウェアはまた、静的型付きソフトウェアよりも多くの電子機器の計算リソースを消費しうる。
【０００３】
本願で請求される対象は、如何なる欠点も解消し又は先に記載されたような環境においてのみ動作する実施形態に制限されない。むしろ、この背景は、本願で記載される幾つかの実施形態が実施され得る一例としての技術範囲を説明するためにのみ提供される。
【発明の概要】
【発明が解決しようとする課題】
【０００４】
本発明は、ソフトウェアプログラムの実行に使用されるリソースを低減してソフトウェアプログラムの効率を高める方法及びプロセッサを提供することを目的とする。
【課題を解決するための手段】
【０００５】
実施形態の一態様に従って、ソフトウェアプログラムの効率を高める方法は、動的型付きプログラミング言語に基づき作成されるソフトウェアプログラムを実行することを含んでよい。方法は、ソフトウェアプログラムの実行の間、ソフトウェアプログラムに含まれる変数についてタイプ情報を決定することを更に含んでよい。加えて、方法は、ソフトウェアプログラム及びタイプ情報に基づき、修正されたソフトウェアプログラムを生成し、その修正されたソフトウェアプログラムを配信することを含んでよい。
【０００６】
本願で記載される実施形態の目的及び利点は、少なくとも、特に特許請求の範囲において指摘される要素、特徴及び組み合わせによって、実現され達成されるであろう。
【０００７】
上記の概要及び下記の詳細な説明はいずれも例示及び説明のためであり、請求される発明の限定でないことが理解されるべきである。
【発明の効果】
【０００８】
本発明の実施形態によれば、ソフトウェアプログラムの実行に使用されるリソースを低減してソフトウェアプログラムの効率を高めることが可能となる。
【図面の簡単な説明】
【０００９】
【図１】動的型付きソフトウェアの効率を高めるシステムの例を表す。
【図２】動的型付きソフトウェアの効率を高めるよう構成されるタイプ情報モジュールの例を表す。
【図３】動的型付きソフトウェアの効率を高める方法の例のフローチャートである。
【発明を実施するための形態】
【００１０】
例となる実施形態は、添付の図面の使用を通じて、更なる特異性及び詳細を伴って記載及び説明されるであろう。
【００１１】
本願で記載される実施形態は、以降「動的型付きソフトウェア」とも呼ばれ得る動的型付き言語に基づくソフトウェアの効率を高める方法及びシステムに関する。動的型付きソフトウェアの変数は、例えば、制限なく、文字、文字列、整数、浮動小数、バイト、ダブル、ブーリアン型、ポインタ、アレイ、構造、クラスのオブジェクト又はインスタンス、及びエヌメレーションのようなタイプを有してよい。変数のタイプは、どのようなデータ（例えば、実際値）が変数に割り当てられ得るかを示す。例えば、整数値は、タイプが整数である変数に割り当てられてよく、一方、真偽値は、タイプがブーリアン型である変数に割り当てられてよい。
【００１２】
動的型付きソフトウェアのコードは、ソフトウェアプログラムが実行されるまでタイプがチェックされない変数を含むことがある。然るに、変数についてのタイプ情報は、主として動的型付きソフトウェアの実行中に（ランタイム時に）決定され得、これにより、動的型付きソフトウェアを実行するためのリソースの使用が増える。
【００１３】
以下で更に詳細に論じられるように、タイプ情報モジュールは、動的型付きソフトウェアが１又はそれ以上のユーザによる使用のために配信される前に、動的型付きソフトウェアに含まれる変数についてタイプ情報を決定するよう構成されてよい。変数のこのような事前の（ＡＯＴ；ahead-of-time）タイプ情報決定は、動的型付きソフトウェアのその後の実行の間に変数のタイプ確認を行うために使用されるリソースを減らすことができる。
【００１４】
本開示の実施形態は、添付の図面を参照して説明されるであろう。
【００１５】
図１は、本願で記載される少なくとも１つの実施形態に従って配置される、動的型付きソフトウェアプログラム１０２の効率を高める例となるシステム１００を表す。ソフトウェア１０２は変数を含んでよく、それらの変数のタイプは、ソフトウェア１０２の実行（又はランタイム）の間に確認されてよい。加えて、動的型付きソフトウェアの実行の間、動的型付きソフトウェアのどのデータ構造又はパスがその時点で実行されているのかに依存して、種々のタイプが変数に使用されてよい。変数タイプがソフトウェアの実行中に確認され得る動的型付きソフトウェアプログラミング言語の幾つかの例として、ＪａｖｅＳｃｒｉｐｔ、Ｐｈｙｔｈｏｎ、Ｒｕｂｙ、ＭＡＴＬＡＢ、ＬＩＳＰ、Ｌｕａ、及びＡＰＬがあるが、これらに限られない。
【００１６】
幾つかの実施形態において、システム１００のタイプ情報モジュール１０４は、ソフトウェア１０２の１又はそれ以上の変数に関連するタイプ情報を決定するようにソフトウェア１０２を実行するよう構成されてよい。幾つかの実施形態において、タイプ情報モジュール１０４は、図２を参照して以下で更に詳細に記載されるように、テストスイート又は記号的実行を用いてソフトウェア１０２を実行してよい。
【００１７】
タイプ情報は、ソフトウェア１０２の実行中にソフトウェア１０２の変数に使用され得るタイプに関連する情報を含んでよい。例えば、幾つかの実施形態において、タイプ情報は、ソフトウェア１０２の実行中に変数に割り当てられ得る種々のタイプを含んでよい。それらの又は他の実施形態において、タイプ情報は、どのタイプがソフトウェア１０２の特定のパス又はデータ構造の実行の間に変数に割り当てられ得るかを含んでよい。加えて、タイプ情報は、ソフトウェア１０２の特定のパス又はデータ構造における変数に関連するタイプを特定し且つそのようにして特定されたタイプに基づきどの動作を実行すべきかを示す命令の特定の組を含んでよい。
【００１８】
ソフトウェア１０２の実行の間、タイプ情報モジュール１０４は、ソフトウェア１０２に含まれる変数についてタイプ情報を決定するよう構成されてよく、また、変数について決定されタイプ情報を記憶しておくよう構成されてよい。幾つかの実施形態において、タイプ情報モジュール１０４は、ソフトウェア１０２の変数についてのタイプ情報を、その変数がソフトウェア１０２の実行中に使用される場合に、ルックアップするよう構成されてよい。
【００１９】
例えば、タイプ情報モジュール１０４は、ソフトウェア１０２の変数についてのタイプ情報を、その変数がソフトウェア１０２の実行中に呼び出され得るソフトウェア１０２の関数へ送られる場合に、ルックアップするよう構成されてよい。タイプ情報モジュール１０４はまた、呼び出された関数によって使用される変数に関連する変数のタイプ情報を記憶しておくよう構成されてよい。
【００２０】
図２に関連して更に詳細に記載されるように、幾つかの実施形態において、タイプ情報モジュール１０４は更に、タイプ情報を決定する部分として、ソフトウェア１０２のプロファイリングを実行するよう構成されてよい。更に、タイプ情報モジュール１０４は、決定されたタイプ情報に関してインライン・キャッシングを実行するよう構成されてよい。図２に関連して以下で更に詳細に論じられるように、タイプ情報モジュール１０４はまた、決定され且つ記憶されたタイプ情報とソフトウェア１０２とに基づき、修正された動的型付きソフトウェアプログラム１０６（「修正ソフトウェア１０６」）を生成するよう構成されてよい。例えば、修正ソフトウェア１０６は、タイプ情報を記憶したソフトウェア１０２を有してよい。加えて、幾つかの実施形態において、タイプ情報モジュール１０４は、インライン・キャッシングに基づき修正ソフトウェア１０６を生成して、ソフトウェア１０２に対するインライン・キャッシングの結果が修正ソフトウェア１０６に記憶され得るようにするよう構成されてよい。タイプ情報モジュール１０４はまた、修正された動的型付きソフトウェア１０６を記憶して、修正ソフトウェア１０６が次いで１又はそれ以上のユーザへ配信され得るようにするよう構成されてよい。
【００２１】
然るに、タイプ情報モジュール１０４は、修正ソフトウェア１０６が１又はそれ以上のユーザによる使用のために配信される前に、修正ソフトウェア１０６に含まれる変数の１又はそれ以上についてタイプ情報を決定するよう構成されてよい。これは、事前のタイプ情報決定と呼ばれることがある。事前に決定されたタイプ情報は、ソフトウェア１０２におけるようにタイプ情報が事前に決定され得ない動的型付きソフトウェアの実行中に使用されるリソースと比較して、修正ソフトウェア１０６の実行中に使用されるリソースを減らすことができる。
【００２２】
図２は、本願で記載される少なくとも１つの実施形態に従って配置されるタイプ情報モジュール２０４の実施例を表す。幾つかの実施形態において、タイプ情報モジュール２０４は、図１のタイプ情報モジュール１０４と同じであるよう構成されてよい。タイプ情報モジュール２０４は、プログラム、ソフトウェア、関数、ライブラリ、サース（ＳａａＳ；software-as-a-service）、アナログ若しくはデジタル回路、又はそれらの組み合わせのような如何なる適切なメカニズムによっても実施されてよい。幾つかの実施形態において、タイプ情報モジュール２０４は、プロセッサによる実行のためにメモリに常駐するロジック又は命令において具現されてよい。
【００２３】
プロセッサは、例えば、マイクロプロセッサ、マイクロコントローラ、デジタル信号プロセッサ（ＤＳＰ）、特定用途向け集積回路（ＡＳＩＣ）、フィルード・プログラマブル・ゲート・アレイ（ＦＰＧＡ）、あるいは、プログラム命令をインタプリット及び／又は実行するよう、及び／又はデータを処理するよう構成された何らかの他のデジタル又はアナログ回路を含んでよい。幾つかの実施形態において、プロセッサは、プログラム命令をインタプリット及び／又は実行し、且つ／あるいは、メモリに記憶されたデータを処理してよい。
【００２４】
メモリは、一定期間プログラム命令及び／又はデータを保持するよう構成される如何なる適切なコンピュータ可読媒体も含んでよい。一例として、制限なしに、そのようなコンピュータ可読媒体は、ランダムアクセスメモリ（ＲＡＭ）、読み出し専用メモリ（ＲＯＭ）、電気的消去可能プログラム可能ＲＯＭ（ＥＥＰＲＯＭ）、コンパクトディスクＲＯＭ（ＣＤ−ＲＯＭ）若しくは他の光ディスク記憶装置、磁気ディスク若しくは他の磁気記憶装置、フラッシュメモリ装置（例えば、固体状態メモリ装置）、又はコンピュータにより実行可能な命令若しくはデータ構造の形で所望のプログラムコードを搬送若しくは記憶するために使用され得且つプロセッサによってアクセスされ得る何らかの他の記憶媒体を含む有形なコンピュータ可読記憶媒体を含んでよい。それらの組み合わせもコンピュータ可読媒体の適用範囲内に含まれてよい。コンピュータにより実行可能な命令は、例えば、汎用コンピュータ、専用コンピュータ、又は専用プロセッシング装置（例えば、プロセッサ）に特定の機能又は機能のグループを実行させる命令及びデータを含んでよい。
【００２５】
幾つかの実施形態において、タイプ情報モジュール２０４は、実行モジュール２１０を有してよい。実行モジュール２１０は、動的型付きソフトウェアプログラム２０２（「ソフトウェア２０２」）を受け取って実行するよう構成されてよい。幾つかの実施形態において、実行モジュール２１０は、ソフトウェア２０２に関連する受け取られたテストスイート２０８を用いて、及び／又はソフトウェア２０２に関して記号的実行を行うことによって、ソフトウェア２０２を実行するよう構成されてよい。
【００２６】
テストスイート２０８は、ソフトウェア２０２の１又はそれ以上のパスが探索され得るようにソフトウェア２０２の１又はそれ以上の動作を開始するために使用され得るコマンド、命令、及び／又は具象な値（concrete  value）のあらゆる適切な組であってよい。テストスイート２０８によるソフトウェア２０２の実行の間、ソフトウェア２０２の１又はそれ以上の変数が呼び出されてよく、それにより、それらの変数に関連するタイプ情報が決定され得る。然るに、実行モジュール２１０は、ソフトウェア２０２の１又はそれ以上の変数に関連するタイプ情報が決定され得るようにソフトウェア２０２を実行するためにテストスイート２０８を使用するよう構成されてよい。
【００２７】
上述されたように、それらの及び他の実施形態において、実行モジュール２１０はまた、ソフトウェア２０２を実行するために記号的実行を使用するよう構成されてよい。記号的実行は、ソフトウェアプログラムを動的に解析するための技術である。記号的実行は、入力値として具象な値に代えてシンボリック値を使用してよく、プログラム変数の値をシンボリック表現として表してよい。結果として、記号的に実行されるソフトウェアプログラムによって計算される出力は、シンボリック入力の関数として表され得る。記号的実行により、ソフトウェアプログラム内の各パスは記号的に実行されてよい。パスに沿った記号的実行が（正常に又はエラーを有して）終了すると、そのパスに関連する経路制約が確立され得る。
【００２８】
然るに、実行モジュール２１０は、記号的実行を実行してソフトウェア２０２を実行するよう構成されてよく、それにより、ソフトウェア２０２の１又はそれ以上の変数は、ソフトウェア２０２の記号的実行の間に呼び出され得る。このように、実行モジュール２１０は、ソフトウェア２０２の変数の１又はそれ以上に関連するタイプ情報を、それらの変数がソフトウェア２０２の記号的実行の間に呼び出される場合に、決定するよう構成されてよい。
【００２９】
（テストスイート２０８又は記号的実行による）ソフトウェア２０２の実行の間、実行モジュール２１０は、ソフトウェア２０２における変数に関連するタイプ情報を決定するよう構成されてよい。幾つかの実施形態において、実行モジュール２１０は、ソフトウェア２０２の実行中にランタイム・メソッド・バインディングを実行してタイプ情報を決定するよう構成されてよい。ランタイム・メソッド・バインディングは、タイプが特定されていない変数について、その変数が呼び出される特定のインスタンスにおいて、どのタイプが使用され得るかを決定するために使用されてよい。例えば、ランタイム・メソッド・バインディングの間、動的ルックアップメソッドが、特定のインスタンスにおいて変数が呼び出される場合にその変数のタイプを決定するよう、当該変数に関して実行されてよい。
【００３０】
上述されたように、異なるインスタンスにおいて、例えば、ソフトウェア２０２の異なる実行パス又はデータ構造内で、変数は異なるタイプを割り当てられてよい。結果として、ソフトウェア２０２における変数に関連するタイプ情報は、ソフトウェア２０２の実行中にそれらの変数に割り当てられ得る１又はそれ以上のタイプを含んでよい。例えば、変数についてのタイプ情報は、その変数がソフトウェア２０２における異なる実行パスにおいて整数、ダブル、及び／又は浮動小数として割り当てられ得ることを示してよい。
【００３１】
幾つかの実施形態において、実行モジュール２１０はインライン・キャッシングモジュール２１４を有してよい。インライン・キャッシングモジュール２１４は、ソフトウェア２０２の実行中にインライン・キャッシングを実行するよう構成されてよい。以下で更に詳細に論じられるように、インライン・キャッシングは、前に実行された動的ルックアップメソッドから得られたタイプ情報を記憶するために使用されてよい。インライン・キャッシングは、前に実行された動的ルックアップメソッドがタイプ情報を決定するために実行されたコールサイトに関連付けられ得るソフトウェア２０２のデータ構造においてタイプ情報を記憶するために使用されてよい。従って、タイプ情報は、タイプ情報を決定するための他の動的ルックアップメソッドを実行することに代えて、コールサイトがその後に引き起こされる場合にアクセスされてよい。インライン・キャッシングモジュール２１４は、単層的（monomorphic）インライン・キャッシング、多層的（polymorphic）インライン・キャッシング、及び／又はメタモルフィック（metamorphic）インライン・キャッシングを含むいずれかの適切な種類のインライン・キャッシングを実行するよう構成されてよい。
【００３２】
幾つかの実施形態において、ソフトウェア２０２の特定のコールサイトに関連する変数（例えば、特定のコールサイトにある関数へ引数として送られる変数）は、その特定のコールに関して、しばしば、同じタイプ、又は有限な数のタイプを有してよい。インライン・キャッシングモジュール２１４によって実行されるインライン・キャッシングはこの教えに基づいてよく、それにより、ソフトウェア２０２の特定のコールサイトにおける１又はそれ以上の変数のための動的ルックアップの結果から得られるタイプ情報は、その特定のコールサイトに関連し得るソフトウェア２０２のデータ構造（及びその対応するコード）とともにインラインで記憶されてよい。従って、特定のコールサイトに再び達する場合に、そのコールサイトに関連するデータ構造において記憶されたタイプ情報が、動的ルックアップメソッドを呼び出すことに代えて、アクセスされ得る。
【００３３】
幾つかの実施形態において、タイプ情報モジュール２０４の修正ソフトウェアモジュール２１６は、修正された動的型付きソフトウェアプログラム２０６（「修正ソフトウェア２０６」）を生成するよう構成されてよい。修正ソフトウェア２０６は、ソフトウェア２０６及び決定されたタイプ情報に基づいてよい。例えば、幾つかの実施形態において、修正ソフトウェアモジュール２１６は、修正ソフトウェア２０６としてソフトウェア２０２のインライン・キャッシングの結果を記憶するよう構成されてよく、それにより、修正ソフトウェア２０６は、ソフトウェア２０２と、インライン・キャッシングの間にソフトウェア２０２に加えられたタイプ情報とを含んでよい。
【００３４】
幾つかの実施形態において、実行モジュール２１０は、ソフトウェア２０２に関連するプロファイル情報を決定するよう構成されるプロファイリングモジュール２１２を更に有してよい。幾つかの実施形態において、プロファイリングモジュール２１２は、ソフトウェア２０２の実行中にソフトウェア２０２の動的プログラム解析を実行することによって、プロファイル情報を決定するよう構成されてよい。例えば、プロファイリングモジュール２１２は、ソフトウェア２０２のメモリ又は時間的コスト、ソフトウェア２０２内の特定の命令の使用、ソフトウェア２０２内の変数使用の頻度及び／又は期間、且つ／あるいは、ソフトウェア２０２内の関数呼び出しの頻度及び／又は期間を決定してプロファイル情報に含めるよう構成されてよい。加えて、プロファイリングモジュール２１２は、ソフトウェア２０２の実行の間の変数タイプの使用の頻度を決定してプロファイル情報に含めるよう構成されてよい。
【００３５】
幾つかの実施形態において、実行モジュール２１０は、プロファイル情報に基づきタイプ情報を決定するよう構成されてよい。例えば、幾つかの実施形態において、実行モジュール２１０は、プロファイル情報によって示されるような、どれくらいの頻度で変数が使用されるかに基づき、変数についてのタイプ情報の決定に優先順位をつけるよう構成されてよい。そのようなものとして、実行モジュール２１０は、使用頻度の低い変数についてのタイプ情報の決定に対して、より使用頻度の高い変数についてのタイプ情報の決定を優先してよい。
【００３６】
加えて、幾つかの実施形態において、実行モジュール２１０は、プロファイル情報によって示されるような、どれくらいの頻度で呼び出し頻度が高い関数が呼び出されるのかに基づき、１又はそれ以上の呼び出し頻度の高い関数に関してタイプ情報の決定に優先順位をつけるよう構成されてよい。例えば、実行モジュール２１０は、めったに呼び出されない関数に関連する変数についてのタイプ情報の決定に対して、呼び出し頻度の高い関数に関連する１又はそれ以上の変数についてのタイプ情報の決定を優先するよう構成されてよい。
【００３７】
それらの及び他の実施形態において、インライン・キャッシングモジュール２１４は、プロファイル情報に関してインライン・キャッシングを実行するよう構成されてよい。例えば、インライン・キャッシングモジュール２１４は、プロファイル情報に含まれ得るデータ構造に関連する関数呼び出しの頻度及び／又はデータ構造に関連する変数の使用の頻度に基づき、タイプ情報を格納すべきソフトウェア２０２のいずれかのデータ構造（例えば、ソフトウェア２０２のコールサイトに関連するデータ構造）を優先してよい。加えて、幾つかの実施形態において、インライン・キャッシングモジュール２１４は、１つのタイプが変数について他のタイプよりもよく使用される場合に、その変数についてのタイプの情報を含む関連のデータ構造において変数の当該１つのタイプについてのタイプ情報を変数の他のタイプに対して優先してよい。
【００３８】
修正ソフトウェアモジュール２１６はまた、プロファイル情報に基づき修正ソフトウェア２０６を生成するよう構成されてよい。例えば、上述されたように、インライン・キャッシングモジュール２１４は、関連のタイプ情報を格納すべきソフトウェア２０２のいずれかのデータ構造を優先するためにプロファイル情報を用いてインライン・キャッシングを実行してよい。修正ソフトウェアモジュール２１６は、ソフトウェア２０２を該ソフトウェア２０２に含まれる優先順位を付けられたタイプ情報とともに修正ソフトウェア２０６として記憶するよう構成されてよい。従って、修正ソフトウェア２０６は、プロファイル情報に含まれ得る使用頻度の高い変数、変数タイプ、及び／又は関数呼び出しに関連するタイプ情報を含んでよい。
【００３９】
幾つかの実施形態において、修正ソフトウェア２０６は、後の時点での使用又は実行のために、コンピュータ可読媒体に記憶されるか、及び／又は配信されてよい。上述されたように、修正ソフトウェア２０６は、決定されたタイプ情報が記憶されたソフトウェア２０２を含んでよい。従って、修正ソフトウェア２０６は、事前に決定された修正ソフトウェア２０６に記憶されているタイプ情報に基づき動作を実行してよく、これにより、修正ソフトウェア２０６の実行中に使用されるリソースを減らすことができる。加えて、修正ソフトウェア２０６を生成するよう実行され得る事前のインライン・キャッシングは、修正ソフトウェア２０６の実行中に実行され得るジャスト・イン・タイム（ＪＩＴ；just-in-time）のインライン・キャッシングの量を低減又は削除することができる。従って、修正ソフトウェア２０６を実行するために使用されるプロセッシングリソースは、ソフトウェア２０２を実行するために使用されるプロセッシングリソースと比べて低減され得る。
【００４０】
変更、追加又は省略が、本開示の適用範囲から逸脱することなく図１及び図２に対してなされてよい。例えば、タイプ情報モジュール２０４のモジュールの１又はそれ以上は組み合わされ、又は追加モジュールに分割されてよい。モジュール間の区別は単に、タイプ情報モジュール２０４によって実行され得る種々の機能の理解を容易にするためである。
【００４１】
図３は、本願で記載される少なくとも１つの実施形態に従って配置される、動的型付きソフトウェアプログラムの効率を高める例となる方法３００のフローチャートである。方法３００は、幾つかの実施形態において、図１及び図２のタイプ情報モジュール１０４及び２０４の夫々のようなタイプ情報モジュールによって実施されてよい。別個のブロックとして表されているが、様々なブロックは、所望の実施に依存して、追加ブロックに分けられ、より少ないブロックへとまとめられ、又は削除されてよい。
【００４２】
方法３００は開始し、ブロック３０２で、動的型付きソフトウェアプログラム（以降「ソフトウェアプログラム」と呼ばれる。）が受け取られてよい。ブロック３０４で、ソフトウェアプログラムは実行されてよい。上述されたように、幾つかの実施形態において、ソフトウェアプログラムはテストスイートを用いて実行されてよい。それらの又は他の実施形態において、ソフトウェアプログラムは記号的実行を用いて実行されてよい。
【００４３】
ブロック３０６で、ソフトウェアプログラムに含まれる変数についてのタイプ情報が、ソフトウェアプログラムの実行中に決定されてよい。例えば、上述されたように、タイプ情報はランタイム・メソッド・バインディングを用いて決定されてよい。幾つかの実施形態において、変数についてのタイプ情報は、それらの変数を使用するソフトウェアプログラムのコールサイトに関連するデータ構造において格納されてよい。幾つかの実施形態において、タイプ情報は、上述されたように、インライン・キャッシングを用いて関連のデータ構造において格納されてよい。
【００４４】
ブロック３０８で、動的型付きの修正されたソフトウェアプログラム（以降「修正ソフトウェアプログラム」と呼ばれる。）がソフトウェアプログラム及びタイプ情報に基づき生成されてよい。例えば、上述されたように、タイプ情報を記憶したソフトウェアプログラムが、修正ソフトウェアプログラムを生成するよう修正ソフトウェアプログラムとして記憶されてよい。
【００４５】
ブロック３１０で、修正ソフトウェアプログラムは後の時点の実行のために配信及び／又は記憶されてよい。上述されたように、修正ソフトウェアプログラムは、ブロック３０２で受け取られたソフトウェアプログラムの前の実行の間に事前に決定された修正ソフトウェアプログラムに含まれる変数についてのタイプ情報を含んでよい。加えて、修正ソフトウェアプログラムにおけるタイプ情報の包含は、ブロック３０２で受け取られたソフトウェアプログラムの実行中に実行され得るインライン・キャッシングの量と比べて、修正ソフトウェアプログラムの実行中に実行されるインライン・キャッシングの量を減らすことができる。結果として、修正ソフトウェアプログラムを起動及び実行するために使用されるリソースの量は、ブロック３０２で受け取られたソフトウェアプログラムを起動及び実行するために使用されるリソースの量と比べて低減され得る。従って、方法３００は、動的型付きソフトウェアプログラムの効率を高めるために使用されてよい。
【００４６】
当業者には明らかなように、本願で開示されるこの及び他の処理及び方法に関して、そのような処理及び方法において実行される機能は異なる順序で実施されてよい。更に、説明されるステップ及び動作は単に例として提供されており、ステップ及び動作の幾つかは、開示される実施形態の本質から逸脱することなしに、任意であり、より少ないステップ及び動作にまとめられ、又は追加のステップ及び動作に拡張されてよい。
【００４７】
例えば、幾つかの実施形態において、方法３００は、ソフトウェアプログラムに関連するプロファイル情報を決定するよう、ブロック３０２で受け取られたソフトウェアプログラムをプロファイリングすることに関するステップを有してよい。そのような実施形態の幾つかにおいて、プロファイル情報は、タイプ情報を決定するために使用されてよい。例えば、プロファイル情報は、どの変数及び／又は変数タイプが頻繁に呼び出され得るのかを決定するために使用されてよく、それにより、そのような変数に関連するタイプ情報の決定が然るべく優先されてよい。
【００４８】
本願で記載される実施形態は、以下で更に詳細に論じられるように、様々なコンピュータハードウェア又はソフトウェアモジュールを含む専用又は汎用のコンピュータの使用を含んでよい。
【００４９】
本願で記載される実施形態は、コンピュータにより実行可能な命令又はデータ構造を搬送又は記憶するための、上述されたようなコンピュータ可読媒体を用いて実施されてよい。そのようなコンピュータ可読媒体は、汎用又は専用のコンピュータによってアクセスされ得る如何なる利用可能な媒体であってもよい。
【００５０】
本願で使用されるように、語「モジュール」又は「コンポーネント」は、コンピューティングシステムで実行するハードウェア及び／又はソフトウェアオブジェクト若しくはルーチンを指す。本願で記載される種々のコンポーネント、モジュール、エンジン及びサービスは、コンピューティングシステムで（例えば、別個のスレッドとして）実行するオブジェクト又は処理として実施されてよい。本願で記載されるシステム及び方法は、場合によりソフトウェアにおいて実施されるように記載されるが、ハードウェア又はソフトウェアとハードウェアとの組み合わせにおける実施も可能であり考えられている。
【００５１】
本願で挙げられている全ての例及び条件付き言語は、当該技術を促進することに発明者によって寄与された発明及び概念を読む者が理解するのを助ける教示を目的としており、そのような具体的に挙げられている例及び条件に制限されないと解釈されるべきである。本発明の実施形態が詳細に記載されてきたが、様々な変更、置換及び代替が本開示の精神及び適用範囲から逸脱することなしにそれらに対してなされ得ることが理解されるべきである。
【００５２】
上記の実施形態に関し、更に以下の付記を開示する。
（付記１）
ソフトウェアプログラムの効率を高める方法であって、
動的型付きプログラミング言語に基づき作成されるソフトウェアプログラムを実行し、
前記ソフトウェアプログラムの実行の間、該ソフトウェアプログラムに含まれる変数についてタイプ情報を決定し、
前記ソフトウェアプログラム及び前記タイプ情報に基づき、修正されたソフトウェアプログラムを生成し、
前記修正されたソフトウェアプログラムを配信する
方法。
（付記２）
前記修正されたソフトウェアプログラムを生成することは、前記ソフトウェアプログラムのデータ構造において前記変数についての前記タイプ情報を格納することを含み、前記データ構造の夫々は、前記変数の少なくとも１つを用いる前記ソフトウェアプログラムのコールサイトに関連する、
付記１に記載の方法。
（付記３）
更に、
前記ソフトウェアプログラムをプロファイリングし、
前記ソフトウェアプログラムのプロファイリングに基づき前記タイプ情報を決定する
付記１に記載の方法。
（付記４）
更に、
前記ソフトウェアプログラムのプロファイリングに基づき該ソフトウェアプログラムの使用頻度の高い関数を決定し、
前記ソフトウェアプログラムにおける前記変数の少なくとも１つについて、該少なくとも１つの変数が前記使用頻度の高い関数において含まれることに基づき前記タイプ情報を決定する
付記３に記載の方法。
（付記５）
更に、
前記ソフトウェアプログラムのプロファイリングに基づき該ソフトウェアプログラムの実行の間の変数タイプの使用の頻度を決定し、
前記変数タイプの使用の頻度に基づき前記タイプ情報を決定する
付記３に記載の方法。
（付記６）
更に、前記タイプ情報を決定するようランタイム・メソッド・バインディングを実行する
付記１に記載の方法。
（付記７）
更に、前記ソフトウェアプログラムのデータ構造において前記変数についての前記タイプ情報を格納するようインライン・キャッシングを実行し、前記データ構造の夫々は、前記変数の少なくとも１つを用いる前記ソフトウェアプログラムのコールサイトに関連する、
付記１に記載の方法。
（付記８）
更に、前記ソフトウェアプログラムを実行するよう該ソフトウェアプログラムの記号的実行を実行する
付記１に記載の方法。
（付記９）
更に、前記ソフトウェアプログラムを実行するよう該ソフトウェアプログラムへテストスイートを適用する、
付記１に記載の方法。
（付記１０）
システムにソフトウェアプログラムの効率を高めさせるようにコンピュータ可読媒体からのコンピュータ命令を実行するよう構成されるプロセッサであって、
前記命令は、
動的型付きプログラミング言語に基づき作成されるソフトウェアプログラムを実行し、
前記ソフトウェアプログラムの実行の間、該ソフトウェアプログラムに含まれる変数についてタイプ情報を決定し、
前記ソフトウェアプログラム及び前記タイプ情報に基づき、修正されたソフトウェアプログラムを生成し、
前記修正されたソフトウェアプログラムを配信する
ことを含む、プロセッサ。
（付記１１）
前記修正されたソフトウェアプログラムを生成することは、前記ソフトウェアプログラムのデータ構造において前記変数についての前記タイプ情報を格納することを含み、前記データ構造の夫々は、前記変数の少なくとも１つを用いる前記ソフトウェアプログラムのコールサイトに関連する、
付記１０に記載のプロセッサ。
（付記１２）
前記命令は、
前記ソフトウェアプログラムをプロファイリングし、
前記ソフトウェアプログラムのプロファイリングに基づき前記タイプ情報を決定する
ことを更に含む、付記１０に記載のプロセッサ。
（付記１３）
前記命令は、
前記ソフトウェアプログラムのプロファイリングに基づき該ソフトウェアプログラムの使用頻度の高い関数を決定し、
前記ソフトウェアプログラムにおける前記変数の少なくとも１つについて、該少なくとも１つの変数が前記使用頻度の高い関数において含まれることに基づき前記タイプ情報を決定する
ことを更に含む、付記１２に記載のプロセッサ。
（付記１４）
前記命令は、
前記ソフトウェアプログラムのプロファイリングに基づき該ソフトウェアプログラムの実行の間の変数タイプの使用の頻度を決定し、
前記変数タイプの使用の頻度に基づき前記タイプ情報を決定する
ことを更に含む、付記１２に記載のプロセッサ。
（付記１５）
前記命令は、前記タイプ情報を決定するようランタイム・メソッド・バインディングを実行することを更に含む、
付記１０に記載のプロセッサ。
（付記１６）
前記命令は、前記ソフトウェアプログラムのデータ構造において前記変数についての前記タイプ情報を格納するようインライン・キャッシングを実行することを更に含み、前記データ構造の夫々は、前記変数の少なくとも１つを用いる前記ソフトウェアプログラムのコールサイトに関連する、
付記１０に記載のプロセッサ。
（付記１７）
前記命令は、前記ソフトウェアプログラムを実行するよう該ソフトウェアプログラムの記号的実行を実行することを更に含む、
付記１０に記載のプロセッサ。
（付記１８）
前記命令は、前記ソフトウェアプログラムを実行するよう該ソフトウェアプログラムへテストスイートを適用することを更に含む、
付記１０に記載のプロセッサ。
【符号の説明】
【００５３】
１００          システム
１０２，２０２  動的型付きソフトウェアプログラム
２０４，１０４  タイプ情報モジュール
１０６，２０６  修正された動的型付きソフトウェアプログラム
２０８          テストスイート
２１０          実行モジュール
２１２          プロファイリングモジュール
２１４          インライン・キャッシングモジュール
２１６          修正ソフトウェアモジュール
２１８          配信モジュール
【図１】
2014186728.tif 000003
【図２】
2014186728.tif 000004
【図３】
2014186728.tif 000005
【外国語明細書】
2014186728000001.pdf