(57)【特許請求の範囲】
【請求項１】
ある１の結果を得ることができるように、１以上の命令を所定の順序で実行させる第１プログラムを取得する取得手段と、
前記第１プログラムに基づき第２プログラムを生成する生成手段と、
前記第２プログラムを出力する出力手段とを備え、
前記第２プログラムは、
当該第２プログラムの実行時に決定され、当該第２プログラムの実行の都度変化する情報であるカレント情報に応じて、結果を得るために実行させる処理が変化し、かつ、得られる前記結果が、前記カレント情報に応じた処理の変化に関わらず、前記第１プログラムにより得られる結果と同一となるプログラムであって、
前記生成手段は、
前記第１プログラムに含まれる命令のうち、相互に依存関係にない命令である複数の並列命令を検出する検出部と、
前記第１プログラムに含まれる１以上の命令であるオリジナル命令と異なる処理を行い、かつ、前記オリジナル命令と同一の結果を出力する１以上の命令からなる恒等命令を１以上生成する恒等命令生成部と、
前記結果に影響を与えない命令であるダミー命令を生成するダミー命令生成部とを備え、
前記第１プログラムが実行させる処理のうち、前記複数の並列命令を前記所定の順序で実行させる処理に替えて、前記カレント情報に応じて変化する順序で実行させ、
前記第１プログラムが実行させる処理のうち、前記オリジナル命令を実行させる処理に替えて、前記カレント情報に応じて、前記オリジナル命令又は生成された前記恒等命令のうちから１を選択させ、実行させ、
当該カレント情報に応じて変化するタイミングで、前記ダミー命令を実行させる前記第２プログラムを生成し、
前記生成手段は、更に、
前記第１プログラムに含まれる命令、恒等命令生成部により生成された恒等命令、及びダミー命令生成部により生成されたダミー命令のそれぞれに、各命令を一意に識別する識別子を付与する識別子付与部を備え、
前記カレント情報に応じて生成される乱数列の各要素と一致する識別子により識別される命令を呼び出す前記第２プログラムを生成する
ことを特徴とするプログラム生成装置。
【請求項２】
前記生成手段は、
前記カレント情報に応じて前記乱数列を生成する乱数列生成アルゴリズムを含む前記第２プログラムを生成する
ことを特徴とする請求項１に記載のプログラム生成装置。
【請求項３】
前記生成手段は、
前記カレント情報に応じて乱数列を生成する複数の乱数列生成アルゴリズムを含み、実行時に前記複数の乱数列生成アルゴリズムから１の乱数列生成アルゴリズムを選択し、選択した乱数列生成アルゴリズムに従い生成される乱数列の各要素と一致する識別子により識別される命令を呼び出す前記第２プログラムを生成する
ことを特徴とする請求項１に記載のプログラム生成装置。
【請求項４】
前記生成手段は、更に、
前記第１プログラムに含まれる命令、恒等命令生成部により生成された恒等命令、及びダミー命令生成部により生成されたダミー命令のそれぞれを関数化し、複数の関数からなる関数データを生成する関数データ生成部と、
前記関数データ生成部により生成されたそれぞれの関数に、各関数を一意に識別する識別子を付与する識別子付与部と、
前記カレント情報に応じて乱数列を生成する乱数列生成アルゴリズムを含み、生成される乱数列の各要素と一致する識別子により識別される関数のうち、前記結果と同一の結果を得るための条件に従う関数の呼び出し、及び実行を指示する呼出プログラムを生成する呼出プログラム生成部とを備え、
前記関数データ、及び前記呼出プログラムを含む前記第２プログラムを生成する
ことを特徴とする請求項１に記載のプログラム生成装置。
【請求項５】
前記複数の関数は、それぞれ、実行時にランダムに決定される順序で実行される関数グループである並列グループ、実行時にシーケンシャルに実行される関数グループであるシーケンシャルグループ、実行時に１つをランダムに選択して実行される関数グループである恒等グループ、及び実行するか又は実行しないかを実行時にランダムに決定して実行される関数グループであるダミーグループの何れか１以上のグループに属し、
前記呼出プログラム生成部は、
各関数が属するグループを判断することにより、前記条件に従う順序で、各関数を呼び出すことを指示する前記呼出プログラムを生成する
ことを特徴とする請求項４に記載のプログラム生成装置。
【請求項６】
前記プログラム生成装置は、更に、
前記カレント情報の候補となる候補情報を複数個生成する候補情報生成手段を備え、
前記出力手段は、前記第２プログラムと共に、適切な複数個の候補情報を出力する
ことを特徴とする請求項１に記載のプログラム生成装置。
【請求項７】
前記プログラム生成装置は、更に、
生成された前記複数個の候補情報のそれぞれについて、各候補情報に応じて行う動作が、正しい動作であるか否か判断するテスト手段を備え、
前記出力手段は、前記テスト手段により正しい動作を行うと判断された候補情報のみを抽出し、出力する
ことを特徴とする請求項６に記載のプログラム生成装置。
【請求項８】
前記テスト手段は、
前記第１プログラムを実行して得られる第１値を取得する第１取得部と、
１の候補情報に応じた動作を行い得られる第２値を取得する第２取得部と、
前記第１値と前記第２値とを比較し、両者が一致する場合に、前記１の候補情報に応じて行う動作が、正しい動作であると判断する比較判断部とを備える
ことを特徴とする請求項７に記載のプログラム生成装置。
【請求項９】
プログラム生成装置及びプログラム実行装置から構成される情報処理システムであって、
前記プログラム生成装置は、
ある１の結果を得ることができるように、１以上の命令を所定の順序で実行させる第１プログラムを取得する取得手段と、
前記第１プログラムに基づき第２プログラムを生成する生成手段と、
前記第２プログラムを出力する出力手段とを備え、
前記第２プログラムは、当該第２プログラムの実行時に決定され、当該第２プログラムの実行の都度変化する情報であるカレント情報に応じて、結果を得るために実行させる処理が変化し、かつ、得られる前記結果が、前記カレント情報に応じた処理の変化に関わらず、前記第１プログラムにより得られる結果と同一となるプログラムであって、
前記生成手段は、
前記第１プログラムに含まれる命令のうち、相互に依存関係にない命令である複数の並列命令を検出する検出部と、
前記第１プログラムに含まれる１以上の命令であるオリジナル命令と異なる処理を行い、かつ、前記オリジナル命令と同一の結果を出力する１以上の命令からなる恒等命令を１以上生成する恒等命令生成部と、
前記結果に影響を与えない命令であるダミー命令を生成するダミー命令生成部とを備え、
前記第１プログラムが実行させる処理のうち、前記複数の並列命令を前記所定の順序で実行させる処理に替えて、前記カレント情報に応じて変化する順序で実行させ、
前記第１プログラムが実行させる処理のうち、前記オリジナル命令を実行させる処理に替えて、前記カレント情報に応じて、前記オリジナル命令又は生成された前記恒等命令のうちから１を選択させ、実行させ、
当該カレント情報に応じて変化するタイミングで、前記ダミー命令を実行させる前記第２プログラムを生成し、
前記生成手段は、更に、
前記第１プログラムに含まれる命令、恒等命令生成部により生成された恒等命令、及びダミー命令生成部により生成されたダミー命令のそれぞれに、各命令を一意に識別する識別子を付与する識別子付与部を備え、
前記カレント情報に応じて生成される乱数列の各要素と一致する識別子により識別される命令を呼び出す前記第２プログラムを生成し、
前記プログラム実行装置は、
前記第２プログラムを取得する第２取得手段と、
前記カレント情報を指定する情報指定手段と、
前記第２プログラムを実行する実行手段とを備える
ことを特徴とする情報処理システム。
【請求項１０】
プログラム生成装置で用いられるプログラム生成方法であって、
前記プログラム生成装置の取得手段が、ある１の結果を得ることができるように、１以上の命令を所定の順序で実行させる第１プログラムを取得する取得ステップと、
前記プログラム生成装置の生成手段が、前記第１プログラムに基づき第２プログラムを生成する生成ステップと、
前記プログラム生成装置の出力手段が、前記第２プログラムを出力する出力ステップとを含み、
前記第２プログラムは、
当該第２プログラムの実行時に決定され、当該第２プログラムの実行の都度変化する情報であるカレント情報に応じて、結果を得るために実行させる処理が変化し、かつ、得られる前記結果が、前記カレント情報に応じた処理の変化に関わらず、前記第１プログラムにより得られる結果と同一となるプログラムであって、
前記生成ステップは、
前記プログラム生成装置の検出部が、前記第１プログラムに含まれる命令のうち、相互に依存関係にない命令である複数の並列命令を検出する検出ステップと、
前記プログラム生成装置の恒等命令生成部が、前記第１プログラムに含まれる１以上の命令であるオリジナル命令と異なる処理を行い、かつ、前記オリジナル命令と同一の結果を出力する１以上の命令からなる恒等命令を１以上生成する恒等命令生成ステップと、
前記プログラム生成装置のダミー命令生成部が、前記結果に影響を与えない命令であるダミー命令を生成するダミー命令生成ステップとを含み、
前記第１プログラムが実行させる処理のうち、前記複数の並列命令を前記所定の順序で実行させる処理に替えて、前記カレント情報に応じて変化する順序で実行させ、
前記第１プログラムが実行させる処理のうち、前記オリジナル命令を実行させる処理に替えて、前記カレント情報に応じて、前記オリジナル命令又は生成された前記恒等命令のうちから１を選択させ、実行させ、
当該カレント情報に応じて変化するタイミングで、前記ダミー命令を実行させる前記第２プログラムを生成し、
前記生成ステップは、更に、
前記プログラム生成装置の識別子付与部が、前記第１プログラムに含まれる命令、恒等命令生成ステップにより生成された恒等命令、及びダミー命令生成ステップにより生成されたダミー命令のそれぞれに、各命令を一意に識別する識別子を付与する識別子付与ステップを含み、
前記カレント情報に応じて生成される乱数列の各要素と一致する識別子により識別される命令を呼び出す前記第２プログラムを生成する
ことを特徴とするプログラム生成方法。
【請求項１１】
プログラム生成装置で用いられるコンピュータプログラムであって、
前記プログラム生成装置に、
ある１の結果を得ることができるように、１以上の命令を所定の順序で実行させる第１プログラムを取得する取得ステップと、
前記第１プログラムに基づき第２プログラムを生成する生成ステップと、
前記第２プログラムを出力する出力ステップとを実行させ、
前記第２プログラムは、
当該第２プログラムの実行時に決定され、当該第２プログラムの実行の都度変化する情報であるカレント情報に応じて、結果を得るために実行させる処理が変化し、かつ、得られる前記結果が、前記カレント情報に応じた処理の変化に関わらず、前記第１プログラムにより得られる結果と同一となるプログラムであって、
前記コンピュータプログラムは、前記プログラム生成装置に、
前記第１プログラムに含まれる命令のうち、相互に依存関係にない命令である複数の並列命令を検出する検出ステップと、
前記第１プログラムに含まれる１以上の命令であるオリジナル命令と異なる処理を行い、かつ、前記オリジナル命令と同一の結果を出力する１以上の命令からなる恒等命令を１以上生成する恒等命令生成ステップと、
前記結果に影響を与えない命令であるダミー命令を生成するダミー命令生成ステップとを実行させ、
前記第１プログラムが実行させる処理のうち、前記複数の並列命令を前記所定の順序で実行させる処理に替えて、前記カレント情報に応じて変化する順序で実行させ、
前記第１プログラムが実行させる処理のうち、前記オリジナル命令を実行させる処理に替えて、前記カレント情報に応じて、前記オリジナル命令又は生成された前記恒等命令のうちから１を選択させ、実行させ、
当該カレント情報に応じて変化するタイミングで、前記ダミー命令を実行させる前記第２プログラムを生成させる、
前記コンピュータプログラムは、更に、前記プログラム生成装置に、
前記第１プログラムに含まれる命令、恒等命令生成ステップにより生成された恒等命令、及びダミー命令生成ステップにより生成されたダミー命令のそれぞれに、各命令を一意に識別する識別子を付与する識別子付与ステップを実行させ、
前記カレント情報に応じて生成される乱数列の各要素と一致する識別子により識別される命令を呼び出す前記第２プログラムを生成させる
ことを特徴とするコンピュータプログラム。
【請求項１２】
プログラム生成装置で用いられるコンピュータプログラムを記録しているコンピュータ読み取り可能な記録媒体であって、
前記コンピュータプログラムは、前記プログラム生成装置に、
ある１の結果を得ることができるように、１以上の命令を所定の順序で実行させる第１プログラムを取得する取得ステップと、
前記第１プログラムに基づき第２プログラムを生成する生成ステップと、
前記第２プログラムを出力する出力ステップとを実行させ、
前記第２プログラムは、
当該第２プログラムの実行時に決定され、当該第２プログラムの実行の都度変化する情報であるカレント情報に応じて、結果を得るために実行させる処理が変化し、かつ、得られる前記結果が、前記カレント情報に応じた処理の変化に関わらず、前記第１プログラムにより得られる結果と同一となるプログラムであって、
前記コンピュータプログラムは、前記プログラム生成装置に、
前記第１プログラムに含まれる命令のうち、相互に依存関係にない命令である複数の並列命令を検出する検出ステップと、
前記第１プログラムに含まれる１以上の命令であるオリジナル命令と異なる処理を行い、かつ、前記オリジナル命令と同一の結果を出力する１以上の命令からなる恒等命令を１以上生成する恒等命令生成ステップと、
前記結果に影響を与えない命令であるダミー命令を生成するダミー命令生成ステップとを実行させ、
前記第１プログラムが実行させる処理のうち、前記複数の並列命令を前記所定の順序で実行させる処理に替えて、前記カレント情報に応じて変化する順序で実行させ、
前記第１プログラムが実行させる処理のうち、前記オリジナル命令を実行させる処理に替えて、前記カレント情報に応じて、前記オリジナル命令又は生成された前記恒等命令のうちから１を選択させ、実行させ、
当該カレント情報に応じて変化するタイミングで、前記ダミー命令を実行させる前記第２プログラムを生成させる、
前記コンピュータプログラムは、更に、前記プログラム生成装置に、
前記第１プログラムに含まれる命令、恒等命令生成ステップにより生成された恒等命令、及びダミー命令生成ステップにより生成されたダミー命令のそれぞれに、各命令を一意に識別する識別子を付与する識別子付与ステップを実行させ、
前記カレント情報に応じて生成される乱数列の各要素と一致する識別子により識別される命令を呼び出す前記第２プログラムを生成させる
ことを特徴とする記録媒体。
【請求項１３】
ある１の結果を得ることができるように、１以上の命令を所定の順序で実行させる第１プログラムを取得する取得手段と、
前記第１プログラムに基づき第２プログラムを生成する生成手段と、
前記第２プログラムを出力する出力手段とを備え、
前記第２プログラムは、
当該第２プログラムの実行時に決定され、当該第２プログラムの実行の都度変化する情報であるカレント情報に応じて、結果を得るために実行させる処理が変化し、かつ、得られる前記結果が、前記カレント情報に応じた処理の変化に関わらず、前記第１プログラムにより得られる結果と同一となるプログラムであって、
前記生成手段は、
前記第１プログラムに含まれる命令のうち、相互に依存関係にない命令である複数の並列命令を検出する検出部と、
前記第１プログラムに含まれる１以上の命令であるオリジナル命令と異なる処理を行い、かつ、前記オリジナル命令と同一の結果を出力する１以上の命令からなる恒等命令を１以上生成する恒等命令生成部と、
前記結果に影響を与えない命令であるダミー命令を生成するダミー命令生成部とを備え、
前記第１プログラムが実行させる処理のうち、前記複数の並列命令を前記所定の順序で実行させる処理に替えて、前記カレント情報に応じて変化する順序で実行させ、
前記第１プログラムが実行させる処理のうち、前記オリジナル命令を実行させる処理に替えて、前記カレント情報に応じて、前記オリジナル命令又は生成された前記恒等命令のうちから１を選択させ、実行させ、
当該カレント情報に応じて変化するタイミングで、前記ダミー命令を実行させる前記第２プログラムを生成する
前記生成手段は、更に、
前記第１プログラムに含まれる命令、恒等命令生成部により生成された恒等命令、及びダミー命令生成部により生成されたダミー命令のそれぞれに、各命令を一意に識別する識別子を付与する識別子付与部を備え、
前記カレント情報に応じて生成される乱数列の各要素と一致する識別子により識別される命令を呼び出す前記第２プログラムを生成する
ことを特徴とする集積回路。
【請求項１４】
請求項１に記載のプログラム生成装置により生成された前記第２プログラムを実行するプログラム実行装置で用いられるプログラム実行方法であって、
前記プログラム実行装置の取得手段が、前記第２プログラムを取得する取得ステップと、
前記プログラム実行装置の情報指定手段が、前記第２プログラムの実行時に、前記カレント情報を指定する情報指定ステップと、
前記プログラム実行装置の実行手段が、前記情報指定ステップにより指定された前記カレント情報に応じて乱数列を生成し、生成した前記乱数列の各要素と一致する識別子により識別される命令を呼び出して実行する実行ステップと
を含むことを特徴とするプログラム実行方法。
【請求項１５】
請求項１に記載のプログラム生成装置により生成された前記第２プログラムを実行するプログラム実行装置で用いられるコンピュータプログラムであって、
前記プログラム実行装置に、
前記第２プログラムを取得する取得ステップと、
前記第２プログラムの実行時に、前記カレント情報を指定する情報指定ステップと、
前記情報指定ステップにより指定された前記カレント情報に応じて乱数列を生成し、生成した前記乱数列の各要素と一致する識別子により識別される命令を呼び出して実行する実行ステップと
を実行させることを特徴とするコンピュータプログラム。
【請求項１６】
請求項１に記載のプログラム生成装置により生成された前記第２プログラムを実行するプログラム実行装置で用いられるコンピュータプログラムを記録しているコンピュータ読み取り可能な記録媒体であって、
前記コンピュータプログラムは、前記プログラム実行装置に、
前記第２プログラムを取得する取得ステップと、
前記第２プログラムの実行時に、前記カレント情報を指定する情報指定ステップと、
前記情報指定ステップにより指定された前記カレント情報に応じて乱数列を生成し、生成した前記乱数列の各要素と一致する識別子により識別される命令を呼び出して実行する実行ステップと
を実行させることを特徴とする記録媒体。
【請求項１７】
請求項１に記載のプログラム生成装置により生成された前記第２プログラムを実行する集積回路であって、
前記第２プログラムを取得する取得手段と、
前記第２プログラムの実行時に、前記カレント情報を指定する情報指定手段と、
前記情報指定ステップにより指定された前記カレント情報に応じて乱数列を生成し、生成した前記乱数列の各要素と一致する識別子により識別される命令を呼び出して実行する実行手段と
を備えることを特徴とする集積回路。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータプログラムの保護に関し、特に、外部からの解析が困難なコンピュータプログラムを生成し、テストし、実行する技術に関する。
【背景技術】
【０００２】
コンピュータプログラムの不正利用を阻止する方法として、特許文献１では、実行時にアクセスされるアドレスの順序を監視し、正当なユーザのみ知り得る正しい順序でアクセスされていない場合に、プログラムの実行を阻止する技術が開示されている。これにより、コンピュータプログラムの無許可アクセスを検出、及び阻止することができる。
【特許文献１】特開平２‐４５８２９号公報
【非特許文献１】湯淺太一、安村通晃、中田登志之編『はじめての並列プログラミング』共立出版  1999
【発明の開示】
【発明が解決しようとする課題】
【０００３】
しかしながら、上記の技術では、毎回同じ順序でプログラムが実行されるため、不正なユーザがプログラムにブレークポイントを設定して、プログラムを解析することにより、プログラムを不正に利用する可能性がある。
そこで、本発明は上記の問題点に鑑みなされたものであって、外部からの解析が困難なコンピュータプログラムを生成するプログラム生成装置、及びこれを実行するプログラム実行装置を提供することを目的とする。
【課題を解決するための手段】
【０００４】
上記の目的を達成するために、本発明は、ある１の結果を得ることができるように、１以上の命令を所定の順序で実行させる第１プログラムを取得する取得手段と、前記第１プログラムに基づき第２プログラムを生成する生成手段と、前記第２プログラムを出力する出力手段とを備え、前記第２プログラムは、当該第２プログラムの実行時に決定されるカレント情報に応じて、結果を得るために実行させる処理が変化し、かつ、得られる前記結果が、前記カレント情報に応じた処理の変化に関わらず、前記第１プログラムにより得られる結果と同一となるプログラムであることを特徴とする。
【０００５】
更に、本発明は、上記のプログラム生成装置により生成された前記第２プログラムを実行するプログラム実行装置であって、前記第２プログラムを取得する取得手段と、実行時に、前記カレント情報を指定する情報指定手段と、前記第２プログラムを実行する実行手段とを備えることを特徴とする。
【発明の効果】
【０００６】
本発明のプログラム生成装置によると、実行時に、実行させる処理が変化する第２プログラムを生成するので、実行する毎に、同一の結果を得ることが出来、尚且つ実行順序や実行経路の異なる処理を実行させることができる。実行する毎に実行順序や実行経路が異なるので、不正なユーザがプログラムを解析することを困難にし、プログラムの不正利用を防止することができる。
【０００７】
また、本発明は、コンパイラやＯＳに依存しないので、不正解析への手掛かりを与えない。
ここで、前記生成手段は、前記第１プログラムに含まれる命令のうち、相互に依存関係にない命令である複数の並列命令を検出する検出部を備え、前記第１プログラムが実行させる処理のうち、前記複数の並列命令を前記所定の順序で実行させる処理に替えて、前記カレント情報に応じて変化する順序で実行させる前記第２プログラムを生成するように構成してもよい。
【０００８】
この構成によると、プログラム生成装置は、第１プログラムの並列性を検出することにより、出力結果が同一であるが実行順序が異なる処理を実行させる第２プログラムを生成することができる。
ここで、前記生成手段は、前記第１プログラムに含まれる１以上の命令であるオリジナル命令と異なる処理を行い、かつ、前記オリジナル命令と同一の結果を出力する１以上の命令からなる恒等命令を１以上生成する恒等命令生成部を備え、前記第１プログラムが実行させる処理のうち、前記オリジナル命令を実行させる処理に替えて、前記カレント情報に応じて、前記オリジナル命令、又は生成された前記恒等命令のうちから１を選択させ、実行させる前記第２プログラムを生成するように構成してもよい。
【０００９】
この構成によると、プログラム生成装置は、第１プログラムに含まれる命令の恒等命令を生成することにより、出力結果が同一であるが実行経路が異なる処理を実行させる第２プログラムを生成することができる。
ここで、前記生成手段は、前記結果に影響を与えない命令であるダミー命令を生成するダミー命令生成部を備え、前記第１プログラムと同一の結果を得るために実行させる処理に加えて、前記カレント情報に応じて変化するタイミングで、前記ダミー命令を実行させる前記第２プログラムを生成するように構成してもよい。
【００１０】
この構成によると、プログラム生成装置は、出力結果に影響を与えないダミー命令を生成することにより、出力結果が同一であるが実行経路が異なる処理を実行させる第２プログラムを生成することができる。
ここで、前記生成手段は、前記第１プログラムに含まれる命令のうち、相互に依存関係にない命令である複数の並列命令を検出する検出部と、前記第１プログラムに含まれる１以上の命令であるオリジナル命令と異なる処理を行い、かつ、前記オリジナル命令と同一の結果を出力する１以上の命令からなる恒等命令を１以上生成する恒等命令生成部と、前記結果に影響を与えない命令であるダミー命令を生成するダミー命令生成部とを備え、前記第１プログラムが実行させる処理のうち、前記複数の並列命令を前記所定の順序で実行させる処理に替えて、前記カレント情報に応じて変化する順序で実行させ、前記第１プログラムが実行させる処理のうち、前記オリジナル命令を実行させる処理に替えて、前記カレント情報に応じて、前記オリジナル命令又は生成された前記恒等命令のうちから１を選択させ、実行させ、当該カレント情報に応じて変化するタイミングで、前記ダミー命令を実行させる前記第２プログラムを生成するように構成してもよい。
【００１１】
この構成によると、プログラム生成装置は、並列性を検出し、恒等命令を生成し、ダミー命令を生成することにより、出力結果が同一であるが実行順序及び実行経路の異なる処理を実行させる第２プログラムを生成することができる。
ここで、前記生成手段は、更に、前記第１プログラムに含まれる命令、恒等命令生成部により生成された恒等命令、及びダミー命令生成部により生成されたダミー命令のそれぞれに、各命令を一意に識別する識別子を付与する識別子付与手段を備え、前記カレント情報に応じて生成される乱数列の各要素と一致する識別子により識別される命令を呼び出す前記第２プログラムを生成するように構成してもよい。
【００１２】
この構成によると、プログラム生成装置は、各命令に識別子を付与することにより、実行時に１の乱数列を生成させることで、実行すべき命令を呼び出す第２プログラムを生成することができる。
ここで、前記生成手段は、前記カレント情報に応じて前記乱数列を生成する乱数列生成アルゴリズムを含む前記第２プログラムを生成するように構成してもよい。
【００１３】
この構成によると、プログラム生成装置は、乱数列生成アルゴリズムを含む第２プログラムを生成することにより、実行時に生成される乱数の安全性を保障することができる。
ここで、前記生成手段は、前記カレント情報に応じて乱数列を生成する複数の乱数列生成アルゴリズムを含み、実行時に前記複数の乱数列生成アルゴリズムから１の乱数列生成アルゴリズムを選択し、選択した乱数列生成アルゴリズムに従い生成される乱数列の各要素と一致する識別子により識別される命令を呼び出す前記第２プログラムを生成するように構成してもよい。
【００１４】
この構成によると、プログラム生成装置は、複数個の乱数列生成アルゴリズムから、実行時に１のアルゴリズムが選択されるように第２プログラムを生成することにより、よりランダム性の高い処理を実行させる第２プログラムを生成することができる。
ここで、前記生成手段は、更に、前記第１プログラムに含まれる命令、恒等命令生成部により生成された恒等命令、及びダミー命令生成部により生成されたダミー命令のそれぞれを関数化し、複数の関数からなる関数データを生成する関数データ生成部と、前記関数データ生成部により生成されたそれぞれの関数に、各関数を一意に識別する識別子を付与する識別子付与部と、前記カレント情報に応じて乱数列を生成する乱数列生成アルゴリズムを含み、生成される乱数列の各要素と一致する識別子により識別される関数のうち、前記結果と同一の結果を得るための条件に従う関数の呼び出し、及び実行を指示する呼出プログラムを生成する呼出プログラム生成部とを備え、前記関数データ、及び前記呼出プログラムを含む前記第２プログラムを生成するように構成してもよい。
【００１５】
この構成によると、プログラム生成装置は、各命令を関数化し、各関数に識別子を付与することにより、実行時に１の乱数を生成させることで、実行させる関数を呼び出す第２プログラムを生成することができる。
ここで、前記複数の関数は、それぞれ、並列グループ、シーケンシャルグループ、恒等グループ、及びダミーグループの何れか１以上のグループに属し、前記呼出プログラム生成部は、各関数が属するグループを判断することにより、前記条件に従う順序で、各関数を呼び出すことを指示する前記呼出プログラムを生成するように構成してもよい。
【００１６】
この構成によると、プログラム生成装置は、関数属性の概念を導入することにより、実行時には、関数属性を判断することにより各関数の実行順序や並列関係を判断し、実行させる関数を呼び出す第２プログラムを生成することができる。
ここで、前記プログラム生成装置は、更に、前記カレント情報の候補となる候補情報を複数個生成する候補情報生成手段を備え、前記出力手段は、前記第２プログラムと共に、適切な複数個の候補情報を出力するように構成してもよい。
【００１７】
この構成によると、プログラム生成装置は、予めカレント情報の候補となる候補情報を複数個生成し、実行時に決定されるカレント情報を限定することにより、実行させる処理のランダム性を確保しながら、実行されうる複数の処理について、正常に動作するか否かをテストすることも現実的に可能となる。
ここで、前記プログラム生成装置は、更に、生成された前記複数個の候補情報のそれぞれについて、各候補情報に応じて行う動作が、正しい動作であるか否か判断するテスト手段を備え、前記出力手段は、前記テスト手段により正しい動作を行うと判断された候補情報のみを抽出し、出力するように構成してもよい。
【００１８】
この構成によると、プログラム生成装置は、正常に動作すると保障された処理に対応する候補情報のみを出力するので、実行時においては、正常に動作する処理のみを実行させることができる。
ここで、前記テスト手段は、前記第１プログラムを実行して得られる第１値を取得する第１取得部と、１の候補情報に応じた動作を行い得られる第２値を取得する第２取得部と、前記第１値と前記第２値とを比較し、両者が一致する場合に、前記１の候補情報に応じて行う動作が、正しい動作であると判断する比較判断部とを備えるように構成してもよい。
【００１９】
この構成によると、プログラム生成装置は、第１プログラムの実行結果を用いて、第２プログラムが実行させる処理が正常に動作するか否か、正確に判断することができる。
また、本発明は、コンピュータプログラムであって、実行時に決定されるカレント情報に応じて異なる動作を行い、かつ、前記動作のそれぞれによって得られる結果は、前記カレント情報に関わらず一定であることを特徴とする。
【００２０】
この構成によると、このコンピュータプログラムは、実行する毎に、同一の結果を得ることができ、尚且つ動作が異なる処理を実行させることができる。
また、本発明は、前記プログラム生成装置により生成された前記第２プログラムを実行するプログラム実行装置であって、前記第２プログラムを取得する取得手段と、実行時に、前記カレント情報を指定する情報指定手段と、前記第２プログラムを実行する実行手段とを備えることを特徴とする。
【００２１】
この構成によると、プログラム実行装置は、実行時に指定するカレント情報により異なる動作を行うので、不正な解析を困難にし、不正利用を防止することができる。
ここで、前記情報指定手段は、乱数を生成し、生成した乱数を前記カレント情報とするように構成してもよい。
この構成によると、プログラム実行装置は、実行時に乱数を発生させてカレント情報を指定するため、実行する処理をランダムに決定することができる。
【００２２】
ここで、前記取得手段は、前記カレント情報の候補となる複数の候補情報を取得し、前記情報指定手段は、前記複数の候補情報から１の候補情報を選択するように構成してもよい。
この構成によると、プログラム実行装置は、第２プログラムと共に取得する複数の候補情報から１の候補情報を選択すればよいので、乱数を発生させるなどの方法によりカレント情報を生成する必要がない。
【００２３】
ここで、前記情報指定手段は、乱数を生成し、生成した乱数を用いて前記複数の候補情報から１の候補情報を選択するように構成してもよい。
この構成によると、プログラム実行装置は、複数の候補情報から１の候補情報を選択する際に、乱数を発生させ、乱数を用いてランダムに１の候補情報を選択することができる。  
【００２４】
ここで、前記第２プログラムを複数回実行する前記プログラム実行装置において、前記情報指定手段は、選択済みの候補情報を記憶する記憶部と、前記記憶部を参照することにより、未選択の候補情報を選択するよう制御する制御部とを備えるように構成してもよい。
この構成によると、プログラム実行装置は、複数の候補情報から１の候補情報を万偏無く選択することができ、これにより、ユーザによる不正な解析を困難にし、不正利用を防止することができる。
【００２５】
ここで、前記プログラム実行装置は、更に、前記第１プログラムを実行して得られる第１値を取得する第１値取得手段と、前記実行手段により実行された第２プログラムの実行結果である第２値と、前記第１値とを比較し、両者が一致するか否か判断する比較判断手段と、前記比較判断手段により、前記第１値と前記第２値とが一致すると判断された場合に、前記情報指定手段により指定された前記候補情報を記録する記録手段とを備えるように構成してもよい。
【００２６】
この構成によると、プログラム実行装置は、取得した複数の候補情報を、第１プログラムの実行結果に基づき正常動作するか否か正しく判断することができる。  
また、プログラム実行装置は、取得した複数の候補情報について比較判断し、正常に動作した候補情報を記録しておくことにより、次に第２プログラムを実行するときから、記録している候補情報から１を選択し、選択した候補情報をカレント情報とすることで、正常動作が保障された処理を実行することができる。
【００２７】
ここで、前記プログラム実行装置は、更に、前記情報指定手段、前記実行手段、前記比較判断手段及び前記記録手段による処理を複数回行い、前記記録手段により記録された複数個の候補情報を含むリストを生成し、生成したリストを出力するように構成してもよい。  
この構成によると、プログラム実行装置は、正常動作する候補情報を含むリストを他の装置へ出力することにより、他の装置に、正常動作が保障された第２プログラムを実行させることができる。
【発明を実施するための最良の形態】
【００２８】
以下では、本発明の実施するための最良の形態について、図面を参照し詳細に説明する。
＜第１の実施形態＞
本発明に係る第１の実施形態として、情報処理システム１について、図面を参照して説明する。
【００２９】
１．全体の構成  
図１は、情報処理システム１の構成を示す図である。情報処理システム１は、プログラム生成装置１０、プログラム実行装置２０、及び記憶装置３０から構成される。
プログラム生成装置１０及びプログラム実行装置２０は、共にコンピュータシステムであり、記憶装置３０は、例えば光ディスク装置である。
【００３０】
プログラム生成装置１０は、オリジナルプログラムから実行形式のプログラムファイル（以下「プログラム実行形式」と呼称する）を生成し、生成したプログラム実行形式を記憶装置３０に書き込む。プログラム実行装置２０は、記憶装置３０に記憶されているプログラム実行形式を読み出し実行する。
記憶装置３０は、プログラム生成装置１０が書き込むプログラム実行形式を記憶する。
【００３１】
２．全体の動作
図２は、情報処理システム１全体の動作を示すフローチャートである。
先ず、プログラム生成装置１０が、オリジナルプログラムからプログラム実行形式を生成し（ステップＳ１０１）、生成したプログラム実行形式を記憶装置３０に書き込む（ステップＳ１０２）。記憶装置３０は、プログラム実行形式を記憶する（ステップＳ１０３）。
【００３２】
プログラム実行装置２０は、記憶装置３０からプログラム実行形式を読み出す（ステップＳ１０４）。プログラム実行装置２０は、初期値を設定し（ステップＳ１０５）、設定した初期値に応じて決定される順序で、プログラム実行形式の各処理を実行する（ステップＳ１０６）。
３．プログラム生成装置１０の構成
ここでは、プログラム生成装置１０の構成について詳細に説明する。
【００３３】
プログラム生成装置１０は、図１に示す様に、オリジナルプログラム保持部１０１、プログラム変換部１０２、関数識別子付与部１０３、プログラム生成部１０４、コンパイル／リンク部１０５、及び書込部１０６から構成される。
プログラム生成装置１０は、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット等から構成されるコンピュータシステムである。ハードディスクユニット及びＲＡＭには、コンピュータプログラムが記憶されており、マイクロプロセッサがコンピュータプログラムに従い動作することにより、プログラム生成装置１０は、その機能を達成する。
【００３４】
（１）オリジナルプログラム保持部１０１
オリジナルプログラム保持部１０１は、図３に示すオリジナルプログラム１１０を保持している。同図に示す様に、オリジナルプログラム１１０は、命令７０１、７０２、７０３、７０４及び７０５の５つの命令から成り、命令７０１を（処理１）、命令７０２を（処理２）、命令７０３を（処理３）、命令７０４を（処理４）、命令７０５を（処理５）と呼称する。オリジナルプログラム１１０は、（処理１）から（処理４）まで、逐次計算し、（処理５）によりｄの値を出力することを示している。
【００３５】
なお、オリジナルプログラム保持部１０１は、どのようにオリジナルプログラム１１０を取得するのか限定されない。ユーザにより入力されてもよいし、記録媒体などに格納されたオリジナルプログラム１１０を読み込んでもよい。また、図３のオリジナルプログラム１１０は、一例であって、オリジナルプログラム保持部１０１が保持するプログラムには、様々なプログラムが想定される。
【００３６】
（２）プログラム変換部１０２
プログラム変換部１０２は、並列性の検出、恒等変換の生成、ダミー処理の生成、及び関数化の処理を行う。
（並列性の検出）
オリジナルプログラム１１０は、図３に示したように、（処理１）から（処理５）までをこの順序で実行する逐次プログラムである。逐次プログラムには、計算結果を得る上で、本質的でない記述上の順序関係が存在する。記述上の順序関係にある処理は、実行順序を入れ替えても逐次実行と同じ計算結果を得ることができる。また、これらの処理を複数のプロセッサに分割して並列実行することもできる。逐次プログラムから、記述上の順序関係にある処理を検出することを、並列性の検出という。
【００３７】
プログラム変換部１０２は、オリジナルプログラム１１０から、以下に示す様に並列性を検出する。
プログラム変換部１０２は、並列性を検出するために、オリジナルプログラム１１０の各処理を先頭から解析して、データ依存関係の有無を調べる。
図４（ａ）に示す様に、命令１００１、即ち（処理２）は、（処理１）で代入された変数ａの値を参照しているので、（処理１）にフロー依存している。ここで、フロー依存とは、例えば、（処理１）を実行したあとでなければ、（処理２）を実行できない関係をいう。命令１００２、即ち（処理３）は、（処理１）で代入された変数ａの値を参照しているので、（処理１）にフロー依存している。命令１００３、即ち（処理４）は、（処理２）で代入された変数ｂの値、及び（処理３）で代入された変数ｃの値を参照しているので、（処理２）及び（処理３）にフロー依存している。
【００３８】
オリジナルプログラム１１０に含まれる各処理の内、データ依存関係が無いのは、（処理２）と（処理３）である。従って、オリジナルプログラム１１０で並列性が検出されるのは、（処理２）及び（処理３）である。なお、並列性の検出は、公知技術である並列化コンパイラで実現可能である。
図４（ｂ）は、オリジナルプログラム１１０の記述上の構造ではなく、本質的な関数構造を示す図である。オリジナルプログラム１１０は、（処理１）が実行された後、（処理２）又は（処理３）が実行される。（処理２）及び（処理３）は並列性があるので、実行順序は問わないが、（処理２）及び（処理３）が共に実行された後、（処理４）が実行される。
【００３９】
プログラム変換部１０２は、並列性を検出すると、各処理をグループに分類する。ここでは、処理１をグループ１、処理２をグループ２、処理３をグループ３、及び処理４をグループ４とする。
（恒等変換の生成）
プログラム変換部１０２は、グループ１からグループ４までの内、１以上のグループに於いて、恒等変換を生成する。ここで恒等変換とは、計算結果が同じになるような異なる処理を示す。具体的には、プログラム変換部１０２は、使用する演算子を変えたり、定数、変数を追加したりして、恒等変換を生成する。
【００４０】
ここでは、具体例として、プログラム変換部１０２は、図５（ａ）に示す様に、グループ３に於いて（処理３）の恒等変換である（処理３´）を生成する。（処理３´）は、ａを左へ２ビットシフトする処理であり、（処理３）のａ＊４と計算結果は同値である。
図５（ｂ）は、上記の様に（処理３´）を生成した後のオリジナルプログラム１１０の関数構造を示す図である。同図に示す様に、（処理３´）を生成した後のオリジナルプログラム１１０は、（処理１）が実行された後、（処理２）又はグループ３に属する何れかの処理が実行される。（処理２）、及びグループ３に属する何れかの処理が実行された後、（処理４）が実行される。ここで、グループ３に属する（処理３）及び（処理３´）は、何れか一方のみを実行すればよい。また、（処理２）、及びグループ３に属する何れかの処理は、実行の順序は問わない。
【００４１】
（ダミー処理の生成）
プログラム変換部１０２は、グループ１からグループ４までの内、１以上のグループに於いてダミー処理を生成する。ここでダミー処理とは、オリジナルプログラム１１０を複雑化するために、オリジナルプログラム１１０に挿入される処理であって、オリジナルプログラム１１０から出力される結果に影響を与えない処理を示す。
【００４２】
ここでは、具体例として、プログラム変換部１０２は、図６（ａ）に示す様に、グループ２に於いて、（処理２）のダミー処理として（処理２´）を生成する。（処理２´）のｄ＝３は、（処理２）のｂ＝ａ＋２とは無関係の処理である。なお、ダミー処理の生成は、オリジナルプログラム１１０全体としての結果に影響を与えない処理であるため、必ずしもグループ単位で生成される必要はない。
【００４３】
図６（ｂ）は、上記の様に（処理２´）を生成した後のオリジナルプログラム１１０の関数構造を示す図である。同図に示す様に、（処理２´）を生成した後のオリジナルプログラム１１０は、（処理１）が実行された後、グループ２から（処理２）を含む１以上の処理、又は、グループ３に属する（処理３）又は（処理３´）の内、何れか一方の処理を実行する。（処理２）、及び（処理３）又は（処理３´）を実行した後、（処理４）を実行する。ここで、ダミー処理である（処理２´）は、実行してもよいし、実行しなくてもよい。また、（処理２）、（処理２´）、及び（処理３）又は（処理３´）は、実行の順序は問わない。
【００４４】
（関数化）
プログラム変換部１０２は、（処理１）、（処理２）、（処理２´）、（処理３）、（処理３´）及び（処理４）の各処理を、それぞれ関数化して関数データ１２０を生成する。
図７は、関数データ１２０を示す図である。ここでは、具体例として、プログラム変換部１０２は、引数の型を統一するために、使用する変数を、「structval_t」という一つの構造体１０１１にし、（処理１）を、「funcA」、（処理２）を、「funcB」、（処理３´）を、「funcC1」、（処理３）を、「funcC」、（処理４）を、「funcD」、（処理２´）を、「funcDummy」という関数に変換し、データ１０１２を生成する。
【００４５】
プログラム変換部１０２は、生成した関数データ１２０と、関数構造とをプログラム生成部１０４へ渡す。関数構造は、各関数の処理順序を決定するために用いられるデータであって、例えば図１７に示す関数構造２５０がデータ化されて生成されたものである。ここでは、プログラム生成装置１０が関数構造をどの様なデータで持つのか限定しない。
（３）関数識別子付与部１０３
関数識別子付与部１０３は、プログラム変換部１０２が生成した関数データ１２０に含まれる各関数に、各関数をそれぞれ一意に識別する関数識別子を生成する。関数識別子付与部１０３は、生成した関数識別子を各関数の関数名に対応付け、関数識別子テーブル１３０を生成する。なお、関数識別子はランダムな値でよい。
【００４６】
図８は、関数識別子テーブル１３０を示す図である。図８に依ると、funcAの関数識別子は「０」、funcBの関数識別子は「１」、funcCの関数識別子は「５」、funcC1の関数識別子は「２」、funcDの関数識別子は「４」、funcDummyの関数識別子は「３」である。
関数識別子付与部１０３は、生成した関数識別子テーブル１３０を、プログラム生成部１０４へ渡す。
【００４７】
（４）プログラム生成部１０４
プログラム生成部１０４は、図９に示す関数呼出プログラム１４０、及び図１０に示す関数呼出順決定プログラム１５０を生成する。
（関数呼出プログラム１４０の生成）
プログラム生成部１０４は、予め関数呼出プログラム生成情報を記憶している。関数呼出プログラム生成情報は、図９に示す関数呼出プログラム１４０の内、main( )、１４３の「val->s=rand();」、及び、１４４の「while(!FuncSelector(&val));」が記述されたデータである。１４３の「val->s=rand();」は、ｓの値を、実行時に生成される乱数の値に設定することを示し、１４４の「while(!FuncSelector(&val));」は、FuncSelectorが１を返すまで、val->nを更新して、ループさせることを示す。
【００４８】
なお、この関数呼出プログラム生成情報は、一例であって、この形に限定する必要はない。以下、関数呼出プログラム１４０の生成について説明する。
プログラム生成部１０４は、プログラム変換部１０２から受け取る関数構造から、初めに実行される関数がfuncAであり、funcAを識別する関数識別子が、関数識別子付与部１０３から受け取る関数識別子テーブル１３０より、「０」であることを判断し、関数呼出プログラム生成情報に、１４２の「val->n=0;」を書き込む。更に、プログラム生成部１０４は、関数構造から、最後に実行される関数がfuncDであることを判断し、関数呼出プログラム生成情報に、１４５の「printf(“%d\n”,a->d);」を書き込み、メイン関数１４１を生成する。ここで、１４５は、ｗｈｉｌｅ文によるループが終了すると、ｄの値を出力することを示す。
【００４９】
更に、プログラム生成部１０４は、関数呼出プログラム生成情報に関数データ１２０を書き込み、図９に示す関数呼出プログラム１４０を生成する。
（関数呼出順決定プログラム１５０の生成）
プログラム生成部１０４は、予め関数呼出順決定プログラム生成情報を記憶している。関数呼出順決定プログラム生成情報は、図１０に示す関数呼出順決定プログラム１５０の内、「FuncSelector()」、「int x」、１５２の「x=(a->n*13+a->s)%8;」、「a->n=x」及び１５３内の「switch(x)」が記述されたデータである。なお、この関数呼出順決定プログラム生成情報は、一例であって、この形に限定する必要はない。
【００５０】
ここで、１５２は、以下の（式１）を示している。
Ｘｎ＋１＝（Ｘｎ＊ａ＋ｂ）ｍｏｄ  ｍ  ａ＝１３、ｍ＝８      ・・・  （式１）
（式１）は、線形合同法と呼ばれる擬似乱数生成のアルゴリズムであって、適当なＸ０を与えることにより、０以上ｍ未満の乱数を要素とする乱数列｛Ｘ０、Ｘ１、Ｘ２、Ｘ３、・・・｝を生成する漸化式である、更に、（式１）は、定数項ｂを変化させることにより、異なる乱数列を生成する漸化式である。本明細書においては、定数項ｂを「初期値ｂ」と呼称する。以下、関数呼出順決定プログラム１５０の生成について説明する。
【００５１】
プログラム生成部１０４は、「FuncSelector( )」に関数名を書き込み「FuncSelector(struct val_t*a )」とする。
プログラム生成部１０４は、関数構造から各関数の実行順序を判断し、funcAが処理されたか否かを記憶する変数「f_a」、funcBが処理されたか否かを記憶する変数「f_b」、及び、funcC又はfuncC1が、処理されたか否かを記憶する変数「f_c」を関数呼出順決定プログラム生成情報に書き込む。funcCとfuncC1とは、恒等変換であり、何れか一方が処理されればよいので、同一の変数「f_c」を用いる。各変数は、「０」又は「１」の値を取り、「０」は、各関数が未処理であることを示し、「１」は、各関数が処理済であることを示す。具体的に、ここでは各変数の初期状態として、１５１に示す様に「staticint f_a=f_b=f_c=0;」、即ち、何れの関数も未処理であることを示す変数を書き込む。
【００５２】
また、プログラム生成部１０４は、関数識別子テーブル１３０、及び関数構造から、１５３のｓｗｉｔｃｈ文を作る。
プログラム生成部１０４は、関数識別子テーブル１３０から関数識別子が「０」である関数がfuncAであることを判断し、１５３のｓｗｉｔｃｈ文に、
case0:if(f_a==0){f_a=1;funcA(a);return(0);}を書き込む。
case0は、１５２で生成されるｘの値が「０」のとき実行される処理を示す。ｘ＝０のとき、１５１で記憶している変数f_aが「０」の場合、即ちfuncAが未処理の場合に、funcAを処理し、変数f_aを「１」に替えて、関数呼出プログラム１４０にリターン値「０」を返す。
【００５３】
次に、プログラム生成部は、関数識別子テーブル１３０から関数識別子が「１」である関数がfuncBであることを判断し、１５３のｓｗｉｔｃｈ文に、
case1:if(f_b==0){f_b=1;funcB(a);return(0);}を書き込む。
case1は、１５２で生成されるｘの値が「１」のとき実行される処理を示す。ｘ＝１のとき、１５１で記憶している変数f_bが「０」の場合、即ちfuncBが未処理の場合に、funcBを処理し、変数f_bを「１」に替えて、関数呼出プログラム１４０にリターン値「０」を返す。
【００５４】
次に、プログラム生成部は、関数識別子テーブル１３０から関数識別子が「２」である関数がfuncC1であることを判断し、１５３のｓｗｉｔｃｈ文に、
case2:if(f_c==0){f_c=1;funcC1(a);return(0);}を書き込む。
case2は、１５２で生成されるｘの値が「２」のとき実行される処理を示す。ｘ＝２のとき、１５１で記憶している変数f_cが「０」の場合、即ちfuncC及びfuncC1が未処理の場合に、funcC1を処理し、変数f_cを「１」に替えて、関数呼出プログラム１４０にリターン値「０」を返す。
【００５５】
次に、プログラム生成部は、関数識別子テーブル１３０から関数識別子が「３」である関数がfuncDummyであることを判断し、１５３のｓｗｉｔｃｈ文に、
case3:funcDummy(a);return(0);を書き込む。
case3は、１５２で生成されるｘの値が「３」のとき実行される処理を示す。ｘ＝３のとき、ダミー処理であるfuncDummyを実行し、リターン値「０」を返す。
【００５６】
次に、プログラム生成部は、関数識別子テーブル１３０から関数識別子が「４」である関数がfuncDであることを判断し、１５３のｓｗｉｔｃｈ文に、
case4:if(f_b==1 && f_c==1){funcD(a);return(1);}を書き込む。
case4は、１５２で生成されるｘの値が「４」のとき実行される処理を示す。ｘ＝４のとき、f_b及びf_cが共に「１」、即ちfuncB、及びfuncC又はfuncC1が処理済である場合に、funcDを処理し、関数呼出プログラム１４０にリターン値「１」を返す。
【００５７】
次に、プログラム生成部は、関数識別子テーブル１３０から関数識別子が「５」である関数がfuncCであることを判断し、１５３のｓｗｉｔｃｈ文に、
case5:if(f_c==0){f_c=1;funcC(a);return(0);}を書き込む。
case5は、１５２で生成されるｘの値が「５」のとき実行される処理を示す。ｘ＝５のとき、１５１で記憶している変数f_cが「０」の場合、即ちfuncC及びfuncC1が未処理の場合に、funcCを処理し、変数f_cを「１」に替えて、関数呼出プログラム１４０にリターン値「０」を返す。
【００５８】
プログラム生成部１０４は、関数識別子テーブル１３０に含まれる全ての関数識別子についてcaseを生成すると、関数呼出順決定プログラム生成情報に、default:return(0)を書き込む。defaultは、case0からcase5まで全てのcaseが満たされなかった場合の処理を示す。即ち１５２で生成されるｘの値が０、１、２、３、４、及び５の何れでもない場合に、関数呼出プログラム１４０にリターン値「０」を返す。
【００５９】
プログラム生成部１０４は、関数識別子付与部１０３から受け取った関数識別子テーブル１３０、生成した関数呼出プログラム１４０、及び生成した関数呼出順決定プログラム１５０を、コンパイル／リンク部１０５へ渡す。
（５）コンパイル／リンク部１０５
コンパイル／リンク部１０５は、関数識別子テーブル１３０、関数呼出プログラム１４０、及び関数呼出順決定プログラム１５０を、コンパイル、及びリンクして、プログラム実行形式を生成する。生成されたプログラム実行形式は、書込部１０６を介して記憶装置３０に書き込まれる。
【００６０】
（６）書込部１０６
書込部１０６は、記憶装置３０に対応したドライバであって、コンパイル／リンク部１０５によりコンパイル、及びリンクされて生成されたプログラム実行形式を、記憶装置３０に書き込む。
４．プログラム生成装置１０の動作
ここでは、図１１に示すフローチャートを用いて、プログラム生成装置１０におけるプログラム実行形式生成の動作について説明する。なお、ここで説明する動作は、図２のステップＳ１０１の詳細である。
【００６１】
先ず、プログラム変換部１０２は、オリジナルプログラム保持部１０１が保持するオリジナルプログラム１１０を読み出し、読み出したオリジナルプログラム１１０に含まれる各処理を解析し、各処理の依存関係を調べる（ステップＳ２００）。プログラム変換部１０２は、各処理の依存関係を調べた結果から、並列処理が可能な部分を抽出する（ステップＳ２０１）。プログラム変換部１０２は、各処理をグループに分け、１以上のグループに於いて、恒等変換を生成する（ステップＳ２０２）。具体的には、プログラム変換部１０２は、グループ３に於いて、（処理３）の恒等変換である（処理３´）を生成する。
【００６２】
次に、プログラム変換部１０２は、１以上のグループに於いて、ダミー処理を生成する（ステップＳ２０３）。具体的には、プログラム変換部１０２は、グループ２に於いて、（処理２）のダミー処理として（処理２´）を生成する。
次に、プログラム変換部１０２は、オリジナルプログラム１１０に含まれる（処理１）から（処理４）、恒等変換（処理３´）、及び、ダミー処理（処理２´）の変数を一つの構造体にして、各処理を関数化して図７に示した関数データ１２０を生成する（ステップＳ２０４）。
【００６３】
次に、関数識別子付与部１０３は、プログラム変換部１０２で変換した各関数に、各関数を一意に識別する関数識別子を付与し（ステップＳ２０５）、図８に示した、関数名と関数識別子とから成る関数識別子テーブル１３０を生成する（ステップＳ２０６）。
次に、プログラム生成部１０４は、関数呼出プログラム生成情報を読み出し（ステップＳ２０７）、読み出した関数呼出プログラム生成情報に、「int n=0」を書き込む（ステップＳ２０８）。次に、プログラム生成部１０４は、関数呼出プログラム生成情報に、「printf(“%d\n”,a->d)」を書き込む（ステップＳ２０９）。続いて、プログラム生成部１０４は、関数呼出プログラム生成情報に、ステップＳ２０４で生成した関数データ１２０（図７）を含めて、図９に示した関数呼出プログラム１４０を生成する（ステップＳ２１０）。
【００６４】
次に、プログラム生成部１０４は、関数呼出順決定プログラム生成情報を読み出し（ステップＳ２１１）、読み出した関数呼出順決定プログラム生成情報の「FuncSelector()」に関数名を書き込み、「FuncSelector(struct val_t*a)とする（ステップＳ２１２）。次に、プログラム生成部１０４は、関数呼出順決定プログラム生成情報に、各関数の呼出状態を記憶する変数、及びその初期状態である「staticint f_a=f_b=f_c=0」を書き込む（ステップＳ２１３）。
【００６５】
続いて、プログラム生成部１０４は、関数識別子テーブル１３０に含まれる全ての関数識別子について、caseを生成する（ステップＳ２１４）。具体的には、関数識別子テーブル１３０には、０から５までの関数識別子とそれに対応する関数名が記述されており、プログラム生成部１０４は、図１０に示す、case0からcase5までを生成する。プログラム生成部１０４は、全ての関数識別子に対応するcaseを生成すると、「default:return(0)」を生成する（ステップＳ２１５）。
【００６６】
プログラム生成部１０４は、ステップＳ２１４及びステップＳ２１５で生成されたcaseとdefaultとを含めてｓｗｉｔｃｈ文を完成させ、関数呼出順決定プログラム生成情報にｓｗｉｔｃｈ文を含め、図１０に示した関数呼出順決定プログラム１５０を生成する（ステップＳ２１６）。
次に、コンパイル／リンク部１０５は、関数識別子テーブル１３０、関数呼出プログラム１４０、及び関数呼出順決定プログラム１５０をコンパイル、及びリンクしてプログラム実行形式を生成する（ステップＳ２１７）。
【００６７】
５．プログラム実行装置２０の構成  
ここでは、プログラム実行装置２０の構成について説明する。
図１に示す様に、プログラム実行装置２０は、読出部２０１、プログラム実行部２０２、及びメモリ２０３から構成される。  
プログラム実行装置２０は、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット等から構成されるコンピュータシステムである。
【００６８】
（１）読出部２０１
読出部２０１は、記憶装置３０に対応したドライバであって、記憶装置３０が挿入された状態で、プログラム実行部２０２からの指示により、記憶装置３０に格納されているプログラム実行形式を読み出し、プログラム実行部２０２に出力する。
（２）プログラム実行部２０２
プログラム実行部２０２は、マイクロプロセッサ、作業用のメモリ、関数呼出プログラム１４０、関数呼出順決定プログラム１５０などにより実現される。
【００６９】
プログラム実行部２０２は、読出部２０１からプログラム実行形式を受け取り、メモリ２０３に格納する。また、プログラム実行部２０２は、メモリ２０３からプログラム実行形式を呼び出して実行する。
図１のプログラム実行部２０２の内部は、プログラム実行部２０２の機能的な構成を示している。同図に示す様に、プログラム実行部２０２は、プログラムロード部２１１、テーブル格納部２１２、関数呼出部２１３、及び実行部２１４から構成される。以下では、これらの機能的な構成に基づいて、プログラム実行部２０２について説明する。
【００７０】
プログラムロード部２１１は、記憶装置３０からのプログラム実行形式の読み出しを読出部２０１に指示し、読出部２０１からプログラム実行形式を受け取る。プログラムロード部２１１は、受け取ったプログラム実行形式の内、関数呼出プログラム１４０及び関数呼出順決定プログラム１５０を、メモリ２０３にロードする。
また、プログラムロード部２１１は、メモリ２０３にロードした関数呼出プログラム１４０に含まれる各関数の位置を指すアドレスを、読出部２０１から受け取った関数識別子テーブル１３０に追加して、図１２に示す関数識別子テーブル２２０を生成する。プログラムロード部２１１は、生成した関数識別子テーブル２２０を、テーブル格納部２１２に格納する。
【００７１】
テーブル格納部２１２は、プログラムロード部２１１から関数識別子テーブル２２０を受け取り、保持する。関数識別子テーブル２２０は、図１２に示す様に、関数毎に、関数名、関数識別子、及びメモリ上の位置を対応付けている。例えば、関数識別子「０」により識別される関数「funcA」が格納されているメモリ２０３上の位置を指すアドレスは、「０ｘ０７ｅ９５００」である。
【００７２】
関数呼出部２１３は、呼出状態保持部を備え、以下の情報を保持する。
（ａ）funcA、funcB、及び、funcC又はfuncC1が実行部２１４により実行されたか否かを示す情報。具体的に、関数呼出部２１３は、図１０に示した関数呼出順決定プログラム１５０の１５１で示される変数f_a、f_b、及びf_cにより、各関数が実行されたか否かが分かる。
【００７３】
（ｂ）関数の並列性を示す情報。具体的に、関数呼出部２１３は、関数呼出順決定プログラム１５０の１５１及び１５３から、funcBとfuncCとに並列性があることが分かる。
（ｃ）関数構造を示す情報。具体的に、関数呼出部２１３は、関数呼出プログラム１４０の１４２で示されるＸ０＝０、及び、関数呼出順決定プログラム１５０の１５３から、funcAが最初に実行され、funcB、及びfuncC又はfuncC1が実行された後、funcDが最後に実行されることが分かる。
【００７４】
関数呼出部２１３は、実行すべき関数の関数識別子を求め、関数識別子テーブル２２０から対応するアドレスを取得する。次に、関数呼出部２１３は、取得したアドレスに基づきメモリ２０３から関数を呼び出し、実行部２１４に渡す。
具体的には、関数呼出部２１３は、Ｘ０＝０であることから、先ず関数識別子が０であるfuncAをメモリ２０３から呼び出して実行部２１４に渡す。
【００７５】
関数呼出部２１３は、乱数を生成し、生成した乱数を（式１）のｂに代入し、更にＸ０＝０を代入し、Ｘ１を得る。関数呼出部２１３は、関数識別子がＸ１である関数を実行すべきか否か、呼出状態保持部の各情報から判断する。実行すべきであると判断する場合に、関数識別子テーブル２２０から対応するアドレスを取得して、メモリ２０３から関数を呼び出し、実行部２１４に渡す。関数を実行部２１４に渡すと、関数呼出部２１３は、呼出状態保持部が保持している実行済みであるか否かを示す変数を「実行済み」を示す状態に変える。
【００７６】
続いて、関数呼出部２１３は、（式１）にＸ１を代入してＸ２を得る。同様に、関数呼出部２１３は、関数識別子がＸ２である関数を実行すべきか否か、呼出状態保持部の各情報から判断する。実行すべきであると判断する場合に、関数識別子テーブル２２０から対応するアドレスを取得して、メモリ２０３から関数を呼び出し、実行部２１４に渡す。関数を実行部２１４に渡すと、関数呼出部２１３は、呼出状態保持部が保持している実行済みであるか否かを示す変数を「実行済み」を示す状態に変える。
【００７７】
同様にして、関数呼出部２１３は、（式１）に順にＸｎを代入してＸｎ＋１を得る。関数呼出部２１３は、funcDが呼び出され実行されるまで、上記の処理を続ける。funcDが実行されると、関数呼出部２１３は処理を終了する。
なお、関数呼出部２１３は、得られたＸｎと一致する関数識別子が関数識別子テーブル２２０に無い場合は、Ｘｎを（式１）に代入して、Ｘｎ＋１を得た後、Ｘｎを破棄する。
【００７８】
実行部２１４は、関数呼出部２１３から受け取る関数を実行する。
（３）メモリ２０３
メモリ２０３は、具体的には、ＲＡＭ及びＲＯＭから構成され、プログラムロード部２１１により書き込まれる関数呼出プログラム１４０、及び関数呼出順決定プログラム１５０を記憶する。
【００７９】
６．プログラム実行装置２０の動作
ここでは、図１３及び図１４に示すフローチャートを用いて、プログラム実行装置２０の動作について説明する。
先ず、プログラムロード部２１１は、読出部２０１を介して記憶装置３０からプログラム実行形式を読み出し、関数呼出プログラム１４０及び関数呼出順決定プログラム１５０を、メモリ２０３にロードする（ステップＳ３０１）。更に、プログラムロード部２１１は、読出部２０１から関数識別子テーブル１３０を受け取り、各関数のメモリ２０３上の位置を示すアドレスを格納し（ステップＳ３０２）、関数識別子テーブル２２０を生成する。プログラムロード部２１１は、生成した関数識別子テーブル２２０を、テーブル格納部２１２に格納する。
【００８０】
関数呼出部２１３は、乱数を生成し（ステップＳ３０３）、ｎを０に設定する（ステップＳ３０４）。関数呼出部２１３は、初期値ｂとして、ステップＳ３０３で生成した乱数を設定し（ステップＳ３０５）、
Ｘｎ＋１＝（Ｘｎ＊１３＋ｂ）ｍｏｄ８  ・・・  （式１）
Ｘ０＝０  ・・・  （式２）
から、Ｘｎを得る（ステップＳ３０６）。ここで、（式２）のＸ０＝０は、関数呼出プログラム１４０により与えられる。
【００８１】
関数呼出部２１３は、テーブル格納部２１２に格納されている関数識別子テーブル２２０から、関数識別子が、ステップＳ３０６で得たＸｎと同一である関数名を取得する（ステップＳ３０７）。例えば、関数呼出部２１３は、ステップＳ３０６で得たＸｎが、Ｘｎ＝０の場合、関数識別子テーブル２２０から関数名funcAを取得し、ステップＳ３０６で得たＸｎが、Ｘｎ＝３の場合は、関数識別子テーブル２２０から、関数名funcDummyを取得する。
【００８２】
関数呼出部２１３は、ステップＳ３０７で取得した関数名が、funcDummyである場合（ステップＳ３０８でＹＥＳ）、ステップＳ３１２へ進み処理を続け、関数名がfuncDummyでない場合（ステップＳ３０８でＮＯ）、呼出状態を確認する（ステップＳ３０９）。具体的には、関数呼出部２１３は、ステップＳ３０７で取得した関数名と同一の関数名を、内部の呼出状態保持部が保持するか否か判断する。
【００８３】
呼出状態保持部が、同一の関数名を保持する場合、即ち、ステップＳ３０７で取得した関数名の関数が既に処理済みである場合（ステップＳ３１０でＹＥＳ）、ステップＳ３１６に進み処理を続ける。呼出状態保持部が、同一の関数名を保持しない場合、即ち、ステップＳ３０７で取得した関数名の関数が未だ処理されていない場合（ステップＳ３１０でＮＯ）、呼出状態保持部の関数構造を確認する。
【００８４】
例えば、funcDは、funcB、及びfuncC又はfuncC1が処理済みでないと、処理されない。
ステップＳ３０７で取得した関数名の処理順序が正しくない場合（ステップＳ３１１でＮＯ）、ステップＳ３１７へ進み処理を続ける。処理順序が正しい場合（ステップＳ３１１でＹＥＳ）、関数呼出部２１３は、テーブル格納部２１２に格納されている関数識別子テーブル２２０から、ステップＳ３０７で取得した関数名、即ち、ステップＳ３０６で取得したＸｎと同一の関数識別子に対応する関数のメモリ２０３上の位置を示すアドレスを取得する（ステップＳ３１２）。例えば、Ｘｎ＝０であり、関数名がfuncAである場合、関数呼出部２１３は、アドレス「０ｘ０７ｅ９５００」を取得する。
【００８５】
次に、関数呼出部２１３は、メモリ２０３における、ステップＳ３１２で取得したアドレスが示す位置から、関数を呼び出し（ステップＳ３１３）、実行部２１４に渡す。実行部２１４は、関数呼出部２１３から関数を受け取り、実行する（ステップＳ３１４）。
続いて、関数呼出部２１３は、実行された関数の関数名を、呼出状態保持部に処理済みの関数として記憶する（ステップＳ３１５）。
【００８６】
関数呼出部２１３は、関数が全て処理されたことにより終了か否か判断し、終了の場合（ステップＳ３１６でＹＥＳ）、処理を終了する。未処理の関数があり、終了でない場合（ステップＳ３１６でＮＯ）、関数呼出部２１３は、ｎにｎ＋１を設定して（ステップＳ３１７）、ステップＳ３０６に戻り処理を続ける。
上記のように、プログラム実行装置２０は、生成した乱数を初期値ｂに設定し、
Ｘｎ＋１＝（Ｘｎ＊１３＋ｂ）ｍｏｄ８及び
Ｘ０＝０、
から、初期値ｂに固有の乱数列｛Ｘ０、Ｘ１、Ｘ２、・・・｝を取得する。
【００８７】
以下では、ｂに具体的な値を代入して説明する。図１５に示したテーブル２３０は、関数呼出順決定プログラム１５０に含まれる（式１）、及び関数呼出プログラム１４０に含まれる（式２）とから、初期値ｂを変化させたときに得られる乱数列の具体例を示している。
２３１は、初期値ｂ＝１を（式１）に代入した場合に生成される乱数列の一部を示す。同図に示す様に、ｂ＝１の場合に生成される乱数列は、
｛０，１，６，７，４，５，２，３，０，１，６，７，４，・・・｝
である。
【００８８】
２３２は、初期値ｂ＝３を（式１）に代入した場合に生成される乱数列の一部を示す。同図に示す様に、ｂ＝３の場合に生成される乱数列は、
｛０，３，２，５，４，７，６，１，０，３，２，５，４，・・・｝
である。
２３３は、初期値ｂ＝５を（式１）に代入した場合に生成される乱数列の一部を示す。同図に示す様に、ｂ＝５の場合に生成される乱数列は、
｛０，５，６，３，４，２，１，７，０，５，６，３，４，・・・｝
である。
【００８９】
２３４は、初期値ｂ＝７を（式１）に代入した場合に生成される乱数列の一部を示す。同図に示す様に、ｂ＝７の場合に生成される乱数列は、
｛０，７，２，１，４，３，６，５，０，７，２，１，４，・・・｝
である。
図１６に示したテーブル２４０は、初期値ｂを変化させたときに実行される関数の順序の具体例を示している。
【００９０】
２４１は、初期値ｂ＝１を（式１）に代入した場合に実行される関数の順序を示す。  ｂ＝１の場合、関数呼出部２１３は、先ずＸ０＝０を得る。関数呼出部２１３は、関数識別子テーブル２２０から関数識別子が０であるfuncAのアドレス「０ｘ０７ｅ９５００」を取得し、メモリ２０３から、取得したアドレスの位置にあるfuncAを呼び出して実行部２１４に渡す。実行部２１４は、funcAを実行する。
【００９１】
次に、関数呼出部２１３は、Ｘ１＝１を得る。関数呼出部２１３は、関数識別子テーブル２２０から関数識別子が１である関数がfuncBであることを判断し、呼出状態保持部が保持する情報から、未だfuncBが実行されていないことを判断する。また、呼出状態保持部が保持する情報から実行順序が正しいと判断する。関数呼出部２１３は、関数識別子テーブルからfuncBのアドレス「０ｘ０７ｅ９８００」を取得し、メモリ２０３から、取得したアドレスの位置にあるfuncBを呼び出して実行部２１４に渡す。実行部２１４は、funcBを実行する。
【００９２】
次に、関数呼出部２１３は、Ｘ２＝６を得る。関数識別子が６である関数は存在しないので、関数呼出部２１３は、次にＸ３＝７を得る。同様に、関数識別子が７である関数は、存在しないので、関数呼出部２１３は、次にＸ４＝４を得る。
関数呼出部２１３は、関数識別子テーブル２２０から関数識別子が４である関数がfuncDであることを判断する。関数呼出部２１３は、呼出状態保持部が保持する情報から、funcC又はfuncC1が未だ実行されていないことから、実行順序が正しくないと判断する。
【００９３】
次に、関数呼出部２１３は、Ｘ５＝５を得る。関数呼出部２１３は、関数識別子テーブル２２０から関数識別子が５である関数がfuncCであることを判断し、呼出状態保持部が保持する情報から、未だfuncCが実行されていないことを判断する。また、呼出状態保持部が保持する情報から実行順序が正しいと判断する。関数呼出部２１３は、関数識別子テーブルからfuncCのアドレス「０ｘ０７ｅ９９００」を取得し、メモリ２０３から、取得したアドレスの位置にあるfuncCを呼び出して実行部２１４に渡す。実行部２１４は、funcCを実行する。
【００９４】
次に、関数呼出部２１３は、Ｘ６＝２を得る。関数呼出部２１３は、関数識別子テーブル２２０から関数識別子が２である関数がfuncC1であると判断し、呼出状態保持部が保持する情報から、fucnCが実行済みであることから、ここでは、funcC1は、実行しないことを判断する。
次に、関数呼出部２１３は、Ｘ７＝３を得る。関数呼出部２１３は、関数識別子テーブル２２０から、関数識別子が３であるfuncDummyのアドレス「０ｘ０７ｅｂ０５０」を取得し、メモリ２０３から、取得したアドレスの位置にあるfuncDummyを呼び出して実行部２１４に渡す。実行部２１４は、funcDummyを実行する。
【００９５】
次に、関数呼出部２１３は、Ｘ８＝０を得る。関数呼出部２１３は、関数識別子が０であるfuncAは、既に実行済みであると判断する。
次に、関数呼出部２１３は、Ｘ９＝１を得る。関数呼出部２１３は、関数識別子が１であるfuncBは、既に実行済みであると判断する。
次に、関数呼出部２１３は、Ｘ１０＝６を得る。関数識別子が６である関数は存在しないので、関数呼出部２１３は、次にＸ１１＝７を得る。同様に、関数識別子が７である関数は、存在しないので、関数呼出部２１３は、次にＸ１２＝４を得る。
【００９６】
関数呼出部２１３は、関数識別子テーブル２２０から関数識別子が４である関数がfuncDであることを判断する。関数呼出部２１３は、呼出状態保持部が保持する情報から、funcB、及びfuncC又はfuncC1が実行済みであることから、実行順序が正しいと判断する。関数呼出部２１３は、関数識別子テーブル２２０から関数識別子が４であるfuncDのアドレス「０ｘ０７ｅｂ０１０」を取得し、メモリ２０３から、取得したアドレスの位置にあるfuncDを呼び出し、実行部２１４に渡す。実行部２１４は、funcDを実行する。
【００９７】
関数呼出部２１３は、funcDが実行され全ての関数の処理が終了したと判断して処理を終える。
上記の様に、初期値ｂ＝１の場合、funcA、funcB、funcC、funcDummy、funcDの順序で実行される。
２４２は、初期値ｂ＝３を（式１）に代入した場合に実行される関数の順序を示す。  ｂ＝１の場合、関数呼出部２１３は、先ずＸ０＝０を得る。関数呼出部２１３は、関数識別子テーブル２２０から関数識別子が０であるfuncAのアドレス「０ｘ０７ｅ９５００」を取得し、メモリ２０３から、取得したアドレスの位置にあるfuncAを呼び出して実行部２１４に渡す。実行部２１４は、funcAを実行する。
【００９８】
次に、関数呼出部２１３は、Ｘ１＝３を得る。関数呼出部２１３は、関数呼出部２１３は、関数識別子テーブル２２０から、関数識別子が３であるfuncDummyのアドレスを取得し、メモリ２０３から、取得したアドレスの位置にあるfuncDummyを呼び出して実行部２１４に渡す。実行部２１４は、funcDummyを実行する。
次に、関数呼出部２１３は、Ｘ２＝２を得る。関数呼出部２１３は、関数識別子テーブル２２０から関数識別子が２である関数がfuncC1であることを判断する。  
関数呼出部２１３は、呼出状態保持部が保持する情報から、funcC1及びfuncC共に未だ実行されていないことを判断する。また、呼出状態保持部が保持する情報から実行順序が正しいと判断する。関数呼出部２１３は、関数識別子テーブルからfuncC1のアドレスを取得し、メモリ２０３から、取得したアドレスの位置にあるfuncC1を呼び出して実行部２１４に渡す。実行部２１４は、funcC1を実行する。
【００９９】
次に、関数呼出部２１３は、Ｘ３＝５を得る。関数呼出部２１３は、関数識別子テーブル２２０から関数識別子が５である関数がfuncCであると判断し、呼出状態保持部が保持する情報から、fucnC1が実行済みであることから、ここでは、funcCは、実行しないことを判断する。
次に、関数呼出部２１３は、Ｘ４＝４を得る。関数呼出部２１３は、関数識別子テーブル２２０から関数識別子が４である関数がfuncDであることを判断する。関数呼出部２１３は、呼出状態保持部が保持する情報から、funcBが未だ実行されていないことから、実行順序が正しくないと判断する。
【０１００】
次に、関数呼出部２１３は、Ｘ５＝７を得る。関数識別子が７である関数は存在しないので、関数呼出部２１３は、次にＸ６＝６を得る。同様に、関数識別子が６である関数は、存在しないので、関数呼出部２１３は、次にＸ７＝１を得る。
関数呼出部２１３は、関数識別子テーブル２２０から関数識別子が１である関数がfuncBであることを判断し、呼出状態保持部が保持する情報から、未だfuncBが実行されていないことを判断する。また、呼出状態保持部が保持する情報から実行順序が正しいと判断する。関数呼出部２１３は、関数識別子テーブルからfuncBのアドレスを取得し、メモリ２０３から、取得したアドレスの位置にあるfuncBを呼び出して実行部２１４に渡す。実行部２１４は、funcBを実行する。
【０１０１】
次に、関数呼出部２１３は、Ｘ８＝０を得る。関数呼出部２１３は、関数識別子が０であるfuncAは、既に実行済みであると判断する。
次に、関数呼出部２１３は、Ｘ９＝３を得る。関数呼出部２１３は、関数呼出部２１３は、関数識別子テーブル２２０から、関数識別子が３であるfuncDummyのアドレスを取得し、メモリ２０３から、取得したアドレスの位置にあるfuncDummyを呼び出して実行部２１４に渡す。実行部２１４は、funcDummyを実行する。
【０１０２】
次に、関数呼出部２１３は、Ｘ１０＝２を得る。関数呼出部２１３は、関数識別子が２であるfuncC1は、既に実行済みであると判断する。
次に、関数呼出部２１３は、Ｘ１１＝５を得る。関数呼出部２１３は、関数識別子テーブル２２０から関数識別子が５である関数がfuncCであると判断し、呼出状態保持部が保持する情報から、fucnC1が実行済みであることから、ここでは、funcCは、実行しないことを判断する。
【０１０３】
次に、関数呼出部２１３は、Ｘ１２＝４を得る。関数呼出部２１３は、関数識別子テーブル２２０から関数識別子が４である関数がfuncDであることを判断する。関数呼出部２１３は、呼出状態保持部が保持する情報から、funcB、及びfuncC又はfuncC1が実行済みであることから、実行順序が正しいと判断する。関数呼出部２１３は、関数識別子テーブル２２０から関数識別子が４であるfuncDのアドレスを取得し、メモリ２０３から、取得したアドレスの位置にあるfuncDを呼び出し、実行部２１４に渡す。実行部２１４は、funcDを実行する。
【０１０４】
関数呼出部２１３は、funcDが実行され全ての関数の処理が終了したと判断して処理を終える。
上記の様に、初期値ｂ＝３の場合、funcA、funcDummy、funcC1、funcB、funcDummy、funcDの順序で実行される。
２４３は、初期値ｂ＝５の場合に実行される関数の順序を示している。初期値ｂ＝５の場合、funcA、funcC、funcDummy、funcB、funcDummy、funcDの順序で実行される。
【０１０５】
２４４は、初期値ｂ＝７の場合に実行される関数の順序を示している。初期値ｂ＝７の場合、funcA、funcC1、funcB、funcDの順序で実行される。
７．関数の属性によるグループ化について
以上説明したように、プログラム生成装置１０のプログラム変換部１０２は、オリジナルプログラムを解析し、解析結果である関数構造をプログラム生成部１０４へ通知する構成を有する。
【０１０６】
ここで、プログラム生成装置１０は、オリジナルプログラムを解析し、オリジナルプログラムに含まれる各関数の属性により関数をグループ化した関数グループに従い関数の実行順序を決定するようなプログラム実行形式を生成してもよい。
ここでは、図１７に示した関数構造２５０を用いて、関数グループに従い関数の実行順序を決定する方法について説明する。同図に示す様に、関数構造２５０は、シーケンシャルグループ２５１、並列グループ２５２、及び恒等グループ２５４を含む。
【０１０７】
シーケンシャルグループ２５１は、funcA２６１、並列グループ２５２、及びfuncD２６６から成る。
並列グループ２５２は、グループ２５３及び恒等グループ２５４から成る。
恒等グループ２５４は、funcC２６４及びfuncC1２６５から成る。
プログラム生成装置１０は、シーケンシャルグループ２５１について、２６１→２５２→２６６の順序にシーケンシャルに実行し、並列グループ２５２について、実行時にランダムに決定される順序でグループ２５３と恒等グループ２５４とを実行し、恒等グループ２５４について、funcC２６４又はfuncC1２６５の何れか一方を実行時にランダムに選択して実行し、funcDummy２６３について、実行するか又は実行しないか、及び、実行する場合に何回実行するか、実行時にランダムに決定して実行する関数呼出プログラムを生成する。
【０１０８】
プログラム実行装置２０は、プログラム生成装置１０が生成した関数呼出プログラムを実行することにより、実行毎に異なる順序で各関数を実行する。
＜第２の実施形態＞
ここでは、本発明に係る第２の実施形態として、情報処理システム２について説明する。
【０１０９】
情報処理システム２は、プログラム実行形式の生成時に、複数の実行経路パターンを生成し、プログラム実行時には、生成された複数の実行経路パターンの内、一の実行経路パターンを選択して実行することを特徴とする。
１．全体の構成
図１８は、情報処理システム２の構成を示す構成図である。同図に示すように、情報処理システム２は、プログラム生成装置１０ａ、プログラム実行装置２０ａ、及び記憶装置３０ａから構成される。
【０１１０】
プログラム生成装置１０ａ及びプログラム実行装置２０ａは、第１の実施形態で開示したプログラム生成装置１０及びプログラム実行装置２０と同様、コンピュータシステムであり、記憶装置３０ａは、光ディスクである。
２．全体の動作
ここでは、図１９に示すフローチャートを用いて、情報処理システム２全体の動作について説明する。
【０１１１】
プログラム生成装置１０ａは、オリジナルプログラムからプログラム実行形式を生成し（ステップＳ４０１）、その後、実行経路パターンリストを生成する（ステップＳ４０２）。プログラム生成装置１０ａは、生成したプログラム実行形式と実行経路パターンリストとを記憶装置３０ａに書き込む（ステップＳ４０３）。
記憶装置３０ａは、プログラム実行形式と実行経路パターンリストとを記憶する（ステップＳ１０３）。
【０１１２】
プログラム実行装置２０ａは、記憶装置３０ａからプログラム実行形式と実行経路パターンリストとを読み出す（ステップＳ４０５）。プログラム実行装置２０ａは、実行経路パターンリストから初期値を選択し（ステップＳ４０６）、選択した初期値に応じて決定される順序で、プログラム実行形式の各処理を実行する（ステップＳ４０７）。
３．プログラム生成装置１０ａの構成
ここでは、図１８を用いて、プログラム生成装置１０ａの構成について説明する。同図に示すように、プログラム生成装置１０ａは、オリジナルプログラム保持部１０１ａ、プログラム変換部１０２ａ、関数識別子付与部１０３ａ、プログラム生成部１０４ａ、コンパイル／リンク部１０５ａ、書込部１０６ａ、及び実行経路パターン生成部１０７ａから構成される。
【０１１３】
プログラム生成装置１０ａは、図１に示したプログラム生成装置１０に、実行経路パターン生成部１０７ａを追加した構成を有する。
オリジナルプログラム保持部１０１ａ、プログラム変換部１０２ａ、関数識別子付与部１０３ａ、プログラム生成部１０４ａ、コンパイル／リンク部１０５ａ、及び書込部１０６ａは、オリジナルプログラム保持部１０１、プログラム変換部１０２、関数識別子付与部１０３、プログラム生成部１０４、コンパイル／リンク部１０５、及び書込部１０６と同様の機能を有する。
【０１１４】
即ち、オリジナルプログラム保持部１０１ａは、図３に示したオリジナルプログラム１１０を保持しており、プログラム変換部１０２ａは、オリジナルプログラム１１０を変換して、図７に示した関数データ１２０を生成する。関数識別子付与部１０３ａは、関数データ１２０に含まれる各関数に、識別子を付与し、図８に示した関数識別子テーブル１３０を生成する。プログラム生成部１０４ａは、図９に示した関数呼出プログラム１４０と、図１０に示した関数呼出順決定プログラム１５０とを生成する。
【０１１５】
実行経路パターン生成部１０７ａは、先に述べたように第２の実施形態のプログラム生成装置１０ａに特徴的な構成要素である。実行経路パターン生成部１０７ａは、実行経路パターンリストを生成する。実行経路パターン生成部１０７ａは、プログラム生成部１０４ａにより生成された関数呼出プログラム１４０と関数呼出順決定プログラム１５０とを受け取り、受け取った関数呼出プログラム１４０と、関数呼出順決定プログラム１５０と、生成した実行経路パターンリストとをコンパイル／リンク部１０５ａへ出力する。
【０１１６】
ここで、図２０は、実行経路パターンリスト３００のデータ構成を示す図である。実行経路パターンリスト３００は、実行経路パターン生成部１０７ａが生成する実行経路パターンリストの具体例である。同図に示すように、実行経路パターンリスト３００は、４つのパターン情報３０１、３０２、３０３、及び３０４から構成される。各パターン情報は、index、実行経路パターン値、及びフラグを含む。
【０１１７】
各indexに対応付けられた実行経路パターン値は、実行経路パターン生成部１０７ａにより生成された乱数の値である。フラグは、０又は１に設定されており、０は、プログラム実行装置２０ａによるプログラム実行形式の実行に際し、対応付けられている実行経路パターン値が、また選択されていないことを示し、１は、対応付けられている実行経路パターン値が、すでに選択されたことを示す。
【０１１８】
コンパイル／リンク部１０５ａは、実行経路パターン生成部１０７ａから、関数呼出プログラム１４０と、関数呼出順決定プログラム１５０と、実行経路パターンリストとを受け取る。コンパイル／リンク部１０５ａは、受け取ったこれらのプログラム及びデータを、コンパイル及びリンクして、プログラム実行形式を生成する。コンパイル／リンク部１０５ａは、生成したプログラム実行形式を書込部１０６ａへ出力する。  
【０１１９】
書込部１０６ａは、コンパイル／リンク部１０５ａから出力されるプログラム実行形式を、記憶装置３０ａに書き込む。
４．実行経路パターンリスト生成の動作
ここでは、図２１に示したフローチャートを用いて、プログラム生成装置１０ａによる実行経路パターンリスト生成処理の動作について説明する。
【０１２０】
先ず、プログラム生成装置１０ａの実行経路パターン生成部１０７ａは、実行経路パターン数Ｎを決定する（ステップＳ４１１）。実行経路パターン数Ｎは、予め所定数が実行経路パターン生成部１０７ａの内部に保持されており、この所定数をＮとして用いてもよいし、外部の入力装置からユーザの入力を受け付け、受け付けた値をＮとして用いてもよい。ここで、実行経路パターン生成部１０７ａが、図２０に示した実行経路パターンリスト３００を生成しようとする場合は、実行経路パターン数Ｎ＝４とする必要がある。
【０１２１】
次に、実行経路パターン生成部１０７ａは、実行経路パターンリストを内部にセットする（ステップＳ４１２）。ここでセットされる実行経路パターンリストは、indexの列については、上から順に０から（Ｎ−１）までの数値が書き込まれており、フラグの列については、上から順に全て０が書き込まれており、実行経路パターン値の列については、まだ何れのデータも書き込まれていない空欄状態のリストである。
【０１２２】
次に、実行経路パターン生成部１０７ａは、ｌ＝０とし（ステップＳ４１３）、乱数ｒを生成する（ステップＳ４１４）。実行経路パターン生成部１０７ａは、ステップＳ４１４で生成した乱数ｒが、既に実行経路パターンリストの実行経路パターン値に含まれるか否か判断する（ステップＳ４１５）。ｒが実行経路パターンリストに含まれる場合（ステップＳ４１５でＹＥＳ）、ステップＳ４１４に戻って処理を続ける。ｒが実行経路パターンリストに含まれない場合（ステップＳ４１５でＮＯ）、実行経路パターン生成部１０７ａは、ｒを、実行経路パターンリストに書き込む（ステップＳ４１６）。
【０１２３】
次にｌ＝ｌ＋１とし（ステップＳ４１７）、実行経路パターン生成部１０７ａは、ｌとＮとが一致するか否か判断する（ステップＳ４１８）。Ｎは、ステップＳ４１１で決定した実行経路パターン数である。
ｌ≠Ｎの場合（ステップＳ４１８でＮＯ）、実行経路パターン生成部１０７ａは、ステップＳ４１４へ戻り処理を続ける。ｌ＝Ｎの場合（ステップＳ４１８でＹＥＳ）、即ち、実行経路パターン数Ｎと一致する数の実行経路パターン値を含む実行経路パターンリストが生成された場合に、実行経路パターン生成部１０７ａは、生成された実行経路パターンリストを、コンパイル／リンク部１０５ａへ出力する（ステップＳ４１９）。
【０１２４】
５．プログラム実行装置２０ａの構成
プログラム実行装置２０ａは、記憶装置３０ａからプログラム実行形式を読み出し、読み出したプログラム実行形式を実行する装置である。
図１８に示すように、プログラム実行装置２０ａは、読出部２０１ａとプログラム実行部２０２ａとメモリ２０３ａとから構成され、プログラム実行部２０２ａは、プログラムロード部２１１ａ、テーブル格納部２１２ａ、関数呼出部２１３ａ、及び実行部２１４ａから構成される。
【０１２５】
各構成要素の機能については、第１の実施形態におけるプログラム実行装置２０と同様である。
第１の実施形態で開示したプログラム実行装置２０は、プログラム実行時に、乱数を生成し、生成した乱数を初期値とし、初期値に応じて決定される順序で、プログラムを実行する構成を有していた。一方、本実施形態におけるプログラム実行装置２０ａは、プログラム実行時に、図２０に示した実行経路パターンリストから１の実行経路パターン値を選択して、選択した実行経路パターン値を初期値として、初期値に応じて決定される順序で、プログラムを実行する。
【０１２６】
６．プログラム実行処理の動作
図２２及び図２３は、プログラム実行装置２０ａによるプログラム実行処理の動作を示すフローチャートである。なお、ここでは、具体例として、記憶装置３０ａには、関数識別子テーブル１３０（図８）、関数呼出プログラム１４０（図９）、関数呼出順決定プログラム１５０（図１０）、及び実行経路パターンリスト３００（図２０）が格納されているものとする。
【０１２７】
先ず、プログラム実行装置２０ａの読出部２０１ａは、記憶装置３０ａから関数呼出プログラム１４０及び関数呼出順決定プログラム１５０を読み出す。プログラムロード部２１１ａは、読出部２０１ａが読み出した関数呼出プログラム１４０及び関数呼出順決定プログラム１５０を、メモリ２０３ａにロードする（ステップＳ４３１）。
更に、読出部２０１ａは、記憶装置３０ａから関数識別子テーブル１３０を読み出す。プログラムロード部２１１ａは、関数識別子テーブル１３０に、各関数のメモリ２０３ａ上の位置を示すアドレスを格納し（ステップＳ４３２）、関数識別子テーブル２２０（図１２）を生成する。テーブル格納部２１２ａは、生成された関数識別子テーブル２２０を、内部に格納する。
【０１２８】
また、プログラム実行装置２０ａは、記憶装置３０ａから実行経路パターンリスト３００を読み出し、読み出した実行経路パターンリスト３００を、メモリ２０３ａに格納する。
次に、プログラム実行部２０２ａの関数呼出部２１３ａは、実行経路パターンリスト３００に含まれる各indexに対応付けられたフラグの値を合計し、合計値をＦとする（ステップＳ４３３）。関数呼出部２１３ａは、Ｆと実行経路パターン値Ｎとが一致するか否か判断する（ステップＳ４３４）。ここで実行経路パターンリスト３００の実行経路パターン数は、Ｎ＝４である。
【０１２９】
Ｆ＝Ｎの場合（ステップＳ４３４でＹＥＳ）、関数呼出部２１３ａは、実行経路パターンリスト３００のフラグ値を全て０にセットしなおす（ステップＳ４３５）。その後、ステップＳ４３３へ進み、処理を続ける。
Ｆ≠Ｎの場合（ステップＳ４３４でＮＯ）、関数呼出部２１３ａは、乱数Ｒを生成し（ステップＳ４３６）、Ｒ  ｍｏｄ  Ｎの値を、indexとして指定する（ステップS４３７）。Ｒ  ｍｏｄ  Ｎとは、ＲをＮで割った余りである。関数呼出部２１３ａは、メモリ２０３ａに格納されている実行経路パターンリスト３００から、指定したindexに対応付けられているフラグ値を読む（ステップS４３８）。
【０１３０】
フラグ値が１の場合（ステップS４３９でＮＯ）、関数呼出部２１３ａは、ステップＳ４３６へ戻って処理を続ける。
フラグ値が０の場合（ステップＳ４３９でＹＥＳ）、関数呼出部２１３ａは、フラグ値を０から１に替えてセットし（ステップＳ４４０）、実行経路パターンリスト３００から、指定したindexに対応付けられている実行経路パターン値を読み出し（ステップＳ４４１）、読み出した実行経路パターン値をｒとする。
【０１３１】
関数呼出部２１３ａは、実行経路パターン値ｒを初期値として、
Ｘ０＝０  、及び
Ｘｎ＋１＝（Ｘｎ＊１３＋ｒ）ｍｏｄ８
から、Ｘｎを得る（ステップＳ４４２）。
関数呼出部２１３ａは、テーブル格納部２１２ａに格納されている関数識別子テーブル２２０から、関数識別子が、ステップＳ４４２で得たＸｎと同一である関数名を取得する（ステップS４５１）。関数呼出部２１３ａは、ステップＳ４５１で取得した関数名がfuncDummyである場合（ステップＳ４５２でＹＥＳ）、ステップＳ４５６へ進み処理を続け、関数名がfuncDummyでない場合（ステップＳ４５２でＮＯ）、呼出状態を確認する（ステップＳ４５３）。具体的には、関数呼出部２１３ａは、ステップＳ４５１で取得した関数名と同一の関数名を、内部の呼出状態保持部が保持するか否か判断する。ここで、呼出状態保持部は、第１の実施形態であるプログラム実行装置２０の関数呼出部２１３が備える呼出状態保持部と同様の情報を保持しているものとする。
【０１３２】
呼出状態保持部が、同一の関数名を保持する場合、即ち、ステップＳ４５１で取得した関数名の関数が既に処理済みである場合（ステップＳ４５４でＹＥＳ）、ステップＳ４６０に進み処理を続ける。呼出状態保持部が、同一の関数名を保持しない場合、即ち、ステップＳ４５１で取得した関数名の関数が未だ処理されていない場合（ステップＳ４５４でＮＯ）、呼出状態保持部の関数構造を確認する。
【０１３３】
例えば、funcDは、funcB、及びfuncC又はfuncC1が処理済みでないと、処理されない。
ステップＳ４５１で取得した関数名の処理順序が正しくない場合（ステップＳ４５５でＮＯ）、ステップＳ４６１へ進み処理を続ける。処理順序が正しい場合（ステップＳ４５５でＹＥＳ）、関数呼出部２１３ａは、テーブル格納部２１２ａに格納されている関数識別子テーブル２２０から、ステップＳ４５１で取得した関数名、即ち、ステップＳ４４２で取得したＸｎと同一の関数識別子に対応する関数のメモリ上の位置を示すアドレスを取得する（ステップＳ４５６）。
【０１３４】
次に、関数呼出部２１３ａは、メモリ２０３ａにおける、ステップＳ４５６で取得したアドレスが示す位置から、関数を呼び出し（ステップＳ４５７）、実行部２１４ａに渡す。実行部２１４ａは、関数呼出部２１３ａから関数を受け取り、実行する（ステップＳ４５８）。続いて、関数呼出部２１３ａは、実行された関数の関数名を、呼出状態保持部に処理済みの関数として記憶する（ステップＳ４５９）。
【０１３５】
関数呼出部２１３ａは、実行すべき関数が全て処理されたことにより終了か否か判断し（ステップＳ４６０）、終了の場合（ステップＳ４６０でＹＥＳ）、処理を終了する。未処理の関数があり、終了でない場合（ステップＳ４６０でＮＯ）、関数呼出部２１３ａは、ｎにｎ＋１を設定して（ステップＳ４６１）、ステップＳ４４２に戻り処理を続ける。
＜第３の実施形態＞
ここでは、本発明に係る第３の実施形態として、情報処理システム３について説明する。
【０１３６】
情報処理システム３は、プログラム実行形式を生成し、生成したプログラム実行形式が正常に動作するか否かをテストし、正常に動作する実行経路パターンを複数個抽出し、プログラム実行時には、正しく動作する複数の実行経路パターンの内、一の実行経路パターンを選択して実行することを特徴とする。
１．全体の構成
図２４は、情報処理システム３の構成を示す図である。同図に示すように、情報処理システム３は、プログラム生成装置１０ｂ、プログラム実行装置２０ｂ、記憶装置３０ｂ、プログラムテスト装置４０ｂ、及び記憶装置５０ｂから構成される。
【０１３７】
プログラム生成装置１０ｂ、プログラム実行装置２０ｂ、及びプログラムテスト装置４０ｂは、コンピュータシステムである。また、記憶装置３０ｂ及び５０ｂは、光ディスクである。  
プログラム生成装置１０ｂは、第１の実施形態で開示したプログラム生成装置１０（図１）と同一の構成及び機能を有する。プログラム実行装置２０ｂは、第２の実施形態で開示したプログラム実行装置２０ａと同一の構成及び機能を有する。プログラムテスト装置４０ｂは、第３の実施形態に特有の構成要素である。
【０１３８】
２．全体の動作
図２５は、情報処理システム３全体の動作を示すフローチャートである。
プログラム生成装置１０ｂは、オリジナルプログラムからプログラム実行形式を生成する（ステップＳ５０１）。プログラム生成装置１０ｂは、記憶装置３０ｂを介して、生成したプログラム実行形式をプログラムテスト装置４０ａへ渡す（ステップＳ５０２）。
【０１３９】
プログラムテスト装置４０ｂは、記憶装置３０ｂから、プログラム実行形式を読み出し、実行する。プログラムテスト装置４０ｂは、正常動作する実行経路パターンを複数個選択し（ステップＳ５０３）、実行経路パターンリストを生成する（ステップＳ５０４）。プログラムテスト装置４０ｂは、記憶装置５０ｂを介して、プログラム実行形式と実行経路パターンリストとをプログラム実行装置２０ｂへ渡す（ステップＳ５０５）。
【０１４０】
プログラム実行装置２０ｂは、記憶装置５０ｂからプログラム実行形式と実行経路パターンリストとを読み出す。プログラム実行装置２０ｂは、実行経路パターンリストから初期値を選択し（ステップＳ５０６）、選択した初期値に応じて決定される順序で、プログラム実行形式の各処理を実行する（ステップＳ５０７）。
３．プログラム生成装置１０ｂの構成及び動作
プログラム生成装置１０ｂは、第１の実施形態で開示したプログラム生成装置１０（図１）と同様の構成を有するため、プログラム生成装置１０ｂの内部構成については図示していない。
【０１４１】
即ち、プログラム生成装置１０ｂは、オリジナルプログラム保持部、プログラム変換部、関数識別子付与部、プログラム変換部、コンパイル／リンク部、及び書込部から構成される。
オリジナルプログラム保持部は、図３に示したオリジナルプログラム１１０とオリジナルプログラム１１０の実行結果とを保持している。オリジナルプログラム保持部は、オリジナルプログラム１１０をプログラム変換部へ渡し、オリジナルプログラム１１０の実行結果を書込部へ渡す。
【０１４２】
プログラム変換部は、オリジナルプログラム１１０を変換して、図７に示した関数データ１２０を生成する。関数識別子付与部は、関数データ１２０に含まれる各関数に、識別子を付与し、図８に示した関数識別子テーブル１３０を生成する。プログラム生成部は、図９に示した関数呼出プログラム１４０と、図１０に示した関数呼出順決定プログラム１５０を生成する。
【０１４３】
コンパイル／リンク部は、プログラム生成部から関数呼出プログラム１４０及び関数呼出順決定プログラム１５０を受け取る。コンパイル／リンク部は、受け取ったこれらのプログラム及びデータを、コンパイル及びリンクして、プログラム実行形式を生成する。コンパイル／リンク部は、生成したプログラム実行形式を書込部へ出力する。
書込部は、コンパイル／リンク部から出力されるプログラム実行形式を、記憶装置３０ｂに書き込む。また、書込部は、オリジナルプログラム保持部から出力されるオリジナルプログラム１１０の実行結果を、記憶装置３０ｂに書き込む。
【０１４４】
なお、プログラム生成装置１０ｂによる、プログラム実行形式生成処理の動作は、図１１に示したプログラム生成装置１０による動作と同様であるため、説明を省略する。
４．プログラムテスト装置４０ｂの構成
プログラムテスト装置４０ｂは、図２４に示すように、読出部４０１ｂ、プログラム実行部４０２ｂ、メモリ４０３ｂ、実行経路パターン生成部４０４ｂ、及び書込部４０５ｂから構成され、プログラム実行部４０２ｂは、更に、プログラムロード部４１１ｂ、テーブル格納部４１２ｂ、関数呼出部４１３ｂ、及び実行部４１４ｂから構成される。
【０１４５】
即ち、プログラムテスト装置４０ｂは、第１の実施形態で開示したプログラム実行装置２０（図１）に、実行経路パターン生成部４０４ｂと書込部４０５ｂとを追加した構成を有する。
読出部４０１ｂは、記憶装置３０ｂからプログラム実行形式とオリジナルプログラム１１０の実行結果とを読み出し、実行結果を実行経路パターン生成部４０４ｂへ渡し、プログラム実行形式をプログラムロード部４１１ｂへ渡す。
【０１４６】
プログラムロード部４１１ｂは、読出部４０１ｂからプログラム実行形式を受け取り、受け取ったプログラム実行形式の内、関数呼出プログラム１４０及び関数呼出順決定プログラム１５０を、メモリ４０３ｂにロードする。
また、プログラムロード部４１１ｂは、メモリ４０３ｂにロードした関数呼出プログラム１４０に含まれる各関数の位置を指すアドレスを、関数識別子テーブル１３０に追加して、図１２に示す関数識別子テーブル２２０を生成する。プログラムロード部４１１ｂは、生成した関数識別子テーブル２２０を、テーブル格納部４１２ｂに格納する。
【０１４７】
テーブル格納部４１２ｂは、プログラムロード部４１１ｂから関数識別子テーブル２２０を受け取り、保持する。
関数呼出部４１３ｂは、第１及び第２の実施形態と同様に、呼出状態保持部を備え上記実施形態で説明した情報を保持する。
関数呼出部２１３は、実行経路パターン生成部４０４ｂから初期値ｒを受け取り、受け取った初期値ｒに応じた順序でメモリ４０３ｂから関数を呼び出し、実行部４１４ｂに渡す。
【０１４８】
実行部４１４ｂは、関数呼出部４１３ｂから受け取る関数を実行する。更に、実行部４１４ｂは、プログラムの実行結果を、実行経路パターン生成部４０４ｂへ渡す。
実行経路パターン生成部４０４ｂは、第２の実施形態で開示したプログラム生成装置１０ａの構成要素である実行経路パターン生成部１０７ａと同様の機能を有する。即ち、実行経路パターン生成部４０４ｂは、実行経路パターンリストを生成する。
【０１４９】
ここで、実行経路パターン生成部４０４ｂと実行経路パターン生成部１０７ａとの相違点は、実行経路パターン生成部４０４ｂは、生成した実行経路パターンに基づきプログラム実行形式を実行した結果と、オリジナルプログラム１１０の実行結果とを比較し、両者が等しいと判断された実行経路パターンのみから成るリストを生成する点である。これに対し、実行経路パターン生成部１０７ａは、複数の実行経路パターンを生成するにとどまり、生成した実行経路パターンのそれぞれが、オリジナルプログラム１１０の実行結果と等しいか否かについての検証は行っていない。
【０１５０】
実行経路パターン生成部４０４ｂは、生成した実行経路パターンリストを書込部４０５ｂへ渡す。
書込部４０５ｂは、実行経路パターン生成部４０４ｂにより生成された実行経路パターンリストと、メモリ４０３ｂに記憶していたプログラム実行形式とを記憶装置５０ｂに書き込む。
【０１５１】
メモリ４０３ｂは、具体的には、ＲＡＭ及びＲＯＭから構成され、プログラムロード部４１１ｂにより書き込まれる関数呼出プログラム１４０、及び関数呼出順決定プログラム１５０を記憶する。
５．実行経路パターンリスト生成処理の動作
ここでは、図２６に示すフローチャートを用いて、プログラムテスト装置４０ｂによる、実行経路パターンリスト生成処理の動作について説明する。
【０１５２】
実行経路パターン生成部４０４ｂは、実行経路パターン数Ｎを決定する（ステップＳ５１１）。また、実行経路パターン生成部４０４ｂは、読出部４０１ｂを介して記憶装置３０ｂからオリジナルプログラム１１０の実行結果Ｖａｌ１を取得する（ステップＳ５１２）。
次に、実行経路パターン生成部４０４ｂは、実行経路パターンリストを内部にセットする（ステップＳ５１３）。ここでセットされる実行経路パターンリストは、indexの列については、上から順に０から（Ｎ−１）までの数値が書き込まれており、フラグの列については、上から順に全て０が書き込まれており、実行経路パターン値の列については、まだ何れのデータも書き込まれていない空欄状態のリストである。
【０１５３】
次に、実行経路パターン生成部４０４ｂは、ｌ＝０とし（ステップＳ５１４）、乱数ｒを生成する（ステップＳ５１５）。実行経路パターン生成部１０７ａは、ステップＳ５１５で生成した乱数ｒが、既に実行経路パターンリストの実行経路パターン値に含まれるか否か判断する（ステップＳ５１６）。ｒが実行経路パターンリストに含まれる場合（ステップＳ５１６でＹＥＳ）、ステップＳ５１５に戻って処理を続ける。ｒが実行経路パターンリストに含まれない場合（ステップＳ５１６でＮＯ）、ｒを初期値とし、プログラム実行部４０２ｂによりプログラム実行形式の実行処理を行う（ステップＳ５１８）。
【０１５４】
なお、ステップＳ５１８のプログラム実行処理の動作は、図２２及び図２３に示したフローチャートの、ステップＳ４４１からステップＳ４６０までの動作と同一であるので、詳細な説明は省略する。
実行経路パターン生成部４０４ｂは、実行部４１４ｂからプログラム実行形式の出力結果Ｖａｌ２を受け取る（ステップＳ５１８）。実行経路パターン生成部４０４ｂは、オリジナルプログラム１１０の実行結果Ｖａｌ１と、初期値ｒとして実行したプログラム実行形式の実行結果Ｖａｌ２とを比較する（ステップＳ５１９）。
【０１５５】
Ｖａｌ１≠Ｖａｌ２のとき（ステップＳ５１９でＮＯ）、実行経路パターン生成部４０４ｂは、ステップＳ５１５に戻り処理を続ける。
Ｖａｌ１＝Ｖａｌ２のとき（ステップＳ５１９でＹＥＳ）、実行経路パターン生成部４０４ｂは、ｒを実行経路パターンリストに書き込む（ステップＳ５２０）。
次にｌ＝ｌ＋１とし（ステップＳ５２１）、実行経路パターン生成部４０４ｂは、ｌとＮとが一致するか否か判断する（ステップＳ５２２）。Ｎは、ステップＳ５１１で決定した実行経路パターン数である。
【０１５６】
ｌ≠Ｎの場合（ステップＳ５２２でＮＯ）、実行経路パターン生成部４０４ｂは、ステップＳ５１５へ戻り処理を続ける。ｌ＝Ｎの場合（ステップＳ５２２でＹＥＳ）、即ち、実行経路パターン数Ｎと一致する数の実行経路パターン値を含む実行経路パターンリストが生成された場合に、実行経路パターン生成部４０４ｂは、生成された実行経路パターンリストを書込部４０５ｂへ出力する。
【０１５７】
６．プログラム実行装置２０ｂの構成及び動作
プログラム実行装置２０ｂは、図２４に示すように、読出部２０１ｂ、プログラム実行部２０２ｂ、及びメモリ２０３ｂから構成され、プログラム実行部２０２ｂは、プログラムロード部２１１ｂ、テーブル格納部２１２ｂ、関数呼出部２１３ｂ、及び実行部２１４ｂから構成される。
【０１５８】
プログラム実行装置２０ｂの各構成要素は、第２の実施形態で開示したプログラム実行装置２０ａの各構成要素と同様の機能を有する。即ち、プログラム実行装置２０ｂは、プログラム実行時に、メモリ２０３ｂに格納されている実行経路パターンリストから１の実行経路パターン値を選択し、選択した実行経路パターン値を初期値として、初期値に応じて決定される順序で、プログラムを実行する。
【０１５９】
＜その他の変形例＞
なお、本発明を上記の実施形態に基づき説明してきたが、本発明は上記の実施形態に限定されないのは勿論であり、以下の様な場合も本発明に含まれる。  
（１）上記の実施形態では、プログラム生成装置は、各命令を関数化し、各関数を線形合同法の式とｓｗｉｔｃｈ文とにより呼び出すプログラムを生成したが、本発明においてプログラム生成装置が生成するプログラムは、この構成に限定されない。例えば、プログラム生成装置が、図２７（ａ）及び（ｂ）に示すように、各命令を関数化せずｓｗｉｔｃｈ文とｇｏｔｏ文とを用い、各命令を実行させるプログラムを生成する場合も本発明に含まれる。
【０１６０】
図２７（ａ）に示すプログラム４０１は、図９に示した関数呼出プログラム１４０から、funcA、funcB、funcC1、funcC、funcD、及びfuncDummyを削除したものである。そして、図２７（ｂ）に示すプログラム４０２により、呼出順を決定し、ｇｏｔｏ文でジャンプし、命令を実行する。
（２）上記の実施形態では、関数の呼出順序を決定する方法として擬似乱数を用いているが、本発明において関数の呼出順序を決定する方法は、擬似乱数に限定されないのは勿論であり、ある初期値を与えることにより、それ以降の状態がランダムに決まる方法であれば、他の方法を用いてもよい。
【０１６１】
関数の呼出順序を決定する方法として、例えばカオス関数を用いてもよい。カオス関数は、ある時点での状態（初期値）が決まればその後の状態が原理的に全て決定されるという決定論的方式に従っているにも関わらず、非常に複雑、不規則、且つ不安定な振る舞いをして、次の状態の予測が不可能であるという性質を有する。
また、関数の呼出順序を決定する方法として、例えばセルオートマトンを用いてもよい。セルオートマトンは、離散的な状態が、ある決まった規則に従い離散時間で変化する数理モデルであって、初期値、及び近傍のｎ−１の状態から、ｎの状態が決まるという性質を有する。
【０１６２】
ここでは、図２８、図２９、及び図３０を参照し、セルオートマトンを用いて、呼び出す関数の関数識別子を順次決定し、決定された関数識別子の順序に応じて、呼出順序を決定する方法について説明する。
図２８は、セルオートマトンにより関数識別子を決定する手順を示したフローチャートである。
【０１６３】
先ず、ｎ＝０とし（ステップＳ６０１）、（ａｎ１，ａｎ２，ａｎ３）の初期値（ａ０１，ａ０２，ａ０３）ｓ.ｔ.ａｉｊｍｏｄ８を設定する（ステップＳ６０２）。
ここで、（ａｎ１，ａｎ２，ａｎ３）は、初期値（ａ０１，ａ０２，ａ０３）からｎ経過後の状態を示している。
ｎ＝０の場合（ステップＳ６０３でＹＥＳ）、ステップＳ６０５へ進む。ｎ≠０の場合（ステップＳ６０３でＮＯ）、ａｎｉ＝ａｎ−１ｉ＋ａｎ−１ｉ＋１、及びａｎ３＝ａｎ−１３から、（ａｎ１，ａｎ２，ａｎ３）を算出する（ステップＳ６０４）。
【０１６４】
ステップＳ６０４で算出されたａｎ１を関数識別子とする（ステップＳ６０５）。処理すべき全ての関数が呼び出され、終了の場合（ステップＳ６０６でＹＥＳ）、セルオートマトンによる関数識別子決定処理を終了する。
終了でない場合（ステップＳ６０６でＮＯ）、ｎをｎ＋１として（ステップＳ６０７）、ステップＳ６０３へ進み処理を続ける。
【０１６５】
図２９に示したテーブル５００は、初期値をａ０１＝１、ａ０２＝０、及びａ０３＝１として図２８のフローチャートに従い、ｎ＝１からｎ＝２０までの各要素（ａｎ１，ａｎ２，ａｎ３）を算出し、算出された各要素をまとめたテーブルである。
図３０に示したテーブル６００は、図２９のテーブル５００のように各要素が算出され、ａｎ１を関数識別子とした場合に実行される関数の順序の具体例を示している。同図によると、初期値をａ０１＝１、ａ０２＝０、及びａ０３＝１としてセルオートマトンを用いた場合、関数は、funcA、funcC、funcDummy、funcB、funcDの順序で実行される。
【０１６６】
（３）第３の実施形態においては、プログラムテスト装置は正常動作するパターンのみを抽出し、プログラム実行装置は正常動作するパターンのみを記憶する構成を有するが、本発明においてはこの構成は必須ではない。例えば、プログラムテスト装置は異常動作するパターンのみを抽出し、プログラム実行装置は異常動作するパターンのリストを記憶しておく構成であっても本発明に含まれる。この場合、プログラム実行装置は、実行時に乱数を生成し、生成した乱数が異常動作するパターンのリストに含まれているか否か判断し、含まれていないと判断した場合には、生成した乱数を初期値として用いて関数識別子を決定する。生成した乱数が異常動作するパターンのリストに含まれていると判断した場合には、プログラム実行装置は、異なる乱数を生成する。プログラム実行装置は、リストに含まれていない乱数を生成するまで、乱数の生成を続ける。
【０１６７】
（４）第３の実施形態では、プログラム生成装置１０ｂとプログラムテスト装置４０ｂとが独立した２の装置で実現される構成を有するが、この構成は必須ではなく、プログラム生成装置１０ｂとプログラムテスト装置４０ｂとの機能を備えた１の装置で実現される構成であっても本発明に含まれる。
（５）オリジナルプログラムに分岐がある場合には、プログラム生成装置は、定数や変数を追加する冗長化処理を行い、内部に分岐のないプログラムに変形するように構成してもよい。また、オリジナルプログラムを複雑化するために、冗長化処理を行ってもよい。
【０１６８】
（６）上記実施形態では、実行時に呼出順序を決定して呼び出される単位を関数としているが、本発明において、呼出順序を決定して呼び出される単位は、関数に限定されない。並列処理が可能な任意の大きさの処理ブロックであっても本発明に含まれる。
（７）上記第１の実施形態では、実行時に、プログラム実行装置２０が乱数を生成し、生成した乱数を、擬似乱数生成アルゴリズムである線形合同法の初期値ｂに代入する構成を有しているが、初期値ｂは、プログラム実行装置２０が生成する乱数に限定されず、実行ごとに異なるランダムな値であればよい。
【０１６９】
例えばプログラム実行装置２０が実行時の時計を読み、それに基づきｂを設定してもよいし、実行時にある特定の記憶領域が保持する値を読み、それに基づきｂを設定してもよい。
（８）関数呼出順決定プログラム１５０に、関数の呼出順序を決定する方法を複数含めてもよい。この場合、実行時にプログラム実行装置で生成される乱数に応じて前記複数の関数呼出順序決定方法のうち、１の方法を選択するように構成してもよい。
【０１７０】
（９）上記実施の形態では、オリジナルプログラムの全体を関数化して、関数呼出プログラム１４０、及び関数呼出順決定プログラム１５０を生成して、全ての関数をこれらのプログラムを用いて呼び出す構成を有しているが、上記技術を、オリジナルプログラムの内の並列処理が可能な部分にのみ適用した場合も本発明に含まれる。この場合、関数呼出順決定プログラム１５０の呼出状態を保持する１５１が不要になる。
【０１７１】
（１０）プログラム生成装置は、擬似乱数を生成する式を含む関数呼出順決定プログラム１５０を生成する代わりに、アドレスを生成する式を含む関数呼出順決定プログラム１５０を生成するように構成してもよい。この場合、プログラム実行装置は、関数識別子テーブル２２０を生成、保持する必要がなくなり、関数呼出時には、オフセットを用いてもよい。
【０１７２】
（１１）上記実施形態においては、プログラム生成装置、プログラムテスト装置、及びプログラム実行装置間でプログラムを受け渡しする際に、光ディスクである記憶装置を用いたが、本発明は、光ディスクのような記憶装置でプログラムを受け渡しする構成に限定されず、その他の方法を用いてもよい。例えば、ネットワークを介してプログラムを送受信する構成であってもよい。
【０１７３】
（１２）上記第３の実施形態では、プログラムテスト装置４０ｂは、ある初期値に基づきプログラムを実行した場合に、出力値とオリジナルプログラムの実行結果とが一致するか否か判断し、両者が一致すると判断された場合を「正常動作」とみなし、両者が一致しないと判断された場合を「異常動作」とみなす構成を有しているが、本発明において、プログラムが正常動作するか又は異常動作するかの判断方法は、これに限定されない。
【０１７４】
例えば、プログラムテスト装置は、各初期値に基づきプログラムを実行し、実行開始から実行終了までの時間である実行時間を測定する。プログラムテスト装置は、測定した実行時間が所定時間以上であれは異常動作とみなし、実行時間が所定時間以下であれば正常動作とみなすように構成してもよい。
また、上記実施形態で示した方法と、実行結果を測定する方法とを併用し、正常動作及び異常動作の判断を行う構成であってもよい。
【０１７５】
（１３）上記第２及び第３の実施形態において、プログラム実行装置は、複数の初期値（実行経路パターンリスト）を記憶しておき、実行時に選択した初期値から乱数列を生成する構成を有するが、本発明においては、プログラム実行装置は、予め複数の初期値から複数の乱数列を生成しておき、複数の初期値に代えて、複数の乱数列を記憶しておき、実行時にランダムに乱数列を選択する構成であってもよい。
【０１７６】
更に、上記のように複数の乱数列を記憶しておく場合には、プログラム実行装置が乱数列を生成する構成ではなく、第２の実施形態においてはプログラム生成装置が、第３の実施形態においてはプログラムテスト装置が乱数列を生成する構成であってもよい。
（１４）上記第２及び第３の実施形態において、プログラム実行装置は、実行経路パターンリストから、ランダムに初期値を選択する構成を有するが、本発明において、この構成は必須ではなく、リストから昇順で、又は降順で初期値を選択する構成であってもよい。
【０１７７】
更に、上記（１３）にように、プログラム実行装置が複数の乱数列を記憶している場合であっても、同様に、ランダムに乱数列を選択する構成は、必須ではない。
（１５）上記実施形態において、プログラム生成装置は、予めオリジナルプログラムを内部に記憶している構成を有するが、本発明においてこの構成は必須ではなく、プログラム生成装置が、外部からオリジナルプログラムを取得し、取得したオリジナルプログラムから、難読化プログラムであるプログラム実行形式を生成する構成であっても本発明に含まれる。
【０１７８】
（１６）本発明は、上記に示す方法であるとしてもよい。また、これらの方法をコンピュータにより実現するコンピュータプログラムであるとしてもよいし、前記コンピュータプログラムからなるデジタル信号であるとしてもよい。
また、本発明は、前記コンピュータプログラム又は前記デジタル信号をコンピュータ読み取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、ＣＤ‐ＲＯＭ、ＭＯ、ＤＶＤ、ＤＶＤ‐ＲＯＭ、ＤＶＤ‐ＲＡＭ、ＢＤ（Ｂｌｕ‐ｒａｙ  Ｄｉｓｃ）、半導体メモリなど、に記録したものとしてもよい。また、これらの記録媒体に記録されている前記コンピュータプログラム又は前記デジタル信号であるとしてもよい。
【０１７９】
また、本発明は、前記コンピュータプログラム又は前記デジタル信号を、電気通信回線、無線又は有線通信回線、インターネットを代表とするネットワーク等を経由して伝送するものとしてもよい。
また、本発明は、マイクロプロセッサとメモリとを備えたコンピュータシステムであって、前記メモリは、上記コンピュータプログラムを記憶しており、前記マイクロプロセッサは、前記コンピュータプログラムに従って動作するとしてもよい。
【０１８０】
また、前記プログラム又は前記デジタル信号を前記記録媒体に記録して移送することにより、又は前記プログラム又は前記デジタル信号を前記ネットワーク等を経由して移送することにより、独立した他のコンピュータシステムにより実施するとしてもよい。
（１７）また本発明は、上記実施形態におけるプログラム生成装置１０、１０ａ、及び１０ｂ、プログラム実行装置２０、２０ａ、及び２０ｂ、並びにプログラムテスト装置４０ｂの機能ブロックの一部又は全てが集積回路であるＬＳＩとして実現される場合も本発明に含まれる。これらは個別に１チップ化されても良いし、一部又は全てを含むように１チップ化されてもよい。ここでは、ＬＳＩとしたが、集積度の違いにより、ＩＣ、システムＬＳＩ、スーパーＬＳＩ、ウルトラＬＳＩと呼称されることもある。
【０１８１】
また、集積回路化の手法はＬＳＩに限るものではなく、専用回路又は汎用プロセッサで実現してもよい。ＬＳＩ製造後に、プログラムすることが可能なＦＰＧＡ（FieldProgrammable Gate Array）やＬＳＩ内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサを利用しても良い。
更には、半導体技術の進歩又は派生する別技術によりＬＳＩに置き換わる集積回路化の技術が登場すれば、当然その技術を用いて機能ブロックの集積化を行ってもよい。バイオ技術の適応などが可能性として有り得る。
【０１８２】
（１８）上記実施形態及び上記変形例をそれぞれ組み合わせる構成も本発明に含まれる。
【産業上の利用可能性】
【０１８３】
本発明は、正当な権利を有する者以外のユーザに解析されたくないプログラムを搭載した装置を製造、販売する産業において、ユーザに解析されにくいプログラムの実行形式を生成する仕組みとして利用することができる。
【図面の簡単な説明】
【０１８４】
【図１】第１の実施形態である情報処理システム１の構成を示すシステム構成図であり、プログラム生成装置１０及びプログラム実行装置２０の機能的な構成を示す機能ブロック図である。
【図２】情報処理システム１全体の動作を示すフローチャートである。
【図３】オリジナルプログラムの具体例であるオリジナルプログラム１１０を示す図である。
【図４】（ａ）オリジナルプログラム１１０に含まれる各処理の、依存関係を説明する図である。（ｂ）オリジナルプログラム１１０の関数構造を示す図である。
【図５】（ａ）プログラム変換部１０２が生成する恒等変換を説明する図である。（ｂ）恒等変換が生成された後のオリジナルプログラム１１０の関数構造を示す図である。
【図６】（ａ）プログラム変換部１０２が生成するダミー処理を説明する図である。（ｂ）ダミー処理が生成された後のオリジナルプログラム１１０の関数構造を示す図である。
【図７】オリジナルプログラム１１０の各処理の変数を構造体に、各処理を関数に変換して生成した関数データ１２０を示す図である。
【図８】関数識別子テーブル１３０を示す図である。
【図９】プログラム生成部１０４が生成する関数呼出プログラム１４０を示す図である。
【図１０】プログラム生成部１０４が生成する関数呼出順決定プログラム１５０を示す図である。
【図１１】プログラム生成装置によるプログラム実行形式の生成処理の動作を示すフローチャートである。
【図１２】関数識別子テーブル２２０を示す図である。
【図１３】プログラム実行装置２０によるプログラム実行処理の動作を示すフローチャートであり、図１４に続く。
【図１４】プログラム実行装置２０によるプログラム実行処理の動作を示すフローチャートであり、図１３から続く。
【図１５】線形合同法による乱数列の生成を説明する図である。
【図１６】初期値ｂの値に応じた関数の実行順序を説明する図である。
【図１７】関数構造２５０を示し、関数グループに基づき各関数の呼出順序を決定する方法について説明する図である。
【図１８】第２の実施形態である情報処理システム２のシステム構成を示す図であり、プログラム生成装置１０ａ及びプログラム実行装置２０ａの内部構成を機能的に示す機能ブロック図である。
【図１９】情報処理システム２全体の動作を示すフローチャートである。
【図２０】実行経路パターンリスト３００のデータ構成を示す図である。
【図２１】プログラム生成装置１０ａにおける実行経路パターンリスト生成処理の動作を示すフローチャートである。
【図２２】プログラム実行装置２０ａにおけるプログラム実行処理の動作を示すフローチャートであり、図２３へ続く。
【図２３】プログラム実行装置２０ａにおけるプログラム実行処理の動作を示すフローチャートであり、図２２から続く。
【図２４】第３の実施形態である情報処理システム３のシステム構成を示す図であり、プログラムテスト装置４０ｂ及びプログラム実行装置２０ｂの内部構成を機能的に示す機能ブロック図である。
【図２５】情報処理システム３全体の動作を示すフローチャートである。
【図２６】プログラムテスト装置４０ｂにおける実行経路パターンリスト生成処理の動作を示すフローチャートである。
【図２７】（ａ）変形例として、プログラム生成装置が生成する関数呼出プログラム４０１を示す図である。（ｂ）変形例として、プログラム生成装置が生成する関数呼出順決定プログラム４０２を示す図である。
【図２８】変形例として、プログラム実行装置がセルオートマトンを用い関数識別子を決定する動作を示すフローチャートである。
【図２９】セルオートマトンで出力される値について、具体例を用いて説明する図である。
【図３０】セルオートマトンで出力される値に応じた関数の実行順序を説明する図である。
【符号の説明】
【０１８５】
１    情報処理システム
２    情報処理システム
３    情報処理システム
１０    プログラム生成装置
１０ａ  プログラム生成装置
１０ｂ  プログラム生成装置
２０    プログラム実行装置
２０ａ  プログラム実行装置
２０ｂ  プログラム実行装置
３０    記憶装置
３０ａ  記憶装置
３０ｂ  記憶装置
４０ａ  プログラムテスト装置
４０ｂ  プログラムテスト装置
５０ｂ  記憶装置
１０１    オリジナルプログラム保持部
１０１ａ  オリジナルプログラム保持部
１０２    プログラム変換部
１０２ａ  プログラム変換部
１０３    関数識別子付与部
１０３ａ  関数識別子付与部
１０４    プログラム生成部
１０４ａ  プログラム生成部
１０５    コンパイル／リンク部
１０５ａ  コンパイル／リンク部
１０６    書込部
１０６ａ  書込部
１０７ａ  実行経路パターン生成部
２０１    読出部
２０１ａ  読出部
２０１ｂ  読出部
２０２    プログラム実行部
２０２ａ  プログラム実行部
２０２ｂ  プログラム実行部
２０３    メモリ
２０３ａ  メモリ
２０３ｂ  メモリ
２１１    プログラムロード部
２１１ａ  プログラムロード部
２１１ｂ  プログラムロード部
２１２    テーブル格納部
２１２ａ  テーブル格納部
２１２ｂ  テーブル格納部
２１３    関数呼出部
２１３ａ  関数呼出部
２１３ｂ  関数呼出部
２１４    実行部
２１４ａ  実行部
２１４ｂ  実行部
４０１ａ  読出部
４０１ｂ  読出部
４０２ｂ  プログラム実行部
４０３ｂ  メモリ
４０４ｂ  実行経路パターン生成部
４０５ｂ  書込部
４１１ｂ  プログラムロード部
４１２ｂ  テーブル格納部
４１３ｂ  関数呼出部
４１４ｂ  実行部
【図１】
0004783289.tif 000002
【図２】
0004783289.tif 000003
【図３】
0004783289.tif 000004
【図４】
0004783289.tif 000005
【図５】
0004783289.tif 000006
【図６】
0004783289.tif 000007
【図７】
0004783289.tif 000008
【図８】
0004783289.tif 000009
【図９】
0004783289.tif 000010
【図１０】
0004783289.tif 000011
【図１１】
0004783289.tif 000012
【図１２】
0004783289.tif 000013
【図１３】
0004783289.tif 000014
【図１４】
0004783289.tif 000015
【図１５】
0004783289.tif 000016
【図１６】
0004783289.tif 000017
【図１７】
0004783289.tif 000018
【図１８】
0004783289.tif 000019
【図１９】
0004783289.tif 000020
【図２０】
0004783289.tif 000021
【図２１】
0004783289.tif 000022
【図２２】
0004783289.tif 000023
【図２３】
0004783289.tif 000024
【図２４】
0004783289.tif 000025
【図２５】
0004783289.tif 000026
【図２６】
0004783289.tif 000027
【図２７】
0004783289.tif 000028
【図２８】
0004783289.tif 000029
【図２９】
0004783289.tif 000030
【図３０】
0004783289.tif 000031