(57)【要約】【課題】Ｃ＋＋言語などのオブジェクト指向言語で記述されたプログラムを入力し、並列実行可能な目的プログラムに変換するプログラム並列化方式を提供する。【解決手段】変数／メンバ解析ステップＳ１３０によってクラスメンバの定義／参照状況を解析し、変数／メンバ情報記憶部Ｄ１３０に格納する。並列化実行ステップＳ１４０はメンバ関数の起動オブジェクトを解析し、変数／メンバ情報記憶部Ｄ１３０を参照して並列化を行い、並列化した目的プログラムを出力する。【選択図】　図１
2004013184.tif 000002
【特許請求の範囲】
【請求項１】
オブジェクト指向言語で記述されたプログラムを入力し、並列実行可能な目的プログラムを出力するプログラム並列化方式であって、
前記入力プログラムに記載されているクラスメンバの情報を解析するクラスメンバ解析ステップと、
前記クラスメンバ解析ステップにより解析された情報を用いて並列化を行う並列化ステップとを備えることを特徴とするプログラム並列化方式。
【請求項２】
前記クラスメンバ解析ステップは、前記クラスメンバの参照および定義の情報を解析するメンバ参照定義解析ステップを備え、
前記並列化ステップは、メンバ関数呼び出しの起動オブジェクトを解析し、メンバ関数呼び出しを含めた各文に対して並列化を行うメンバ関数呼び出し並列化ステップを備えることを特徴とする請求項１記載のプログラム並列化方式。
【請求項３】
前記メンバ参照定義解析ステップは、クラスの非静的メンバの参照および定義の情報を解析する非静的メンバ参照定義解析ステップと、
大域変数の参照および定義の情報を解析する大域変数参照定義解析ステップとを備え、
前記並列化ステップは、メンバ関数呼び出しの起動オブジェクトを解析し、メンバ関数呼び出しを含めた各文に対して並列化を行うメンバ関数呼び出し並列化ステップと、
大域関数呼び出しを含めた各文に対して並列化を行う大域関数呼び出し並列化ステップとを備えることを特徴とする請求項２記載のプログラム並列化方式。
【請求項４】
前記メンバ参照定義解析ステップは、クラスの静的メンバの参照および定義の情報を解析する静的メンバ参照定義解析ステップと、
大域変数の参照および定義の情報を解析する大域変数参照定義解析ステップとを備え、
前記並列化ステップは、メンバ関数呼び出しの起動オブジェクトを解析し、メンバ関数呼び出しを含めた各文に対して並列化を行うメンバ関数呼び出し並列化ステップと、
大域関数呼び出しを含めた各文に対して並列化を行う大域関数呼び出し並列化ステップとを備えることを特徴とする請求項２記載のプログラム並列化方式。
【請求項５】
オブジェクト指向言語で記述されたプログラムを入力し、並列実行可能な目的プログラムを出力するプログラム並列化方式であって、
前記入力プログラムに記載されているクラスメンバの参照および定義の情報を解析するメンバ参照定義解析ステップと、
前記入力プログラムに記載されているクラス定義を解析するクラス解析ステップと、
前記メンバ参照定義解析ステップおよび前記クラス解析ステップにより解析された情報を用いて並列化を行う並列化ステップとを備えることを特徴とするプログラム並列化方式。
【請求項６】
前記メンバ参照定義解析ステップは、クラスの非静的メンバの参照および定義の情報を解析する非静的メンバ参照定義解析ステップと、
大域変数の参照および定義の情報を解析する大域変数参照定義解析ステップとを備え、
前記並列化ステップは、メンバ関数呼び出しの起動オブジェクトを解析し、メンバ関数呼び出しを含めた各文に対して並列化を行うメンバ関数呼び出し並列化ステップと、
大域関数呼び出しを含めた各文に対して並列化を行う大域関数呼び出し並列化ステップとを備えることを特徴とする請求項５記載のプログラム並列化方式。
【請求項７】
前記メンバ参照定義解析ステップは、クラスの静的メンバの参照および定義の情報を解析する静的メンバ参照定義解析ステップと、
大域変数の参照および定義の情報を解析する大域変数参照定義解析ステップを備え、
前記並列化ステップは、メンバ関数呼び出しの起動オブジェクトを解析し、メンバ関数呼び出しを含めた各文に対して並列化を行うメンバ関数呼び出し並列化ステップと、
大域関数呼び出しを含めた各文に対して並列化を行う大域関数呼び出し並列化ステップを備えることを特徴とする請求項５記載のプログラム並列化方式。
【請求項８】
前記クラス解析ステップは、クラスの継承関係を解析するクラスツリー解析ステップを備え、
前記並列化ステップは、継承関係にないクラスの１つあるいは複数のメンバ関数呼び出しの間に実行順序の依存がないとして並列化を行うことを特徴とする請求項５から請求項７までのいずれかに記載のプログラム並列化方式。
【請求項９】
前記クラス解析ステップは、仮想関数の呼び出しで呼び出される可能性のある関数の集合を解析する仮想関数解析ステップを備え、
前記並列化ステップは、前記仮想関数呼び出しステップにより解析された情報を用いて並列化を行う仮想関数呼び出し並列化ステップを備えることを特徴とする請求項５から請求項８までのいずれかに記載のプログラム並列化方式。
【請求項１０】
オブジェクト指向言語で記述されたプログラムを入力し、並列実行可能な目的プログラムを出力するプログラムを記録したコンピュータ読み取り可能な記録媒体であって、
前記入力プログラムに記載されているクラスメンバの情報を解析するクラスメンバ解析ステップと、
前記クラスメンバ解析ステップにより解析された情報を用いて並列化を行う並列化ステップとを含むことを特徴とするプログラム並列化用の記録媒体。
【請求項１１】
オブジェクト指向言語で記述されたプログラムを入力し、並列実行可能な目的プログラムを出力するプログラムを記録したコンピュータ読み取り可能な記録媒体であって、
前記入力プログラムに記載されているクラスメンバの参照および定義の情報を解析するメンバ参照定義解析ステップと、
前記入力プログラムに記載されているクラス定義を解析するクラス解析ステップと、
前記クラスメンバ参照定義解析ステップおよび前記クラス解析ステップにより解析された情報を用いて並列化を行う並列化ステップとを含むことを特徴とするプログラム並列化用の記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、オブジェクト指向言語により逐次記述されたプログラムを並列実行可能な目的プログラムに変換するプログラム並列化方式に関する。
【０００２】
【従来の技術】
近年、コンピュータ分野において高速化・高性能化への要求がますます強くなり、プロセッサの高速化と共に、プログラムの並列化によって単位処理時間当たりの処理性能を向上させるという取り組みが盛んに行われている。
【０００３】
プログラムの並列化には大きく細粒度、中粒度、粗粒度の３つの粒度に分類される。細粒度はＶＬＩＷ（ＶｅｒｙＬｏｎｇ　Ｉｎｓｔｒｕｃｔｉｏｎ　Ｗｏｒｄ）などの命令レベルでの並列化であり、中粒度はベクトル化などのループイタレーションレベルでの並列化であり、粗粒度はサブルーチンやブロックレベルでの並列化である。
【０００４】
従来、細粒度および中粒度の並列化が主に行われていたが、更なる高性能化への要求が高まるにつれ、粗粒度の並列化すなわちサブルーチンやブロックレベルでの最適化が注目されつつある。
【０００５】
サブルーチンを含めた並列化を行う従来の並列化方法として、特開平５−１４３３５７号公報「プログラム自動並列化方法」がある。この従来技術は、２段階のパスによって構成されており、第一のパスで関数内部で参照、代入が行われた大域変数を検出し、関数内で使用された大域変数の情報を作成する。次に、第二のパスで並列化を行う際、関数呼び出しを検出したとき、第一のパスで作成した大域変数の情報を参照することによって、プログラムの動作を変えることなく、関数呼び出しを含めた並列化を行うものである。
【０００６】
【発明が解決しようとする課題】
近年のプログラムの大規模化に伴い、プログラムの開発効率を高め、再利用化を図るため、あるいはプログラムの保守性を向上させるために、オブジェクト指向言語によるプログラム開発が注目されている。オブジェクト指向言語の代表例にＣ＋＋言語がある。
【０００７】
オブジェクト指向言語によるプログラム開発では、従来の手続き型言語によるプログラム開発とは異なり、オブジェクトと、そのオブジェクトに対する操作を表すメソッドとの関係が重要になってくる。
【０００８】
しかし、前述の特開平５−１４３３５７号公報「プログラム自動並列化方法」では大域変数の関係は考慮されているが、オブジェクトとメソッドとの関係は考慮されていない。
【０００９】
例えば、図５（ａ）に示したプログラムに対する動作を考える。図５（ａ）のプログラムはオブジェクト指向言語Ｃ＋＋言語で記述したプログラムである。図５（ａ）の１行目から９行目はクラスＸの定義を表す。２行目は非静的データメンバｘの宣言であり、３行目は静的データメンバｙの宣言である。非静的データメンバはクラスオブジェクト毎に持っているメンバであり、静的データメンバはクラスで一つだけ存在するメンバである。
【００１０】
５行目はクラスＸのデフォルトコンストラクタの宣言であり、６行目、７行目は非静的メンバ関数、８行目は静的メンバ関数の宣言である。非静的メンバ関数と静的メンバ関数を合わせてメンバ関数と呼ぶこともある。５行目のデフォルトコンストラクタもメンバ関数の一つである。１０行目から１２行目までがクラスＸの非静的メンバ関数ｃａｌｃの関数定義（５ａ１）、１３行目から１５行目までがクラスＸの非静的メンバ関数ｉｎｉｔの関数定義（５ａ２）、１６行目から１８行目までがクラスＸのデフォルトコンストラクタの関数定義（５ａ３）、１９行目から２１行目までがクラスＸの静的メンバ関数ｓｅｔの関数定義（５ａ４）である。２３行目から２８行目までが大域関数ｇの関数定義（５ａ５）を表している。
【００１１】
大域関数ｇの中には、２４行目でクラスＸのデフォルトコンストラクタ呼び出しが、２５行目でクラスＸの静的メンバ関数呼び出しが、２６行目でクラスＸの非静的メンバ関数呼び出しと大域変数ａへの代入文が記述されている。２４行目のデフォルトコンストラクタ呼び出しでは、非静的メンバ関数ｉｎｉｔの呼び出しによってｏｂｊ１とｏｂｊ２のメンバｘにそれぞれ値を設定している。また、２６行目の非静的メンバ関数呼び出しではｏｂｊ１とｏｂｊ２のメンバｘをそれぞれ参照している。
【００１２】
２４行目の２つのデフォルトコンストラクタ呼び出しは、ｏｂｊ１とｏｂｊ２の異なるオブジェクトに対するメンバの値の設定および参照であるため、並列に実行しても良い。また、２６行目の２つの非静的メンバ関数呼び出しは、ｏｂｊ１とｏｂｊ２の異なるオブジェクトに対するメンバの値の設定および参照であるため、並列に実行しても良い。しかし、２４行目のｏｂｊ１のデフォルトコンストラクタ呼び出しと２６行目のｏｂｊ１の非静的メンバ関数呼び出しは、同じオブジェクトに対するメンバの値の設定および参照であるため、並列に実行してはいけない。
【００１３】
しかし、従来技術の並列化方法では、クラスＸの非静的メンバ関数内で大域変数は存在しないと解釈し、２４行目のｏｂｊ１のデフォルトコンストラクタ呼び出しと２６行目のｏｂｊ１の非静的メンバ関数呼び出しは並列に実行しても良いと誤って解析してしまう。
【００１４】
また、一般的に非静的メンバ関数の引数にはメンバが属するクラスへのポインタ型を暗黙的に持ち、実際の非静的メンバ関数の呼び出し時には、起動オブジェクトのアドレスを暗黙的に追加して呼び出す。ポインタ型を引数とする関数では、ポインタが指しているオブジェクトは一般的には不明であるため、その関数呼び出しを他の処理と並列実行可能であるとは判定できない。そのため、ポインタ型を引数として持つ非静的メンバ関数呼び出しは全て並列実行できないとすると、図５（ａ）の２４行目と２６行目の非静的メンバ関数呼び出しは全て並列実行することができなくなる。
【００１５】
【課題を解決するための手段】
本発明は、上記の課題を解決するために次のような手段を講じる。
【００１６】
第１の解決手段として、本発明は、オブジェクト指向言語で記述されたプログラムを入力し、並列実行可能な目的プログラムを出力するプログラム並列化方式であって、さらに、次のように構成してあることを特徴とする。すなわち、前記入力プログラムに記載されているクラスメンバの情報を解析するクラスメンバ解析ステップと、前記クラスメンバ解析ステップにより解析された情報を用いて並列化を行う並列化ステップとを備えた構成としている。
【００１７】
この構成によれば、クラスメンバ解析ステップにおいて入力プログラム内のクラスメンバについて解析を行い、並列化ステップにおいて前記の解析結果の情報（クラスメンバ解析情報）に基づいて関数内の各文に対して所要のプログラム並列化を行うため、その並列化を効率良く行うことができる。すなわち、オブジェクト指向言語により逐次記述されたプログラムのクラスメンバ解析情報を考慮した上で並列化するので、並列実行可能な目的プログラムへの変換を効率良く遂行することができる。
【００１８】
上記の構成をより具体的レベルで考察すると、次のようにいうことができる。すなわち、上記構成において、前記のクラスメンバ解析ステップが、前記クラスメンバの参照および定義の情報を解析するメンバ参照定義解析ステップを備えている一方、前記並列化ステップが、メンバ関数呼び出しの起動オブジェクトを解析し、メンバ関数呼び出しを含めた各文に対して並列化を行うメンバ関数呼び出し並列化ステップを備えていることである。
【００１９】
この構成によれば、クラスメンバの参照および定義の関係を用いてプログラムの動作を変えることなく、メンバ関数呼び出しを含めた文の並列化を効率良く遂行することができる。
【００２０】
また、上記のメンバ参照定義解析ステップおよび並列化ステップについてより具体的レベルで考察すると、好ましい態様として、次のような構成を挙げることができる。すなわち、前記のメンバ参照定義解析ステップが、クラスの非静的メンバの参照および定義の情報を解析する非静的メンバ参照定義解析ステップと、大域変数の参照および定義の情報を解析する大域変数参照定義解析ステップを備えている一方、前記の並列化ステップが、メンバ関数呼び出しの起動オブジェクトを解析し、メンバ関数呼び出しを含めた各文に対して並列化を行うメンバ関数呼び出し並列化ステップと、大域関数呼び出しを含めた各文に対して並列化を行う大域関数呼び出し並列化ステップを備えていることである。
【００２１】
この構成によれば、クラス毎に存在するメンバである非静的メンバ、および複数の関数から共通に参照および代入が可能な変数である大域変数を考慮した解析を行うことができ、プログラムの動作を変えることなく、メンバ関数呼び出しおよび大域関数呼び出しを含めた文の並列化をより効率良く遂行することができる。
【００２２】
また、上記のメンバ参照定義解析ステップおよび並列化ステップについてより具体的レベルでの好ましい別の態様として、次のような構成を挙げることができる。すなわち、前記のメンバ参照定義解析ステップが、クラスの静的メンバの参照および定義の情報を解析する静的メンバ参照定義解析ステップと、大域変数の参照および定義の情報を解析する大域変数参照定義解析ステップを備えている一方、前記の並列化ステップが、メンバ関数呼び出しの起動オブジェクトを解析し、メンバ関数呼び出しを含めた各文に対して並列化を行うメンバ関数呼び出し並列化ステップと、大域関数呼び出しを含めた各文に対して並列化を行う大域関数呼び出し並列化ステップを備えていることである。前述のものとの対比では、クラス毎に存在するメンバである非静的メンバに代えて各クラスに１つしかないメンバである静的メンバを対象とし、これに伴って、非静的メンバ参照定義解析ステップに代えて静的メンバ参照定義解析ステップと記述しているところがポイントである。
【００２３】
この構成によれば、各クラスに１つしかないメンバである静的メンバ、および複数の関数から共通に参照および代入が可能な変数である大域変数を考慮した解析を行うことができ、プログラムの動作を変えることなく、メンバ関数呼び出しおよび大域関数呼び出しを含めた文の並列化をより効率良く遂行することができる。
【００２４】
第２の解決手段として、本発明は、オブジェクト指向言語で記述されたプログラムを入力し、並列実行可能な目的プログラムを出力するプログラム並列化方式であって、さらに、次のように構成してあることを特徴とする。すなわち、前記入力プログラムに記載されているクラスメンバの参照および定義の情報を解析するメンバ参照定義解析ステップと、前記入力プログラムに記載されているクラス定義を解析するクラス解析ステップと、前記メンバ参照定義解析ステップおよび前記クラス解析ステップにより解析された情報を用いて並列化を行う並列化ステップとを備えた構成としている。
【００２５】
この構成によれば、メンバ参照定義解析ステップにおいて入力プログラム内のクラスメンバの参照および定義について解析を行うとともに、クラス解析ステップにおいて入力プログラムに記載されているクラス定義について解析を行い、並列化ステップにおいて前記の解析結果の情報に基づいて関数内の各文に対して所要のプログラム並列化を行うため、その並列化を効率良く行うことができる。すなわち、複数のクラスについて、各クラス定義でクラスどうしの継承関係がある場合において、オブジェクト指向言語により逐次記述されたプログラムのクラスメンバの参照、定義およびクラス定義の解析情報を考慮して並列化を行うため、並列実行可能な目的プログラムへの変換を効率良く遂行することができる。なお、継承とは、あるクラス（基底クラス）を拡張し、別のクラス（派生クラス）を作る仕組みのことである。
【００２６】
上記のメンバ参照定義解析ステップおよび並列化ステップについてより具体的レベルで考察すると、好ましい態様として、次のような構成を挙げることができる。すなわち、前記のメンバ参照定義解析ステップが、クラスの非静的メンバの参照および定義の情報を解析する非静的メンバ参照定義解析ステップと、大域変数の参照および定義の情報を解析する大域変数参照定義解析ステップとを備えている一方、前記の並列化ステップが、メンバ関数呼び出しの起動オブジェクトを解析し、メンバ関数呼び出しを含めた各文に対して並列化を行うメンバ関数呼び出し並列化ステップと、大域関数呼び出しを含めた各文に対して並列化を行う大域関数呼び出し並列化ステップを備えていることである。
【００２７】
この構成によれば、クラスの非静的メンバと大域変数およびクラス定義の解析情報を考慮した並列化を行うことができ、プログラムの動作を変えることなく、メンバ関数呼び出しおよび大域関数呼び出しを含めた文の並列化をより効率良く遂行することができる。
【００２８】
また、上記のメンバ参照定義解析ステップおよび並列化ステップについてより具体的レベルでの好ましい別の態様として、次のような構成を挙げることができる。すなわち、前記のメンバ参照定義解析ステップが、クラスの静的メンバの参照および定義の情報を解析する静的メンバ参照定義解析ステップと、大域変数の参照および定義の情報を解析する大域変数参照定義解析ステップを備えている一方、前記の並列化ステップが、メンバ関数呼び出しの起動オブジェクトを解析し、メンバ関数呼び出しを含めた各文に対して並列化を行うメンバ関数呼び出し並列化ステップと、大域関数呼び出しを含めた各文に対して並列化を行う大域関数呼び出し並列化ステップを備えていることである。前述のものとの対比では、クラス毎に存在するメンバである非静的メンバに代えて各クラスに１つしかないメンバである静的メンバを対象とし、これに伴って、非静的メンバ参照定義解析ステップに代えて静的メンバ参照定義解析ステップと記述しているところがポイントである。
【００２９】
この構成によれば、各クラスに１つしかないメンバである静的メンバと複数の関数から共通に参照および代入が可能な変数である大域変数およびクラス定義の解析情報を考慮した並列化を行うことができ、プログラムの動作を変えることなく、メンバ関数呼び出しおよび大域関数呼び出しを含めた文の並列化をより効率良く遂行することができる。
【００３０】
また、上記のクラス解析ステップおよび並列化ステップについてより具体的レベルでの好ましい態様として、次のような構成を挙げることができる。すなわち、前記のクラス解析ステップが、クラスの継承関係を解析するクラスツリー解析ステップを備えている一方、前記の並列化ステップが、継承関係にないクラスの１つあるいは複数のメンバ関数呼び出しの間に実行順序の依存がないとして並列化を行うことである。
【００３１】
この構成によれば、クラスの継承関係（あるクラスを拡張し、別のクラスを生成する仕組み）を解析してクラスツリーを作成することにより、同一クラスツリーに属さないクラスのメンバ関数呼び出しは並列実行の候補と判定することができ、静的／非静的クラスメンバの関係を解析する必要がないため、処理の高速化を図ることができる。
【００３２】
また、上記のクラス解析ステップおよび並列化ステップについてのより具体的レベルでの別の好ましい態様として、次のような構成を挙げることができる。すなわち、前記のクラス解析ステップが、仮想関数の呼び出しで呼び出される可能性のある関数の集合を解析する仮想関数解析ステップを備えている一方、前記の並列化ステップが、前記仮想関数呼び出しステップにより解析された情報を用いて並列化を行う仮想関数呼び出し並列化ステップを備えていることである。仮想関数とは、派生クラスが基底クラスのポインタで示されている場合でも、派生クラスの関数として動作する関数である。
【００３３】
この構成によれば、仮想関数呼び出しで呼び出される可能性のある全ての関数を考慮した並列化を行うことができ、より精度の高い並列化を行うことができる。
【００３４】
以上、プログラム並列化方式についてのいくつかの解決手段を説明してきたが、別の観点から、本発明をコンピュータ読み取り可能なプログラム並列化用の記録媒体として捉えることも可能である。すなわち、記録媒体についての本発明は、オブジェクト指向言語で記述されたプログラムを入力し、並列実行可能な目的プログラムを出力するプログラムを記録したコンピュータ読み取り可能な記録媒体であって、前記入力プログラムに記載されているクラスメンバの情報を解析するクラスメンバ解析ステップと、前記クラスメンバ解析ステップにより解析された情報を用いて並列化を行う並列化ステップとを含むものである。
【００３５】
この記録媒体によれば、クラスメンバ解析ステップにおいて入力プログラム内のクラスメンバについて解析を行い、並列化ステップにおいて前記の解析結果の情報（クラスメンバ解析情報）に基づいて関数内の各文に対して所要のプログラム並列化を行うため、その並列化を効率良く行うことができる。すなわち、オブジェクト指向言語により逐次記述されたプログラムのクラスメンバ解析情報を考慮した上で並列化するので、並列実行可能な目的プログラムへの変換を効率良く遂行することができる。
【００３６】
また、別態様のコンピュータ読み取り可能な記録媒体についての本発明は、オブジェクト指向言語で記述されたプログラムを入力し、並列実行可能な目的プログラムを出力するプログラムを記録したコンピュータ読み取り可能な記録媒体であって、前記入力プログラムに記載されているクラスメンバの参照および定義の情報を解析するメンバ参照定義解析ステップと、前記入力プログラムに記載されているクラス定義を解析するクラス解析ステップと、前記クラスメンバ参照定義解析ステップおよび前記クラス解析ステップにより解析された情報を用いて並列化を行う並列化ステップとを含むものである。
【００３７】
この記録媒体によれば、メンバ参照定義解析ステップにおいて入力プログラム内のクラスメンバの参照および定義について解析を行うとともに、クラス解析ステップにおいて入力プログラムに記載されているクラス定義について解析を行い、並列化ステップにおいて前記の解析結果の情報に基づいて関数内の各文に対して所要のプログラム並列化を行うため、その並列化を効率良く行うことができる。すなわち、複数のクラスについて、各クラス定義でクラスどうしの継承関係がある場合において、オブジェクト指向言語により逐次記述されたプログラムのクラスメンバの参照、定義およびクラス定義の解析情報を考慮して並列化を行うため、並列実行可能な目的プログラムへの変換を効率良く遂行することができる。
【００３８】
【発明の実施の形態】
以下、本発明のプログラム並列化方式の実施の形態の一例について図面を参照しながら説明する。
【００３９】
（第一の実施形態）
図１は本発明の第一の実施形態におけるプログラム並列化方式の構成図を表している。
【００４０】
図１において、このプログラム並列化ステップは、入力ステップＳ１１０、構文解析ステップＳ１２０、記憶部Ｄ１２０、変数／メンバ解析ステップＳ１３０、変数／メンバ情報記憶部Ｄ１３０、並列化実行ステップＳ１４０、最適化ステップＳ１５０、コード生成ステップＳ１６０から構成されている。
【００４１】
プログラム記憶部Ｄ１００は、並列化を行うプログラムを保持している。
【００４２】
入力ステップＳ１１０は、プログラム記憶部Ｄ１００に格納されている全てのプログラムを順次入力し、構文解析ステップＳ１２０に渡す。
【００４３】
構文解析ステップＳ１２０は、入力ステップＳ１１０から受けとったプログラムの構文を解析し、シンボルテーブルの生成や構文木の生成などを行い、その解析結果を記憶部Ｄ１２０に格納する。
【００４４】
記憶部Ｄ１２０は、構文解析ステップＳ１２０から解析結果を受け取り、格納しておく。
【００４５】
変数／メンバ解析ステップＳ１３０は、記憶部Ｄ１２０に格納されている大域変数やクラスメンバの情報を抽出し、関数内で定義および参照されている大域変数やクラスメンバに関する情報を解析して、解析結果を変数／メンバ情報記憶部Ｄ１３０に格納する。
【００４６】
変数／メンバ情報記憶部Ｄ１３０は、変数／メンバ解析ステップＳ１３０から解析結果を受け取り、格納しておく。
【００４７】
並列化実行ステップＳ１４０は、記憶部Ｄ１２０から構文木を受け取り、関数内の各文について並列化を行う。この際、変数／メンバ情報記憶部Ｄ１３０に格納されている大域変数やクラスメンバの定義／参照情報を使用して並列化を行う。
【００４８】
最適化ステップＳ１５０は、並列化実行ステップＳ１４０によって生成された中間コードに対して各種最適化を実行する。
【００４９】
コード生成ステップＳ１６０は、最適化ステップＳ１５０によって最適化された中間コードを目的コードに変換して生成コード記憶部Ｄ１６０に出力する。
【００５０】
生成コード記憶部Ｄ１６０は、Ｓ１１０からＳ１６０までのプログラム並列化ステップによって変換された目的コードを格納しておく。
【００５１】
なお、入力ステップＳ１１０、構文解析ステップＳ１２０、最適化ステップＳ１５０、コード生成ステップＳ１６０については、本発明の主眼ではないため、詳細な説明は省略する。
【００５２】
次に、変数／メンバ解析ステップＳ１３０の処理について、図５（ａ）に示すプログラムに適用した場合を例にして、図２を参照しながら説明する。
【００５３】
図５（ａ）はＣ＋＋言語で記述したソースプログラム例１である。また、図５（ｂ）は、図５（ａ）の大域関数ｇ（５ａ５）に関する構文解析ステップＳ１２０の解析結果の中間コードである。図５（ａ）の大域関数ｇの２４行目の文の解析結果の中間コードが図５（ｂ）の１および２の中間コードであり、ｏｂｊ１およびｏｂｊ２に対してデフォルトコンストラクタ呼び出しのコードになっている。２５行目の文の解析結果の中間コードが図５（ｂ）の３の中間コードであり、クラスＸの静的メンバ関数ｓｅｔの呼び出しのコードになっている。２６行目の文の解析結果の中間コードが図５（ｂ）の４、５および６の中間コードであり、それぞれｏｂｊ１に対する非静的メンバ関数ｃａｌｃの呼び出し、ｏｂｊ２に対する非静的メンバ関数ｃａｌｃの呼び出し、外部変数ａへの加算演算結果の設定のコードとなっている。２７行目の文の解析結果の中間コードが図５（ｂ）の７の中間コードであり、戻り値用の変数に値を設定するコードとなっている。
【００５４】
変数／メンバ解析ステップＳ１３０の処理は、記憶部Ｄ１２０に格納されている全ての構文解析データのうち関数定義のデータに対してａ１からａ９までのステップによって行われる。以下記号の順に説明していく。
【００５５】
ステップａ１では、記憶部Ｄ１２０に格納されている関数定義データがクラスのメンバ関数に関するものかどうかを判定する。クラスのメンバ関数である場合はＹｅｓと判定しステップａ２へと処理を移行し、そうでない場合はＮｏと判定しステップａ６へと処理を移行する。図５（ａ）の非静的メンバ関数ｃａｌｃ（５ａ１）に関してはステップａ１でＹｅｓと判定され、大域関数ｇに関してはＮｏと判定される。
【００５６】
ステップａ２では、関数内の全ての文についてループ１を繰り返す。
【００５７】
ステップａ３では、文中で定義および参照されているクラスの非静的メンバを変数／メンバ情報記憶部Ｄ１３０に登録する。図５（ａ）の非静的メンバ関数ｉｎｉｔ（５ａ２）に関しては、１４行目の文でクラスＸの非静的メンバｘを定義しているので、ステップａ３で関数ｉｎｉｔの定義非静的メンバにｘを登録する。また、非静的メンバ関数ｃａｌｃ（５ａ１）に関しては、１１行目の文でクラスＸの非静的メンバｘを参照しているので、ステップａ３で関数ｃａｌｃの参照非静的メンバにｘを登録する。
【００５８】
ステップａ４では、文中で定義および参照されているクラスの静的メンバを変数／メンバ情報記憶部Ｄ１３０に登録する。図５（ａ）の静的メンバ関数ｓｅｔ（５ａ４）に関しては、２０行目の文でクラスＸの静的メンバｙを定義しているので、ステップａ４で関数ｓｅｔの定義静的メンバにｙを登録する。また、非静的メンバ関数ｃａｌｃ（５ａ１）に関しては、１１行目の文でクラスＸの静的メンバｙを参照しているので、ステップａ４で関数ｃａｌｃの参照静的メンバにｙを登録する。
【００５９】
ステップａ５では、ステップａ２に処理を移行し、ループ１の処理を繰り返す。
【００６０】
ステップａ６では、関数内の全ての文についてループ２を繰り返す。
【００６１】
ステップａ７では、文中で定義および参照されている大域変数を変数／メンバ情報記憶部Ｄ１３０に登録する。図５（ａ）の大域関数ｇ（５ａ５）に関しては、２６行目の文で大域変数ａを定義しているので、ステップａ７で大域関数ｇの定義大域変数にａを登録する。また、２７行目の文で大域変数ａを参照しているので、ステップａ７で大域関数ｇの参照大域変数にａを登録する。
【００６２】
ステップａ８では、文中で呼び出されている関数を変数／メンバ情報記憶部Ｄ１３０に登録する。図５（ａ）の大域関数ｇ（５ａ５）に関しては、２４行目の文でクラスＸのデフォルトコンストラクタＸが、２５行目の文でクラスＸの静的メンバ関数ｓｅｔが、２６行目の文でクラスＸの非静的メンバ関数ｃａｌｃが呼び出されているので、呼び出し関数にＸ、ｓｅｔ、ｃａｌｃが登録される。
【００６３】
ステップａ９では、ステップａ６に処理を移行し、ループ２の処理を繰り返す。
【００６４】
変数／メンバ解析ステップＳ１３０の処理を図５（ａ）に示すプログラムに適用した場合、変数／メンバ情報記憶部Ｄ１３０の内容は図５（ｃ）に示すようになる。
【００６５】
次に、並列化実行ステップＳ１４０の処理について、図５（ａ）に示すプログラムの大域関数ｇ（５ａ５）について適用した場合を例にして図５（ｂ）に示した中間コードを使って、図３を参照しながら説明する。
【００６６】
並列化実行ステップＳ１４０の処理は、記憶部Ｄ１２０に格納されている全ての構文解析データのうち関数定義のデータに対してｂ１からｂ１２までのステップによって行われる。以下記号の順に説明していく。
【００６７】
ステップｂ１では、記憶部Ｄ１２０に格納されている関数定義Ｆ１内の全ての文について定義／参照文情報を作成する。定義／参照文情報の作成処理の詳細については後述する。ステップｂ１によって、関数定義Ｆ１内の各文において定義／参照される静的／非静的メンバ、定義／参照される大域変数、および非静的メンバ関数の起動オブジェクトを得る。図５（ｂ）の大域関数ｇの中間コードに対する定義／参照文情報は図６（ａ）のようになる。
【００６８】
ステップｂ２では、関数定義Ｆ１内の全ての文１について、ループ１を繰り返す。
【００６９】
ステップｂ３では、定義／参照文情報から文１に関する情報を抽出し、文１で定義／参照される静的／非静的メンバ、定義／参照される大域変数および非静的メンバ関数の起動オブジェクトＭの情報を取得する。図５（ｂ）の中間コード１では、定義非静的メンバとしてクラスＸの非静的メンバｘ、起動オブジェクトＭとしてｏｂｊ１を得る。
【００７０】
ステップｂ４では、文１以降に文１の起動オブジェクトＭの定義静的／非静的メンバを定義あるいは参照する文２が存在するかどうかを判定する。存在する場合はＹｅｓと判定しステップｂ５へと処理を移行し、そうでない場合はＮｏと判定しステップｂ６へと処理を移行する。図５（ｂ）の中間コード１では、起動オブジェクトＭがｏｂｊ１であり、定義非静的メンバがクラスＸのメンバｘであるので、中間コード１以降に起動オブジェクトＭがｏｂｊ１であり、メンバｘを定義あるいは参照するような中間コードが存在するかどうかを図６（ａ）の大域関数ｇの文情報を検索して判定する。図６（ａ）の文情報を検索した結果、中間コード４で起動オブジェクトがｏｂｊ１であり、メンバｘを参照しているので、ステップｂ４ではＹｅｓと判定される。同様に中間コード２では、起動オブジェクトＭがｏｂｊ２であり、定義非静的メンバがクラスＸのメンバｘであるので、中間コード５で起動オブジェクトがｏｂｊ２であり、メンバｘを参照しているため、ステップｂ４ではＹｅｓと判定される。また、中間コード３では、定義静的メンバがクラスＸのメンバｙであるので、中間コード４および５でメンバｙを参照しているため、ステップｂ４ではＹｅｓと判定される。
【００７１】
ステップｂ５では、文１と文２の間で実行順序の関係を設定する。この順序関係は文１を実行した後で文２を実行しなければならないことを表す。図５（ｂ）の中間コード１では、中間コード４との実行順序が設定される。同様に、中間コード２と中間コード５との実行順序、中間コード３と中間コード４との実行順序、中間コード３と中間コード５との実行順序が設定される。
【００７２】
ステップｂ６では、文１以降に文１の起動オブジェクトＭの参照静的／非静的メンバを定義する文２が存在するかどうかを判定する。存在する場合はＹｅｓと判定しステップｂ７へと処理を移行し、そうでない場合はＮｏと判定しステップｂ８へと処理を移行する。図５（ｂ）の中間コード４では、起動オブジェクトＭがｏｂｊ１であり参照非静的メンバがクラスＸのメンバｘであるので、中間コード４以降に起動オブジェクトＭがｏｂｊ１であり、メンバｘを定義するような中間コードが存在するかどうかを図６（ａ）の大域関数ｇの文情報を検索して判定する。図６（ａ）の文情報を検索した結果、起動オブジェクトがｏｂｊ１であり、メンバｘを定義している中間コードは存在しないため、ステップｂ６ではＮｏと判定される。
【００７３】
ステップｂ７では、ステップｂ５と同様に文１と文２の間で実行順序の関係を設定する。
【００７４】
ステップｂ８では、文１以降に文１で定義する大域変数を定義あるいは参照する文２が存在するかどうかを判定する。存在する場合はＹｅｓと判定しステップｂ９へと処理を移行し、そうでない場合はＮｏと判定しステップｂ１０へと処理を移行する。図５（ｂ）の中間コード６では、定義する大域変数がａであるので、中間コード６以降に大域変数を定義あるいは参照するような中間コードが存在するかどうかを図６（ａ）の大域関数ｇの文情報を検索して判定する。図６（ａ）の文情報を検索した結果、中間コード７で大域変数ａを参照しているので、ステップｂ８ではＹｅｓと判定される。
【００７５】
ステップｂ９では、ステップｂ５、ステップｂ７と同様に、文１と文２の間で実行順序の関係を設定する。図５（ｂ）の中間コード３では、中間コード６との実行順序が設定される。同様に中間コード６と中間コード７との実行順序が設定される。
【００７６】
ステップｂ１０では、文１以降に文１で参照する大域変数を定義する文２が存在するかどうかを判定する。存在する場合はＹｅｓと判定しステップｂ１１へと処理を移行し、そうでない場合はＮｏと判定しステップｂ１２へと処理を移行する。図５（ｂ）の中間コード３では、参照する大域変数がａであるので、中間コード３以降に大域変数を定義するような中間コードが存在するかどうかを図６（ａ）の大域関数ｇの文情報を検索して判定する。図６（ａ）の文情報を検索した結果、中間コード６で大域変数ａを定義しているので、ステップｂ１０ではＹｅｓと判定される。
【００７７】
ステップｂ１１では、ステップｂ９、ステップｂ５、ステップｂ７と同様に、文１と文２の間で実行順序の関係を設定する。図５（ｂ）の中間コード３と中間コード６の間に実行順序が設定される。
【００７８】
ステップｂ１２では、ステップｂ２に処理を移行し、ループ１の処理を繰り返す。
【００７９】
なお、クラスメンバ、大域変数以外の自動変数などの実行順序に関しては、通常の依存関係の解析により順序付けられる。通常の依存関係の解析については、本発明の主眼ではないため、詳細な説明は省略する。通常の依存関係の解析によって、局所変数の間の実行順序が設定され、中間コード４と中間コード６の実行順序が設定される。また、同様に中間コード５と中間コード６の実行順序が設定される。
【００８０】
次に、関数の定義／参照文情報作成ステップの処理について、図５（ａ）に示すプログラムの大域変数ｇ（５ａ５）について適用した場合を例にして図５（ｂ）に示した中間コードを使って、図４を参照しながら説明する。
【００８１】
定義／参照文情報作成ステップの処理は、記憶部Ｄ１２０に格納されている全ての構文解析データのうち関数定義のデータに対してｃ１からｃ９までのステップによって行われる。以下記号の順に説明していく。
【００８２】
ステップｃ１では、関数定義Ｆ１内の全ての文１について、ループ１を繰り返す。
【００８３】
ステップｃ２では、文１が関数呼び出しを含む文であるかどうかを判定する。文１が関数呼び出しを含む場合はＹｅｓと判定しステップｃ３へと処理を移行し、そうでない場合はＮｏと判定しステップｃ７へと処理を移行する。図５（ｂ）の中間コード１および２では、クラスＸのデフォルトコンストラクタの呼び出しを含んでいるため、ステップｃ２ではＹｅｓと判定される。中間コード３では、クラスＸのメンバ関数ｓｅｔの呼び出しを含んでいるため、Ｙｅｓと判定される。また、中間コード４および５では、クラスＸのメンバ関数ｃａｌｃの呼び出しを含んでいるため、同様にＹｅｓと判定される。図５（ｂ）のその他の中間コードはＮｏと判定される。
【００８４】
ステップｃ３では、文１に含まれている呼び出し関数Ｆ２がクラスのメンバ関数であるかどうかを判定する。関数Ｆ２がクラスのメンバ関数である場合はＹｅｓと判定しステップｃ４へと処理を移行し、そうでない場合はＮｏと判定しステップｃ６へと処理を移行する。図５（ｂ）の中間コード１、２、３、４、５に関しては呼び出される関数が全てメンバ関数であるため、ステップｃ３でＹｅｓと判定される。
【００８５】
ステップｃ４では、メンバ関数呼び出しの式から起動オブジェクトＭを取得し、文情報に登録する。図５（ｂ）の中間コード１、２に関しては、デフォルトコンストラクタの起動オブジェクトＭは、それぞれｏｂｊ１、ｏｂｊ２であるため、中間コード１および２に対する文情報の起動オブジェクトの欄にそれぞれｏｂｊ１、ｏｂｊ２を登録する。中間コード３に関しては呼び出される関数が静的メンバ関数であるため、起動オブジェクトＭを持たないため、文情報の起動オブジェクトの欄には何も登録しない。
【００８６】
ステップｃ５では、変数／メンバ情報記憶部Ｄ１３０から関数Ｆ２の定義／参照非静的メンバ、定義／参照静的メンバ、呼び出し関数の情報を取得し、文中で定義および参照される非静的メンバ、および静的メンバを計算し、文情報に登録する。図５（ｂ）の中間コード１に関しては、クラスＸのデフォルトコンストラクタＸの呼び出しが含まれているので、図５（ｃ）の変数／メンバ情報記憶部Ｄ１３０を参照し、呼び出し関数内で定義、参照される非静的、静的メンバおよび呼び出し関数を取得する。デフォルトコンストラクタＸ中では定義、参照される非静的、静的メンバはなく、クラスＸのメンバ関数ｉｎｉｔが含まれている。呼び出し関数が含まれている場合は再帰的に図５（ｃ）の変数／メンバ情報記憶部Ｄ１３０を参照し、定義、参照される非静的、静的メンバと呼び出し関数を取得する。クラスＸのメンバ関数ｉｎｉｔでは、参照非静的メンバ、参照静的メンバ、定義静的メンバはなく、定義非静的メンバとしてｘがあるため、図５（ｂ）の中間コード１では定義非静的メンバとしてｘという結果が得られ、中間コード１の定義非静的メンバの欄にクラスＸのメンバｘを登録する。
【００８７】
ステップｃ６では、変数／メンバ情報記憶部Ｄ１３０から関数Ｆ２の定義大域変数、参照大域変数、呼び出し関数の情報を取得し、文中で定義および参照される大域変数を計算し、文情報に登録する。図５（ｂ）の中間コード１に関しては、クラスＸのデフォルトコンストラクタＸの呼び出しが含まれているので、図５（ｃ）の変数／メンバ情報記憶部Ｄ１３０を参照し、呼び出し関数内で定義、参照される大域変数と呼び出し関数を取得する。デフォルトコンストラクタＸ中では定義、参照される大域変数はなく、クラスＸのメンバ関数ｉｎｉｔが含まれている。呼び出し関数が含まれている場合は再帰的に図５（ｃ）の変数／メンバ情報記憶部Ｄ１３０を参照し、定義、参照される大域変数と呼び出し関数を取得する。クラスＸのメンバ関数ｉｎｉｔでは、参照、定義される大域変数は存在しないため、図５（ｂ）の中間コード１の定義大域変数、参照大域変数には何も登録されない。
【００８８】
ステップｃ７では、文１の中で関数呼び出し以外の式で定義および参照されている非静的メンバ、静的メンバを計算し、文情報に登録する。図５（ｂ）の中間コード１から６では、関数呼び出し以外の式で定義および参照されているメンバは存在しないため、中間コード１から中間コード６の文情報の定義メンバおよび参照メンバの欄には何も登録されない。図５（ａ）のメンバ関数ｃａｌｃ（５ａ１）の関数定義の１１行目の中間コードの場合では、クラスＸの非静的メンバｘと静的メンバｙを参照しているのでメンバ関数ｃａｌｃの１１行目の中間コードに対する文情報には参照非静的メンバの欄にメンバｘが、参照静的メンバの欄にはメンバｙが登録される。なお、メンバ関数ｃａｌｃ（５ａ１）の関数定義の中間コードは図示していない。
【００８９】
ステップｃ８では、文１の中で関数呼び出し以外の式で定義および参照されている大域変数を計算し、文情報に登録する。図５（ｂ）の中間コード５では、関数呼び出し以外の式で大域変数ａが定義されているため、中間コード５の定義大域変数の欄に大域変数ａを登録する。また、中間コード３では、関数呼び出しの引数として大域変数ａが参照されている。この場合も中間コード３の参照大域変数の欄に大域変数ａを登録する。
【００９０】
ステップｃ９では、ステップｃ１に処理を移行し、ループ１の処理を繰り返す。
【００９１】
定義／参照文情報作成ステップの処理を大域関数ｇに対して適用した結果、図６（ａ）に示すような文情報が得られる。
【００９２】
並列化実行ステップＳ１４０の処理を大域関数ｇに対して適用した結果、大域関数ｇの中間コード１から７までの実行順序の関係を有向グラフで表すと、図６（ｂ）に示すようになる。中間コード１と中間コード２と中間コード３、および中間コード４と中間コード５は実行順序に関する依存関係は存在しないため、それぞれ並列して実行することが可能であると判断でき、大域関数ｇの実行ステップ数は、中間コードの実行ステップ数で表すと４ステップで実行することが可能である。大域関数ｇの中間コードを従来技術の方法で並列化を行うと、図６（ｃ）に示すようにクラスメンバに対応していないため、いずれの中間コードも並列に実行することができないため、７ステップ要することになる。
【００９３】
図６（ｂ）と図６（ｃ）との比較で明かなように、本実施の形態によれば、従来技術に比べて、各文の並列化をより効率良く遂行することができる。
【００９４】
（第二の実施形態）
図７は本発明の第二の実施形態におけるプログラム並列化方式の構成図を表している。
【００９５】
図７において、このプログラム並列化ステップは、入力ステップＳ２１０、構文解析ステップＳ２２０、記憶部Ｄ２２０、変数／メンバ解析ステップＳ２３０、クラス解析ステップＳ２４０、クラス／変数／メンバ情報記憶部Ｄ２４０、並列化実行ステップＳ２５０、最適化ステップＳ２６０、コード生成ステップＳ２７０から構成されている。
【００９６】
第二の実施形態におけるプログラム並列化方式の入力ステップＳ２１０、構文解析ステップＳ２２０、記憶部Ｄ２２０、変数／メンバ解析ステップＳ２３０、最適化ステップＳ２６０、コード生成ステップＳ２７０については、それぞれ第一の実施形態における入力ステップＳ１１０、構文解析ステップＳ１２０、記憶部Ｄ１２０、変数／メンバ解析ステップＳ１３０、最適化ステップＳ１５０、コード生成ステップＳ１６０と同じであるので説明を省略する。
【００９７】
クラス解析ステップＳ２４０は、記憶部Ｄ２２０に格納されているクラス情報を抽出し、クラスの継承関係やメンバ関数に関する情報を解析して、解析結果をクラス／変数／メンバ情報記憶部Ｄ２４０のクラス情報記憶部Ｄ２４２に格納する。
【００９８】
クラス／変数／メンバ情報記憶部Ｄ２４０は、変数／メンバ情報記憶部Ｄ２４１とクラス情報記憶部Ｄ２４２から構成されており、変数／メンバ解析ステップＳ２３０およびクラス解析ステップＳ２４０から解析結果を受け取り、それぞれ変数／メンバ情報記憶部Ｄ２４１とクラス情報記憶部Ｄ２４２に格納しておく。
【００９９】
並列化実行ステップＳ２５０は、記憶部Ｄ２２０から構文木を受け取り、関数内の各文について並列化を行う。この際、クラス／変数／メンバ情報記憶部Ｄ２４０に格納されているクラスツリーや大域変数、クラスメンバの定義／参照情報などを使用して並列化を行う。
【０１００】
図１１（ａ）はＣ＋＋言語で記述したソースプログラム例２である。
【０１０１】
図１１（ａ）の１行目から１５行目まではクラスＡ、クラスＢ、クラスＣのクラス定義である。クラスＢはクラスＡを継承しており、クラスＣはクラスＢを継承している。また、４行目、９行目、１４行目のｖｉｒｔｕａｌ指定子が指定されたメンバ関数は仮想関数であることを表しており、クラスＡのメンバ関数ｃａｌｃ（１１ａ１）、クラスＢのメンバ関数ｃａｌｃ（１１ａ２）、クラスＣのメンバ関数ｃａｌｃ（１１ａ３）がそれぞれ定義されている。更に、クラスＢの仮想関数ｃａｌｃ（１１ａ２）は基底クラスＡの仮想関数ｃａｌｃ（１１ａ１）を上書きし、クラスＣの仮想関数ｃａｌｃ（１１ａ３）は基底クラスＢの仮想関数ｃａｌｃ（１１ａ２）を上書きする。
【０１０２】
１８行目から３１行目まではクラスＸ、クラスＹ、クラスＺのクラス定義である。クラスＹおよびクラスＺは、それぞれクラスＸを継承している。２０行目、２５行目、３０行目のｖｉｒｔｕａｌ指定子が指定されたメンバ関数は仮想関数であることを表しており、クラスＸのメンバ関数ｃａｌｃ（１１ａ４）、クラスＹのメンバ関数ｃａｌｃ（１１ａ５）、クラスＺのメンバ関数ｃａｌｃ（１１ａ６）がそれぞれ定義されている。クラスＹの仮想関数ｃａｌｃ（１１ａ５）は基底クラスＸの仮想関数ｃａｌｃ（１１ａ４）を上書きし、クラスＺの仮想関数ｃａｌｃ（１１ａ６）は基底クラスＸの仮想関数ｃａｌｃ（１１ａ４）を上書きする。
【０１０３】
３２行目から３５行目までは大域関数ｇの関数定義（１１ａ７）を表しており、３３行目および３４行目でそれぞれ、クラスＡへのポインタ変数に対する仮想関数ｃａｌｃの呼び出しと、クラスＸへのポインタ変数に対する仮想関数ｃａｌｃの呼び出しが記述されている。
【０１０４】
次に、クラス解析ステップＳ２４０の処理について、図１１（ａ）に示すプログラムに適用した場合を例にして図８を参照しながら説明する。
【０１０５】
クラス解析ステップＳ２４０の処理は、記憶部Ｄ２２０に格納されている全ての構文解析データのうちクラス定義のデータに対してｄ１からｄ１０までのステップによって行われる。以下記号の順に説明していく。
【０１０６】
ステップｄ１では、記憶部Ｄ２２０に格納されている全てのクラスＴ１について、ループ１を繰り返す。
【０１０７】
ステップｄ２では、クラスＴ１が基底クラスＴ２を持つかどうかを判定する。基底クラスＴ２を持つ場合はＹｅｓと判定しステップｄ３へと処理を移行し、そうでない場合はＮｏと判定しステップｄ４へと処理を移行する。図１１（ａ）のプログラムではクラスＢ、クラスＣ、クラスＹ、クラスＺについては、それぞれ基底クラスを持つため、ステップｄ２でＹｅｓと判定され、クラスＡ、クラスＸは基底クラスを持たないため、Ｎｏと判定される。
【０１０８】
ステップｄ３では、クラスＴ１をクラスＴ２の属するクラスツリーに追加し、クラスＴ２の派生クラスとして設定し、クラスツリーを更新する。図１１（ａ）のプログラムでは、クラスＢに関しては、基底クラスであるクラスＡの属するクラスツリーにクラスＢを追加し、クラスＡの派生クラスとして設定する。同様にクラスＣに関しては、クラスＢの属するクラスツリーに追加し、クラスＢの派生クラスと設定し、クラスＹ、クラスＺに関しては、それぞれクラスＸの属するクラスツリーに追加し、クラスＸの派生クラスと設定する。
【０１０９】
ステップｄ４では、クラスＴ１の属するクラスツリーを新たに生成し、クラスＴ１をクラスツリーに追加する。図１１（ａ）のプログラムでは、クラスＡ、クラスＸに関してそれぞれクラスツリーを新たに生成し、クラスＡ、クラスＸを追加する。
【０１１０】
ステップｄ５では、クラスＴ１の全ての仮想関数Ｆ１について、ループ２を繰り返す。
【０１１１】
ステップｄ６では、クラスＴ１が基底クラスＴ２を持ち、かつ仮想関数Ｆ１が基底クラスＴ２の仮想関数Ｆ２を上書きするかどうかを判定する。仮想関数Ｆ１が基底クラスの仮想関数Ｆ２を上書きする場合はＹｅｓと判定しステップｄ７へと処理を移行し、そうでない場合はＮｏと判定しステップｄ８へと処理を移行する。図１１（ａ）のプログラムでは、クラスＢに関しては、基底クラスとしてクラスＡを持ち、クラスＢの仮想関数ｃａｌｃ（１１ａ２）がクラスＡの仮想関数ｃａｌｃ（１１ａ１）を上書きするので、ステップｄ６でＹｅｓと判定される。同様にクラスＣの仮想関数ｃａｌｃ（１１ａ３）、クラスＹの仮想関数ｃａｌｃ（１１ａ５）、クラスＺの仮想関数ｃａｌｃ（１１ａ６）でもＹｅｓと判定される。クラスＡおよびクラスＸの仮想関数ｃａｌｃに関しては、クラスＡおよびクラスＸが基底クラスを持たないため、Ｎｏと判定される。
【０１１２】
ステップｄ７では、仮想関数Ｆ２の属する仮想関数集合に仮想関数Ｆ１を追加する。図１１（ａ）のプログラムでは、クラスＢの仮想関数ｃａｌｃに関しては、クラスＡの仮想関数ｃａｌｃ（１１ａ１）の属する仮想関数集合に追加し、クラスＣの仮想関数ｃａｌｃに関しては、クラスＢの仮想関数ｃａｌｃ（１１ａ２）の属する仮想関数集合に追加する。同様に、クラスＹの仮想関数ｃａｌｃ（１１ａ５）、クラスＺの仮想関数ｃａｌｃ（１１ａ６）に関しては、共にクラスＸの仮想関数ｃａｌｃ（１１ａ４）の属する仮想関数集合に追加する。
【０１１３】
ステップｄ８では、仮想関数Ｆ１の属する仮想関数集合を新たに生成し、仮想関数Ｆ１を仮想関数集合に追加する。図１１（ａ）のプログラムでは、クラスＡの仮想関数ｃａｌｃおよびクラスＸの仮想関数ｃａｌｃに関しては、それぞれ新たに仮想関数集合を生成して仮想関数を追加する。
【０１１４】
ステップｄ９では、ステップｄ５に処理を移行し、ループ２の処理を繰り返す。
【０１１５】
ステップｄ１０では、ステップｄ１に処理を移行し、ループ１の処理を繰り返す。
【０１１６】
クラス解析ステップＳ２４０の処理を図１１（ａ）に示すプログラムに適用した場合、クラス／変数／メンバ情報記憶部Ｄ２４０のクラス情報記憶部Ｄ２４２の内容は図１２（ｂ）に示すようになる。
【０１１７】
次に、並列化実行ステップＳ２５０の処理について、図１１（ａ）に示すプログラムの大域関数ｇ（１１ａ７）について適用した場合を例にして図１１（ｂ）に示した中間コードを使って、図９を参照しながら説明する。
【０１１８】
並列化実行ステップＳ２５０の処理は、記憶部Ｄ２２０に格納されている全ての構文解析データのうち関数定義のデータに対してｅ１からｅ１６までのステップによって行われる。以下記号の順に説明していく。
【０１１９】
ステップｅ１では、記憶部Ｄ２２０に格納されている関数定義Ｆ１内の全ての文について定義／参照文情報を作成する。定義／参照文情報の作成処理の詳細については後述する。ステップｅ１によって、関数定義Ｆ１内の各文において定義／参照される静的／非静的メンバ、定義／参照される大域変数、および非静的メンバ関数の起動オブジェクトを得る。図１１（ｂ）の大域関数ｇの中間コードに対する定義／参照文情報は図１３（ａ）のようになる。
【０１２０】
ステップｅ２では、関数定義Ｆ１内の全ての文１について、ループ１を繰り返す。
【０１２１】
ステップｅ３では、定義／参照文情報から文１に関する情報を抽出し、文１で定義／参照される静的／非静的メンバ、定義／参照される大域変数および非静的メンバ関数の起動オブジェクトＭ１の情報を取得する。図１１（ｂ）の中間コード１では、図１３（ａ）の文情報より、参照非静的メンバとしてクラスＢの非静的メンバｂとクラスＣの非静的メンバｃを得るとともに、定義静的メンバおよび参照静的メンバとしてクラスＡの静的メンバａを得、起動オブジェクトＭ１としてｐａ１を得る。
【０１２２】
ステップｅ４では、文１以降の全ての文２について、ループ２を繰り返す。
【０１２３】
ステップｅ５では、定義／参照文情報から文２に関する情報を抽出し、文２で定義／参照される静的／非静的メンバ、定義／参照される大域変数および非静的メンバ関数の起動オブジェクトＭ２の情報を取得する。図１１（ｂ）の中間コード２では、図１３（ａ）の文情報より、参照非静的メンバとしてクラスＹの非静的メンバｙとクラスＺの非静的メンバｚ、定義大域変数および参照大域変数としてｖａｌ、起動オブジェクトＭ２としてｐｘ１を得る。
【０１２４】
ステップｅ６では、クラス／変数／メンバ情報記憶部Ｄ２４０のクラス情報記憶部Ｄ２４２の内容を参照し、起動オブジェクトＭ１とＭ２のクラスが同一のクラスツリーに属するかどうかを判定する。同一のクラスツリーに属する場合はＹｅｓと判定しステップｅ７へと処理を移行し、そうでない場合はＮｏと判定しステップｅ１１へと処理を移行する。図１１（ｂ）で文１が中間コード１で文２が中間コード２の場合では、図１３（ａ）の文情報より、中間コード１と中間コード２の起動オブジェクトｐａ１、ｐｘ１について判定する。ｐａ１およびｐｘ１の型はポインタ型であるので、ポインタが指している型、すなわち、ｐａ１ではクラスＡ、ｐｘ１ではクラスＸについて調べる。クラスＡとクラスＸが同一のクラスツリーに属するかどうかを図１２（ｂ）のクラスツリー集合を検索して判定した場合、同一のクラスツリーには属さないため、ステップｅ６ではＮｏと判定される。
【０１２５】
一方、文１が中間コード１で文２が中間コード４の場合では、図１３（ａ）の文情報より、起動オブジェクトはそれぞれｐａ１、ｐａ２であり、共にポインタ型であるので、ポインタが指している型について調べる。ｐａ１、ｐａ２が指している型は共にクラスＡであるため、同一のクラスツリーに属し、ステップｅ６ではＹｅｓと判定される。
【０１２６】
ステップｅ７では、文１の起動オブジェクトＭ１の定義静的／非静的メンバを文２で定義あるいは参照するかどうかを判定する。定義あるいは参照する場合はＹｅｓと判定しステップｅ８へと処理を移行し、そうでない場合はＮｏと判定しステップｅ９へと処理を移行する。図１１（ｂ）の中間コード１が文１、中間コード４が文２である場合では、図１３（ａ）の文情報より、文１である中間コード１の起動オブジェクトＭ１がｐａ１であり、定義静的メンバがクラスＡのメンバａであるので、文２である中間コード４でｐａ１のメンバａを定義あるいは参照するかどうかを判定する。中間コード４でクラスＡのメンバａを定義／参照しているので、ステップｅ７ではＹｅｓと判定される。
【０１２７】
なお、中間コード１と中間コード４の起動オブジェクトは共にポインタ型であるため、起動オブジェクトが同一かどうかは不明であるが、中間コード１と中間コード４では共に非静的メンバは参照のみであるので影響はない。
【０１２８】
同様に文１が中間コード４の場合では、図１３（ａ）の文情報より、起動オブジェクトＭ１がｐｘ２であり、定義静的メンバがクラスＡのメンバａであるが、文２が中間コード５、６のいずれの場合でもメンバａを定義／参照していないため、ステップｅ７ではＮｏと判定される。
【０１２９】
ステップｅ８では、文１と文２の間で実行順序の関係を設定する。この順序関係は文１を実行した後で文２を実行しなければならないことを表す。図１１（ｂ）の中間コード１と中間コード４との実行順序が設定される。
【０１３０】
ステップｅ９では、文１の起動オブジェクトＭ１の参照静的／非静的メンバを文２で定義するかどうかを判定する。定義する場合はＹｅｓと判定しステップｅ１０へと処理を移行し、そうでない場合はＮｏと判定しステップｅ１１へと処理を移行する。図１１（ｂ）の中間コード１が文１、中間コード４が文２である場合では、図１３（ａ）の文情報より、中間コード１の起動オブジェクトＭ１がｐａ１であり参照静的メンバがクラスＡのメンバａであるので、中間コード４でｐａ１のメンバａを定義するかどうかを判定する。中間コード４でクラスＡのメンバａを定義しているので、ステップｅ９ではＹｅｓと判定される。
【０１３１】
なお、中間コード１と中間コード４の起動オブジェクトは共にポインタ型であるため、起動オブジェクトが同一かどうかは不明であるが、中間コード１と中間コード４では共に非静的メンバは参照のみであるので影響はない。
【０１３２】
ステップｅ１０では、ステップｅ８と同様に文１と文２の間で実行順序の関係を設定する。図１１（ｂ）の中間コード１と中間コード４との実行順序が設定される。
【０１３３】
ステップｅ１１では、文１で定義する大域変数を文２で定義あるいは参照するかどうかを判定する。定義あるいは参照する場合はＹｅｓと判定しステップｅ１２へと処理を移行し、そうでない場合はＮｏと判定しステップｅ１３へと処理を移行する。図１１（ｂ）で文１が中間コード２、文２が中間コード３である場合では、図１３（ａ）の文情報より、中間コード２で定義する大域変数がｖａｌであり、中間コード３で大域変数ｖａｌを定義しているので、ステップｅ１１ではＹｅｓと判定される。同様に文１が中間コード２、文２が中間コード５の場合、文１が中間コード３、文２が中間コード５の場合もステップｅ１１でＹｅｓと判定される。
【０１３４】
ステップｅ１２では、ステップｅ８、ステップｅ１０と同様に、文１と文２の間で実行順序の関係を設定する。図１１（ｂ）の中間コード２では、中間コード３との実行順序が設定される。同様に中間コード２と中間コード５との実行順序および中間コード３と中間コード５との実行順序が設定される。
【０１３５】
ステップｅ１３では、文１で参照する大域変数を文２で定義するかどうかを判定する。定義する場合はＹｅｓと判定しステップｅ１４へと処理を移行し、そうでない場合はＮｏと判定しステップｅ１５へと処理を移行する。図１１（ｂ）で文１が中間コード２、文２が中間コード３である場合では、図１３（ａ）の文情報より、中間コード２で参照する大域変数がｖａｌであり、中間コード３で大域変数ｖａｌを定義しているので、ステップｅ１３ではＹｅｓと判定される。
【０１３６】
ステップｅ１４では、ステップｅ８、ステップｅ１０、ステップｅ１２と同様に、文１と文２の間で実行順序の関係を設定する。図１１（ｂ）の中間コード２と中間コード３の間に実行順序が設定される。
【０１３７】
ステップｅ１５では、ステップｅ４に処理を移行し、ループ２の処理を繰り返す。
【０１３８】
ステップｅ１６では、ステップｅ２に処理を移行し、ループ１の処理を繰り返す。
【０１３９】
なお、クラスメンバ、大域変数以外の自動変数などの実行順序に関しては、通常の依存関係の解析により順序付けられる。通常の依存関係の解析については、本発明の主眼ではないため、詳細な説明は省略する。通常の依存関係の解析によって、局所変数の間の実行順序が設定され、中間コード１と中間コード３の実行順序、中間コード２と中間コード３の実行順序、中間コード４と中間コード６の実行順序、中間コード５と中間コード６の実行順序が設定される。
【０１４０】
次に、関数の定義／参照文情報作成ステップの処理について、図１１（ａ）に示すプログラムの大域変数ｇ（１１ａ７）について適用した場合を例にして図１１（ｂ）に示した中間コードを使って、図１０を参照しながら説明する。
【０１４１】
定義／参照文情報作成ステップの処理は、記憶部Ｄ２２０に格納されている全ての構文解析データのうち関数定義のデータに対してｆ１からｆ１１までのステップによって行われる。以下記号の順に説明していく。
【０１４２】
ステップｆ１では、関数定義Ｆ１内の全ての文１について、ループ１を繰り返す。
【０１４３】
ステップｆ２では、文１が関数呼び出しを含む文であるかどうかを判定する。文１が関数呼び出しを含む場合はＹｅｓと判定しステップｆ３へと処理を移行し、そうでない場合はＮｏと判定しステップｆ９へと処理を移行する。図１１（ｂ）の中間コード１および４では、クラスＡのメンバ関数ｃａｌｃの呼び出しを含んでいるため、ステップｆ２ではＹｅｓと判定される。また、中間コード２および５では、クラスＸのメンバ関数ｃａｌｃの呼び出しを含んでいるため、Ｙｅｓと判定される。図１１（ｂ）のその他の中間コードはＮｏと判定される。
【０１４４】
ステップｆ３では、文１に含まれている呼び出し関数Ｆ２がクラスのメンバ関数であるかどうかを判定する。関数Ｆ２がクラスのメンバ関数である場合はＹｅｓと判定しステップｆ４へと処理を移行し、そうでない場合はＮｏと判定しステップｆ８へと処理を移行する。図１１（ｂ）の中間コード１、２、４、５に関しては呼び出される関数が全てメンバ関数であるため、ステップｆ３でＹｅｓと判定される。
【０１４５】
ステップｆ４では、メンバ関数呼び出しの式から起動オブジェクトＭを取得し、文情報に登録する。図１１（ｂ）の中間コード１、２、４、５に関しては、起動オブジェクトＭは、それぞれｐａ１、ｐｘ１、ｐａ２、ｐｘ２であるため、対応する文情報の起動オブジェクトの欄にそれぞれｐａ１、ｐｘ１、ｐａ２、ｐｘ２を登録する。
【０１４６】
ステップｆ５では、起動オブジェクトＭがポインタ型あるいはリファレンス型で、かつ関数Ｆ２が仮想関数であるかどうかを判定する。起動オブジェクトＭがポインタ型あるいはリファレンス型で関数Ｆ２が仮想関数である場合はＹｅｓと判定しステップｆ６へと処理を移行し、そうでない場合はＮｏと判定しステップｆ７へと処理を移行する。図１１（ｂ）の中間コード１、２、４、５は起動オブジェクトがそれぞれｐａ１、ｐｘ１、ｐａ２、ｐｘ２であり、全てポインタ型である。また、呼び出し関数はそれぞれ仮想関数であるため、図１１（ｂ）の中間コード１、２、４、５ではステップｆ５でＹｅｓと判定される。
【０１４７】
ステップｆ６では、クラス／変数／メンバ情報記憶部Ｄ２４０のクラス情報記憶部Ｄ２４２から仮想関数集合から関数Ｆ２が属する集合を取得し、その集合に含まれる全ての関数の定義／参照非静的メンバ、定義／参照静的メンバ、定義／参照大域変数、呼び出し関数の情報をクラス／変数／メンバ情報記憶部Ｄ２４０の変数／メンバ情報記憶部Ｄ２４１から取得し、文中で定義および参照される非静的メンバ、静的メンバおよび大域変数を計算し、文情報に登録する。図１１（ｂ）の中間コード２に関しては、クラスＸの仮想関数ｃａｌｃが属する集合を仮想関数集合から取得し、集合ＶＦ２を得る。次に集合ＶＦ２に含まれる全ての関数、すなわち、Ｘ：：ｃａｌｃ、Ｙ：：ｃａｌｃ、Ｚ：：ｃａｌｃに関する定義／参照非静的メンバ、定義／参照静的メンバ、定義／参照大域変数、呼び出し関数の情報を図１２（ａ）より取得して文情報に登録する。Ｘ：：ｃａｌｃでは参照大域変数に大域変数ｖａｌを登録し、Ｙ：：ｃａｌｃでは参照非静的メンバにＹ：：ｙを、定義大域変数に大域変数ｖａｌを登録し、Ｚ：：ｃａｌｃでは参照非静的メンバにＹ：：ｙ、Ｚ：：ｚを、参照大域変数に大域変数ｖａｌを登録する。その結果、図１３（ａ）の中間コード２の文情報が得られる。図１１（ｂ）の中間コード１、４および５に関しても同様である。
【０１４８】
ステップｆ７では、クラス／変数／メンバ情報記憶部Ｄ２４０の変数／メンバ情報記憶部Ｄ２４１から関数Ｆ２の定義／参照非静的メンバ、定義／参照静的メンバ、定義／参照大域変数、呼び出し関数の情報を取得し、文中で定義および参照される非静的メンバ、静的メンバ、および大域変数を計算し、文情報に登録する。図１１（ｂ）の中間コードに関しては、ステップｆ５でＮｏと判定される場合がないため、ステップｆ７は実行されない。
【０１４９】
ステップｆ８では、クラス／変数／メンバ情報記憶部Ｄ２４０の変数／メンバ情報記憶部Ｄ２４１から関数Ｆ２の定義大域変数、参照大域変数、呼び出し関数の情報を取得し、文中で定義および参照される大域変数を計算し、文情報に登録する。図１１（ｂ）の中間コードでは、メンバ関数でない（クラスの中にない関数である）大域関数の呼び出しを含む中間コードを含まないため、いずれの中間コードでもステップｆ８は実行されない。
【０１５０】
ステップｆ９では、文１の中で関数呼び出し以外の式で定義および参照されている非静的メンバ、静的メンバを計算し、文情報に登録する。図１１（ｂ）の中間コード１から中間コード６では、関数呼び出し以外の式で定義および参照されているメンバは存在しないため、中間コード１から中間コード６の文情報の定義メンバおよび参照メンバの欄には何も登録されない。図１１（ａ）の４行目のクラスＡのメンバ関数ｃａｌｃの関数定義の中間コードの場合では、静的メンバａを参照しているのでメンバ関数ｃａｌｃ（１１ａ１）の中間コードに対する文情報には参照静的メンバの欄にはメンバａが登録される。なお、クラスＡのメンバ関数ｃａｌｃ（１１ａ１）の関数定義の中間コードは図示していない。
【０１５１】
ステップｆ１０では、文１の中で関数呼び出し以外の式で定義および参照されている大域変数を計算し、文情報に登録する。図１１（ｂ）の中間コード３では、関数呼び出し以外の式で大域変数ｖａｌが定義されているため、中間コード３の定義大域変数の欄に大域変数ｖａｌを登録する。
【０１５２】
ステップｆ１１では、ステップｆ１に処理を移行し、ループ１の処理を繰り返す。
【０１５３】
定義／参照文情報作成ステップの処理を大域関数ｇに対して適用した結果、図１３（ａ）に示すような文情報が得られる。
【０１５４】
並列化実行ステップＳ２５０の処理を大域関数ｇに対して適用した結果、大域関数ｇの中間コード１から６までの実行順序の関係を有向グラフで表すと、図１３（ｂ）に示すようになる。中間コード１と中間コード２、および中間コード４と中間コード５は実行順序に関する依存関係は存在しないため、それぞれ並列して実行することが可能であると判断でき、大域関数ｇの実行ステップ数は、中間コードの実行ステップ数で表すと４ステップで実行することが可能である。大域関数ｇの中間コードを従来技術の方法で並列化を行うと、図１３（ｃ）に示すようにクラスメンバに対応していないため、いずれの中間コードも並列に実行することができないため、６ステップ要することになる。
【０１５５】
図１３（ｂ）と図１３（ｃ）との比較で明かなように、本実施の形態によれば、複数のクラスについて、各クラス定義でクラスどうしの継承関係がある場合において、クラスメンバの参照、定義およびクラス定義の解析情報を考慮して並列化を行うため、従来技術に比べて、各文の並列化をより効率良く遂行することができる。
【０１５６】
【発明の効果】
以上のように、本発明のプログラム並列化方式によれば、入力プログラム中のクラスメンバの情報を解析するクラスメンバ解析ステップと、解析された情報を用いて並列化を行う並列化ステップを備えたものであり、クラスメンバの情報を考慮して、効率の良い並列化を行うことができる。
【０１５７】
また、メンバ参照定義解析ステップ、並列化ステップを備えることにより、クラスメンバの参照および定義の関係を用いてプログラムの動作を変えることなく、メンバ関数呼び出しを含めた文を効率良く並列化することができる。
【０１５８】
また、非静的メンバ参照定義解析ステップ、大域変数参照定義解析ステップ、メンバ関数呼び出し並列化ステップおよび大域関数呼び出し並列化ステップを備えることにより、クラスの非静的メンバおよび大域変数を考慮した解析をすることができ、プログラムの動作を変えることなく、メンバ関数呼び出しおよび大域関数呼び出しを含めた文をより効率良く並列化することができる。
【０１５９】
また、静的メンバ参照定義解析ステップ、大域変数参照定義解析ステップ、メンバ関数呼び出し並列化ステップおよび大域関数呼び出し並列化ステップを備えることにより、クラスの静的メンバおよび大域変数を考慮した解析をすることができ、プログラムの動作を変えることなく、メンバ関数呼び出しおよび大域関数呼び出しを含めた文をより効率良く並列化することができる。
【０１６０】
また、別態様の本発明によれば、入力プログラム中のクラスメンバの参照および定義の情報を解析するメンバ参照定義解析ステップと、入力プログラムに記載されているクラス定義を解析するクラス解析ステップと、メンバ参照定義解析ステップおよびクラス解析ステップにより解析された情報を用いて並列化を行う並列化ステップを備えることにより、クラスメンバの参照、定義およびクラス定義の解析情報を考慮した並列化を行うことができ、より効率良く並列化することができる。
【０１６１】
また、非静的メンバ参照定義解析ステップ、大域変数参照定義解析ステップ、メンバ関数呼び出し並列化ステップおよび大域関数呼び出し並列化ステップを備えることにより、クラスの非静的メンバと大域変数およびクラス定義の解析情報を考慮した並列化を行うことができ、プログラムの動作を変えることなく、メンバ関数呼び出しおよび大域関数呼び出しを含めた文をより効率良く並列化することができる。
【０１６２】
また、静的メンバ参照定義解析ステップ、大域変数参照定義解析ステップ、メンバ関数呼び出し並列化ステップおよび大域関数呼び出し並列化ステップを備えることにより、クラスの静的メンバと大域変数およびクラス定義の解析情報を考慮した並列化行うことができ、プログラムの動作を変えることなく、メンバ関数呼び出しおよび大域関数呼び出しを含めた文をより効率良く並列化することができる。
【０１６３】
また、クラスの継承関係を解析するクラスツリー解析ステップを備え、継承関係にないクラスの１つあるいは複数のメンバ関数呼び出しの間に実行順序の依存がないとして並列化を行うことにより、クラスの継承関係を解析してクラスツリーを作成することにより、同一クラスツリーに属さないクラスのメンバ関数呼び出しは並列実行の候補と判定することができ、静的／非静的クラスメンバの関係を解析する必要がないため、処理の高速化を図ることができる。
【０１６４】
また、仮想関数解析ステップおよび仮想関数呼び出し並列化ステップを備えることにより、仮想関数呼び出しで呼び出される可能性のある全ての関数を考慮した並列化を行うことができ、より精度の高い並列化を行うことができる。
【０１６５】
また、プログラム並列化用の記録媒体についての本発明によれば、クラスメンバの情報を考慮して、効率の良い並列化を行うことができる。あるいは、クラスメンバの参照、定義およびクラス定義の解析情報を考慮した並列化を行うことができ、より効率良く並列化することができる。
【図面の簡単な説明】
【図１】本発明の第一の実施形態におけるプログラム並列化方式の構成図
【図２】第一の実施形態における変数／メンバ解析ステップの処理を示すフローチャート
【図３】第一の実施形態における並列化実行ステップの処理を示すフローチャート
【図４】第一の実施形態における定義／参照文情報作成ステップの処理を示すフローチャート
【図５】第一の実施形態において、（ａ）プログラム記憶部に格納されているプログラムを示す図、（ｂ）記憶部に格納されている大域関数に関する中間コードを示す図、および（ｃ）変数／メンバ情報記憶部に格納されている、関数毎の定義／参照メンバ、定義／参照大域変数および呼び出し関数の一覧を示す図
【図６】第一の実施形態において、（ａ）定義／参照情報作成ステップの処理を大域関数に適用した結果の文毎の定義／参照メンバ、定義／参照大域変数および起動オブジェクトの一覧を示す図、（ｂ）プログラム並列化方式実行順序の依存関係を示す図、および（ｃ）従来技術のプログラム並列化方式実行順序の依存関係を示す図
【図７】本発明の第二の実施形態におけるプログラム並列化方式の構成図
【図８】第二の実施形態におけるクラス解析ステップの処理を示すフローチャート
【図９】第二の実施形態における並列化実行ステップの処理を示すフローチャート
【図１０】第二の実施形態における定義／参照文情報作成ステップの処理を示すフローチャート
【図１１】第二の実施形態において、（ａ）プログラム記憶部に格納されているプログラムを示す図、（ｂ）記憶部に格納されている大域関数に関する中間コードを示す図
【図１２】第二の実施形態において、（ａ）変数／メンバ情報記憶部に格納されている、関数毎の定義／参照メンバ、定義／参照大域変数および呼び出し関数の一覧を示す図、（ｂ）クラス情報記憶部に格納されているクラスツリー集合、仮想関数集合を示す図
【図１３】第二の実施形態において、（ａ）定義／参照情報作成ステップの処理を大域関数に適用した結果の文毎の定義／参照メンバ、定義／参照大域変数および起動オブジェクトの一覧を示す図、（ｂ）プログラム並列化方式実行順序の依存関係を示す図、および（ｃ）従来技術のプログラム並列化方式実行順序の依存関係を示す図
【符号の説明】
Ｓ１１０　入力ステップ
Ｓ１２０　構文解析ステップ
Ｓ１３０　変数／メンバ解析ステップ
Ｓ１４０　並列化実行ステップ
Ｓ１５０　最適化ステップ
Ｓ１６０　コード生成ステップ
Ｓ２１０　入力ステップ
Ｓ２２０　構文解析ステップ
Ｓ２３０　変数／メンバ解析ステップ
Ｓ２４０　クラス解析ステップ
Ｓ２５０　並列化実行ステップ
Ｓ２６０　最適化ステップ
Ｓ２７０　コード生成ステップ
Ｄ１００　プログラム記憶部
Ｄ１２０　記憶部
Ｄ１３０　変数／メンバ情報記憶部
Ｄ１６０　生成コード記憶部
Ｄ２２０　記憶部
Ｄ２４０　クラス／変数／メンバ情報記憶部
Ｄ２４１　変数／メンバ情報記憶部
Ｄ２４２　クラス情報記憶部
．
【図１】
2004013184.tif 000003
【図２】
2004013184.tif 000004
【図３】
2004013184.tif 000005
【図４】
2004013184.tif 000006
【図５】
2004013184.tif 000007
【図６】
2004013184.tif 000008
【図７】
2004013184.tif 000009
【図８】
2004013184.tif 000010
【図９】
2004013184.tif 000011
【図１０】
2004013184.tif 000012
【図１１】
2004013184.tif 000013
【図１２】
2004013184.tif 000014
【図１３】
2004013184.tif 000015