JP6379654B2 - 処理実行プログラム、処理実行方法、及び情報処理装置 - Google Patents

処理実行プログラム、処理実行方法、及び情報処理装置 Download PDF

Info

Publication number
JP6379654B2
JP6379654B2 JP2014101437A JP2014101437A JP6379654B2 JP 6379654 B2 JP6379654 B2 JP 6379654B2 JP 2014101437 A JP2014101437 A JP 2014101437A JP 2014101437 A JP2014101437 A JP 2014101437A JP 6379654 B2 JP6379654 B2 JP 6379654B2
Authority
JP
Japan
Prior art keywords
function
source code
intermediate representation
stored
code
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2014101437A
Other languages
English (en)
Other versions
JP2015219637A (ja
Inventor
坂本 拓也
拓也 坂本
和明 二村
和明 二村
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2014101437A priority Critical patent/JP6379654B2/ja
Priority to EP15158074.3A priority patent/EP2945057B1/en
Priority to US14/660,526 priority patent/US9672016B2/en
Publication of JP2015219637A publication Critical patent/JP2015219637A/ja
Application granted granted Critical
Publication of JP6379654B2 publication Critical patent/JP6379654B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Description

本願は、処理実行プログラム、処理実行方法、及び情報処理装置に関する。
様々なモノがセンサを備えると共にインターネット等の通信ネットワークに接続して情報交換するInternet of Thingsにより、モノを識別したり、モノの状況を把握したり、モノを制御したりすることが可能になってきている。その中でもモノと連携するアプリケーション(以下、「アプリ」と略称する)やサービスの開発にWeb技術を使うWeb of Thingsが注目されている。World Wide Web Consortium(W3C)では、ユースケースや要求事項の検討及びその実現方向について議論されている。これは、Web技術を扱える技術者が非常に多く、アプリやサービスの開発が促進され、その結果、ユーザは様々なメリットを享受できると考えられているからである。
また、モノに搭載するデバイスは、コストや消費電力の面からロースペックであることが望まれる。そこで、小型デバイス上で、Web技術の1つであるJavaScript(登録商標)を動作させるマイコンボードが開発されている。組み込みの世界では、低スペック上で動作させるために、例えばC言語等で書かれたプログラムをコンパイルして得られた実行形式のバイナリファイルを使うことが多い。しかしながら、JavaScriptのようなスクリプト言語を使うことで、個々のデバイス向けの実行形式にコンパイルせずにアプリを実行することが可能であるため、様々なデバイス上でプログラムを動作させる場合に有用である。
また近年では、腕時計型端末(スマートウォッチ)や眼鏡型端末(スマートグラス)等といったウェアラブルデバイスのように低スペックでありながら汎用的なアプリを動作させたい機器の普及が始まりつつある。このようなデバイスを普及させるには、多くの開発者がアプリを作ることができる環境を用意することが重要であり、JavaScriptのようなWeb技術が重要になる。一方で、JavaScriptのようなスクリプト言語には、コンパイルされたバイナリを実行することに比べて動作が遅いという問題がある。そのため、JavaScriptエンジンには、様々な高速化技術が実装されている。例えばGoogle(登録商標)のJavaScriptエンジンであるV8では、full−codegen,crankshaftと呼ばれるJust in Timeコンパイラが搭載されている。そして、JavaScriptを実行する際には、デバイス上でJavaScriptのソースコードを読み込んだ後、コンパイルしてから実行している。
特開2009−211190号公報 特開2002−163115号公報 特表2013−516720号公報 特開2007−179153号公報
しかしながら、上述したような技術は、例えばPersonal Computer(PC)やスマートフォン等の比較的高スペックなデバイス(情報処理装置)を対象としており、処理を実行するために多くのリソース(高速なCentral Processing Unit(CPU)、大きなメモリ領域)が必要である。また、小型デバイス等への組み込み用のJavaScriptエンジンは、低スペックで動作可能なように、シンプルなインタプリタとして実行され、コンパイルなしで、逐次スクリプトを解析(パーズ)しながら実行するため、動作速度は遅い。
一つの側面では、本発明は、効率的にプログラムを実行することを目的とする。
一つの態様では、処理実行プログラムは、読み込んだソースコードの解析と実行とを繰り返してプログラム処理を行う際、前記ソースコードに含まれる関数をコールバック関数として登録し、前記ソースコード内に関数の定義が含まれる場合に、前記関数を識別する関数名と、前記関数に対応するソースコードの中間表現とを対応付けて記憶し、所定のイベントに対応させて登録した前記コールバック関数を呼び出した場合に、前記関数に対応する前記中間表現が記憶されているか否かを判断し、対応する前記中間表現が記憶されている場合は、記憶された前記中間表現を用いて前記関数に対応する処理を実行し、対応する前記中間表現が記憶されていない場合は、前記関数に対応するソースコードを解析して中間表現を作成する、処理をコンピュータに実行させる。
一つの側面として、効率的にプログラムを実行することができる。
情報処理装置の機能構成の一例を示す図である。 情報処理装置のハードウェア構成の一例を示す図である。 第1実施形態におけるスクリプト実行処理の一例を示すフローチャートである。 メモリ管理処理の一例を示すフローチャートである。 第2実施形態におけるスクリプト実行処理の一例を示すフローチャートである。 イベント抽出処理の一例を示すフローチャートである。 本実施形態におけるアーキテクチャと実装例を示す図である。 中間コードの生成とオブジェクト管理ツリーを説明するための図である。 本実施形態における動作概要を説明するための図である。 関数使用表の一例を示す図である。
以下、添付図面を参照しながら実施例について詳細に説明する。
<情報処理装置の機能構成例>
図1は、情報処理装置の機能構成の一例を示す図である。図1の例に示す情報処理装置10は、記憶部11と、読み込み部の一例としてのロード部12と、解析部の一例としてのパーズ部13と、実行部14と、関数定義抽出部15と、関数コール抽出部16と、関数情報管理部17と、中間表現管理部の一例としての中間コード管理部18とを有する。
記憶部11は、本実施形態におけるJavaScriptを用いた各種情報処理等を実行するためのソースコード21等が記憶される。なお、記憶部11は、例えば中間表現(例えば、中間コード等)やコールバックデータ、関数使用表、各種設定情報、実行途中で得られたデータ、実行結果(ログ)等を記憶してもよい。中間表現とは、ソースコード21に含まれる関数全体についてパーズした結果をまとめたものである。中間表現は、メモリ上では、「変数」といった言葉で書かれているのではなく、記号に置き換えて記憶するためバイナリデータである。なお、中間表現は、コードに限定されるものではない。記憶部11に含まれる各データは、ロード部12以外の構成から読み込まれてもよい。記憶部11は、ハードディスク等でもよく、メモリ等でもよく、それらの組み合わせでもよい。
ロード部12は、記憶部11等からJavaScript等の言語で記述されたソースコード21をメモリ(例えばメモリキャッシュ)上等に読み込み、パーズ部13にて解析可能な状態にする。
パーズ部13は、メモリ上等に存在するソースコードを記述順序の最初(前)から順に構文解析や意味解析等の解析(パーズ)処理を行い、解析結果として実行可能なプログラム等を生成する。また、パーズ部13は、関数情報管理部17等により管理される中間コードから実行可能なプログラム等を生成してもよい。中間コードから処理を実行する場合は、パーズ部13での処理にかかる時間がなくなるため、処理が高速化される。
実行部14は、パーズ部13により得られる解析結果を用いて処理を実行する。また、実行部14は、ソースコード21の代わりに中間コード等を使用して処理を実行することができる。実行部14により実行された処理結果は、記憶部11に記憶されてもよい。
関数定義抽出部15は、ソースコード21から関数定義された部分を抽出し、抽出した部分を関数情報管理部17に出力する。
関数コール抽出部16は、ソースコード21から関数呼び出し部分を抽出して、関数情報管理部17から対応する関数の中間コードやソースコード等を取得し、パーズ部13に出力する。
関数情報管理部17は、例えば関数定義抽出部15や関数コール抽出部16等から得られる関数(例えば、関数名や引数)、関数のソースコード、中間コード等の各情報の対応付けを管理する。例えば、関数情報管理部17は、関数定義抽出部15によりソースコード内に関数の定義が含まれると判断された場合に、関数を識別する関数名と、関数に対応するソースコードの中間コードとを対応付けて管理する。また、関数情報管理部17は、得られた関数をオブジェクトの一例として、木構造(オブジェクト管理ツリー)を生成し、記憶部11や関数情報管理部17の内部メモリ上で管理する。
また、関数情報管理部17は、ソースコード21に含まれる関数をコールバック関数として登録するか否かを管理してもよい。関数をコールバック登録しておくことで、スクリプトを最後まで実行した後も、所定のイベントに対応させて登録した関数を呼び出して処理を実行することができる。
中間コード管理部18は、中間表現の一例として例えば中間コード等を管理する。また、中間コード管理部18は、メモリ管理や利用状況管理等を行い、例えば中間コードの作成や削除等を行う。例えば、中間コード管理部18は、中間コードが存在しない場合に、中間コードを作成する。また、中間コード管理部18は、使用メモリ状況に応じて、利用状況、中間コードの作成時間等に応じて優先順位をつけて、優先順位の低い中間コード等を削除する。
ここで、中間コード管理部18について具体的に説明する。中間コード管理部18は、中間コード作成部31と、中間コード削除部32と、メモリ管理部33と、利用状況管理部34とを有する。
上述した中間コード自身は、関数情報管理部17により管理され、中間コード管理部18では必要に応じて、中間コード作成部31、中間コード削除部32、メモリ管理部33、及び利用状況管理部34のうち、少なくとも1つの機能を呼び出す。
中間コード作成部31は、中間コード管理部18の指示に応じて関数のソースコードから中間コードを作成する。中間コード削除部32は、中間コード管理部18の指示に応じて中間コードを削除する。メモリ管理部33は、中間コードをメモリに記憶することで使用されるメモリ使用量を管理する。また、メモリ管理部33は、メモリ使用量の基準(例えば、閾値等)を設定しておく。これらの情報に基づいて、中間コード管理部18は、中間コード削除部32を呼び出すか否かを決定する。利用状況管理部34は、その中間コードがいつ呼び出されたか、呼び出し頻度、作成時刻、呼び出された時のCPU負荷、中間コードを作成するのにかかる時間等の情報を管理し、この情報に基づいて、中間コード管理部18が中間コード削除部32によりどの関数の中間コードを削除するかを決定する。
上述したように、本実施形態における情報処理装置10は、読み込んだソースコード21の解析と実行とを繰り返してプログラム処理を行う際、関数情報管理部17で管理する関数情報(例えば、関数名・引数・関数内のコード等)に加えて、中間コード管理部18により中間コードを管理する。中間コードを用いることで、効率的にプログラムを実行することができる。
情報処理装置10としては、例えばPCやタブレット端末であるが、これに限定されるものではなく、例えばスマートウォッチやスマートグラス、グローブ型、ペンダント型等のウェアラブル機器や、所定の環境下で設置されるセンサデバイス(温度センサ等)であってもよい。また、これらの各デバイスは、直接インターネットに接続して情報通信したり、Bluetooth(登録商標)(例えば、Bluetooth Low Energy等)やWiFi(登録商標)等を使ってスマートフォン等と接続して情報通信してもよい。これらの通信によって、JavaScriptで記述されたアプリ(プログラム)が各デバイス(情報処理装置10)に配布されてもよい。
<情報処理装置10のハードウェア構成例>
次に、情報処理装置10のハードウェア構成例について、図を用いて説明する。図2は、情報処理装置のハードウェア構成の一例を示す図である。図2の例において、情報処理装置10は、入力装置41と、出力装置42と、ドライブ装置43と、補助記憶装置44と、主記憶装置45と、CPU46と、ネットワーク接続装置47とを有し、これらはシステムバスBで相互に接続されている。
入力装置41は、ユーザ等が操作するキーボード及びマウス等のポインティングデバイスや、マイクロフォン等の音声入力デバイスを有しており、ユーザ等からのプログラムの実行指示、各種操作情報、ソフトウェア等を起動するための情報等の入力を受け付ける。
出力装置42は、本実施形態における処理を行うためのコンピュータ本体(情報処理装置10)を操作するのに必要な各種ウィンドウやデータ等を表示するディスプレイ等を有する。出力装置42は、CPU46が有する制御プログラムによりプログラムの実行経過や結果等を表示することができる。
ここで、本実施形態において、例えばコンピュータ本体にインストールされる実行プログラムは、記録媒体48等により提供される。記録媒体48は、ドライブ装置43にセット可能である。CPU46からの制御信号に基づき、記録媒体48に格納された実行プログラムが、記録媒体48からドライブ装置43を介して補助記憶装置44にインストールされる。
補助記憶装置44は、例えばHard Disk Drive(HDD)やSolid State Drive(SSD)等のストレージ手段等である。補助記憶装置44は、CPU46からの制御信号に基づき、本実施形態における実行プログラム(処理実行プログラム)や、コンピュータに設けられた制御プログラム等を記憶し、必要に応じて入出力を行う。補助記憶装置44は、CPU46からの制御信号等に基づいて、記憶された各情報から必要な情報を読み出したり、書き込むことができる。
主記憶装置45は、CPU46により補助記憶装置44から読み出された実行プログラム等を格納する。主記憶装置45は、Read Only Memory(ROM)やRandom Access Memory(RAM)等である。補助記憶装置44及び主記憶装置45は、上述した記憶部11の一例である。
CPU46は、Operating System(OS)等の制御プログラム、及び主記憶装置45に格納されている実行プログラムに基づいて、各種演算や各ハードウェア構成部とのデータの入出力等、コンピュータ全体の処理を制御して各処理を実現する。プログラムの実行中に必要な各種情報等は、補助記憶装置44から取得することができ、また実行結果等を格納することもできる。
具体的には、CPU46は、例えば入力装置41から得られるプログラムの実行指示等に基づき、補助記憶装置44にインストールされたプログラムを実行させることにより、主記憶装置45上でプログラムに対応する処理を行う。例えば、CPU46は、処理実行プログラムを実行させることで、上述したロード部12におけるソースコード21の読み込みや、パーズ部13におけるソースコードの解析、実行部14におけるスクリプトに対応するプログラムの実行等の処理を行う。また、CPU46は、処理実行プログラムを実行させることで、上述した関数定義抽出部15による関数定義の抽出、関数コール抽出部16による関数コールの抽出、関数情報管理部17における関数情報の管理等の処理を行う。また、CPU46は、処理実行プログラムを実行させることで、上述した中間コード管理部18における中間コードの管理等の処理を行う。CPU46における処理内容は、上述した内容に限定されるものではない。CPU46により実行された内容は、必要に応じて補助記憶装置44等に記憶される。
ネットワーク接続装置47は、Local Area Network(LAN)やインターネット等に代表される通信ネットワークを介して外部装置等との通信を行う。ネットワーク接続装置47は、CPU46からの制御信号に基づき、通信ネットワーク等と接続することにより、実行プログラムやソフトウェア、設定情報等を外部装置等から取得する。また、ネットワーク接続装置47は、プログラムを実行することで得られた実行結果又は本実施形態における実行プログラム自体を外部装置等に提供する。ネットワーク接続装置47は、例えば上述したBluetoothやWiFi等を用いて外部装置等との無線通信を実現することができる。
記録媒体48は、上述したように実行プログラム等が格納されたコンピュータで読み取り可能な記録媒体である。記録媒体48は、例えばフラッシュメモリ等の半導体メモリやCD−ROM、DVD等の可搬型の記録媒体であるが、これに限定されるものではない。
図2に示すハードウェア構成に実行プログラム(例えば、処理実行プログラム等)をインストールすることで、ハードウェア資源とソフトウェアとが協働して本実施形態におけるスクリプト実行処理等を実現することができる。
<スクリプト実行処理の一例>
次に、本実施形態におけるスクリプト実行処理の一例についてフローチャートを用いて説明する。
<スクリプト実行処理:第1実施形態>
図3は、第1実施形態におけるスクリプト実行処理の一例を示すフローチャートである。図3の例において、ロード部12は、記憶部11等からJavaScriptのソースコード21を読み込む(S01)、また、パーズ部13は、スクリプトを解析(パーズ)する(S02)。
次に、関数定義抽出部15は、S02の処理から得られる解析結果において、関数定義された部分が抽出されたか否かを判断し(S03)、抽出された場合(S03において、YES)、関数コードを記憶する(S04)。また、S03の処理において、関数定義された部分が抽出されなかった場合(S03において、NO)、関数コール抽出部16は、関数呼び出し部分が抽出されたか否かを判断する(S05)。
関数呼び出し部分が抽出された場合(S05において、YES)、関数情報管理部17は、中間表現の一例である中間コードが存在するか否かを判断する(S06)。中間コードが存在する場合(S06において、YES)、中間コード管理部18は、関数コードを取得し(S07)、取得した関数コードを解析し(S08)、解析結果を中間コードに追加する(S09)。
次に、実行部14は、関数コードを実行し(S10)、取得した関数コードを最後まで実行したか否かを判断する(S11)。ここで、実行部14は、最後まで実行していない場合(S11において、NO)、S08の処理に戻る。また、S11の処理において、最後まで実行した場合(S11において、YES)、関数情報管理部17は、関数と中間コードとの対応付けを記憶部11等に記憶する(S12)。次に、中間コード管理部18は、中間コード等を記憶したメモリ等に対する管理処理(メモリ管理処理)を行う(S13)。
また、S06の処理において、中間コードが存在する場合(S06において、YES)、実行部14は、その中間コードを実行し(S14)、最後まで実行したか否かを判断する(S15)。最後まで実行していない場合(S15において、NO)、実行部14は、S14の処理に戻る。また、S05の処理において、関数呼び出し部分が抽出されていない場合(S05において、NO)、実行部14は、S02の処理で解析したスクリプトを実行する(S16)。
ここで、S04,S13,或いはS16の処理後、又は、S15の処理において、最後まえ実行した場合(S15において、YES)、処理終了か否かを判断し(S17)、処理を終了しない場合(S17において、YES)、S02に処理に戻り、例えば次のスクリプトの解析等を行う。また、S17の処理において、読み込んだ全てのスクリプトを解析した場合やユーザにより終了指示等があった場合等のように、処理を終了する場合(S17において、YES)、第1実施形態におけるスクリプト実行処理を終了する。
<S13:メモリ管理処理の一例>
次に、上述したS13におけるメモリ管理処理の一例についてフローチャートを用いて説明する。図4は、メモリ管理処理の一例を示すフローチャートである。図4に示すメモリ管理処理において、中間コード管理部18は、中間コードのメモリ使用量を算出し(S21)、全中間コードによるメモリ使用量を取得する(S22)。
次に、中間コード管理部18は、メモリ使用量が予め設定された閾値以上か否かを判断し(S23)、閾値以上である場合(S23において、YES)、利用状況を取得する(S24)。利用状況とは、例えば中間コード毎に、いつ呼び出されたか、呼び出し頻度、作成時刻、呼び出された時のCPU負荷、中間コードを作成するのにかかる時間等の情報であるが、これに限定されるものではない。
次に、中間コード管理部18は、取得した利用状況等に基づいて中間コードの優先順位を設定する(S25)。S25の処理では、最近呼び出されていない関数や、呼び出し回数が少ない関数等を優先順位を低くし、逆に最近呼び出されている関数や呼び出し回数が多い関数を優先順位を高く設定する等の処理を行うが、これに限定されるものではない。
次に、中間コード管理部18は、優先順位の低いものから順にメモリ使用量が閾値以下になるまで中間コードを削除し(S26)、S26の処理により削除された中間コードに対応させて、関数と中間コードとの対応付けを削除する(S27)。
また、S23の処理において、メモリ使用量が閾値以上でない場合(S23において、NO)、そのまま処理を終了する。
<スクリプト実行処理:第2実施形態>
次に、第2実施形態におけるスクリプト実行処理について説明する。第2実施形態では、Web技術によって接続される情報処理装置(デバイス)10の一例として、センサ等を備えた小型デバイスを想定する。小型デバイスが、センサの情報等を消費電力の観点から効率的に処理するためには、センサ等からの情報を受けて情報処理装置10のCPU等がが動作し、処理終了後にはCPU等がスリープすることが望ましい。
そこで、情報処理装置10は、センサや通信等によって得られた情報を、イベントとして受ける。そして、情報処理装置10は、受け取った情報に基づいて計算を行い、その計算結果に応じて、別のデバイス(外部装置)等への情報通知を行う。例えば、情報処理装置10は、温度センサからの入力イベントを受けて、温度が30度を超えているかどうかの閾値チェックを行い、例えば温度が閾値を超えている場合にのみ、通信ネットワーク等を介して外部装置に通知するといった処理である。
この場合のイベントドリブンをJavaScriptで実現する。そのため、イベントに対応付けて、スクリプト関数をコールバックとして渡すことになる。その結果として、イベントの発生時にその渡した関数が呼び出されることになる。イベントが起こる毎に、関数が呼び出されることになるため、関数の実行を効率化することができる。上述した第2実施形態におけるスクリプト実行処理をフローチャートを用いて説明する。
図5は、第2実施形態におけるスクリプト実行処理の一例を示すフローチャートである。第2実施形態におけるスクリプト実行処理において、S31〜S45の処理は、上述した第1実施形態におけるスクリプト実行処理におけるS01〜S15の処理と同様の処理であるため、ここでの具体的な説明は省略する。
情報処理装置10は、S35の処理において、関数呼び出し部分が抽出されたか否かを判断し(S35)、関数呼び出し部分が抽出されなかった場合(S35において、NO)、関数情報管理部17は、関数をコールバック関数として登録するか否かを判断する(S46)。関数を登録する場合(S47において、YES)、コールバック関数(コールバックデータ)として記憶部11に登録する(S47)。関数をコールバック登録しておくことで、スクリプトを最後まで実行した後も、登録した関数を呼び出すことができる。これにより、例えば、センサ等の値が取得できた場合に呼び出されたり、画面にタッチされたときに呼び出される等、所定のイベント発生に応じて関数が呼び出される。なお、イベント抽出は、JavaScriptソースコードの実行とは独立して動作している。
また、S46の処理において、関数を登録しない場合(S46において、NO)、スクリプトを実行する(S48)。また、情報処理装置10は、S34、S43、S47,或いはS48の処理後、又は、S45の処理において、最後まで実行した場合(S45において、YES)、処理終了か否かを判断し(S49)、処理を終了しない場合(S49において、NO)、S32の処理に戻る。また、S49の処理において、処理を終了する場合(S49において、YES)、第2実施形態におけるスクリプト実行処理を終了する。
<イベント抽出処理について>
ここで、図5に対応させたイベント抽出処理についてフローチャートを用いて説明する。図6は、イベント抽出処理の一例を示すフローチャートである。図6の例において、情報処理装置10は、所定のイベントを抽出すると(S51)、イベントに対応するコールバックを取得し(S52)、記憶部11等に登録されたコールバックデータから対応するコールバック関数を呼び出す(S53)。
次に、関数情報管理部17は、中間コードが存在するか否かを判断する(S54)。中間コードが存在する場合(S54において、YES)、中間コード管理部18は、関数コードを取得し(S55)、取得した関数コードを解析し(S56)、解析結果を中間コードに追加する(S57)。
次に、実行部14は、関数コードを実行し(S58)、取得した関数コードを最後まで実行したか否かを判断する(S59)。ここで、実行部14は、最後まで実行していない場合(S59において、NO)、S56の処理に戻る。また、S59の処理において、最後まで実行した場合(S59において、YES)、関数情報管理部17は、関数と中間コードとの対応付けを記憶部11等に記憶する(S60)。また、情報処理装置10は、上述したメモリ管理処理を行う(S61)。
また、S54の処理において、中間コードが存在する場合(S54において、YES)、実行部14は、その中間コードを実行し(S62)、最後まで実行したか否かを判断する(S63)。最後まで実行していない場合(S63において、NO)、実行部14は、S62の処理に戻る。また、S63の処理において、最後まで実行した場合(S63において、YES)、又はS61の処理後、処理を終了する。なお、図6のイベント抽出処理は、イベントが発生する毎に上述した処理が実行される。
<本実施形態のアーキテクチャと実装例>
次に、上述した本実施形態における情報処理装置10を用いて、スクリプト関数の実行を効率化するためのアーキテクチャと実装例について、具体的に図を用いて説明する。図7は、本実施形態におけるアーキテクチャと実装例を示す図である。図7(A)は、関数の実行を効率化するためのアーキテクチャ例を示し、図7(B)は、アーキテクチャーを実装するJavaScriptエンジンの実施例を示している。なお、図7(A),(B)の例では、本実施形態における情報処理装置10の機能構成の一部を概略的に示している。
図7(A)に示すアーキテクチャの構成において、ライブラリ51は、例えばセンサや通信(送受信)等に伴うイベントの発生に従って、コールバック登録された関数を呼び出す。例えば、ライブラリ51は、例えばセンサや通信等に基づくイベントを待機し、イベントが発生した場合にコールバック登録された関数等を読み出すイベントループとしての機能であってもよい。
また、実行部14は、上述したライブラリ51やイベントループ等からの呼び出しを受けて、関数情報管理部17から関数のソースコード又は中間コードを取得して、そのコードを実行する。
関数情報管理部17は、関数のソースコードを管理する。また、実行部14からの要求に応じて、関数のソースコード又は中間コードを返答する。中間コード管理部18は、関数情報管理機能からの要求に応じて、関数の中間コードを返答する。必要に応じて、関数のソースコードをパーズして中間コードを作成したり、中間コードを削除する。
具体的には、要求された関数の中間コードが存在しない場合に、中間コード作成部31により中間コードを作成してから返答し、存在する場合は作成せずに返答することになる。また、作成した中間コードを記憶部11等に記憶しておくにはメモリ容量が必要であるため、不要になった場合や多くなりすぎて空きメモリが少なくなった場合に、中間コード削除部32により所定の中間コードを削除する機能も持つ。
本実施形態では、中間コードを使用しなかった場合、つまり関数情報管理部17がソースコードを返答する場合、JavaScriptインタープリタの標準的な動作を行う。また、本実施形態では、ソースコードの代わりに中間コードを使うことで、関数をパーズする処理を省略することができ、その時間を短縮できることになる。パーズは、テキストで書かれたJavaScriptを字句解析及び構文解析する処理であるため時間がかかる。したがって、本実施形態を適用することで、時間短縮の効果が大きい。なお、図7(A)に示すようなイベントドリブンモデルでは、イベントに対応する多くの関数は、関数単位で繰り返し呼ばれることになる。そのため、本実施形態では、関数毎に中間コードを管理する。
また、図7(B)に示す例では、JavaScriptのソースコードをロードした後、そのソースコードを前から順にパーズと実行とを繰り返す(ロード/パーズ/実行)。そして、実行により得られたオブジェクトの一例である関数等を木構造(オブジェクト管理ツリー52)として、記憶部11等のメモリ上で管理する。このオブジェクト管理ツリー52を使うことで、次回以降からそのオブジェクトを取得してアクセスすることができる。
ここで、上述した関数は、ソースコード21のパーズ時に関数定義があった場合には、関数名と引数、関数部分のソースコードを対応付けて、オブジェクト管理ツリー52に追加して管理される。また、コールバック登録があった場合には、ライブラリ51を通してイベントと関数を対応付けて記憶する。
コールバック登録したことにより、イベント発生時に対応付けた関数が呼び出されることになる。関数呼び出し時には、そのオブジェクト管理ツリー52を使って呼び出された関数に対応するソースコードを関数情報管理部17経由で取得する。次に、パーズ部13がその取得した関数部分のソースコードを解析する。そして、実行部14が、その解析結果を用いて処理を実行する(関数実行)。つまり、本実施形態では、関数情報管理部17における機能部分を拡張して、中間コード管理部18における機能が動作するように実装することができる。なお、ここで管理する中間コードは、例えば関数のソースコードをステートメント毎にパーズして得られた結果から作成した木構造をリストにしたバイナリデータである。
例えば、図7(B)に示すように、オブジェクト管理ツリーを拡張して、関数名とそのソースコードの対応付けに加えて、中間コードへの対応付けを持たせる。そして、関数情報管理部17は、関数呼び出し時に関数名でオブジェクト管理ツリーから関数のソースコードを取得するのに代えて、対応する中間コードが存在する場合は、中間コードを返答する。
実行部14により、その中間コードを実行する。中間コードが存在しない場合は、関数のソースコードをパーズ・実行しながら、中間コード管理部18が中間コードの作成を行い、オブジェクト管理ツリーに関数名と対応付けて記憶する。これにより、次回以降の呼び出し時に中間コードを使った実行が可能となり、高速化が実現される。
なお、上述した方法では、中間コードが作成されるのは、呼び出された関数に限られるが、例えば限定されたとしても、中間コードを記憶するためにメモリ領域が必要である。したがって、多くの関数があった場合に、小型デバイスではメモリの使用量が大きすぎることになり得る。そのため、中間コード削除部32により中間コードを削除する機能を追加した。中間コードによって使用されるメモリ使用量を管理し、所定の使用量になった場合に、何れかの関数の中間コードを削除し、オブジェクト管理ツリー52の対応付けを書き換える。その結果、中間コードを削除された関数が呼び出された場合にも、正常に実行することができる。
<中間コードの生成とオブジェクト管理ツリーについて>
次に、上述した本実施形態における中間コードの生成とオブジェクト管理ツリーについて、具体的に図を用いて説明する。
図8は、中間コードの生成とオブジェクト管理ツリーを説明するための図である。例えば、図8(A)の左側に記述されたようなJavaScriptソースがあった場合、functionから始まる関数定義の部分が抜き出されて管理される。本実施形態では、例えば図8(A)に示すようにwindowから始まるライブラリの呼び出しが実行されて、コールバック登録される。そして、対応するイベントが発生した時には、その登録された関数(例えばlistener)が呼び出される。その際、中間コードが存在する場合は、その中間コードを実行する。また、中間コードが存在しない場合は、パーズして中間コードを作成しながら実行する。そこで作られた中間コードは、関数(例えば、listener)と対応付けてバイナリデータとして記憶される。
このような場合における中間コードの生成において、まずJavaScriptのソースコードは、一連の表現(expression)をテキスト化したものである。例えば、以下のようなシンプルなソースコードを考える。
var x;
x = 1;
JavaScriptエンジンは上記のソースコードを与えられた場合、例えばパーズ部13等による字句解析、構文解析により、以下のような表現として解析する。
<変数宣言(x)><名前(x)>
<割り当て><左辺><名前(x)>
<右辺><整数(1)>
上述した表現の1行目は、JavaScriptの変数宣言のステートメントであり、これを1つの木構造として表現している。また、上述した表現の2行目は割り当てのステートメントであり、左辺、右辺両方を解析した上で1つの木構造として表現する。そして、これらをリスト化したものを中間コードとしてメモリ上に記憶する。なお、上述した内容は、説明の便宜上、言葉で表現しているが、実際にはそれぞれの表現に値を割り当てたバイナリデータで表現される。
次に、実行時に作成されるオブジェクト管理ツリーについて説明する。例えば、以下のようなソースコードを想定する。
var x = 1;
function func1(y) {
return y + 1;
}
このソースを実行した結果、オブジェクト管理ツリー52に対して、変数オブジェクトxに整数1が追加され、関数オブジェクトfunc1に引数「y」とソースコード「return y+1;」が追加される。そのオブジェクト管理ツリーのイメージを図8(B)(斜線部分以外)に示す。
ここで、関数の呼び出し時に関数名に基づいて、このオブジェクト管理ツリー52を使って関数を検索して、その中間コードが存在する場合には、表現の一連である中間コードを取得して実行することになる。また、中間コードがない場合は、中間コード作成してオブジェクト管理ツリーの関数オブジェクトに追加して管理することになる。その部分を図8(B)の斜線部分で示す。
上述したように、本実施形態によれば、例えば小型デバイス等で動作するイベントドリブンのモデルを想定し、その上で動作させるJavaScriptエンジンの高速化アーキテクチャを実現することができる。その結果、小型デバイスで動作する単純な動作のスクリプトエンジンを効率的に動作させることができる。
また、使用メモリの管理機能や中間表現作成部分指定機能、一部の中間表現作成機能を持つことで、中間表現の作成によってメモリ使用量が増えすぎる問題を防ぐことができる。全体をコンパイルするのに比べて、メモリの使用量は小さい。
ここで、具体的なJavaScriptソースコードを用いた本実施形態における実行処理の動作例について説明する。図9は、本実施形態における動作概要を説明するための図である。中間表現とは、本来はスクリプトであるために、図9に示すように実行時には変数に値が入っている。例えば、図9に示すJavaScriptソースコードでは、「param+1」を実行する場合に、引数として与えられた「10」に対し、10+1を計算すればよい。しかしながら、中間表現では、次に呼ばれた時には、引数が変わることがあるため(図9の例では、引数20)、変数部分は変数として、実行時に値を置き換えられるように作成する必要がある。
そこで、本実施形態では、図9に示すように繰り返して実行されるJavaScriptソースコードの呼び出しを効率化する。そのため、本実施形態では、上述したように1度目のパーズ実行時にパーズ結果(解析結果)から得られる情報を記憶しておき、2度目以降の実行時に、その情報を利用してパーズ処理を省略することを可能とする。
例えば、JavaScriptソースコードが与えられた時、JavaScriptソースコードをメモリへ読み込み、JavaScriptソースコードを前から順にパーズして、パーズ結果を元に実行することを繰り返す。例えば、図9に示すように、
var a = 1;
のようなソースコードがあった場合、「<変数の宣言><代入><整数>」といったようにその意味を理解して、その意味に基づいて変数のaと整数の1とを結び付ける。このような処理を繰り返すことになる。そこで、本実施形態では、関数の呼び出し時に中間表現を作成することで、実行を高速化する。また、例えば、図9に示すように、
function func1(param) {
return param + 1;
}
var result1 = func1(10);
var result2 = func1(20);
のようなスクリプトプログラムがある場合、図9(B)に示すように、最初の3行である関数定義部分において、関数名とソースコードの対応付けのみを記憶しておき、4行目の関数(var result1 = func1(10);)の呼び出し時には、その関数名に対応するソースコードについてパーズして中間表現を作成して対応付けに追加し、対応する処理を実行する。また、5行目の関数(var result2 = func1(20);)の呼び出し時には、パーズの代わりに(パーズせずに)、対応付けから得られるすでに作成された中間表現を使って対応する処理を実行することができる。
このように、本実施形態では、最初の関数の呼び出し時には、最初に中間表現(中間コード)を作成する時間が必要なだけで、2度目以降の呼び出し時にパーズする必要がない。その結果、小型デバイスで動作する単純な動作のスクリプトエンジンを効率的に動作させることができる。
また、本実施形態では、中間コード管理部18において、使用メモリの管理機能や中間表現作成部分指定機能、一部の中間表現作成機能を有することで、中間表現の作成によってメモリ使用量が増えすぎる問題を防止ことができる。また、本実施形態では、全体をコンパイルするのに比べて、メモリの使用量は小さくなる。
<JavaScriptエンジンについて>
JavaScriptエンジンでは、グローバルソースと呼ばれる関数内ではない部分が、パーズ及び実行される。したがって、例えば上述した図9に示すJavaScriptソースコードの最初の行「var a=1;」を解釈する。この場合は、<変数(a)><代入(=)><整数(1)>ということを意味する。次の行は、関数の定義をしていることを意味する。<関数(func1)><引数(param)><ソース(<return param+1;>)>と解釈される。これら(変数(a)及び関数(func1))のオブジェクトは、後から使用される可能性がある。そのため、後から呼び出し時に見つけることができるように管理する必要がある。そのため、例えば上述した図8(B)のようなツリー構造で管理する。これにより、もし後から変数aの値を使用しようとした場合は、このオブジェクト管理ツリーを辿ることで値を取得することができる。関数func1を呼びだそうとした場合は、オブジェクト管理ツリーを辿ることで関数func1のソースコードを取得することができる。そして、上述した例の最後の行のように実際に呼ばれた場合には、func1のソースコードを取得して、その後、ソースコード内を実行する。
本実施形態では、オブジェクト管理ツリーに、オブジェクトに対応するソースコードに加えて、中間表現を管理できるように拡張する。上述した図8(B)の「Intermediate」データの部分が中間表現に相当する。関数の呼び出し時には、対応する名前を持ったオブジェクトを見つけ出し、更にそのオブジェクトが中間表現を持っているかどうかを確認する。もし、持っていた場合は、ソースコードを取得する代わりに、中間表現を取得して、その中間表現を使用してJavaScriptの実行を行う。また、中間表現を持っていなかった場合は、ソースコードを取得して、ソースコードを中間表現に変換し、得られた中間表現をオブジェクト管理ツリーに追加する。そして、中間表現を使用してJavaScriptの実行を行う。
なお、中間表現は、メモリ上では、「変数」といった言葉で書かれているのではなく、記号に置き換えて記憶するためバイナリデータである。中間表現から実行する場合は、パーズにかかる時間がなくなるため、処理が高速化される。一方で、この方式では、中間表現を作って記憶するため、メモリの使用量が大きくなる。本実施形態で想定しているような組み込みデバイスでは、メモリ使用量が増えることは大きな問題である。そのため、この方法に因るメモリ使用量の増加を一定範囲に抑えることが重要である。そのために、本実施形態では、中間コード管理部18において、中間表現によるメモリ使用量を管理する。
例えば、中間コード管理部18は、中間表現を作成した場合、その中間表現であるバイナリデータのデータサイズを算出する。そして、中間表現によるメモリ使用量にこのデータサイズを追加する。そして、ある値(閾値)を超えた場合、中間表現の少なくとも1つを削除する。なお、どれを削除するかは、ランダムに削除する方法や最近使われていないもの、呼ばれた回数、古くに作成されたもの等に応じて優先順位を設定し、その優先順位に基づいて削除する方法等があるが、これらに限定されるものではない。また、上述した削除を実現するために、例えば関数使用表を記憶部11等に記憶しておき管理することができる。
図10は、関数使用表の一例を示す図である。図10に示す関数使用表は、例えば記憶部11に記憶され、必要に応じて読み込みや書き出しを行うことができる。図10の例では、関数毎に、「作成時刻」、「最新呼び出し時刻」、「呼ばれた回数(回)」、「CPU負荷(%)」等の項目が記憶されているが、関数の数や記憶される項目の種類については、これに限定されるものではない。このように、関数毎に管理を行い、記憶された関数情報に基づいて中間表現の削除対象を選択することができる。なお、削除については、例えば一つの関数の中間表現を削除しても、メモリ使用量が上限を超えている場合は、更に別の関数の中間表現も削除する。
また、関数使用表は、中間表現の作成対象を選択する場合に用いてもよい。また、関数使用表は、オブジェクト管理ツリーを拡張して管理してもよく、別の表として管理してもよい。これにより、メモリ等を使いすぎるのを防止することができる。なお、超えてはいけない使用量を判断するための閾値は、例えば固定値でもよく、またOS等から空きメモリ領域のサイズを取得して、その値に基づいて動的に変更してもよい。なお、削除された中間表現の関数が再び呼び出される場合は、中間表現が存在しないことになるため、再度中間表現が作成される。
<メモリ使用量削減例>
次に、上述した中間コード管理部18におけるメモリ使用量削減例について説明する。なお、以下の各実施例では、中間コードの作成時又は削除時におけるメモリ使用量削減例を示している。
<実施例1>
上述したように、中間コードを作成していくと時間の経過と共に多くのメモリを使用することになる。そこで、実施例1では、中間コードを記憶するための使用可能メモリを決定し、記憶した中間コードのメモリ量を管理する。また、実施例1では、作成された中間コードを記憶した場合のメモリ量を計算し、上限を超えていた場合、記憶されている中間コードのどれかを削除する。
また、中間コードをメモリキャッシュに置き、次回同じ関数が呼び出された時、その中間コードを使用することで、一部の処理を削減できる。
削除する中間コードの選択基準として、最も最近使われていないもの、一定期間内での頻度が少ないもの、最も古くに作成されたもの等から選択された少なくとも1つの手法を用いて使用量が所定の閾値以上にならなくなるまで削除を行う。なお、選択基準については、これに限定されるものではない。これにより、メモリ容量を使い過ぎないため、例えば小さいメモリ容量を有するデバイスでも利用することができる。
<実施例2>
実施例2では、作成された中間コードを記憶した場合のメモリ量を計算し、上限を超えていた場合、記憶されている中間コードのどれかをファイルに書き出し、メモリキャッシュから消す。次回同じ関数が呼び出された時、その中間コードを使用することで、一部の処理を削減できる。また、次回ファイルに書きだされた関数が呼び出された場合、中間コードをメモリキャッシュに読み込んでから実行する。上述したファイルの書き出しとメモリキャッシュからの削除を行う。
なお、中間コードをファイルに書き出した場合、その情報(例えば、ファイル名)は、例えばオブジェクト管理ツリーに追加しておき、その関数が呼び出された場合は、オブジェクト管理ツリーに基づいてファイルをロードして、ロードした中間コードを使用してもよい。
また、実施例2において、削除する中間コードの選択基準としては、上述したように最近使われていないもの、一定期間内での頻度が少ないもの、最も古くに作成されたもの等から順に閾値以下となるまで処理を行うことが好ましいがこれに限定されるものではない。これにより、メモリ容量を使い過ぎないため、小さいメモリのデバイスで利用できる。
<実施例3>
実施例3では、中間コード作成時に作成時間を測定し、記憶した中間コードのメモリ量を管理する。また、作成された中間コードを記憶した場合のメモリ量を計算し、上限を超えていた場合、作成時間に基づいて記憶されている中間コードの少なくとも1つを削除する。
中間コードの作成にかかる時間は、作成しようとしているソースコードの内容によって異なる。そのため、実施例3では、中間コード管理部18において、中間コードを作成にかかった時間を管理し、削除が必要なときにはその時間情報を使って対象を選択する。この時間情報は、例えば上述した関数使用表を使って管理してもいいし、オブジェクト管理ツリーを使って管理してもよい。作成時間が短いものは、再度作ったとしても速度面で負担にはならない。
これにより、メモリ容量を使い過ぎないため、小さいメモリ容量を有するデバイスでも利用できる。また、中間コードの作成に時間がかかるものを再作成しないことで高速化が望める。
<実施例4>
実施例4では、デバイス(情報処理装置10)のCPU負荷を用いて中間コードの作成や削除の対象を管理する。JavaScriptの関数は、ユーザ操作があった場合や通信によりデータを受け取った場合、センサから情報を受け取った場合等、何かのイベントを受けて呼び出されることが多く、またイベントの発生は複数で連動することが多い。例えば、ユーザがデバイスを操作しているときはタッチやスワイプといった操作のイベント等と連続して発生することが考えられる。逆に、1分に一回しか呼ばれないタイマイベント等も考えられる。
このような場合、前者の方が頻繁に関数を呼び出すことになり、反応を早くするために、より速い動作をすることが望ましく、後者は前者に比べると遅くてもいい。したがって、実施例4では、CPU負荷を見て、CPU負荷が高い部分については中間コードを使用するのが好ましい。また、実施例では、関数が呼び出された場合のCPU負荷を管理し、CPU負荷が低い時に呼び出された関数は削除する。更に、実施例4では、逆に何度も呼び出された場合のみ、中間コードを記憶する方法をとってもよい。これは、関数の呼ばれた回数を関数使用表等で管理することで実現できる。
<実施例5>
例えば、中間コードを作るのに時間がかかるので、あまり呼び出されない場合は作るほうが遅くなる。そのため、実施例5では、関数に所定のコメント情報を付けておき、そのコメント情報に基づいて中間コードを作成するか否かを決定する。例えば、実施例5では、例えばソースコード中にコメントで決まりを作ったり(例えば関数の前に「//@nogen」を付与する等)、関数名に決まりを作る(例えば関数名の最後に「nogen」を付与する等)。
例えば、実施例5では、ユーザ(開発者等)が中間表現を記憶しない関数を指定する。この場合、JavaScriptの特徴である汎用性(JavaScriptエンジンがあればどこでも動作する)が阻害されてはいけない。したがって、例えば、コメントとして、情報を記述する。もしくは関数名の命名方法に決まりを作る方法がある。この方法を使った場合、以下のようになる。
// @nogen
function func1(param) {
return param + 1;
}
function func2(param) {
return param + 2;
}
function func3_nogen(param) {
return param + 3;
}
上述した例は、「@nogen」とついたコメントが付いているfunc1は中間コードを記憶せず、関数名に「_nogen」が付いているfunc3_nogenも中間コードにしないことを意味する。実施例5の処理は、例えば中間コードを作成しないことを示す情報を、オブジェクト管理ツリーを拡張して管理することで実現できる。また、実施例5は、ユーザ(開発者等)が設定することでより効果的な方法を設定することができる。これにより、無駄な中間コードを作成しないため、実行が速くなると共にメモリ使用量も減らすことができる。
<実施例6>
また、使われないコードの中間表現をとるのは無駄であるため、例えばほとんど実行される可能性のないエラー処理等については、何からの処理が必要となる。そこで、実施例6では、中間コード作成時に、実行しながら中間コードを作成する。その中間コードを作成する際は、実行時に通らなかった部分は、中間コードにしない(例えばif文で分岐した場合等)。
そして、実施例6では、通らなかった部分はソースコードのままにしておき、次回以降の呼び出しでその部分が実行された場合は、その部分の中間言語を作成する。
例えば、実施例6では、まず関数全体について中間コードを作成し、次にその中間コードを実行する。しかしながら、インタプリタが逐次解釈して実行することを繰り返すのと同様に行うことも可能である。そして、実施例6の方法を取る場合、一部の中間コードのみを作成することが可能である。例えば、以下のような関数があるとする。
function func4(a) {
if (a > 0) {
return a;
} else {
return -a;
}
var result = func4(-1);
この場合、最後の行「var result = func4(-1);」で引数−1を持って関数呼び出しがされ、関数func4のソースコードを取得する。そして、最初の行を解釈し<分岐><条件<変数(a)><比較(>)><整数(0)>>となり、これを中間表現とする。次に、実行中なので、この結果も算出できる。aには−1が入っているため、else側のみ中間表現とする。<条件付き実行(else)><戻り値><計算(−)><変数(a)>と解釈し、これだけの中間表現を作成する。そして、実行としては、1を返却することになる。このように、部分のみを作ることが可能になる。関数の中には、ほとんど使われない部分がある。そのような部分を中間コードにすることを防止し、メモリを有効利用できる。なお、もし、a=1だった場合等、逆の条件の実行が必要な場合は、そのときにその部分のみ中間コードを作成して追加することで対応することができる。これにより、無駄な中間コードを作成しないため、実行が速くなると同時にメモリ使用量も減る。
上述したように本実施形態によれば、効率的にプログラムを実行することができる。また、本実施形態によれば、例えば使用メモリ量に応じて中間表現を作成したり、削除したりすることで、中間表現作成時にメモリ容量を測定し管理することができる。
例えば、最初の関数の呼び出し時には、中間表現を作成する処理を行うが、2度目以降の呼び出し時にパーズする必要がない。そのため、例えば小型デバイス等で動作する単純な動作のスクリプトエンジンを効率的に動作させることができる。また、本実施形態によれば、中間表現の作成によってメモリ使用量が増えすぎるのを防止することができる。また、本実施形態によれば、アプリやプログラム全体をコンパイルするのに比べて、メモリの使用量は小さくなる。
以上、実施例について詳述したが、特定の実施例に限定されるものではなく、特許請求の範囲に記載された範囲内において、種々の変形及び変更が可能である。また、上述した各実施例の一部又は全部を組み合わせることも可能である。
なお、以上の実施例に関し、更に以下の付記を開示する。
(付記1)
読み込んだソースコードの解析と実行とを繰り返してプログラム処理を行う際、
前記ソースコード内に関数の定義が含まれる場合に、前記関数を識別する関数名と、前記関数に対応するソースコードの中間表現とを対応付けて記憶し、
前記関数を呼び出す場合に、前記関数に対応する前記中間表現が記憶されているか否かを判断し、
対応する前記中間表現が記憶されている場合は、記憶された前記中間表現を用いて前記関数に対応する処理を実行し、
対応する前記中間表現が記憶されていない場合は、前記関数に対応するソースコードを解析して中間表現を作成する、
処理をコンピュータに実行させるための処理実行プログラム。
(付記2)
前記中間表現により使用される記憶部の使用量を管理し、
作成した前記中間表現を記憶した場合の前記使用量が所定の閾値以上である場合に、記憶された少なくとも1つの中間表現を削除することを特徴とする付記1に記載の処理実行プログラム。
(付記3)
前記中間表現の利用状況を管理し、
前記利用状況に応じて前記記憶部から削除する中間表現を選択することを特徴とする付記2に記載の処理実行プログラム。
(付記4)
前記中間表現の作成時間を管理し、
前記作成時間に応じて前記記憶部から削除する中間表現を選択することを特徴とする付記2に記載の処理実行プログラム。
(付記5)
前記ソースコード内に含まれる関数の実行時における情報処理装置のCPU負荷に基づいて、前記中間表現を作成するか否かを判断することを特徴とする付記1乃至4の何れか1項に記載の処理実行プログラム。
(付記6)
前記ソースコードに含まれるコメント情報に基づいて前記中間表現を作成するか否かを判断することを特徴とする付記1乃至5の何れか1項に記載の処理実行プログラム。
(付記7)
前記中間表現の作成時に、前記関数の全体ではなく、初回の実行時に使った部分のみの中間表現を作成し、
次回の呼び出し以降で別の部分を実行した場合に、前記別の部分の中間表現を作成することを特徴とする付記1乃至6の何れか1項に記載の処理実行プログラム。
(付記8)
前記ソースコードに含まれる関数をコールバック関数として登録し、所定のイベントに対応させて登録した関数を呼び出して処理を実行することを特徴とする付記1乃至7の何れか1項に記載の処理実行プログラム。
(付記9)
情報処理装置が、
読み込んだソースコードの解析と実行とを繰り返してプログラム処理を行う際、
前記ソースコード内に関数の定義が含まれる場合に、前記関数を識別する関数名と、前記関数に対応するソースコードの中間表現とを対応付けて記憶し、
前記関数を呼び出す場合に、前記関数に対応する前記中間表現が記憶されているか否かを判断し、
対応する前記中間表現が記憶されている場合は、記憶された前記中間表現を用いて前記関数に対応する処理を実行し、
対応する前記中間表現が記憶されていない場合は、前記関数に対応するソースコードを解析して中間表現を作成する、
ことを特徴とする処理実行方法。
(付記10)
読み込んだソースコードの解析と実行とを繰り返してプログラム処理を行う際、前記ソースコード内に関数の定義が含まれる場合に、前記関数を識別する関数名と、前記関数に対応するソースコードの中間表現とを対応付けて管理する関数情報管理部と、
前記関数を呼び出す場合に、前記関数に対応する前記中間表現が記憶されているか否かを判断し、対応する前記中間表現が記憶されている場合は、記憶された前記中間表現を用いて前記関数に対応する処理を実行し、対応する前記中間表現が記憶されていない場合は、前記関数に対応するソースコードを解析して中間表現を作成する中間表現管理部とを有することを特徴とする情報処理装置。
10 情報処理装置
11 記憶部
12 ロード部(読み込み部)
13 パーズ部(解析部)
14 実行部
15 関数定義抽出部
16 関数コール抽出部
17 関数情報管理部
18 中間コード管理部(中間表現管理部)
21 ソースコード
31 中間コード作成部
32 中間コード削除部
33 メモリ管理部
34 利用状況管理部
41 入力装置
42 出力装置
43 ドライブ装置
44 補助記憶装置
45 主記憶装置
46 CPU
47 ネットワーク接続装置
48 記録媒体
51 ライブラリ
52 オブジェクト管理ツリー

Claims (8)

  1. 読み込んだソースコードの解析と実行とを繰り返してプログラム処理を行う際、
    前記ソースコードに含まれる関数をコールバック関数として登録し、
    前記ソースコード内に関数の定義が含まれる場合に、前記関数を識別する関数名と、前記関数に対応するソースコードの中間表現とを対応付けて記憶し、
    所定のイベントに対応させて登録した前記コールバック関数を呼び出した場合に、前記関数に対応する前記中間表現が記憶されているか否かを判断し、
    対応する前記中間表現が記憶されている場合は、記憶された前記中間表現を用いて前記関数に対応する処理を実行し、
    対応する前記中間表現が記憶されていない場合は、前記関数に対応するソースコードを解析して中間表現を作成する、
    処理をコンピュータに実行させるための処理実行プログラム。
  2. 前記中間表現により使用される記憶部の使用量を管理し、
    作成した前記中間表現を記憶した場合の前記使用量が所定の閾値以上である場合に、記憶された少なくとも1つの中間表現を削除することを特徴とする請求項1に記載の処理実行プログラム。
  3. 前記中間表現の利用状況を管理し、
    前記利用状況に応じて前記記憶部から削除する中間表現を選択することを特徴とする請求項2に記載の処理実行プログラム。
  4. 前記中間表現の作成時間を管理し、
    前記作成時間に応じて前記記憶部から削除する中間表現を選択することを特徴とする請求項2に記載の処理実行プログラム。
  5. 前記ソースコード内に含まれる関数の実行時における情報処理装置のCPU負荷に基づいて、前記中間表現を作成するか否かを判断することを特徴とする請求項1乃至4の何れか1項に記載の処理実行プログラム。
  6. 前記ソースコードに含まれるコメント情報に基づいて前記中間表現を作成するか否かを判断することを特徴とする請求項1乃至5の何れか1項に記載の処理実行プログラム。
  7. 情報処理装置が、
    読み込んだソースコードの解析と実行とを繰り返してプログラム処理を行う際、
    前記ソースコードに含まれる関数をコールバック関数として登録し、
    前記ソースコード内に関数の定義が含まれる場合に、前記関数を識別する関数名と、前記関数に対応するソースコードの中間表現とを対応付けて記憶し、
    所定のイベントに対応させて登録した前記コールバック関数を呼び出した場合に、前記関数に対応する前記中間表現が記憶されているか否かを判断し、
    対応する前記中間表現が記憶されている場合は、記憶された前記中間表現を用いて前記関数に対応する処理を実行し、
    対応する前記中間表現が記憶されていない場合は、前記関数に対応するソースコードを解析して中間表現を作成する、
    ことを特徴とする処理実行方法。
  8. 読み込んだソースコードの解析と実行とを繰り返してプログラム処理を行う際、前記ソースコードに含まれる関数をコールバック関数として登録する登録部と、
    前記ソースコード内に関数の定義が含まれる場合に、前記関数を識別する関数名と、前記関数に対応するソースコードの中間表現とを対応付けて管理する関数情報管理部と、
    所定のイベントに対応させて登録した前記コールバック関数を呼び出した場合に、前記関数に対応する前記中間表現が記憶されているか否かを判断し、対応する前記中間表現が記憶されている場合は、記憶された前記中間表現を用いて前記関数に対応する処理を実行し、対応する前記中間表現が記憶されていない場合は、前記関数に対応するソースコードを解析して中間表現を作成する中間表現管理部とを有することを特徴とする情報処理装置。
JP2014101437A 2014-05-15 2014-05-15 処理実行プログラム、処理実行方法、及び情報処理装置 Active JP6379654B2 (ja)

Priority Applications (3)

Application Number Priority Date Filing Date Title
JP2014101437A JP6379654B2 (ja) 2014-05-15 2014-05-15 処理実行プログラム、処理実行方法、及び情報処理装置
EP15158074.3A EP2945057B1 (en) 2014-05-15 2015-03-06 Process execution method and information processing apparatus
US14/660,526 US9672016B2 (en) 2014-05-15 2015-03-17 Process execution method and information processing apparatus

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2014101437A JP6379654B2 (ja) 2014-05-15 2014-05-15 処理実行プログラム、処理実行方法、及び情報処理装置

Publications (2)

Publication Number Publication Date
JP2015219637A JP2015219637A (ja) 2015-12-07
JP6379654B2 true JP6379654B2 (ja) 2018-08-29

Family

ID=52824002

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2014101437A Active JP6379654B2 (ja) 2014-05-15 2014-05-15 処理実行プログラム、処理実行方法、及び情報処理装置

Country Status (3)

Country Link
US (1) US9672016B2 (ja)
EP (1) EP2945057B1 (ja)
JP (1) JP6379654B2 (ja)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20190391806A1 (en) * 2016-12-19 2019-12-26 Nippon Telegraph And Telephone Corporation Determination apparatus, determination method, and determination program
CN107908407B (zh) * 2017-12-11 2021-09-07 北京奇虎科技有限公司 编译方法、装置及终端设备
JP6705848B2 (ja) * 2018-02-16 2020-06-03 ファナック株式会社 制御装置及び制御システム
US20200218584A1 (en) * 2019-01-03 2020-07-09 International Business Machines Corporation Identifying and demarcating application transactions in an event loop based runtime
US11537093B2 (en) * 2019-03-08 2022-12-27 Citizen Watch Co., Ltd. Mobile device and mobile device system
JP6755538B1 (ja) * 2019-10-29 2020-09-16 株式会社Shift 実行プログラム、入力支援プログラム、及びコード読込式ロボット
WO2023233630A1 (ja) * 2022-06-02 2023-12-07 日本電気株式会社 演算装置、演算方法、および、記録媒体

Family Cites Families (28)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5822591A (en) * 1996-08-29 1998-10-13 Hewlett-Packard Company Virtual code system
US6842894B1 (en) * 1999-04-05 2005-01-11 Gateway, Inc. Dynamic Compiling
US6457176B1 (en) * 1999-06-25 2002-09-24 International Business Machines Corporation System and method for source code processing
JP2002163115A (ja) 2000-11-29 2002-06-07 Toshiba Corp 仮想機械用プログラムのコンパイル対象指定方法、同プログラムのコンパイル対象判定方法、仮想機械実行方法、事前コンパイル方法、コンピュータ、記録媒体、及びプログラム製品
FI20002720A (fi) * 2000-12-12 2002-06-13 Nokia Corp Menetelmä konversioiden suorittamiseksi
KR100506522B1 (ko) * 2003-02-24 2005-08-03 삼성전자주식회사 자바 프로그램에서 바이트 코드의 컴파일 시간 단축시스템 및 방법
US7103723B2 (en) * 2003-02-25 2006-09-05 Intel Corporation Priority-based code cache management
US7406687B1 (en) * 2004-03-17 2008-07-29 Sun Microsystems, Inc. Sharing runtime representation of software component methods across component loaders
US7617495B2 (en) * 2004-03-24 2009-11-10 Intel Corporation Resource-aware scheduling for compilers
JP2007179153A (ja) * 2005-12-27 2007-07-12 Toshiba Corp スクリプトプログラム実行装置、スクリプトプログラム実行方法及び光ディスク装置
JP5167589B2 (ja) * 2006-02-13 2013-03-21 富士通株式会社 アプリケーションサーバ装置および仮想マシンプログラム
US8464207B2 (en) * 2007-10-12 2013-06-11 Novell Intellectual Property Holdings, Inc. System and method for tracking software changes
US8181167B2 (en) * 2008-01-09 2012-05-15 Kan Zhao Method and system for presenting and analyzing software source code through intermediate representation
JP2009187285A (ja) * 2008-02-06 2009-08-20 Panasonic Corp プログラム変換方法、プログラム変換装置およびプログラム
JP2009211190A (ja) 2008-02-29 2009-09-17 Hitachi Ltd 情報処理装置
US8397225B2 (en) * 2008-04-24 2013-03-12 International Business Machines Corporation Optimizing just-in-time compiling for a java application executing on a compute node
US9250938B2 (en) * 2008-10-15 2016-02-02 Microsoft Technology Licensing, Llc Caching runtime generated code
US8375377B2 (en) * 2009-03-06 2013-02-12 International Business Machines Corporation Controlling java virtual machine component behavior on a per-classloader basis
US8683319B2 (en) * 2009-10-06 2014-03-25 Telefonaktiebolaget L M Ericsson (Publ) Shared script files in multi-tab browser
JP4912452B2 (ja) * 2009-11-27 2012-04-11 インターナショナル・ビジネス・マシーンズ・コーポレーション 動的型付け言語で記述されたソースコードを静的型付け言語で記述されたターゲットコードに変換し、実行する方法、並びにそのコンピュータ・プログラム及びコンピュータ・システム
WO2011072970A1 (en) * 2009-12-18 2011-06-23 Syddansk Universitet Method, computer program product, and system for non-blocking dynamic update of statically typed class-based object-oriented software
US9003380B2 (en) * 2010-01-12 2015-04-07 Qualcomm Incorporated Execution of dynamic languages via metadata extraction
US8924924B2 (en) * 2010-03-29 2014-12-30 Microsoft Corporation Representing the structure of a data format using a class-based representation
US20110265069A1 (en) * 2010-04-21 2011-10-27 Salesforce.Com Methods and systems for execution of tenant code in an on-demand service environment including utilization of shared resources and inline governor limit enforcement
US9038038B1 (en) * 2010-06-01 2015-05-19 Google Inc. Just in time cloud compilation
US20120072891A1 (en) * 2010-09-17 2012-03-22 Joseph Raymond Hewitt Computer Language Syntax for Automatic Callback Function Generation
US8555264B2 (en) * 2011-01-14 2013-10-08 Oracle International Corporation System and method for efficient compilation and invocation of function type calls
US20150212803A1 (en) * 2013-05-24 2015-07-30 Google Inc. Systems and methods for optimizing source code compiling

Also Published As

Publication number Publication date
EP2945057A1 (en) 2015-11-18
US20150331678A1 (en) 2015-11-19
US9672016B2 (en) 2017-06-06
EP2945057B1 (en) 2019-02-27
JP2015219637A (ja) 2015-12-07

Similar Documents

Publication Publication Date Title
JP6379654B2 (ja) 処理実行プログラム、処理実行方法、及び情報処理装置
US10152309B2 (en) Cross-library framework architecture feature sets
US8997070B2 (en) Extension mechanism for scripting language compiler
EP2992431B1 (en) Activity based sampling of diagnostics data
JP7324831B2 (ja) ディープラーニングフレームワークにおける演算子の展開方法、展開装置及び電子機器
US8209674B2 (en) Tier splitting support for distributed execution environments
US8627298B2 (en) Using appropriate level of code to be executed in runtime environment using metadata describing versions of resources being used by code
US11474797B2 (en) Generating closures from abstract representation of source code
US9292446B2 (en) Speculative prefetching of remote data
US9684493B2 (en) R-language integration with a declarative machine learning language
US20090328016A1 (en) Generalized expression trees
WO2018236558A1 (en) DIFFERENTIATED STATIC ANALYSIS FOR DYNAMIC CODE OPTIMIZATION
Garbervetsky et al. Toward full elasticity in distributed static analysis: The case of callgraph analysis
US20110276983A1 (en) Automatic return to synchronization context for asynchronous computations
JP7389246B2 (ja) 依存グラフ生成方法、装置、機器、記憶媒体、及びプログラム製品
JP2007193423A (ja) プログラム処理装置、並列処理プログラム、プログラム処理方法、並列処理コンパイラおよび並列処理コンパイラを格納した記録媒体
US8572585B2 (en) Using compiler-generated tasks to represent programming elements
US11429358B2 (en) Representing asynchronous state machine in intermediate code
CN112882698A (zh) 开发环境的生成方法及装置、计算机存储介质及电子设备
US11689630B2 (en) Request processing method and apparatus, electronic device, and computer storage medium
EP4083785B1 (en) Profiling and optimization of compiler-generated code
Cascaval et al. Concurrency in mobile browser engines
Ramanujam et al. Floo: automatic, lightweight memoization for faster mobile apps
CN117573277A (zh) 微信小程序页面动态化方法、系统、设备及储存介质
Anderson et al. A Limit Study of JavaScript Parallelism

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20170206

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20171108

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20171114

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20171225

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20180403

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20180514

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20180703

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20180716

R150 Certificate of patent or registration of utility model

Ref document number: 6379654

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150