(57)【特許請求の範囲】
【請求項１】
第１のプログラムから呼び出される関係にある第２のプログラムを受付け、
受付けた前記第２のプログラムを、前記第２のプログラムの実行に伴って使用されるリソースを初期化する初期化命令と前記第１のプログラムに戻る復帰命令とをエラーが発生した場合に実行する命令と、最終的な戻り先への復帰を開始する命令とを含むプログラムに変換するとともに、前記第１のプログラムを、前記最終的な戻り先を登録する命令を含むプログラムに変換し、
変換された各プログラムと所定の関数群とを連携させた実行ファイルを実行し、
エラーが発生した場合に、エラーを発生させた実行ファイル内のプログラムに記述される前記初期化命令に基づいてリソースを初期化する場合に、該プログラムのスタック環境値を退避させ、退避させたスタック環境値と前記最終的な戻り先として登録されたスタック環境値とを比較し、一致しない場合は前記復帰命令に基づいて呼出元のプログラムに戻り、一致する場合は前記スタック環境値によって特定される戻りアドレスに制御を移す
各処理をさらにコンピュータに実行させることを特徴とする実行制御プログラム。
【請求項２】
第１のプログラムから呼び出される関係にある第２のプログラムを受付け、
受付けた前記第２のプログラムを、前記第２のプログラムの実行に伴って使用されるリソースを初期化する初期化命令と、前記第１のプログラムに戻る復帰命令とをエラーが発生した場合に実行する命令とを含むプログラムに変換し、
変換されたプログラムと所定の関数群とを連携させた実行ファイルを実行し、
実行した実行ファイル内で最終的な戻り先として指定されたプログラム内に、該プログラムが実行されたときのスタック環境の値を登録し、
エラーが発生した場合に、エラーを発生させた実行ファイル内のプログラムに記述される初期化命令に基づいてリソースを初期化し、該プログラム内に前記スタック環境の値が登録されていない場合には、該プログラムに記述される復帰命令に基づいて呼出元のプログラムに戻り、
呼出元のプログラム内に前記スタック環境の値が登録されていない場合には、前記初期化命令と前記復帰命令を実行し、
呼出元のプログラム内に前記スタック環境の値が登録されている場合には、前記初期化命令を実行するとともに、前記スタック環境の値によって特定される戻りアドレスに制御を移す、
各処理をさらにコンピュータに実行させることを特徴とする実行制御プログラム。
【請求項３】
第１のプログラムから呼び出される関係にある第２のプログラムを受付ける受付部と、
前記受付部によって受け付けられた前記第２のプログラムを、前記第２のプログラムの実行に伴って使用されるリソースを初期化する初期化命令と前記第１のプログラムに戻る復帰命令とをエラーが発生した場合に実行する命令と、最終的な戻り先への復帰を開始する命令とを含むプログラムに変換するとともに、前記第１のプログラムを、前記最終的な戻り先を登録する命令を含むプログラムに変換する変換部と、
前記変換部が変換した各プログラムと所定の関数群とを連携させた実行ファイルを実行する実行制御部と、
エラーが発生した場合に、エラーを発生させた実行ファイル内のプログラムに記述される前記初期化命令に基づいてリソースを初期化する場合に、該プログラムのスタック環境値を退避させ、退避させたスタック環境値と前記最終的な戻り先として登録されたスタック環境値とを比較し、一致しない場合は前記復帰命令に基づいて呼出元のプログラムに戻り、一致する場合は前記スタック環境値によって特定される戻りアドレスに制御を移すエラー処理部と
有することを特徴とする実行制御装置。
【請求項４】
コンピュータが、
第１のプログラムから呼び出される関係にある第２のプログラムを受付け、
受け付けた前記第２のプログラムを、前記第２のプログラムの実行に伴って使用されるリソースを初期化する初期化命令と前記第１のプログラムに戻る復帰命令とをエラーが発生した場合に実行する命令と、最終的な戻り先への復帰を開始する命令とを含むプログラムに変換るとともに、前記第１のプログラムを、前記最終的な戻り先を登録する命令を含むプログラムに変換し、
変換した各プログラムと所定の関数群とを連携させた実行ファイルを実行し、
エラーが発生した場合に、エラーを発生させた実行ファイル内のプログラムに記述される前記初期化命令に基づいてリソースを初期化する場合に、該プログラムのスタック環境値を退避させ、退避させたスタック環境値と前記最終的な戻り先として登録されたスタック環境値とを比較し、一致しない場合は前記復帰命令に基づいて呼出元のプログラムに戻り、一致する場合は前記スタック環境値によって特定される戻りアドレスに制御を移す
処理を含んだことを特徴とする実行制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、実行制御プログラム、コンパイラ、実行制御装置および実行制御方法に関する。
【背景技術】
【０００２】
近年、システム規模の大規模化や顧客ニーズの複雑化などのシステム要求に対応するために、プログラム内で他のプログラムを呼び出して実行し、複数のプログラムを連携して実行させる大規模プログラムが利用されている。例えば、プログラムを連携させる例を挙げると、プログラムＡが実行されると、プログラムＡ内でプログラムＢが呼び出されて実行され、プログラムＢが実行されると、プログラムＢ内でプログラムＣが呼び出されて実行される大規模プログラムなどがある。
【０００３】
このような大規模プログラムでエラーが発生した場合に、呼び出された側の下位プログラム内に、呼び出し元の上位プログラムへの分岐を記述しておくことで、下位プログラムから上位プログラムへ復帰させる方法が知られている。例えば、ＣＯＢＯＬであれば、ＧＯＴＯ文を用いてプログラム内へ復帰させ、Ｃ言語であれば、ｓｅｔｊｍｐ関数やｌｏｎｇｊｍｐ関数などで上位プログラムへ復帰させる方法が用いられる。
【０００４】
この方法の場合、復帰して再実行させる前に、実行済みプログラムで使用されたデータやファイルなどのリソースを初期化することが、管理者やオペレータ等によって行われる。これは、メモリリークやファイルの２重オープンエラーなどを防止するためである。
【０００５】
また、複数の下位プログラムを呼び出すプログラムを多く含む大規模プログラムでは、エラーが発生したプログラムの上位プログラムだけを再実行しても、処理が正常に終了しない場合もある。このような場合には、大規模プログラム全体を終了させて、大規模プログラムを最初から再実行することも行われている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平０２−０７９１２５号公報
【特許文献２】特開昭５９−１３５５５１号公報
【特許文献３】特開平０６−１６８１２４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、従来技術では、エラーが発生したプログラムを再実行させるまでに時間がかかるという問題がある。
【０００８】
例えば、上位プログラムへ復帰させる方法では、エラーが発生したプログラムを再実行する前に、リソースを初期化する別プログラムを管理者等が作成して実行することになる。プログラムが連携して実行される場合には、データの更新履歴を特定するとともに、ファイルがどのタイミングでオープンされたかを特定した上で、リソース初期化用のプログラムを生成して実行することになる。したがって、エラーが発生したプログラムを再実行する前準備に時間がかかる。
【０００９】
また、最初から再実行する方法では、近年の複雑な大規模プログラム全体を正常に終了させるのに時間がかかるので、再実行までに多くの時間がかかる。また、大規模プログラム全体が正常に終了しなかった場合には、当該大規模プログラム自体を再実行できなくなる危険性もある。
【００１０】
１つの側面として、エラーが発生したプログラムを再実行させるまでにかかる時間を抑制することを目的とする。
【課題を解決するための手段】
【００１１】
第１の案では、コンピュータに、第１のプログラムから呼び出される関係にある第２のプログラムを受付ける処理を実行させる。コンピュータに、受付けた前記第２のプログラムを、前記第２のプログラムの実行に伴って使用されるリソースを初期化する初期化命令含むプログラムに変換する処理を実行させる。コンピュータに、前記第１のプログラムに戻る復帰命令とをエラーが発生した場合に実行する命令とを含むプログラムに変換する処理を実行させる。
【発明の効果】
【００１２】
エラーが発生したプログラムを再実行させるまでにかかる時間を抑制することができる。
【図面の簡単な説明】
【００１３】
【図１】図１は、実施例１にかかるコンパイラと実行制御装置とを示す図である。
【図２】図２は、実施例２に係る情報処理装置の構成を示す機能ブロック図である。
【図３】図３は、リソーステーブルが記憶する情報の例を示す図である。
【図４】図４は、分岐箇所登録部が登録するスタック環境値の例を示す図である。
【図５】図５は、実行対象のプログラム例を示す図である。
【図６】図６は、コンパイル後のオブジェクトコード例を示す図である。
【図７】図７は、プログラムの実行例を示す図である。
【図８】図８は、コンパイル実行時の処理の流れを示すフローチャートである。
【図９】図９は、プログラム実行時の処理の流れを示すフローチャートである。
【図１０】図１０は、エラー処理の流れを示すフローチャートである。
【図１１】図１１は、実施例３に係る実行対象のプログラム例を示す図である。
【図１２】図１２は、実施例３に係るコンパイル後のオブジェクトコード例を示す図である。
【図１３】図１３は、実行制御プログラムを実行するコンピュータのハードウェア構成例を示す図である。
【発明を実施するための形態】
【００１４】
以下に、本願の開示する実行制御プログラム、コンパイラ、実行制御装置および実行制御方法の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
【実施例１】
【００１５】
図１は、実施例１に係るコンパイラと実行制御装置とを示す図である。ここでは、コンパイラと実行制御装置とを別々の装置である場合を図示したが、これに限定されるものではなく、１つの筐体で実現することもできる。
【００１６】
図１に示すように、コンパイラ１は、受付部１ａと変換部１ｂとを有し、入力されたプログラムをコンパイルする装置である。受付部１ａは、第１のプログラムから呼び出される関係にある第２のプログラムを受付け処理部である。変換部１ｂは、受付けた第２のプログラムを、第２のプログラムの実行に伴って使用されるリソースを初期化する初期化命令と、第１のプログラムに戻る復帰命令とをエラーが発生した場合に実行する命令とを含むプログラムに変換する処理部である。ここで初期化命令とは、当該プログラムの実行に伴って使用されたリソースを初期化する命令である。復帰命令とは、当該プログラムを呼び出した呼出元のプログラムに戻る命令である。
【００１７】
実行制御装置２は、実行制御部２ａとエラー処理部２ｂとを有し、コンパイルされたプログラムを実行する装置である。実行制御部２ａは、コンパイラ１によって上記命令が追記されたプログラムと所定の関数群とを連携させた実行ファイルを実行する処理部である。エラー処理部２ｂは、エラーが発生した場合に、エラーを発生させた実行ファイル内のプログラムに記述される初期化命令に基づいてリソースを初期化し、該プログラムに記述される復帰命令に基づいて呼出元のプログラムに戻る処理部である。
【００１８】
このように、実施例１に係るコンパイラ１は、コンパイル時に、リソースの初期化命令と復帰命令とをプログラム内に追記する。実行制御装置２は、エラーが発生したプログラムから、リソースを初期化しつつ呼出元のプログラムに戻ることができる。したがって、エラーが発生したプログラムを再実行する前準備を短縮できる。また、プログラム全体を停止させなくても、プログラムを再実行することができる。この結果、エラーが発生したプログラムを再実行させるまでにかかる時間を短縮することができる。
【実施例２】
【００１９】
次に、実施例２では、コンパイラと実行制御装置とを１つの筐体で実現する例を説明する。ここでは、コンパイラの処理部と実行制御装置の処理部とを有する情報処理装置の機能ブロック図、処理の具体例、処理の流れ等を説明する。
【００２０】
（情報処理装置の構成）
図２は、実施例２に係る情報処理装置の構成を示す機能ブロック図である。図２に示すように、実施例２に係る情報処理装置１０は、入出力インタフェース部１１とＨＤＤ（ハードディスクドライブ）１２とメモリ１３とプロセッサ１４とを有するコンピュータである。なお、情報処理装置１０は、図２に示した処理部以外の処理部を有してもよい。例えば、情報処理装置１０は、マウスなどの入力部、ディスプレイなどの表示部、ハードディスクなどの記憶装置等を有していてもよい。
【００２１】
入出力インタフェース部１１は、ＣＯＢＯＬプログラムの入力を受け付ける処理部である。例えば、入出力インタフェース部１１は、ネットワークカードなどを有し、ネットワークを介してＣＯＢＯＬプログラムを受け付ける。また、入出力インタフェース部１１は、記憶媒体読取装置を有し、入力された記憶媒体からＣＯＢＯＬプログラムを読み取る。
【００２２】
ＨＤＤ１２は、ソースコード１２ａとオブジェクトコード１２ｂとを記憶する記憶装置である。オブジェクトコード１２ｂは、情報処理装置１０が実行するオブジェクトコードであり、コンパイル部１５によって格納される。
【００２３】
メモリ１３は、プロセッサが実行するプログラムを記憶するとともに、実行ファイル１３ａとスタック環境値１３ｂとを記憶する記憶装置である。また、メモリ１３は、リソーステーブル１３ｃと作業領域１３ｄとを有する。なお、作業領域１３ｄは、プロセッサ１４、コンパイル部１５、生成部１６、実行制御部１７等が処理を実行する際に使用する一時領域である。
【００２４】
実行ファイル１３ａは、オブジェクトコード１２ｂとランタイムシステム１８に記憶される該当ランタイム等とを連携させた実行可能な形式のロードモジュール、すなわちＣＯＢＯＬアプリケーションであり、生成部１６によって格納される。スタック環境値１３ｂは、ランタイムシステム１８がオブジェクトコード内に登録したレジスタの値などであり、分岐箇所登録部１８ａによって格納される。
【００２５】
リソーステーブル１３ｃは、ＣＯＢＯＬプログラムの各オブジェクトコード、すなわち各ロードモジュールが使用したリソースを記憶するテーブルである。図３は、リソーステーブルが記憶する情報の例を示す図である。図３に示すように、リソーステーブル１３ｃは、ランタイム管理域にファイル管理情報とデータ域管理情報とを対応付けて記憶する。ランタイム管理域は、ランタイムシステム１８が管理する領域を示し、当該領域内でファイル管理情報とデータ域情報を管理する。
【００２６】
ファイル管理情報は、「ファイル名、プログラム名」を対応付けて記憶する。ここで記憶される「ファイル名」は、プログラムが使用したファイルの名称であり、「プログラム名」は、ファイルを使用したプログラム名である。図３の場合、プログラム「ＰＧＭＡ」がファイル「Ａ．ＴＸＴ」を使用したことを示す。データ域管理情報は、「データ域アドレス、プログラム名」を対応付けて記憶する。ここで記憶される「データ域アドレス」は、プログラムが使用したデータのアドレスであり、「プログラム名」は、データを使用したプログラムの名称である。図３の場合、プログラム「ＰＧＭＡ」が、アドレス「0xaaaaaaa」に記憶されるデータを使用したことを示す。
【００２７】
図２に戻り、プロセッサ１４は、ＯＳ（Operating  System）などを実行し、情報処理装置１０全体の処理を司る処理部であり、コンパイル部１５と生成部１６と実行制御部１７とを有する。
【００２８】
コンパイル部１５は、入力部１５ａと変換部１５ｂとを有し、ＣＯＢＯＬプログラムのコンパイルを実行する処理部である。入力部１５ａは、入出力インタフェース部１１によって受け付けられたＣＯＢＯＬプログラムを変換部１５ｂに渡す。
【００２９】
変換部１５ｂは、入力したプログラムを、エラーが発生した場合に実行する命令として初期化命令と復帰命令とを追加したオブジェクトコードに変換する処理部である。例えば、変換部１５ｂは、入力部１５ａから渡されたソースコード１２ａを読み込む。そして、変換部１５ｂは、プログラムをオブジェクトコードに変換する際に、エラー時にランタイムシステム１８に実行させる命令として、リソースの初期化命令と復帰命令とを追記して、ＨＤＤ１２に格納する。
【００３０】
生成部１６は、オブジェクトコードを連結させて、情報処理装置１０が実行可能な形式である実行ファイルを生成する処理部である。例えば、生成部１６は、ＨＤＤ１２に記憶されるオブジェクトコード１２ｂを読み出して連結させて実行可能な形式に変換する。また、生成部１６は、連結させた各オブジェクトコードに対して、オブジェクトコードの実行に使用する関数をランタイムシステム１８が管理する関数群から特定する。そして、生成部１６は、各オブジェクトコードについて、オブジェクトコードと関数とを連携させたロードモジュールを生成する。その後、生成部１６は、各オブジェクトコードから生成された各ロードモジュールを実行ファイル１３ａとしてＨＤＤ等１２に格納する。
【００３１】
生成部１６は、コンパイル部１５からコンパイルが終了したことを通知された場合に、実行ファイルを生成してもよく、オペレータ等から指示された任意のタイミングで生成してもよい。
【００３２】
実行制御部１７は、実行部１７ａとランタイムシステム１８とを有し、これらによって生成部１６が生成した実行ファイルを実行する制御部である。実行部１７ａは、ＨＤＤ１２に格納される実行ファイルを読み出してメモリ１３に展開する。すなわち、実行部１７ａは、ＣＯＢＯＬプログラムを実行する。なお、実行部１７ａがＣＯＢＯＬプログラムを実行するタイミングと、コンパイル部１５がコンパイルを実行するタイミングとは、連続していなくてもよい。
【００３３】
ランタイムシステム１８は、ＣＯＢＯＬプログラムを実行する際に使用されるソフトウェアモジュールなどの関数群を有する。このランタイムシステム１８は、分岐箇所登録部１８ａとリソース管理部１８ｂと分岐処理部１８ｃとリソース初期化部１８ｄと復帰判定部１８ｅとを有する。なお、この各処理部は、ランタイムシステム１８が有する関数として実現することもできる。
【００３４】
分岐箇所登録部１８ａは、最終的な復帰先となるＣＯＢＯＬプログラム内の、スタック環境値を登録する処理部である。例えば、分岐箇所登録部１８ａは、実行部１７ａによって実行された実行ファイルのうち、ＳＥＴ  ＰＲＯＣが記述されているロードモジュールから呼び出される。すると、分岐箇所登録部１８ａは、呼び出したロードモジュールが実行されるときのレジスタ値や戻りアドレス等を抽出して、スタック環境値１３ｂに格納する。スタック環境値の格納が終了すると、分岐箇所登録部１８ａを読み出したロードモジュールに制御を戻す。
【００３５】
図４は、分岐箇所登録部１８ａが登録するスタック環境値の例を示す図である。図４に示すように、分岐箇所登録部は、「レジスタの値（ebp、esp、esi、ebx）、戻りアドレス」を対応付けて登録する。ここで登録される「レジスタの値」は、ロードモジュール内の「ＳＥＴ  ＰＲＯＣ」が呼び出されたときのレジスタの値である。「戻りアドレス」は、「ＳＥＴ  ＰＲＯＣ」を呼び出した次の命令に復帰するためのアドレスである。
【００３６】
リソース管理部１８ｂは、ＣＯＢＯＬプログラムの実行に伴って使用されたリソースを管理する処理部である。例えば、リソース管理部１８ｂは、実行ファイルが実行された場合に、当該実行ファイルが有する各ロードモジュールが使用したリソースを監視する。そして、リソース管理部１８ｂは、リソースが使用されると、使用されたリソースの情報をリソーステーブル１３ｃに格納する。
【００３７】
一例を挙げると、リソース管理部１８ｂは、実行ファイル内のロードモジュールであるＰＧＭＡＡがファイル「ＡＡＡ．ＴＸＴ」を使用した場合には、「ＡＡＡ．ＴＸＴ、ＰＧＭＡＡ」をリソーステーブル１３ｃのファイル管理情報に格納する。また、リソース管理部１８ｂは、実行ファイル内のロードモジュールであるＰＧＭＢＡがアドレス「ＢＢ」のデータを更新した場合には、「ＢＢ、ＰＧＭＢＡ」をリソーステーブル１３ｃのデータ域管理情報に格納する。
【００３８】
分岐処理部１８ｃは、実行ファイルの実行中にエラーを検出した場合に、リソースの初期化や呼出元への復帰を開始する処理部である。例えば、分岐処理部１８ｃは、エラーが発生したロードモジュールのスタック環境値を作業領域１３ｄに退避させる。そして、分岐処理部１８ｃは、リソース初期化部１８ｄに制御を依頼する。
【００３９】
リソース初期化部１８ｄは、プログラム内に記述されたリソース初期化命令に基づいてリソースの初期化を実行する処理部である。例えば、リソース初期化部１８ｄは、リソーステーブル１３ｃを参照し、ロードモジュールによってオープンされたファイルを特定し、特定したファイルをクローズする。また、リソース初期化部１８ｄは、リソーステーブル１３ｃを参照し、ロードモジュールによって更新されたデータを特定し、作業領域１３ｄ等を参照して当該データを更新前のデータに戻す。
【００４０】
復帰判定部１８ｅは、プログラム内に記述された復帰命令に基づいて呼出元のプログラムに復帰する処理部である。例えば、復帰判定部１８ｅは、ロードモジュール内に復帰命令が記述されている場合には、実行ファイル１３ａ等に基づいて、復帰先のロードモジュールを特定する。そして、復帰判定部１８ｅは、特定した復帰先のロードモジュールに対する制御に移行し、分岐処理部１８ｃやリソース初期化部１８ｄに制御を依頼する。
【００４１】
［具体例］
次に、図５から図７を用いて具体例を説明する。図５は、実行対象のプログラム例を示す図であり、図６は、コンパイル後のオブジェクトコード例を示す図であり、図７は、プログラムの実行例を示す図である。ここでは、最上位プログラムＡがサブプログラムＢを呼び出し、サブプログラムＢがさらにサブプログラムＣを呼び出すＣＯＢＯＬアプリケーションを例にして説明する。
【００４２】
図５に示すように、情報処理装置１０の入力部１５ａは、プログラムＡとプログラムＢとプログラムＣとを有するＣＯＢＯＬアプリケーションを受け付けて、変換部１５ｂに渡す。図５に示すように、プログラムＡには、「ＣＡＬＬ  “ＳＥＴ＿ＰＲＯＣ”」と「ＣＡＬＬ  “Ｂ”」とが記述される。「ＣＡＬＬ  “ＳＥＴ＿ＰＲＯＣ”」は、分岐箇所登録部１８ａを呼び出す命令であり、最終的な戻り先を示す情報である。「ＣＡＬＬ  “Ｂ”」は、プログラムＢを呼び出す命令である。
【００４３】
また、プログラムＢには、「ＣＡＬＬ  “Ｃ”」が記述される。「ＣＡＬＬ  “Ｃ”」は、プログラムＣを呼び出す命令である。プログラムＣには、「ＣＡＬＬ  “ＪＵＭＰ＿ＰＲＯＣ”」が記述される。「ＣＡＬＬ  “ＪＵＭＰ＿ＰＲＯＣ”」は、分岐処理部１８ｃを呼び出す命令であり、最終的な戻り先への復帰を開始することを示す情報である。
【００４４】
続いて、情報処理装置１０の変換部１５ｂは、入力部１５ａから渡されたソースコード１２ａをオブジェクトコード１２ｂに変換して、ＨＤＤ１２に格納する。例えば、変換部１５ｂは、図５に示したプログラムＡ、プログラムＢ、プログラムＣ各々を、図６に示したオブジェクトＡ、オブジェクトＢ、オブジェクトＣ各々に変換する。
【００４５】
具体的に説明すると、変換部１５ｂは、プログラムＡの「ＣＡＬＬ  “ＳＥＴ＿ＰＲＯＣ”」を「“ＳＥＴ＿ＰＲＯＣ”を呼び出す命令」に変換し、「ＣＡＬＬ  “Ｂ”」を「プログラム“Ｂ”を呼び出す命令」に変換する。また、変換部１５ｂは、プログラムＡを変換したオブジェクトＡに、「リソースの初期化命令」と「復帰命令」とを追記する。
【００４６】
同様に、変換部１５ｂは、プログラムＢの「ＣＡＬＬ  “Ｃ”」を「プログラム“Ｃ”を呼び出す命令」に変換する。また、変換部１５ｂは、プログラムＢを変換したオブジェクトＢに、「リソースの初期化命令」と「復帰命令」とを追記する。同様に、変換部１５ｂは、プログラムＣの「ＣＡＬＬ  “ＪＵＭＰ＿ＰＲＯＣ”」を「“ＪＵＭＰ＿ＰＲＯＣ”を呼び出す命令」に変換する。また、変換部１５ｂは、プログラムＣを変換したオブジェクトＣに、「リソースの初期化命令」と「復帰命令」とを追記する。
【００４７】
その後、生成部１６は、変換部１５ｂによって生成されたオブジェクトコードを連結させ、各オブジェクトコードとランタイムの関数とを連携させたロードモジュールを生成して、実行ファイル１３ａとしてＨＤＤ１２に格納する。そして、実行部１７ａは、ＨＤＤ１２から実行ファイルを読み出してメモリ１３に展開する。
【００４８】
すると、図７に示すように、ロードモジュールＡは、分岐する箇所を登録するために、分岐箇所登録部１８ａを呼び出す。分岐箇所登録部１８ａは、現在のスタック環境をスタック環境値１３ｂに保存する。その後、ロードモジュールＡは、プログラムＢを呼び出す。なお、リソース管理部１８ｂは、ロードモジュールＡが使用したリソース情報を管理する。
【００４９】
続いて、ロードモジュールＡによって呼び出されたロードモジュールＢは、プログラムＣを呼び出し、ロードモジュールＣが実行される。なお、リソース管理部１８ｂは、ロードモジュールＢが使用したリソース情報を管理する。
【００５０】
このロードモジュールＣが実行されているタイミングでエラーが発生したとする。すると、ロードモジュールＣは、ロードモジュールＡに登録した箇所に分岐するために、スタック環境保存域を引数として、分岐処理部１８ｃを呼び出す。
【００５１】
続いて、分岐処理部１８ｃは、引数として渡されたロードモジュールＣのスタック環境値を作業領域１３ｄに退避させる。そして、リソース初期化部１８ｄは、ロードモジュールＣ内の「リソースの初期化命令」を実行し、リソーステーブル１３ｃを参照してロードモジュールＣ言い換えるとプログラムＣが使用したリソースを初期化する。続いて、復帰判定部１８ｅは、分岐処理部１８ｃによって退避されたスタック環境値と、分岐箇所登録部１８ａによって登録されたスタック環境値とを比較し、一致しないので、「復帰命令」にしたがって呼出元のロードモジュールＢに復帰する。
【００５２】
続いて、ロードモジュールＢは、ロードモジュールＡに登録した箇所に分岐するために、スタック環境保存域を引数として、分岐処理部１８ｃを呼び出す。分岐処理部１８ｃは、引数として渡されたロードモジュールＢのスタック環境値を作業領域１３ｄに退避させる。そして、リソース初期化部１８ｄは、ロードモジュールＢ内の「リソースの初期化命令」を実行し、リソーステーブル１３ｃを参照してロードモジュールＢ言い換えるとプログラムＢが使用したリソースを初期化する。続いて、復帰判定部１８ｅは、分岐処理部１８ｃによって退避されたスタック環境値と、分岐箇所登録部１８ａによって登録されたスタック環境値とを比較し、一致しないので、「復帰命令」にしたがって呼出元のロードモジュールＡに復帰する。
【００５３】
続いて、ロードモジュールＡは、スタック環境保存域を引数として、分岐処理部１８ｃを呼び出す。分岐処理部１８ｃは、引数として渡されたロードモジュールＡのスタック環境値を作業領域１３ｄに退避させる。そして、リソース初期化部１８ｄは、ロードモジュールＡ内の「リソースの初期化命令」を実行し、リソーステーブル１３ｃを参照してロードモジュールＡ言い換えるとプログラムＡが使用したリソースを初期化する。続いて、復帰判定部１８ｅは、分岐処理部１８ｃによって退避されたスタック環境値と、分岐箇所登録部１８ａによって登録されたスタック環境値とを比較し、一致すると判定する。このため、復帰判定部１８ｅは、スタック環境値に登録される戻りアドレスに制御を移す。こうすることで、情報処理装置１０は、エラーが発生した場合でも、リソースを初期化した状態で、アプリケーションを実行前の状態に戻すことができる。
【００５４】
［処理の流れ］
次に、図８から図１０を用いて情報処理装置が実行する処理の流れを説明する。ここでは、図８を用いて、コンパイル実行時の処理の流れを説明し、図９を用いて、プログラム実行時の処理の流れを説明し、図１０を用いて、エラー処理の流れを説明する。
【００５５】
（コンパイル実行時の処理の流れ）
図８は、コンパイル実行時の処理の流れを示すフローチャートである。図８に示すように、情報処理装置１０のコンパイル部１５の変換部１５ｂは、入力部１５ａから渡されたソースコードを読み込む（Ｓ１０１）。
【００５６】
続いて、変換部１５ｂは、読み込んだソースコードをオブジェクトコードに変換する（Ｓ１０２）。そして、変換部１５ｂは、変換したオブジェクトコード内に「リソースの初期化命令」を記述し（Ｓ１０３）、呼び出し元への「復帰命令」を記述して（Ｓ１０４）、ＨＤＤ１２に格納する（Ｓ１０５）。
【００５７】
その後、変換部１５ｂは、ＨＤＤ１２内に他のソースコードが存在する場合には（Ｓ１０６肯定）、Ｓ１０１に戻って以降の処理を繰り返す。一方、変換部１５ｂは、ＨＤＤ１２内に他のソースコードが存在しない場合には（Ｓ１０６否定）、コンパイル処理を終了する。
【００５８】
（プログラム実行時の処理の流れ）
図９は、プログラム実行時の処理の流れを示すフローチャートである。図９に示すように、情報処理装置１０の実行部１７ａは、生成部１６が生成した実行ファイルをメモリ１３上に展開して実行する（Ｓ２０１）。
【００５９】
続いて、分岐箇所登録部１８ａは、プログラムが実行された時点のレジスタ値を抽出する（Ｓ２０２）。また、分岐箇所登録部１８ａは、戻りアドレス値をレジスタ等から抽出する（Ｓ２０３）。
【００６０】
その後、分岐箇所登録部１８ａは、抽出したレジスタ値と戻りアドレス値とを、スタック環境値１３ｂに登録する（Ｓ２０４）。そして、分岐箇所登録部１８ａは、当該分岐箇所登録部１８ａを呼び出したプログラムに制御を復帰させる（Ｓ２０５）。
【００６１】
そして、リソース管理部１８ｂは、プログラムによってリソースが使用された場合に（Ｓ２０６肯定）、使用されたリソースとリソースを使用したプログラム名とを対応付けて、リソーステーブル１３ｃに格納してリソースを管理する（Ｓ２０７）。
【００６２】
また、実行制御部１７は、リソースを使用していない（Ｓ２０６否定）またはＳ２０７が実行された後、リソース管理が実行されたプログラム内に、サブプログラムの呼出し命令が記述されているか否かを判定する（Ｓ２０８）。そして、実行制御部１７は、サブプログラムの呼出し命令が記述されている場合には（Ｓ２０８肯定）、サブプログラムを呼び出す（Ｓ２０９）。
【００６３】
そして、リソース管理部１８ｂは、呼び出されたサブプログラムによってリソースが使用された場合に（Ｓ２１０肯定）、使用されたリソースとサブプログラム名とを対応付けて、リソーステーブル１３ｃに格納してリソースを管理する（Ｓ２１１）。
【００６４】
その後、実行制御部１７は、リソースを使用していない（Ｓ２１０否定）またはＳ２１１が実行された後、リソース管理が実行されたサブプログラム内に、さらにサブプログラムの呼出し命令が記述されているか否かを判定する（Ｓ２１２）。そして、実行制御部１７は、さらにサブプログラムの呼出し命令が記述されている場合には（Ｓ２１２肯定）、Ｓ２０９以降の処理を繰り返す。
【００６５】
一方、実行制御部１７は、プログラム内にサブプログラムの呼出し命令が記述されていない場合（Ｓ２０８否定）、または、サブプログラム内にさらにサブプログラムの呼出し命令が記述されていない場合には（Ｓ２１２否定）、プログラムを終了する。
【００６６】
（エラー処理の流れ）
図１０は、エラー処理の流れを示すフローチャートである。実行制御部１７がエラーを検出すると（Ｓ３０１肯定）、分岐処理部１８ｃは、エラーが検出されたプログラムのスタック環境値を退避させる（Ｓ３０２）。なお、エラーの検出方法は、プログラムのエラー検出として一般的に利用されている様々な手法を用いることができる。
【００６７】
続いて、リソース初期化部１８ｄは、スタック環境値が退避させられたプログラム内の「リソースの初期化命令」を実行する（Ｓ３０３）。すなわち、リソース初期化部１８ｄは、リソーステーブル１３ｃを参照してリソースを初期化する。
【００６８】
復帰判定部１８ｅは、退避されたスタック環境値と、分岐箇所登録部１８ａによってスタック環境値１３ｂに登録されたスタック環境値とが一致しない場合（Ｓ３０４否定）、プログラム内の「復帰命令」にしたがって呼出元のプログラムに復帰する（Ｓ３０５）。その後、実行制御部１７は、Ｓ３０２以降の処理を繰り返す。
【００６９】
一方、復帰判定部１８ｅは、退避されたスタック環境値と、分岐箇所登録部１８ａによってスタック環境値１３ｂに登録されたスタック環境値とが一致した場合（Ｓ３０４肯定）、Ｓ３０６以降を実行する。すなわち、復帰判定部１８ｅは、スタック環境値１３ｂに登録されたスタック環境値のレジスタ値を現在の情報処理装置１０のスタック環境値のレジスタ値として、該当するレジスタに登録する（Ｓ３０６）。この結果、プログラム内の「ＳＥＴ  ＰＲＯＣ」が実行されたときのレジスタ値に戻すことができる。
【００７０】
そして、復帰判定部１８ｅは、戻りアドレスに制御を移す（Ｓ３０７）。その後、実行制御部１７は、当該プログラム全体すなわちアプリケーションを再実行する（Ｓ３０８）。
【００７１】
上述したように、情報処理装置１０は、ＣＯＢＯＬプログラムをコンパイルする際に、最終的な復帰先と、各プログラムにリソース初期化命令と復帰命令とを記述したオブジェクトコードを生成することができる。したがって、情報処理装置１０は、エラーが発生した場合には、エラーが発生したプログラムから最終的な戻り先のプログラムまで、リソースを初期化しながら復帰することができる。
【００７２】
つまり、情報処理装置１０は、プログラムを再実行する前段階の処理を実行しながら、先頭のプログラムまで復帰させることができる。この結果、情報処理装置１０は、ＣＯＢＯＬプログラム全体を終了させることもないので、再実行できない危険性を低下させることができる。また、情報処理装置１０は、前処理を実行することもなく、ＣＯＢＯＬプログラムを再実行することができる。
【実施例３】
【００７３】
実施例２では、アプリケーションの先頭であるプログラムＡに復帰させる例を説明したが、これに限定されるものではない。例えば、複数のプログラムを有するアプリケーションのうち、任意のプログラムに復帰させることもできる。その場合、復帰先としたいプログラムに「ＣＡＬＬ  “ＳＥＴ  ＰＲＯＣ”」を記述すればよい。また、先頭のプログラムまで戻らずに、１つ前のプログラムにだけ戻るようにしてもよい。その場合も同様に、「呼出元のプログラムに戻る命令」を追記するようにすればよい。
【００７４】
ここで、エラーが発生したプログラムの１つ前のプログラムに戻る例を説明する。図１１は、実施例３に係る実行対象のプログラム例を示す図であり、図１２は、実施例３に係るコンパイル後のオブジェクトコード例を示す図である。
【００７５】
図１１に示すように、情報処理装置１０の入力部１５ａは、プログラムＡとプログラムＢとプログラムＣとを有するＣＯＢＯＬアプリケーションを入力部１５ｂに渡す。図１１に示すように、プログラムＡには、「ＣＡＬＬ  “ＳＥＴ＿ＰＲＯＣ”」と「ＣＡＬＬ  “Ｂ”」とが記述される。
【００７６】
また、プログラムＢには、「ＣＡＬＬ  “ＳＥＴ＿ＰＲＯＣ”」と、「ＣＡＬＬ  “ＪＵＭＰ＿ＰＲＯＣ”」と、「ＣＡＬＬ  “Ｃ”」とが記述される。同様に、プログラムＣには、「ＣＡＬＬ  “ＳＥＴ＿ＰＲＯＣ”」と、「ＣＡＬＬ  “ＪＵＭＰ＿ＰＲＯＣ”」とが記述される。
【００７７】
続いて、変換部１５ｂは、入力部１５ａから渡されたソースコード１２ａをオブジェクトコード１２ｂに変換して、ＨＤＤ１２に格納する。例えば、変換部１５ｂは、図１１に示したプログラムＡ、プログラムＢ、プログラムＣ各々を、図１２に示したオブジェクトＡ、オブジェクトＢ、オブジェクトＣ各々に変換する。
【００７８】
具体的に説明すると、変換部１５ｂは、プログラムＡの「ＣＡＬＬ  “ＳＥＴ＿ＰＲＯＣ”」を「“ＳＥＴ＿ＰＲＯＣ”を呼び出す命令」に変換し、「ＣＡＬＬ  “Ｂ”」を「プログラム“Ｂ”を呼び出す命令」に変換する。また、変換部１５ｂは、プログラムＡを変換したオブジェクトＡに、「リソースの初期化命令」と「復帰命令」とを追記する。
【００７９】
同様に、変換部１５ｂは、プログラムＢの「ＣＡＬＬ  “ＳＥＴ＿ＰＲＯＣ”」を「“ＳＥＴ＿ＰＲＯＣ”を呼び出す命令」に変換し、「ＣＡＬＬ  “ＪＵＭＰ＿ＰＲＯＣ”」を「“ＪＵＭＰ＿ＰＲＯＣ”を呼び出す命令」に変換し、「ＣＡＬＬ  “Ｃ”」を「プログラム“Ｃ”を呼び出す命令」に変換する。また、変換部１５ｂは、プログラムＢを変換したオブジェクトＢに、「リソースの初期化命令」と「復帰命令」とを追記する。
【００８０】
同様に、変換部１５ｂは、プログラムＣの「ＣＡＬＬ  “ＳＥＴ＿ＰＲＯＣ”」を「“ＳＥＴ＿ＰＲＯＣ”を呼び出す命令」に変換し、「ＣＡＬＬ  “ＪＵＭＰ＿ＰＲＯＣ”」を「“ＪＵＭＰ＿ＰＲＯＣ”を呼び出す命令」に変換する。また、変換部１５ｂは、プログラムＣを変換したオブジェクトＣに、「リソースの初期化命令」と「復帰命令」とを追記する。
【００８１】
このようにすることで、情報処理装置１０は、ＣＯＢＯＬプログラムでエラーが発生した場合に、１つ前のプログラムすなわち呼び出し元へ戻る命令を追加することができる。その後は、実施例２と同様の手法でプログラムの実行およびエラー処理が実行される。
【００８２】
簡単に説明すると、生成部１６は、図１２に示したオブジェクトコードを連結して実行ファイルを生成し、実行部１７ａは、実行ファイルをメモリ１３上に展開して実行する。そして、分岐箇所登録部１８ａは、実行部１７ａによって各オブジェクトコードに該当するロードモジュールが実行されるたびに、レジスタ値と戻りアドレスとを当該ロードモジュールのスタック環境保存域に格納する。
【００８３】
例えば、分岐箇所登録部１８ａは、オブジェクトＡに該当するロードモジュールＡが実行されると、ロードモジュールＡ内のスタック環境保存域に、「ＳＥＴ  ＰＲＯＣ」の次に命令である「プログラムＢを呼び出す命令のアドレス」を登録する。このとき、分岐箇所登録部１８ａは、実施例２と同様、各レジスタ値も登録する。
【００８４】
同様に、分岐箇所登録部１８ａは、オブジェクトＢに該当するロードモジュールＢが実行されると、ロードモジュールＢ内のスタック環境保存域に、「ＳＥＴ  ＰＲＯＣ」の次に命令である「ＪＵＭＰ＿ＰＲＯＣを呼び出す命令のアドレス」を登録する。このとき、実施例２と同様、分岐箇所登録部１８ａは、各レジスタ値も登録する。
【００８５】
また、分岐箇所登録部１８ａは、オブジェクトＣに該当するロードモジュールＣが実行されると、ロードモジュールＣ内のスタック環境保存域に、「ＳＥＴ  ＰＲＯＣ」の次に命令である「ＪＵＭＰ＿ＰＲＯＣを呼び出す命令のアドレス」を登録する。このとき、実施例２と同様、分岐箇所登録部１８ａは、各レジスタ値も登録する。
【００８６】
このようにすることで、各ロードモジュールでエラーが発生した際の戻り先を呼び出し元のプログラムに指定することができる。この結果、ロードモジュールＣでエラーが発生した場合には、ロードモジュールＢの「ＪＵＭＰ＿ＰＲＯＣを呼び出す命令」に復帰することができる。同様に、ロードモジュールＢでエラーが発生した場合には、ロードモジュールＡの「プログラムＢを呼び出す命令」に復帰することができる。
【実施例４】
【００８７】
さて、これまで本発明の実施例について説明したが、本発明は上述した実施例以外にも、種々の異なる形態にて実施されてよいものである。そこで、以下に異なる実施例を説明する。
【００８８】
（対象プログラム）
上記実施例では、ＣＯＢＯＬプログラムを例にして説明したがこれに限定されるものではなく、Ｃ言語などコンパイルを実行する言語であればよい。
【００８９】
（システム）
また、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともできる。あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【００９０】
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られない。つまり、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、ＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【００９１】
（ハードウェア構成）
ところで、上記の実施例で説明した各種の処理は、あらかじめ用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータシステムで実行することによって実現することができる。そこで、以下では、上記の実施例と同様の機能を有するプログラムを実行するコンピュータシステムの一例を説明する。
【００９２】
図１３は、実行制御プログラムを実行するコンピュータのハードウェア構成例を示す図である。図１３に示すように、コンピュータ１００は、ＣＰＵ１０２、入力装置１０３、出力装置１０４、通信インタフェース１０５、媒体読取装置１０６、ＨＤＤ（Hard  Disk  Drive）１０７、ＲＡＭ（Random  Access  Memory）１０８を有する。また、図１３に示した各部は、バス１０１で相互に接続される。
【００９３】
入力装置１０３は、マウスやキーボードであり、出力装置１０４は、ディスプレイなどであり、通信インタフェース１０５は、ＮＩＣ（Network  Interface  Card）などのインタフェースである。ＨＤＤ１０７は、実行制御プログラム１０７ａととともに、図２に示した各情報等を記憶する。記録媒体の例としてＨＤＤ１０７を例に挙げたが、ＲＯＭ（Read  Only  Memory）、ＲＡＭ、ＣＤ−ＲＯＭ等の他のコンピュータ読み取り可能な記録媒体に各種プログラムを格納しておき、コンピュータに読み取らせることとしてもよい。なお、記録媒体を遠隔地に配置し、コンピュータが、その記憶媒体にアクセスすることでプログラムを取得して利用してもよい。また、その際、取得したプログラムをそのコンピュータ自身の記録媒体に格納して用いてもよい。
【００９４】
ＣＰＵ１０２は、実行制御プログラム１０７ａを読み出してＲＡＭ１０８に展開することで、図２等で説明した各機能を実行する実行制御プロセス１０８ａを動作させる。すなわち、実行制御プロセス１０８ａは、図２に記載したコンパイル部１５、実行制御部１７と同様の機能を実行する。このようにコンピュータ１００は、プログラムを読み出して実行することで実行制御方法を実行する情報処理装置として動作する。
【００９５】
例えば、コンピュータ１００は、媒体読取装置１０６によって記録媒体から実行制御プログラムを読み出し、読み出された実行制御プログラムを実行することで上記した実施例と同様の機能を実現することもできる。なお、この他の実施例でいうプログラムは、コンピュータ１００によって実行されることに限定されるものではない。例えば、他のコンピュータまたはサーバがプログラムを実行する場合や、これらが協働してプログラムを実行するような場合にも、本発明を同様に適用することができる。
【符号の説明】
【００９６】
１  コンパイラ
１ａ  受付部
１ｂ  変換部
２  実行制御装置
２ａ  実行制御部
２ｂ  エラー処理部
１０  情報処理装置
１１  入出力インタフェース部
１２  ＨＤＤ
１２ａ  ソースコード
１２ｂ  オブジェクトコード
１３  メモリ
１３ａ  実行ファイル
１３ｂ  スタック環境値
１３ｃ  リソーステーブル
１３ｄ  作業領域
１４  プロセッサ
１５  コンパイル部
１５ａ  入力部
１５ｂ  変換部
１６  生成部
１７  実行制御部
１７ａ  実行部
１８  ランタイムシステム
１８ａ  分岐箇所登録部
１８ｂ  リソース管理部
１８ｃ  分岐処理部
１８ｄ  リソース初期化部
１８ｅ  復帰判定部
【図１】
0005845788.tif 000002
【図２】
0005845788.tif 000003
【図３】
0005845788.tif 000004
【図４】
0005845788.tif 000005
【図５】
0005845788.tif 000006
【図６】
0005845788.tif 000007
【図７】
0005845788.tif 000008
【図８】
0005845788.tif 000009
【図９】
0005845788.tif 000010
【図１０】
0005845788.tif 000011
【図１１】
0005845788.tif 000012
【図１２】
0005845788.tif 000013
【図１３】
0005845788.tif 000014