(57)【特許請求の範囲】
【請求項１】
動的スクリプト言語で書かれたスクリプトを処理する方法であって、
前記スクリプトを事前にパースして、実行前に前記スクリプト内の高レベルプログラム構造を識別するステップと、
前記識別された高レベル構造を特徴付けるメタデータを生成するステップと、
ランタイム情報およびメタデータを使用して、実行する必要のある前記スクリプトの部分を判断するステップと、
前記生成されたメタデータを使用して前記スクリプトの前記部分を完全にパースして、バイトコードを生成するステップと、
前記スクリプトを実行するステップと
を含む、方法。
【請求項２】
前記スクリプトが、解釈によって実行される、請求項1に記載の方法。
【請求項３】
前記スクリプトを事前にパースするステップが、前記スクリプトの前記部分を完全にパースする際に使用される文法よりも単純である前記文法を使用して行われる、請求項1に記載の方法。
【請求項４】
前記生成されたメタデータをキャッシュするステップをさらに含む、請求項1に記載の方法。
【請求項５】
前記生成されたバイトコードをキャッシュするステップをさらに含む、請求項1に記載の方法。
【請求項６】
前記生成されたメタデータをキャッシュするステップと、
前記スクリプトがキャッシュされているかどうかを判断するステップと
をさらに含み、
前記スクリプトがあらかじめキャッシュされていないと判断されるとき、前記スクリプトを事前にパースするステップが行われる、
請求項1に記載の方法。
【請求項７】
前記生成されたバイトコードをキャッシュするステップと、
前記スクリプトが完全にパースされているかどうかを判断するステップと、
をさらに含み、
前記スクリプトの前記部分を完全にパースするステップは、前記スクリプトがあらかじめ完全にパースされていないと判断されるとき行われる、
請求項1に記載の方法。
【請求項８】
前記スクリプトを事前にパースするステップが、並列処理操作で行われる、請求項1に記載の方法。
【請求項９】
前記スクリプトを実行するステップが、
前記生成されたバイトコードから実行可能コードを生成するステップと、
前記生成された実行可能コードを実行するステップと
を含む、請求項1に記載の方法。
【請求項１０】
前記生成された実行可能コードをキャッシュするステップをさらに含む、請求項9に記載の方法。
【請求項１１】
前記生成された実行可能コードをキャッシュするステップと、
前記スクリプトの実行可能コードがキャッシュされているかどうかを判断するステップと
をさらに含み、
前記スクリプトの実行可能コードが、あらかじめキャッシュされていないと判断されるとき、生成された実行可能コードが行われる、
請求項9に記載の方法。
【請求項１２】
プロセッサと、
前記プロセッサに結合されたメモリと
を含み、
前記プロセッサが、
動的スクリプト言語で書かれたスクリプトを事前にパースして、前記スクリプト内の高レベルプログラム構造を識別するステップと、
前記識別された高レベル構造を特徴付けるメタデータを生成するステップと、
ランタイム情報およびメタデータを使用して、実行する必要のある前記スクリプトの部分を判断するステップと、
前記生成されたメタデータを使用して前記スクリプトの前記部分を完全にパースして、バイトコードを生成するステップと、
前記スクリプトを実行するステップと
を含む操作を行うためのプロセッサ実行可能命令を備えて構成される、コンピューティングデバイス。
【請求項１３】
前記スクリプトが解釈を介して実行されるように、前記プロセッサがプロセッサ実行可能命令を備えて構成される、請求項12に記載のコンピューティングデバイス。
【請求項１４】
前記プロセッサが、プロセッサ実行可能命令を備えて構成され、前記スクリプトを事前にパースするステップが、前記スクリプトの前記部分を完全にパースする際に使用される文法よりも単純である前記文法を使用して行われるようにする、請求項12に記載のコンピューティングデバイス。
【請求項１５】
前記プロセッサが、前記生成されたメタデータをキャッシュするステップをさらに含む操作を行うためのプロセッサ実行可能命令を備えて構成される、請求項12に記載のコンピューティングデバイス。
【請求項１６】
前記プロセッサが、前記生成されたバイトコードをキャッシュするステップをさらに含む操作を行うためのプロセッサ実行可能命令を備えて構成される、請求項12に記載のコンピューティングデバイス。
【請求項１７】
前記プロセッサが、
前記生成されたメタデータをキャッシュするステップと、
前記スクリプトがキャッシュされているかどうかを判断するステップと、
をさらに含む操作を行うためのプロセッサ実行可能命令を備えて構成され、
前記スクリプトを事前にパースするステップは、前記スクリプトがあらかじめキャッシュされていないと判断されるとき行われる、
請求項12に記載のコンピューティングデバイス。
【請求項１８】
前記プロセッサが、
をさらに含む操作を行うためのプロセッサ実行可能命令を備えて構成され、
前記スクリプトの前記部分を完全にパースするステップは、前記スクリプトがあらかじめ完全にパースされていないと判断されるとき行われる、
請求項12に記載のコンピューティングデバイス。
【請求項１９】
前記スクリプトを前記事前にパースするステップが並列処理操作で実行されるように、前記プロセッサがプロセッサ実行可能命令を備えて構成される、請求項12に記載のコンピューティングデバイス。
【請求項２０】
前記スクリプトを実行するステップが、
前記生成されたバイトコードから実行可能コードを生成するステップと、
前記生成された実行可能コードを実行するステップと
を含むように、前記プロセッサがプロセッサ実行可能命令を備えて構成される、請求項12に記載のコンピューティングデバイス。
【請求項２１】
前記プロセッサが、前記生成された実行可能コードをキャッシュするステップをさらに含む操作を行うためのプロセッサ実行可能命令を備えて構成される、請求項20に記載のコンピューティングデバイス。
【請求項２２】
前記プロセッサが、
前記生成された実行可能コードをキャッシュするステップと、
前記スクリプトの実行可能コードがキャッシュされているかどうかを判断するステップと
をさらに含む操作を行うためのプロセッサ実行可能命令を備えて構成され、
実行可能コードを生成するステップは、前記スクリプトの実行可能コードがあらかじめキャッシュされていないと判断されるとき行われる、
請求項20に記載のコンピューティングデバイス。
【請求項２３】
動的スクリプト言語で書かれたスクリプトを事前にパースして、実行前に前記スクリプト内の高レベルプログラム構造を識別するための手段と、
前記識別された高レベル構造を特徴付けるメタデータを生成するための手段と、
ランタイム情報およびメタデータを使用して、実行する必要のある前記スクリプトの部分を判断するための手段と、
前記生成されたメタデータを使用して前記スクリプトの前記部分を完全にパースして、バイトコードを生成するための手段と、
前記スクリプトを実行するための手段と
を含む、コンピューティングデバイス。
【請求項２４】
前記スクリプトを実行するための手段が、解釈によって前記スクリプトを実行するための手段を含む、請求項23に記載のコンピューティングデバイス。
【請求項２５】
前記スクリプトを事前にパースするための手段が、前記スクリプトの前記部分を完全にパースする際に使用される文法よりも単純である前記文法を使用して前記スクリプトを事前にパースするための手段を含む、請求項23に記載のコンピューティングデバイス。
【請求項２６】
前記生成されたメタデータをキャッシュするための手段をさらに含む、請求項23に記載のコンピューティングデバイス。
【請求項２７】
前記生成されたバイトコードをキャッシュするための手段をさらに含む、請求項23に記載のコンピューティングデバイス。
【請求項２８】
前記生成されたメタデータをキャッシュするための手段と、
前記スクリプトがキャッシュされているかどうかを判断するための手段と
をさらに含み、
ランタイム情報およびメタデータを使用して実行する必要がある前記スクリプトの部分を判断するための手段が、前記スクリプトがあらかじめキャッシュされていないと判断されるとき、ランタイム情報およびメタデータを使用して実行する必要がある前記スクリプトの部分を判断するための手段を含む、
請求項23に記載のコンピューティングデバイス。
【請求項２９】
前記生成されたバイトコードをキャッシュするための手段と、
前記スクリプトが完全にパースされているかどうかを判断するための手段と
をさらに含み、
前記スクリプトの前記部分を完全にパースするための手段が、前記スクリプトがあらかじめ完全にパースされていないと判断されるときバイトコードを生成するために、前記生成されたメタデータを使用して前記スクリプトの前記部分を完全にパースするための手段を含む、
請求項23に記載のコンピューティングデバイス。
【請求項３０】
延期スクリプトを事前にパースするための手段が、並列処理操作で前記スクリプトを事前にパースするための手段を含む,請求項23に記載のコンピューティングデバイス。
【請求項３１】
前記スクリプトを実行するための手段が、
前記生成されたバイトコードから実行可能コードを生成するための手段と
前記生成された実行可能コードを実行するための手段と
を含む、請求項23に記載のコンピューティングデバイス。
【請求項３２】
前記生成された実行可能コードをキャッシュするための手段をさらに含む、請求項31に記載のコンピューティングデバイス。
【請求項３３】
前記生成された実行可能コードをキャッシュするための手段と、
前記スクリプトの実行可能コードがキャッシュされているかどうかを判断するための手段と
をさらに含み、
前記生成されたバイトコードから実行可能コードを生成するための手段が、前記スクリプトの実行可能コードがあらかじめキャッシュされていないと判断されるとき、前記生成されたバイトコードから実行可能コードを生成するための手段を含む、
請求項31に記載のコンピューティングデバイス。
【請求項３４】
動的スクリプト言語で書かれたスクリプトを事前にパースして、実行前に前記スクリプト内の高レベルプログラム構造を識別するための少なくとも1つの命令と、
前記識別された高レベル構造を特徴付けるメタデータを生成するための少なくとも1つの命令と、
ランタイム情報およびメタデータを使用して、実行する必要のある前記スクリプトの部分を判断するための少なくとも1つの命令と、
前記生成されたメタデータを使用して前記スクリプトの前記部分を完全にパースして、バイトコードを生成するための少なくとも1つの命令と、
前記スクリプトを実行するための少なくとも1つの命令と
を含むプロセッサで実行可能な命令を格納した、非一時的プロセッサ可読記憶媒体。
【請求項３５】
前記スクリプトを実行するための前記少なくとも1つの命令が、解釈によって前記スクリプトを実行するための少なくとも1つの命令を含む、請求項34に記載の非一時的プロセッサ可読記憶媒体。
【請求項３６】
前記スクリプトを事前にパースするための前記少なくとも1つの命令が、前記スクリプトの前記部分を完全にパースする際に使用される文法よりも単純である前記文法を使用して前記スクリプトを事前にパースするための少なくとも1つの命令を含む、請求項34に記載の非一時的プロセッサ可読記憶媒体。
【請求項３７】
前記格納されたプロセッサで実行可能な命令がさらに、前記生成されたメタデータをキャッシュするための少なくとも1つの命令をさらに含む、請求項34に記載の非一時的プロセッサ可読記憶媒体。
【請求項３８】
前記格納されたプロセッサで実行可能な命令がさらに、前記生成されたバイトコードをキャッシュするための少なくとも1つの命令をさらに含む、請求項34に記載の非一時的プロセッサ可読記憶媒体。
【請求項３９】
前記格納されたプロセッサで実行可能な命令がさらに、
前記生成されたメタデータをキャッシュするための少なくとも1つの命令と、
前記スクリプトがキャッシュされているかどうかを判断するための少なくとも1つの命令と
を含み、
前記スクリプトがあらかじめキャッシュされていないと判断されるとき、前記スクリプトを事前パースするステップが行われる、
請求項34に記載の非一時的プロセッサ可読記憶媒体。
【請求項４０】
前記格納されたプロセッサで実行可能な命令がさらに、
前記生成されたバイトコードをキャッシュするための少なくとも1つの命令と、
前記スクリプトが完全にパースされているかどうかを判断するための少なくとも1つの命令と
を含み、
前記スクリプトがあらかじめ完全にパースされていないと判断されるとき、前記スクリプトの前記部分を完全にパースするステップが行われる、
請求項34に記載の非一時的プロセッサ可読記憶媒体。
【請求項４１】
前記スクリプトを事前にパースするための前記少なくとも1つの命令が、並列処理操作で前記スクリプトを事前にパースするための少なくとも1つの命令を含む、請求項34に記載の非一時的プロセッサ可読記憶媒体。
【請求項４２】
前記スクリプトを実行するための前記少なくとも1つの命令が、
前記生成されたバイトコードから実行可能コードを生成するための少なくとも1つの命令と、
前記生成された実行可能コードを実行するための少なくとも1つの命令と
を含む、請求項34に記載の非一時的プロセッサ可読記憶媒体。
【請求項４３】
前記格納されたプロセッサで実行可能な命令がさらに、前記生成された実行可能コードをキャッシュするための少なくとも1つの命令をさらに含む、請求項36に記載の非一時的プロセッサ可読記憶媒体。
【請求項４４】
前記格納されたプロセッサで実行可能な命令がさらに、
前記生成された実行可能コードをキャッシュするための少なくとも1つの命令と、
前記スクリプトの実行可能コードがキャッシュされているかどうかを判断するための少なくとも1つの命令と
を含み、
前記スクリプトの実行可能コードがあらかじめキャッシュされていないと判断されるとき実行可能コードを生成するステップが行われる、
請求項36に記載の非一時的プロセッサ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本出願は、参照によりその内容全体が組み込まれている、2010年1月12日に出願された、「Execution of Dynamic Languages via Metadata Extraction」という名称の、米国仮特許出願第61/294,478号に基づく優先権の利益を主張する。
【０００２】
本出願は、概してコンピューティングデバイスに関し、より詳細にはコンピューティングデバイス上で動的言語を実行するための方法に関する。
【背景技術】
【０００３】
コンピュータプログラミングおよびソフトウェア開発においては、現在、動的スクリプト言語が好ましい開発プラットフォームである。詳細には、クライアント側におけるウェブページおよびウェブアプリケーションについてはJavaScript(登録商標)が主要な開発言語であり、サーバ側におけるソフトウェア開発についてはPythonおよびRubyが非常に一般的である。このようなプログラミング言語は、対話型実行(スクリプト記述)のために設計されており、したがって当然、動的である(すなわち、動的な型、反省(reflection)および内省(introspection)、ならびに拡張性をサポートする)。動的なスクリプト言語は一般に解釈によって実行され、スクリプトは実行時にパース（parse）され、分析された後に実行される。
【０００４】
最近では、JavaScript（登録商標）など、いくつかのこうした言語に、ジャストインタイムのコンパイルが導入されて、動的言語の性能の問題に対処している。しかしながら、性能の問題はまだ残っている。これは、詳細には、モバイルデバイスのような制約のあるコンピューティング環境の場合であり、この場合既存の動的言語の性能および電力効率は引き続き問題である。
【発明の概要】
【課題を解決するための手段】
【０００５】
動的言語で書かれたスクリプトを実行するための装置、システム、および方法についての様々な態様を提示する。1つの態様ではスクリプトは、事前にパースされて、スクリプト内の高レベルプログラム構造を識別し、識別された高レベル構造を特徴付けるメタデータを生成する。このようなメタデータは、ランタイム情報と共に使用して、実行する必要がある可能性があるスクリプトの部分を判断する。1つの態様では、実行する必要がある部分は、完全にパースして、生成されたメタデータと共に使用してバイトコードを生成することができる。様々な態様で、事前にパースされたスクリプトを実行することができる。1つの態様ではスクリプトの実行は、解釈によるものとすることができる。別の態様では、スクリプトを実行することは、生成されたバイトコードから実行可能コードを生成することと、生成した実行可能コードを実行することとを含むことができる。
【０００６】
1つの態様では、生成されたメタデータ、生成されたバイトコード、および/または生成された実行可能コードは、キャッシュに格納することができる。一態様では、スクリプトは、実行する必要がある部分を完全にパースするために使用される文法よりも単純である文法を使用して事前にパースすることができる。一態様では、スクリプトがあらかじめキャッシュされていないと判断されるときにのみ、スクリプトを事前にパースすることができる。1つの態様では、スクリプトがあらかじめキャッシュされていないと判断されるときにのみ、スクリプトを完全にパースすることができる。別の態様では、スクリプトの実行可能コードがあらかじめキャッシュされていないと判断されるときにのみ、実行可能コードを生成することができる。
【０００７】
別の態様では、事前にパースすることは、並列処理操作で行うことができる。一態様では、個々のスレッドおよび/またはプロセスを使用して、事前パース、メタデータの生成、コードの生成、プログラムの実行、および/またはキャッシュ操作を実行することができる。一態様では、最適化されたスレッドおよび/または処理を使用して、将来実行する必要がある可能性があるスクリプトをプリフェッチ(pre-fetch)および分析することができる。一態様では、最適化されたスレッドまたは処理は、プリフェッチ操作に投機的な(speculative)アルゴリズムを使用することができ、それによって現在の実行に関する情報を使用して、将来の実行パスを予想し、コードのセクションが将来実行される可能性があることを予測する。
【０００８】
一態様は、スクリプトを事前にパースして実行前にスクリプト内の高レベルプログラム構造を識別することを含む、動的スクリプト言語で書かれたスクリプトを実行し、識別された高レベル構造を特徴付けるメタデータを生成し、ランタイム情報およびメタデータを使用して実行する必要のあるスクリプトの部分を判断し、生成したメタデータを使用してスクリプトのこの部分を完全にパースしてバイトコードを生成し、スクリプトを実行するための方法を提供する。このような方法では、スクリプトを事前にパースすることは、スクリプトのこの部分を完全にパースする際に使用される文法よりも単純である文法を使用して行うことができる。一態様では、スクリプトは解釈によって実行することができる。別の態様では、スクリプトを実行することは、生成されたバイトコードから実行可能コードを生成することと、生成された実行可能コードを実行することとを含むことができる。一態様では、この方法はさらに、生成されたメタデータをキャッシュすること、生成されたバイトコードをキャッシュすること、および/または生成された実行可能コードをキャッシュすることを含むことができる。この態様はさらに、スクリプトがキャッシュされているかどうかを判断し、スクリプトがあらかじめキャッシュされていないと判断されるときスクリプトを事前にパースすること、スクリプトが完全にパースされているかどうかを判断し、スクリプトがあらかじめ完全にパースされていないと判断されるときスクリプトの部分をパースすること、および/またはスクリプト用の実行可能コードがキャッシュされているかどうかを判断し、スクリプト用の実行可能コードがあらかじめキャッシュされていないと判断されるとき実行可能コードを生成することを含むことができる。一態様ではスクリプトを事前にパースする方法の操作は、並列処理操作で行うことができる。
【０００９】
さらなる態様は、プロセッサと、プロセッサに結合されたメモリとを含むコンピューティングデバイスを含み、この中でプロセッサは、プロセッサ実行可能命令を用いて、スクリプトを事前にパースして実行前にスクリプト内の高レベルプログラム構造を識別することと、識別された高レベル構造を特徴付けるメタデータを生成することと、ランタイム情報およびメタデータを使用して実行する必要のあるスクリプトの部分を判断することと、生成されたメタデータを使用してこのスクリプトの部分を完全にパースしてバイトコードを生成することと、スクリプトを実行することとを含む操作を行うように構成される。一態様ではプロセッサは、プロセッサ実行可能命令を用いて、スクリプトが解釈によって実行されるように構成することができる。別の態様ではプロセッサは、スクリプトを実行することが、生成されたバイトコードから実行可能コードを生成することと、生成された実行可能コードを実行することとを含むように、プロセッサ実行可能命令を用いて構成することができる。さらなる態様では、コンピューティングデバイスのメモリおよびプロセッサはさらに、生成されたメタデータ、生成されたバイトコード、および/または生成された実行可能コードをキャッシュするように構成することができる。さらなる態様では、プロセッサはさらに、スクリプトがキャッシュされているかどうかを判断する、スクリプトがあらかじめキャッシュされていないと判断されるとき、ランタイム情報およびメタデータを使用して実行する必要があるスクリプトの部分を判断するように構成することができる。さらなる態様では、プロセッサはさらに、スクリプトが完全にパースされているかどうかを判断する、スクリプトがあらかじめ完全にパースされていないと判断されるとき、生成されたメタデータを使用してスクリプトの部分を完全にパースしてバイトコードを生成するように構成することができる。さらなる態様では、プロセッサはさらに、スクリプトの実行可能コードがキャッシュされているかどうかを判断し、スクリプトの実行可能コードがあらかじめキャッシュされていないと判断されるとき、生成されたバイトコードから実行可能コードを生成するように構成される。一態様ではプロセッサは、並列処理操作でスクリプトの事前パースを行うように構成することができる。
【００１０】
さらなる態様は、スクリプトを事前にパースして実行前にスクリプト内の高レベルプログラム構造を識別するための手段と、識別された高レベル構造を特徴付けるメタデータを生成するための手段と、ランタイム情報およびメタデータを使用して実行する必要のあるスクリプトの部分を判断するための手段と、生成したメタデータを使用してスクリプトのこの部分を完全にパースしてバイトコードを生成するための手段と、スクリプトを実行するための手段とを含むコンピューティングデバイスを含む。さらなる態様では、コンピューティングデバイスは、解釈によってスクリプトを実行するための手段を含むことができる。別の態様では、スクリプトを実行するための手段は、生成されたバイトコードから実行可能コードを生成するための手段と、生成された実行可能コードを実行するための手段とを含むことができる。さらなる態様では、コンピューティングデバイスは、生成されたメタデータをキャッシュするための手段、生成されたバイトコードをキャッシュするための手段、および/または生成された実行可能コードをキャッシュするための手段を含むことができる。さらなる態様では、コンピューティングデバイスは、スクリプトがキャッシュされているかどうかを判断するための手段をさらに含むことができ、ランタイム情報およびメタデータを使用して実行する必要のあるスクリプトの部分を判断するための手段は、スクリプトがあらかじめキャッシュされていないと判断されるとき、ランタイム情報およびメタデータを使用して実行する必要のあるスクリプトの部分を判断するための手段を含む。さらなる態様では、コンピューティングデバイスは、さらにスクリプトが完全にパースされているかどうかを判断するための手段を含むことができ、生成されたメタデータを使用してスクリプトの部分を完全にパースしてバイトコードを生成するための手段は、スクリプトがあらかじめ完全にパースされていないと判断されるとき、生成されたメタデータを使用してスクリプトの部分を完全にパースしてバイトコードを生成するための手段を含む。さらなる態様では、コンピューティングデバイス波佐羅に、スクリプト用の実行可能コードがキャッシュされているかどうかを判断するための手段を含むことができ、生成されたバイトコードから実行可能コードを生成するための手段は、スクリプトの実行可能コードがあらかじめキャッシュされていないと判断されるとき、生成されたバイトコードから実行可能コードを生成するための手段を含む。一態様では、スクリプトを事前にパースするための手段は、並列処理操作でスクリプトを事前にパースするための手段を含むことができる。
【００１１】
さらなる態様は、スクリプトを事前にパースして実行前にスクリプト内の高レベルプログラム構造を識別するための少なくとも1つの命令と、識別された高レベル構造を特徴付けるメタデータを生成するための少なくとも1つの命令と、ランタイム情報およびメタデータを使用して実行する必要のあるスクリプトの部分を判断するための少なくとも1つの命令と、生成されたメタデータを使用してスクリプトの部分を完全にパースしてバイトコードを生成するための少なくとも1つの命令と、スクリプトを実行するための少なくとも1つの命令とを含むプロセッサ実行可能な命令を格納した非一時的(non-transitory)プロセッサ読み取り可能記憶媒体を含む。さらなる態様では、非一時的プロセッサ読み取り可能記憶媒体は、解釈を使用してスクリプトを実行するための少なくとも1つの命令を含むことができる。別の態様では、スクリプトを実行するための少なくとも1つの命令は、生成されたバイトコードから実行可能コードを生成するための少なくとも1つの命令と、生成された実行可能コードを実行するための少なくとも1つの命令とを含むことができる。さらなる態様では、格納されたプロセッサ実行可能な命令はさらに、生成されたメタデータをキャッシュするための少なくとも1つの命令、生成されたバイトコードをキャッシュするための少なくとも1つの命令、および/または生成された実行可能コードをキャッシュするための少なくとも1つの命令を含むことができる。この態様はさらに、スクリプトがキャッシュされたかどうかを判断し、スクリプトがあらかじめキャッシュされていないと判断されるときスクリプトを事前にパースするための少なくとも1つの命令、スクリプトが完全にパースされているかどうかを判断し、スクリプトがあらかじめ完全にパースされていないと判断されるときスクリプトの部分をパースするための少なくとも1つの命令、および/またはスクリプト用の実行可能コードがキャッシュされているかどうかを判断し、スクリプト用の実行可能コードがあらかじめキャッシュされていないと判断されるとき実行可能コードを生成するための少なくとも1つの命令を含むことができる。一態様では、格納されたプロセッサ実行可能な命令は、並列処理操作でスクリプトを事前にパースするための少なくとも1つの命令を含むことができる。
【００１２】
本明細書に組み込んで本明細書の一部を構成する添付の図面は、本発明の例示的態様を示しており、上記の概括的な説明及び下記の詳細な説明とともに、本発明の特徴を説明するのに役立つ。
【図面の簡単な説明】
【００１３】
【図１Ａ】動的スクリプト言語のスクリプトを実行するための方法のプロセスフロー図である。
【図１Ｂ】動的スクリプト言語のスクリプトを実行するための別の方法のプロセスフロー図である。
【図２】本発明の一態様を用いて使用するのに適したデータ構造を示す図である。
【図３】動的スクリプト言語のスクリプトを実行するためのさらに別の方法のプロセスフロー図である。
【図４】動的スクリプト言語のスクリプトを実行するための別の方法のプロセスフロー図である。
【図５】様々な態様を用いて使用するのに適したコンピューティングデバイスの構成要素ブロック図である。
【図６】様々な態様を用いて使用するのに適した例示的モバイルデバイスの図である。
【図７】様々な態様を用いて使用するのに適した例示的パーソナルコンピュータの図である。
【発明を実施するための形態】
【００１４】
添付の図面を参照して、様々な態様を詳細に説明する。可能な限り、図面を通して同じまたは同様の部分に対して同じ参照符号を使用する。特定の例および実施を参照するのは例示のためであり、本発明または特許請求の範囲の範囲を限定しようとするものではない。
【００１５】
「コンピューティングデバイス」という用語は、本明細書では概して、サーバ、パーソナルコンピュータ、モバイルデバイス、携帯電話、携帯情報端末(PDA)、パームトップコンピュータ、ワイヤレス電子メール受信器(例えば、Blackberry(登録商標)およびTreo(登録商標)デバイス)、マルチメディアインターネット対応携帯電話(例えばBlackberry Storm(登録商標))、全地球測位システム(GPS)受信機、ワイヤレスゲームコントローラ、パーソナルコンピュータ、およびプログラム可能なプロセッサを搭載する同様のパーソナル電子デバイスのうちのいずれか1つまたは全部を指すように使用される。処理電力が限られている携帯電話のようなモバイルデバイスにおいて様々な態様が有用であるが、一般に諸態様は、スクリプトおよび動的および/またはスクリプト言語で書き込まれたアプリケーションを実行するいかなるコンピューティングデバイスにおいても有用である。
【００１６】
「動的言語」および「スクリプト言語」という用語は、本出願では総称的に、かつ区別なく使用されており、いかなる動的言語、スクリプト言語も、または実行時に解釈されるおよび/またはコンパイルされるプログラムを(ここでは「スクリプト」として)書くために使用されるいかなるインタプリタ型言語も指すことができる。こうした用語は、管理されたランタイム上で動き、動的にコンパイルされるいかなる言語を指すこともできる。したがって、本出願の目的で、「動的言語」および「スクリプト言語」という用語は、ソースコードまたはバイトコードから解釈される言語、または伝統的にネイティブマシンコードにコンパイルされるプログラムとともに実行する言語に限定されるべきではない。本出願の範囲内の動的言語およびスクリプト言語の例には、例えば、JavaScript（登録商標）、Perl、Python、およびRuby、ならびにJava（登録商標）および将来開発される可能性がある他の言語が含まれる。
【００１７】
本明細書に開示する様々な態様は、実行時にパースする、分析する、および実行する必要があるために動的スクリプト言語を悩ませる性能の問題に対処する。様々な態様は、大部分の応用で動的言語が使用され、実行される方法を活かすことによって、性能および電力の問題に対処する。詳細には、様々な態様は、動的言語で書かれたスクリプトが、あらゆる場合にも実行されない大量のコードを含む可能性があるということから、性能の向上をもたらす。
【００１８】
静的コンピュータプログラミング言語では、オフラインコンパイラが、プログラム全体をパースし、中間表現(IR)を生成してプログラム構造を表現する。一般にこのIRは、抽象構文木上に注釈のような追加情報を伝え、これがコード生成時に使用されてプログラムを分析して、実行されることになるプログラムの部分、ならびにこの活動では実行されない部分(すなわち、現在の実行または起動環境ではプログラムの開始から終了までいかなるパスでも到達できないので決して実行されることがないコード)を判断する。参照しやすいように、あらゆるタイプのこのような注釈が、本明細書ではメタデータと呼ばれる。
【００１９】
JavaScript（登録商標）のような動的言語では、実行時、プログラムを実行する直前にパースおよびコンパイルが行われる。パースは、テキストを分析して、所与の形式文法に対してその文法構造を判断するプロセスであり、プログラムを解釈する際のパースは、ソーススクリプトで読み取ること、およびプログラム言語の言語意味論(semantics)に基づいてこれを内部表現に変換することを含む。大部分の動的および/またはスクリプト言語について、パースは、インタープリタ(interpreter)に入力される(fed)プログラムのバイトコード表現を生成する。インタプリタは、バイトコードを実行する。一部の実施では、インタプリタは、ジャストインタイムのコンパイラを呼び出して、コードの選択部分(関数など)について機械コードを生成することもできる。したがって、パースおよびコンパイル処理時間は、全プログラム実行時間の一部になる。
【００２０】
2009年12月付けのマイクロソフトリサーチテクニカルレポート(Microsoft research Technical Report) MSR-TR-2009-173「JSMeter: Characterizing Real-World Behavior of JavaScript Programs」(http://research.microsoft.com/apps/pubs/default.aspx?id=15687)によれば、今日コンピューティングデバイスに実装されるコードの最大70%は、すべての実装で実行されることがない。これは、データ依存の実行(すなわち、コードの中の一定の経路は、一定の入力の状況でのみ実行される)、エラー処理コード(すなわち、例外イベントが発生するときのみ実行されるコード)、および特定の動作環境または実装に基づいて選択されるように設計された複数のアルゴリズムなど、多くの要因による。したがって、コンピューティングデバイスに書き込まれたプログラム全体は、様々なユーザまたは実行環境に対処するための要素を含むことが多く、実際に実行されるコードは、通常特定の実施または呼び出し操作に限定されない。
【００２１】
動的言語では、パースとバイトコード生成は、実行処理の一部として行われる。したがって動的言語では、一般的なスクリプト(すなわち、コンピューティングデバイスの通常の操作で頻繁に使用されるプログラム)のパースおよびバイトコード生成に割り当てられる処理時間の最大70%が、実行される可能性がないコードによって消費される。以下に説明する様々な態様は、スクリプトの未使用部分(すなわち、現在の実行または呼び出し環境では実行されることがないコードの部分)のパースおよびコンパイルを回避することによって、動的スクリプト言語を使用する応用に、性能および電力節約の利点をもたらす。
【００２２】
様々な態様は、パースプロセスを2つの段階に分けることによって、動的言語スクリプトの実行を修正する。第1の段階では、ランタイム実行(runtime execution)前に、プレパーサ(pre-parser)が簡易化された文法を使用してソースコードをパースするアルゴリズムを実行する。第2の段階では、実行時に、フルパーサ(full parser)が言語の形式文法を使用してアルゴリズムを実行し、ソースコードを実行できるように完全にパースする。
【００２３】
より詳細には、第1の段階では、プレパーサは単純な文法を使用してスクリプトからコードの主要な特徴を抽出し、スクリプトの言語の中にある高レベル構造を記述するスクリプトのメタデータを生成する。スクリプトのメタデータは、関数、オブジェクトメソッド、トップレベルコールグラフおよび様々な他の高レベル構造の細部を含むことができる。プレパーサによって生成されたスクリプトのメタデータは、次いでフルパーサによって使用されて、完全な言語構文および意味論を用いて完全にパースされなければならないコードの部分を識別する。この2つの段階のプロセスは、本明細書では動的メタデータ抽出と呼ぶことができる。
【００２４】
動的メタデータ抽出は、実行時に完全なパースを行って費やす処理時間を最小化する。動的メタデータ抽出はまた、伝統的にコードのセクションをコンパイルして費やされる無駄な処理時間およびエネルギーを無くす。これは、伝統的なコンパイラ/インタプリタは一般に、データに依存した実行により決して実行されることのないコード、エラー処理コード、複数のアルゴリズム、およびその他の効率を悪くするものなど、コードのすべてを完全にパースすることを必要とするからである。
【００２５】
様々な態様は、実際にはいかなる動的および/またはスクリプト言語で書かれたスクリプトでも実行することができる。特定の言語のプレパーサを開発するには、開発者は重要な構造特性を識別し、こうした特性を使用して、プログラムスクリプト内でこうした重要な構造特性および断片(pieces)のみを識別する文法を定義することができる。プレパーサがこの文法を使用して、プログラムの一部(subset)にのみ完全なパースを行うことができる。定義された文法および識別された構造特性を使用して、実行されることのないスクリプト要素を識別することができる。したがって、様々な態様を実行するために、言語へのまたは完全パース文法への変更は必要ではない。
【００２６】
プログラミング言語および完全パース文法は変更を必要としないが、以下に説明する態様は、スクリプトの実行処理に変更を含むことがある。実行処理のこうした変更は、システムが事前パース操作において生成されたスクリプトのメタデータを十分に活用できるようにする方法で行うことができる。言い換えれば、スクリプトの実行前に行われる完全なパース操作を変更して、事前パース操作によって生成されたメタデータを利用することができる。例えば、1つの態様では、完全なパース操作は、メタデータにおいて識別されるクラス境界情報を使用して、完全な文法のパース操作のためにコードの簡潔な部分を効率的に抽出することができる。
【００２７】
図1Aは、動的メタデータの抽出を利用してスクリプトを実行するための第1の態様の方法1を示している。ブロック12では、実行可能スクリプトが、ブロック14において事前にパースを行うコンピューティングデバイスのプロセッサにロードされる、またはこれによってアクセスされる。事前にパースするブロック14の間、簡易化された文法が使用されて、プログラムの高レベル構造の詳細を識別し、様々な詳細を識別するキーワードを抽出する。スクリプトは、メタデータの形式で格納されたキーワードに分解することができる。次いでメタデータは、論理的なやり方でまとめて、メタデータブロック16を形成することができる。メタデータは、例えば、クラス名、関数名、クラスまたは関数の位置、クラスまたは関数の長さ、およびプログラム内の言語の境界を識別するその他の構造情報を含むことができる。プロセッサは、ブロック16に示すように、メタデータブロックをメタデータファイルに保存することができる。
【００２８】
ブロック18では、プロセッサはプログラムの主要部分のメタデータを識別することによって、メタデータのエントリポイントを識別する。ブロック18では、プロセッサは、呼び出されたプログラムを実行するためのスクリプトへのエントリポイントを用意する。実行時には、スクリプト中の1つまたは複数のオブジェクトまたは関数が呼び出されることになる。こうした呼出しは、スクリプトの外部(HTMLにJavaScript（登録商標）を組み込んだウェブページ中など)、またはスクリプトの内部(別の関数を呼び出しているスクリプト中の1つの関数など)である場合がある。エントリポイントを用意するブロック18のプロセスにより、メタデータ中のこうしたポイントを識別し、メタデータ情報を使用して完全なパース、コンパイル、実行などを呼び出す(invoke)ランタイム操作が可能になる。実行のためにメタデータによって識別されるスクリプトの部分またはセクションは、ブロック30において完全なパースを行われることが可能であり、動的スクリプト言語の完全な文法および構文がスクリプトに適用される。ブロック21では、スクリプトを実行することができる。コードが実行されている間、プロセッサは実行中のプロセスによって使用される可能性が高いメタデータブロックを使用して関数、方法、および変数を識別し、ブロック24においてcalleeメタデータを生成することができる。1つの態様ではスクリプトは、ブロック21において解釈によって実行される。図1Bを参照して以下に説明する別の態様では、スクリプトの実行は、生成されたバイトコードから実行可能コードを生成することと、生成された実行可能コードを実行することとを含む。
【００２９】
図1Bは、動的メタデータの抽出を利用してスクリプトを実行するための第2の態様の方法100を示している。ブロック12では、実行可能スクリプトが、ブロック14において事前パースを行うコンピューティングデバイスのプロセッサにロードされる、またはこれによってアクセスされる。事前にパースするブロック14の間、簡易化された文法を使用して、プログラムの高レベル構文の詳細を識別し、様々な詳細を識別するキーワードを抽出する。スクリプトは、メタデータの形式で格納されるキーワードに分解することができる。次いでメタデータは、論理的なやり方でまとめて、メタデータブロック16を形成することができる。メタデータは、例えば、クラス、関数名、クラスまたは関数の位置、クラスまたは関数の長さ、およびプログラム内の言語の境界を識別する他の構造情報を含むことができる。プロセッサは、ブロック16に示すように、メタデータブロックをメタデータファイルに保存することができる。一態様では、後の実行中に、メタデータで識別されるクラスまたは関数の定義のみが、完全なパースを必要とする可能性がある。この完全なパースは、識別されたクラス型のオブジェクトが作成されるときにのみ、または識別された機能が呼び出される場合に行われる。
【００３０】
事前パース操作を行い、スクリプトのメタデータを生成するために、様々な異なる手法を使用することができる。例示的手法では、プログラムまたはスクリプトの構造は、メソッドと変数を含むクラスによって形成されると考えることができる。このような構成概念において、トップレベル関数および変数は、エントリポイントとして識別される暗黙のルートクラスに属することができる。このような例示的手法では、事前パースブロック14は、(i)クラス、(ii)関数、および(iii)変数という3つのタイプの構成概念の開始および終了位置を識別することができる。この情報は、図2に示すものと同様のデータ構造で格納することができる。1つの態様では、ブロック14におけるプレパーサの役割は、結局、メタデータテーブルを初期設定する(initialize)ことである。その際に、プレパーサは、メタデータテーブル200におけるクラスの境界を見つけ、各クラスについて、メタデータテーブル202においてそのクラスの関数および変数の定義の境界を見つけることができる。図2に示す例では、メタデータテーブルは、ハッシュテーブルとして実行されて、名前に基づいて情報を迅速に検索することが可能になる。
【００３１】
図1Bに戻ると、ブロック18では、プロセッサはプログラムの主要部分のメタデータを識別することによって、メタデータのエントリポイントを識別する。ブロック18では、プロセッサは、呼び出されたプログラムを実行するためのスクリプトへのエントリポイントを用意する。実行時には、スクリプト中の1つまたは複数のオブジェクトまたは関数が呼び出されることになる。こうした呼出しは、スクリプトの外部(HTMLにJavaScript（登録商標）を組み込んだウェブページの中など)、または内部(別の関数を呼び出し中のスクリプトの中の1つの関数など)である場合がある。エントリポイントを用意するブロック18中のプロセスにより、メタデータの中でこうしたポイントを識別し、メタデータ情報を使用して完全なパース、コンパイル、実行などを呼び出すランタイム操作が可能になる。
【００３２】
実行中、ブロック14においてプレパーサによって集められたメタデータは、使用されると同時に、更新されることが可能である。ブロック18(すなわちエントリポイント)において取得されたランタイム情報、および事前パースのブロック14において生成されたスクリプトのメタデータを使用して、プロセッサは、実行する必要があるスクリプトの部分を十分に判断することができる。これもまた、図1Bに示している。
【００３３】
ブロック20では、プロセッサはループに入り、識別されたメタデータのエントリポイントから始まり、プロセッサは、コードがすでに生成されているかどうか、実行の準備ができているかどうかを判断する。生成されたコードがすでに存在している場合(すなわち、決定のブロック20=「はい」)、ブロック22に示すように、プロセッサは生成されたコードの実行を開始する。コードが実行中である間、プロセッサは、メタデータブロックを使用して、実行中のプロセスによって使用される可能性が高い関数、メソッド、および変数を識別し、ブロック24に示すようにcalleeメタデータの生成を開始する。calleeメタデータは、将来の実行に備えて完全にパースされなければならない機能(features)を識別する。次いでプロセッサは、ブロック20に戻って、calleeメタデータがすでに生成されたコードを指しているかどうかを判断することができ、上述のプロセスが繰り返される。
【００３４】
一態様では、ブロック20に示す決定は、すでにコンパイルされたコードのすべてが依然として有効であることを確認するチェックを含むことができる。別の態様では、ブロック20は、入力パラメータが依然として同じであることを確認するチェックを含むことができる。別の態様では、ブロック20は、実行エラーを回避するためにシステムのコードおよびデータの完全性を確認する他の検査を含むことができる。
【００３５】
メタデータが指すスクリプトまたはコードが、実行可能ではない(すなわち決定のブロック20=「いいえ」)場合、プロセッサは、スクリプトが決定のブロック26においてパースされたかどうかを判断することができる。この判断は、スクリプトのメタデータにある情報を使用することができる。スクリプトがすでにパースされている(すなわち、決定のブロック26=「はい」)場合、プロセッサはコード生成(すなわち、バイトコードの生成)、またはジャストインタイムのコンパイラによるコンパイルへ進み、ブロック28において実行可能なメタデータを生成することができる。実行可能コードは、上述のようにブロック22において実行されることが可能である。
【００３６】
プロセッサがメタデータから、スクリプトがパースされていない(すなわち、決定のブロック26=「いいえ」)と判断する場合、実行のためにメタデータによって識別されるスクリプトの部分またはセクションは、ブロック30において完全なパースを行うことができ、動的スクリプト言語の完全な文法および構文がスクリプトに適用される。上述のように、完全なパースを行うためのプロセスは、事前パースのプロセスのブロック14において生成されたスクリプトのメタデータを利用することができる。スクリプトがブロック30において完全なパースを経ていると、プロセッサはコード生成(すなわち、バイトコードの生成)、またはジャストインタイムのコンパイラによるコンパイルへ進み、ブロック28において実行可能コードを生成することができる。次いで実行可能コードは、メタデータテーブル(または、実行可能コードを指すように更新されたメタデータ)においてリンクされ、上述のようにブロック22で実行される。
【００３７】
一態様では、マルチコアプロセッサおよび/またはマルチプロセッサシステムの完全な機能を活用するために、複数のスレッドおよび/またはプロセスを同時に使用することができる。例えば、ブロック26では、スクリプトがまだパースされていないと判断される場合、個々のプロセスを作成して、コードセグメント上で完全なパースを実行することができる。これによりシステムは、完全なパースが完了するのを待つことなく残りのスクリプトを処理し続けることができる。完全なパーサの逐次的な(serial)性質のため、複数のプロセスをこのように使用することは、以前は可能ではなかった。さらに、スクリプトを完全にパースするために必要とされる複雑な構文は、グローバルリソースへのアクセスを必要とし、マルチプロセスの実行を費用がかかり、困難なものにした。しかしながら、スクリプトを事前にパースするのに簡易化された構文を使用することによって、現在コードははるかに容易に並列化され、その結果、同時に実行されることが可能である。
【００３８】
方法100を要約するには、実行フェーズ中に、あるクラスタイプのオブジェクトが初めてインスタンス化される(すなわち、決定のブロック20および26=「いいえ」)とき、フルパーサは、ブロック30において完全な文法を使用して変数宣言を分析し、変数情報ならびに関数スタブを含むクラスタイプオブジェクトを作成することができる。後の実行中に、インスタンス化されたオブジェクトの方法が呼び出されるように、フルパーサは、(Classメタデータのハッシュテーブル200で捕捉された)こうした関数の本体(body)を分析し、ブロック28においてその関数の実行可能コード(解釈、ジャストインタイムコンパイルなど)を生成する。各ブロックでは、生成された型および実行可能な情報を、後に再利用するためにもとのメタデータ情報にリンクすることができる。処理済みクラスタイプ(すなわち、決定のブロック26=「はい」)のその後のオブジェクトのインスタンス化では、パースを全く飛び越えて進むことができ、タイプオブジェクトを使用して実行可能コードを生成することができる。同様に、処理済み関数(すなわち、決定のブロック20=「はい」)へのその後の呼出しでは、パースを飛び越えて進み、ブロック22において格納された実行可能情報を実行することができる。
【００３９】
JavaScript（登録商標）などの一部の言語では、関数がクラスおよびそのコンストラクタを表わすことができる。このような場合では、実行中にメタデータ情報は、クラスならびにその関数および変数情報を追加することによって更新することができる。このデータを構築するには、プログラムソースを完全にパースする必要がある。しかしながら、様々な態様において、完全なパースは、コードが実際に実行されるときにのみ行われることが可能であり、したがって、すべての場合において完全なパースを行う現在の処理方法の態様よりもすぐれ、この諸態様により追加されるエネルギーまたは性能のオーバヘッドはほとんどない。
【００４０】
メタデータテーブルのルックアップ速度を上げるために、プログラムのハッシュテーブル200中の名前を完全に修飾することができる。言い換えれば、言語がネストされたクラスまたは名前空間に対応する場合、外部クラス/名前空間名を接頭辞として内部クラス名に追加する。
【００４１】
プレパーサの簡易化された文法によれば、事前パースの文法によって完全に認識することができない場合が存在する可能性がある。こうした場合を、クラスメタデータのハッシュテーブルに「変数」または「未知数」の新しいカテゴリとして追加することができる。完全なパースの間、完全な言語文法を使用してこの情報を分析することができ、それに応じてメタデータ情報が更新される。
【００４２】
図1A、1B、および2を参照して上述した態様に基づいて構築することができるいくつかの代替的態様が考えられる。図3に示す1つの態様の方法300では、事前パースプロセスのブロック14で生成されたスクリプトのメタデータは、キャッシュメモリ54に格納することができ、同じスクリプトプログラムの次の実行ではパースを回避できるようにする。この代替的方法300では、あるスクリプトがプロセッサによってアクセスされるとき(例えば、HTTPメッセージで受信されるHTMLページの一部)、プロセッサは決定のブロック52において、このスクリプトがあらかじめメモリにキャッシュされたかどうかを判断する。スクリプトがあらかじめキャッシュされたかどうかを判断するために、プロセッサはキャッシュ54にアクセスして、スクリプトのメタデータがあらかじめメモリに格納されたかどうかを判断することができる。このスクリプトがあらかじめキャッシュされていない(すなわち、決定のブロック52=「いいえ」)場合、プロセッサは、図1Bを参照して上述したように、ブロック14において事前パースのプロセスを行ってスクリプトのメタデータ16を生成することができる。生成されたスクリプトのメタデータ16は、ブロック14の一部としてキャッシュメモリ54に格納される。プロセッサが、スクリプトはすでにパースされ、キャッシュされている(すなわち、決定のブロック52=「はい」)と判断する場合、プロセッサはブロック18において、キャッシュされたスクリプトのメタデータ16を使用してエントリポイントのメタデータを用意することができる。
【００４３】
キャッシュされたスクリプトのメタデータ54は、決定のブロック20において、スクリプトが実行可能コード(すなわち依然として実行可能であるコード)に変換されたかどうかを判断する、ならびに、決定のブロック26においてスクリプトがすでにパースされたかどうかを判断するために、プロセッサがキャッシュ54に照会してメタデータを取得する、またはバイトコードもしくは実行可能コードがキャッシュに格納されているという表示を受け取ることによって使用されることが可能である。
【００４４】
スクリプトのメタデータのキャッシュ54は、ブロック30における完全なパース操作の結果、ならびにブロック28において生成された実行可能コードを格納することもできる。このように、メタデータのキャッシュ54を使用すると、プロセッサは完全なパースの結果または実行可能コードを保持して、将来特定のスクリプトに遭遇したとき、キャッシュされた実行可能コードを使用して、通常のジャストインタイム分析およびコンパイルを行うことなくこれを直接実行することができる。3つの代替的態様では、メタデータのキャッシュ54は、事前パースのブロック14によって生成されたメタデータのみを格納する、メタデータおよびブロック30で生成された完全なパースの出力を含むバイトコードを格納する、あるいは、メタデータ、完全なパースの出力、およびコンパイルの出力を含む、ブロック28で生成された実行可能コードを格納することができる。バイナリメタデータをキャッシュすることは、スクリプトのテキスト自体をキャッシュするよりも効率的である。したがって、上述のプロセスは、キャッシュのリソースをより有効に使う。
【００４５】
さらなる態様では、スクリプトのメタデータのキャッシュ54は、1つまたは複数のアプリケーションによって再利用するためにクライアントマシン上で、いくつかのクライアントコンピュータによってアクセスできるプロキシサーバ上で、または、すべてのクライアントコンピュータによってアクセスできるメインサーバ上で、保持されることが可能である。
【００４６】
メタデータのキャッシュ54を保持すると、ブロック56に示すように、オフラインまたはアイドル状態のプロセッサにおいて最適化された低優先度のプロセスによって完全なパース操作30を実行することができる別の態様が可能になる。最適化された低優先度のプロセスによって行われるパースは、生成されたバイトコードをキャッシュ54に格納して、実行時よりも前にブロック30の完全なパースプロセスの一部または全部を行うことによって、コンピューティングデバイスはプロセッサの能力を十分に活用できるようになる。別の態様では、複数のスレッドおよび/またはプロセスは、メインスレッドおよび/またはプロセスが現在の実行可能コードを生成しながら、またはあらかじめパースし、コンパイルしたコードを実行しながら、バックグラウンドで完全なパースステップを行うことができる。
【００４７】
さらなる態様では、スクリプトのこの事前処理は、ブロック56においてコンパイルスレッドを含むことができ、これらもまた実行時に使用するためにキャッシュ54に格納されて、ブロック28で必要とされるコード生成またはコンパイルの量を最小化する。この態様では、低優先度のオフラインスレッドが、プログラムを通してコールグラフを処理し、テキストをパースすること、および近い将来に実行される可能性が最も高いプログラムの部分の実行可能コードを生成することによってコードを事前コンパイルすることができる。このプロセスは、プログラムスコープが限られている場合などでは、バックグラウンドで行うことができる。そうすることで、実行時に行わなければならないコンパイルの量を最小化することにより、スクリプトの実行を加速させることができる。
【００４８】
別の態様では、図4に示す方法400は、パース操作に専用の個々の最適化されたスレッドおよび/またはプロセスを含むことができる。方法400は、図1を参照して上述した操作と同じ操作にブロック60を追加して、最適化されたパースまたはブロック28のコード生成と関連するスレッド生成プロセスを含む操作を含む。ブロック60におけるこれらの最適化されたパーススレッド/プロセスは、将来実行する必要がある可能性のあるスクリプトをプリフェッチし、分析することができる。ブロック60における最適化されたスレッド/プロセスは、プリフェッチ操作に決定論的または投機的アルゴリズムを使用することができ、それによって現在の実行に関する情報を使用して将来の実行パスを予想し、将来に必要とされる可能性が高いコードのセクションを予測する。こうしたアルゴリズムは、実行時にメインプロセスと同時に実行されることが可能である。こうしたアルゴリズムを使用して、現在の実行から集められた情報に基づいて将来の実行パスを判断することができる。こうしたアルゴリズムは、実行速度および電力効率を最大にするような方法で実装されることが可能である。
【００４９】
1つの態様では、以前の実行および/または以前の実行期間を分析して将来の実行パスを予測する発見的方法に基づいて、ステップ60において投機的アルゴリズムを使用することができる。このような投機的アルゴリズム「meet-predict」ロジックを使用して、信頼区間を生成することができ、この信頼区間を使用して、将来の実行に必要とされる可能性が高いスクリプトを識別することができる。別の態様では、ブロック60において決定論的アルゴリズムを使用して、現在の実行の実行状態および実行要件に基づいてスクリプトをプリフェッチすることができる。例えば、現在の実行が関数Xを実行しており、メタデータが、関数YおよびZへの要求呼び出し(requiring calls)として関数Xを識別する場合、最適化されたスレッドが関数YおよびZをプレフェッチし、主要なすスレッドが関数Xを実行しながらこれらをパースすることができる。別の態様では、ブロック60において投機的アルゴリズムと決定論的アルゴリズムの組合せを使用することができる。
【００５０】
様々な態様は、並列プロセッサのコンピューティングデバイス上など、並列で実行されるのにより適している可能性がある、事前パースのプロセスで使用される単純なメタデータ文法を提供する。事前パース操作は、スクリプトプログラムの主要な構造構成要素のみを識別するので、スクリプトの処理は、2つ以上のプロセッサに割り当て、平行して実行することができる。さらに、並列処理の複雑さおよび難しさは、言語の文法の複雑さによって決まるので、簡易化された構文を使用して、コードの並列処理を非常に容易にする。したがって、この態様は、詳細にはマルチコアプロセッサおよび/またはマルチプロセッサコンピュータアーキテクチャで使用するのに良く適している可能性がある。さらに、事前パース処理の出力は、マルチコアプロセッサがプログラムの一部を平行して実行できるようにするメタデータを生み出すことができる。実行時よりも前に事前パースにおいて主要な構造構成要素を識別することによって、実行可能コードの生成は、平行して実行することができる部分が個々に生成されて、並列プロセッサに割り当てられるような方法で達成することができる。
【００５１】
様々な態様は、動的言語を実行するための現在の方法を超えるいくつかの技術的利点を提供する。こうした利点は、より単純な文法を使用して全スクリプトをより早くパースすることと、プログラム全体の実行に必要とされる処理が削減され、したがって性能がより良くなり、エネルギー消費量が少なくなることと、最適化および並列化するためにより単純なパース文法であることと、平行して実行されるパースおよび実行プロセスが、コールグラフのパーサスレッドを使用することとを含む。
【００５２】
諸態様は、マルチ機能の携帯電話のようなモバイルコンピューティングデバイス、およびパーソナルコンピュータなど、様々なコンピューティングデバイスのいずれかに実装することができる。諸態様は、事前パースのスクリプトによって可能になる性能の節約(performance savings)から恩恵を受けることができる、比較的限られた処理能力を有するコンピューティングデバイスにおいて特に有益である可能性がある。
【００５３】
このようなコンピューティングデバイス500の例示的な、限定されない態様の構成要素およびモジュール例を図5に示している。コンピューティングデバイス500は、電子構成要素の回路基板580を含むことができ、電子構成要素の一部または全部は、オンチップシステムに組み込むことができ、オンチップシステムは、メモリ502に結合された制御プロセッサ501を含んでいる。制御プロセッサ501は、さらにデジタル信号プロセッサ511および/またはアナログ信号プロセッサ521に結合することができ、これらを共に結合することもできる。一部の実施形態では、制御プロセッサ501およびデジタル信号プロセッサ511は、同じ構成要素とすることができる、または同じプロセッサのチップに組み込むことができる。ディスプレイコントローラ533およびタッチスクリーンコントローラ543は、制御プロセッサ501に、またはコンピューティングデバイス500内のもしくはこれに接続されたディスプレイもしくはタッチスクリーンディスプレイ503に、結合することができる。
【００５４】
制御プロセッサ501は、リムーバブルメモリ522(例えば、モバイルコンピューティングデバイスの場合はSDメモリもしくはSIMカード)に、および/または、ディスクドライブ、CDドライブ、およびDVDドライブのうちの1つまたは複数など外部メモリ504に、結合することもできる。制御プロセッサ501は、USBポート514に連結するユニバーサルシリアルバス(USB)コントローラ512に結合することもできる。また、電源570は、USBコントローラ512を介して、または様々な電気接続を介して、回路基板580に結合され、電力(例えば、DC電源)を様々な電子部品に提供することができる。
【００５５】
制御プロセッサ501は、例えば、位相反転走査線(PAL)エンコーダ、順次式カラーメモリ(sequential couleur a memoire、SECAM)エンコーダ、または全米テレビジョン放送方式標準化委員会(national television system(s) committee、NTSC)エンコーダなどの、ビデオエンコーダ534に結合することもできる。さらに、ビデオエンコーダ534は、ビデオエンコーダ534およびディスプレイもしくはタッチスクリーン画面503に結合することができるビデオ増幅器536に結合することができる。また、ビデオポート538をビデオ増幅器536に結合して、コンピューティングデバイス500を外部モニタ、テレビ、または他のディスプレイ(図示せず)に接続できるようにすることができる。
【００５６】
一部の実施形態、詳細にはモバイルコンピューティングデバイスでは、制御プロセッサ501は、例えばアナログ信号プロセッサ521を介して、無線周波数(RF)トランシーバ505に結合することができる。RFトランシーバ505は、RF信号を送受信するためにRFアンテナ504に結合することができる。RFトランシーバ505は、例えば、携帯電話(例えば、G-3、UMTS、CDMAなど)、WiFi、WiMax、およびBluetooth（登録商標）を含む、1つまたは複数の異なる無線通信プロトコルの通信信号を送受信するように構成することができる。
【００５７】
制御プロセッサ501はさらに、ネットワークコネクタ516および/またはRFトランシーバ505に結合することができるネットワークカード506に結合され、外部ネットワーク(例えば、ローカルエリアネットワーク、インターネット、イントラネット、WiFi網、Bluetooth（登録商標）網、パーソナルエリアネットワーク(PAN)など)を介した通信を可能にするよう構成することができる。ネットワークカード506は、個々のチップまたはカードの形式とすることができる、または、フルソリューション(full solution)の通信チップとして、制御プロセッサ501もしくはトランシーバ505(または両方)の一部として実装することができる。
【００５８】
図5に示すキーパッド508のようなアナログ信号プロセッサ521を介して、いくつかのアナログデバイスを制御プロセッサ501に結合することができる。他の実装では、制御プロセッサ501とのインタフェースが、調節接続(図示せず)を介する、ネットワーク接続を介する(例えば、ネットワークカードを介する)、またはUSBポート514を介することができるように、キーパッドまたはキーボードが、独自のプロセッサを含むことができる。
【００５９】
一部の実装では、制御プロセッサ501にデジタルカメラ548を結合することができる。例示的態様では、デジタルカメラ548は、電荷結合素子(CCD)カメラまたは相補型金属酸化膜半導体(CMOS)カメラとすることができる。デジタルカメラ548は、コンピューティングデバイス500に内蔵されるか、外部ケーブルによって装置に結合されることが可能である。
【００６０】
一部の実装では、オーディオCODEC 550(例えば、ステレオCODEC)がアナログ信号プロセッサ521に結合されて、音声増幅器552を介して1人または複数の話者554に音声信号を送信するように構成されることが可能である。オーディオCODEC550は、(例えばマイクジャックを介して)マイク558に結合することができるマイク増幅器556に結合されることもある。音声をヘッドホンに出力するために、ヘッドホンジャック559がオーディオCODEC 550に結合されることもある。
【００６１】
一部の実装では、コンピューティングデバイス500は、放送無線通信信号を受信するためにアンテナ562に結合することができる個々のRF受信機回路560含むことができる。受信回路560は、放送テレビ信号(例えば、FLO TV放送)を受信し、受信した信号を処理するためにDSP511に提供するように構成することができる。一部の実装では、受信機回路560は、FMラジオ信号を受信するように構成することができ、この場合、受信した信号は、処理するためにオーディオCODEC 550に渡すことができる。
【００６２】
一態様では、上述の方法の操作の1つまたは複数を実行するためのプロセッサ実行可能命令を、内部メモリ502、リムーバブルメモリ522、および/または(例えば、ハードドライブ、DCドライブ、もしくはネットワークを介してアクセスできる他の記憶装置上の)不揮発性メモリ504に、格納することができる。本明細書に記載する方法を行うために、このようなプロセッサ実行可能命令が制御プロセッサ501によって実行されることが可能である。
【００６３】
図6にはモバイルコンピューティングデバイスの一例を示しており、図13にはノートブックコンピュータの一例を示している。典型的なモバイルコンピューティングデバイス600は、一般に図6に示す構成要素を有することになる。例えば、モバイルコンピューティングデバイス600は、内部メモリ602およびタッチ表面入力デバイス/ディスプレイ603に結合されたプロセッサ601を含むことができる。タッチスクリーンディスプレイ603は、抵抗膜式タッチスクリーン、静電容量式タッチスクリーン、赤外線感知式タッチスクリーン、音響/圧電感知式タッチスクリーンなどのタッチスクリーンでもよい。様々な態様は、いかなる特定のタイプのタッチスクリーンディスプレイ603またはタッチパッド技術に限定されない。さらに、コンピューティングデバイス600は、無線データリンクおよび/またはプロセッサ601に結合された携帯電話のトランシーバ605に接続された、電磁放射を送受信するためのアンテナ604を有することができる。コンピューティングデバイス600は、ユーザの入力を受け取るための物理ボタン608を含むこともできる。
【００６４】
様々な態様は、モバイルコンピューティングデバイスに大幅な性能向上をもたらすことができるが、パーソナルコンピュータおよびラップトップコンピュータなど、他の形式のコンピューティングデバイスもまた、動的言語スクリプトの事前パースから恩恵を受けることができる。このようなコンピューティングデバイスは、一般に、典型的なパーソナルラップトップコンピュータ700を表わす、図7に図示した構成要素を含む。このようなパーソナルコンピュータ700は、一般に、揮発性メモリ702とディスクドライブ703などの大容量不揮発性メモリとに結合されたプロセッサ701を含む。コンピュータ700は、プロセッサ701に結合されたコンパクトディスク(CD)および/またはDVDドライブ704を含むこともある。コンピュータデバイス700は、プロセッサ601をネットワークに結合するためのネットワーク接続回路705など、データ接続を確立するまたは外部メモリデバイスを受け入れるためにプロセッサ601に結合された、いくつかのコネクタポートを含むこともできる。コンピュータ700はさらに、コンピュータ技術分野では周知のように、キーボード708、マウス707などのポインティングデバイス、およびディスプレイ709に結合することもできる。
【００６５】
プロセッサ601、701は、本明細書で述べる様々な態様の機能を含む、様々な機能を実行するためのソフトウェア命令(アプリケーション)で構成されることが可能である、いかなる１つまたは複数のプログラム可能なマイクロプロセッサ、マイクロコンピュータ、または複数プロセッサチップであることも可能である。一部のモバイルデバイスでは、複数のプロセッサ601、701が、1つのプロセッサを無線通信機能専用とし、1つのプロセッサを他のアプリケーションの実行専用として、設けられることが可能である。一般に、ソフトウェアアプリケーションは、内部メモリ602、702に格納された後に、アクセスされ、プロセッサ601、702にロードされることが可能である。いくつかのモバイルデバイスでは、プロセッサ601、701は、アプリケーションのソフトウェア命令を格納するのに十分な内部メモリを含むことができる。一部のモバイルデバイスでは、セキュアメモリが、プロセッサ601、701に結合された個々のメモリチップの中にある。内部メモリ602、702は、揮発性もしくはフラッシュメモリのような不揮発性メモリとする、または両方の混合とすることができる。この説明のために、一般的にメモリに言及すると、内部メモリ602、702、モバイルデバイスに差し込まれたリムーバブルメモリ、およびプロセッサ601、701自体の内部のメモリなど、プロセッサ601、701がアクセスできるすべてのメモリを指す。
【００６６】
前述の方法の説明およびプロセスフロー図は、単に説明のための例として提供しており、提示した順序で様々な態様のブロックを行わなければならないと要求する、または暗示することを目的としていない。当業者には理解されるように、前述の態様のステップの順序は、いかなる順序でも行うことができる。「その後」、「次いで」、「次に」などの用語は、ブロックの順序を限定することを目的としておらず、こうした用語は、単に方法の説明によって読者を導くために使用している。さらに、例えば冠詞「a」、「an」または「the」を使用した単数形の請求要素へのいかなる言及も、その要素を単数に限定すると解釈されてはならない。
【００６７】
本明細書に開示される諸態様と関連して説明した様々な例示的論理ブロック、モジュール、回路、およびアルゴリズムのステップは、電子ハードウェア、コンピュータソフトウェア、または両方の組み合わせとして実装されることが可能である。ハードウェアとソフトウェアのこのような互換性をわかりやすく説明するために、様々な例示的構成要素、ブロック、モジュール、回路、およびステップは、概してその機能性に関して上述した。このような機能性がハードウェアとして実装されるか、またはソフトウェアとして実装されるかは、特定の応用およびシステム全体に課される設計の制約によって決まる。当業者は、各特定の応用に対して様々な方法で記載した機能を実施することができるが、このような実施の決定は、本発明の範囲からの逸脱を引き起こすと解釈されるべきではない。
【００６８】
本明細書に開示する諸態様と関連して説明する様々な例示的論理、論理ブロック、モジュール、および回路は、汎用プロセッサ、デジタル信号プロセッサ(DSP)、特定用途用集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)もしくは他のプログラマブルロジックデバイス、ディスクリートのゲートもしくはトランジスタロジック、ディスクリートのハードウェア部品、またはこれらの、本明細書に記載した機能を行うように設計されたいかなる組み合わせでも、実装または実行されることが可能である。汎用プロセッサは、マイクロプロセッサとすることができるが、代替的にはプロセッサは、いかなる従来のプロセッサ、コントローラ、マイクロコントローラ、または状態機械とすることもできる。プロセッサは、例えばDSPとマイクロプロセッサの組み合わせ、複数のマイクロプロセッサ、DSPコアと連結した1つまたは複数のマイクロプロセッサ、またはその他のこのような構成など、コンピューティングデバイスの組み合わせとして実装することもできる。あるいは、いくつかのステップまたは方法は、所与の機能に専用の回路によって実行されることが可能である。
【００６９】
1つまたは複数の例示的実施形態では、記載した機能は、ハードウェア、ソフトウェア、ファームウェア、またはこれらのいかなる組み合わせにも実装されることが可能である。ソフトウェアに実装される場合、諸機能は、コンピュータ可読またはプロセッサ可読記憶媒体上の1つもしくは複数の命令またはコードとしてこれに格納される、またはこれを通じて伝送されることが可能である。本明細書に開示する方法またはアルゴリズムの諸ステップは、非一時的プロセッサ可読またはコンピュータ可読記憶媒体にあることが可能である、プロセッサで実行可能なソフトウェアモジュールに組み入れることができる。非一時的プロセッサ可読およびコンピュータ可読媒体は、コンピュータまたはコンピューティングデバイスのプロセッサによってアクセスされることが可能であるいかなる利用可能な記憶媒体とすることもできる。一例としてであって、限定ではないが、このような非一時的プロセッサ可読またはコンピュータ可読媒体は、RAM、ROM、EEPROM、CD-ROMもしくは他の光ディスク記憶装置、磁気ディスク記憶装置もしくは他の磁気記憶装置、または所望のプログラムコードを命令もしくはデータ構造の形態で搬送するもしくは格納するために使用することができ、コンピュータもしくはコンピューティングデバイスのプロセッサによってアクセスすることができる他のいかなる媒体も備えることができる。本明細書で使用するディスク(diskおよびdisc)は、コンパクトディスク(compact disc、CD)、レーザーディスク（登録商標）(laser disc)、光ディスク(optical disc)、ディジタルバーサタイルディスク(digital versatile disc、DVD)、フロッピー（登録商標）ディスク(floppy disk)、およびブルーレイディスク(blu-ray disc)を含み、ディスク(disk)は通常データを磁気的に再生し、ディスク(disc)はレーザーを使用してデータを光学的に再生する。上記のものの組み合わせもまた、非一時的コンピュータ可読媒体の範囲内に含まれるべきである。さらに、方法またはアルゴリズムの操作は、非一時的プロセッサ可読媒体および/または非一時的ピュータ可読媒体上のコードおよび/または命令の1つまたは任意の組み合わせまたはセットとして、備わっている場合があり、これはコンピュータプログラム製品に組み込むことができる。
【００７０】
当業者が本発明を作成するまたは利用することができるように、開示した実施形態の前述の説明を提供する。当業者にはこれらの実施形態への様々な変更が容易に理解され、また本明細書で説明した一般的な原理は、本発明の趣旨または範囲から逸脱することなく他の態様に適用されるものとする。したがって本発明は、本明細書に示した態様に限定されるものではなく、次の特許請求の範囲および本明細書に開示した原理および新規の特徴と一致する最大の範囲を与えられるものとする。
【符号の説明】
【００７１】
500  コンピューティングデバイス
501  制御プロセッサ
502  メモリ
503  ディスプレイ/タッチスクリーン
504  不揮発性メモリ
505  RFトランシーバ
506  ネットワークカード
508  キーパッド
511  デジタル信号プロセッサ(DSP)
512  USBコントローラ
521  アナログ信号プロセッサ
522  リムーバブルメモリ
533  ディスプレイコントローラ
534  ビデオエンコーダ
536  ビデオアンプ
538  ビデオポート
543  タッチスクリーンコントローラ
548  CCD/CMOSカメラ
552  オーディオアンプ
554  スピーカ
556  マイクアンプ
558  マイク
550  オーディオCODEC
559  ヘッドホンジャック
560  RF受信機
570  電源
【図１Ａ】
0005436696.tif 000002
【図１Ｂ】
0005436696.tif 000003
【図２】
0005436696.tif 000004
【図３】
0005436696.tif 000005
【図４】
0005436696.tif 000006
【図５】
0005436696.tif 000007
【図６】
0005436696.tif 000008
【図７】
0005436696.tif 000009