(57)【要約】【課題】分割コンパイルにおいて、各手続きに対して生成するコードを主プログラムの開始時、終了時、あるいは実行の途中や割り込み処理で実行させる。【解決手段】該複数の手続きを一通り横断的に実行させる手続きである横断的手続きを生成する分割コンパイルプログラムであって、複数の手続きが逐次され、各入力手続き内から呼び出される手続きを検出し、この入力手続き及びこの呼び出し手続きの各手続き名に手続き名に基づいて、横断的手続きの名称を生成し、前記各入力手続きから所定の処理と前記横断的手続き名を呼び出す処理を生成し、これらの処理を含む手続きの出力コードを生成し、前記入力手続きを翻訳し、この入力手続きが主手続きの場合、この入力手続きに横断的手続きを呼び出す処理を生成することにより、上記課題の解決を図る。【選択図】図１
2008083755.tif 000002
【特許請求の範囲】
【請求項１】
プログラムを構成する複数の手続きを分割コンパイルすると共に、該複数の手続きを一通り横断的に実行させる手続きである横断的手続きを生成する処理をコンピュータに実行させるコンパイルプログラムであって、
入力された前記複数の手続きを逐次取得する取得手順と、
前記各入力手続き内から呼び出される手続きを検出する呼び出し手続き検出手順と、
前記入力手続き及び前記検出された呼び出し手続きの各手続き名に基づいて、該各手続きに対応する前記横断的手続きの名称を生成する横断的手続き名生成手順と、
前記各入力手続きの内容に基づいて所定の処理を生成し、さらに、前記検出された呼び出し手続きがあれば該呼び出し手続きに対応する前記横断的手続き名を呼び出す処理を生成し、該所定の処理及び該呼び出す処理を含む手続きを前記生成した横断的手続き名で命名して前記横断的手続きの出力コードを生成する横断的手続き出力コード生成手順と、
前記入力手続きを翻訳したコードである入力手続き出力コードを生成する入力手続き出力コード生成手順と、
前記入力手続きが主手続きの場合、前記入力手続き出力コードに関して前記横断的手続きを呼び出す処理を生成する横断的手続き呼び出し生成手順と、
をコンピュータに実行させることを特徴とするコンパイルプログラム。
【請求項２】
前記横断的手続き呼び出し生成手順は、前記入力手続き出力コード内の最初、最後、または所定箇所に前記横断的手続きを呼び出す処理を生成する
ことを特徴とする請求項１に記載のコンパイルプログラム。
【請求項３】
前記横断的手続き呼び出し生成手順は、前記入力手続きを実行させた際にその実行中に外部からの割り込みによって前記横断的手続きを呼び出すようにする処理を生成する
ことを特徴とする請求項１に記載のコンパイルプログラム。
【請求項４】
プログラムを構成する複数の手続きを分割コンパイルすると共に、該複数の手続きを一通り横断的に実行させる手続きである横断的手続きを生成するコンパイル装置であって、
入力された前記複数の手続きを逐次取得する取得手段と、
前記各入力手続き内から呼び出される手続きを検出する呼び出し手続き検出手段と、
前記入力手続き及び前記検出された呼び出し手続きの各手続き名に基づいて、該各手続きに対応する前記横断的手続きの名称を生成する横断的手続き名生成手段と、
前記各入力手続きの内容に基づいて所定の処理を生成し、さらに、前記検出された呼び出し手続きがあれば該呼び出し手続きに対応する前記横断的手続き名を呼び出す処理を生成し、該所定の処理及び該呼び出す処理を含む手続きを前記生成した横断的手続き名で命名して前記横断的手続きの出力コードを生成する横断的手続き出力コード生成手段と、
前記入力手続きを翻訳したコードである入力手続き出力コードを生成する入力手続き出力コード生成手段と、
前記入力手続きが主手続きの場合、前記入力手続き出力コードに関して前記横断的手続きを呼び出す処理を生成する横断的手続き呼び出し生成手段と、
を備えることを特徴とするコンパイル装置。
【請求項５】
プログラムを構成する複数の手続きを分割コンパイルすると共に、該複数の手続きを一通り横断的に実行させる手続きである横断的手続きを生成するコンパイル方法であって、
入力された前記複数の手続きを逐次取得し、
前記各入力手続き内から呼び出される手続きを検出し、
前記入力手続き及び前記検出された呼び出し手続きの各手続き名に基づいて、該各手続きに対応する前記横断的手続きの名称を生成し、
前記各入力手続きの内容に基づいて所定の処理を生成し、さらに、前記検出された呼び出し手続きがあれば該呼び出し手続きに対応する前記横断的手続き名を呼び出す処理を生成し、該所定の処理及び該呼び出す処理を含む手続きを前記生成した横断的手続き名で命名して前記横断的手続きの出力コードを生成し、
前記入力手続きを翻訳したコードである入力手続き出力コードを生成し、
前記入力手続きが主手続きの場合、前記入力手続き出力コードに関して前記横断的手続きを呼び出す処理を生成する、
ことを特徴とするコンパイル方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、Ｃ言語やＦｏｒｔｒａｎ言語など手続き型言語のコンパイラにおいて、分割コンパイル（後述）を行う場合には難しかった、プログラムを構成する個々の手続き（関数、サブルーチンなど）に関するプログラム実行開始時の初期化や実行終了時の終了処理などを実現する技術に関する。
【背景技術】
【０００２】
複数の手続きから成るプログラムにおいて全体を一度に翻訳するのではなく、個々の手続きごとに翻訳して結合編集する方法を分割コンパイルという。分割コンパイルは、商用コンパイラでは一般的な手法である。
【０００３】
この分割コンパイルには、一部の手続きだけを修正して再翻訳することで翻訳時間が短縮できたり、手続きのプログラムソースを開示せずオブジェクトやアーカイブの形で流通させたりできるなどの利点がある。
【０００４】
図１６は、ＨＰＦ（Ｈｉｇｈ  Ｐｅｒｆｏｒｍａｎｃｅ  Ｆｏｒｔｒａｎ）言語によるコンパイラに対する入力プログラムの例を示す。図１７は、従来の分割コンパイル時の出力コードの例を示す。例えば、図１６に示すような並列言語プログラムから逐次言語プログラムに変換するコンパイラ（トランスレータ）を用いて分割コンパイルを行う。そうすると、ｍａｉｎ手続きとｓｕｂ１手続きはそれぞれ独立に、図１７に示すｍａｉｎ手続き（図１７の上側）とｓｕｂ１手続き（図１７の下側）に変換される。
【０００５】
このようなコンパイラを用いた場合には、分割コンパイル後でｓｕｂ１手続きだけを修正し再翻訳しても、ｍａｉｎ手続きの再翻訳を行うことなく結合編集して正しい実行が保障される。
【０００６】
ところが、分割コンパイルでは、ある手続きを翻訳している場合、その手続きの呼び出し元や呼出し先の情報がコンパイラに伝わらないため、効率のよいコードを生成することができない場合がある。その回避手段として、利用者からコンパイラに他の手続きの情報を伝える方法がある。
【０００７】
例えば、Ｃ言語のプロトタイプ宣言やＦｏｒｔｒａｎ９０のＩｎｔｅｒｆａｃｅ  ｂｌｏｃｋ宣言を使うと、その手続きがどのような文脈から呼ばれるか、あるいは、呼出し先手続きがどのような性質を持つかをコンパイラに知らせることができる。
【０００８】
また、どのように呼び出されるか分からないという前提で、複数のコードを用意して実行時に最適なものを選択する方法もある（特許文献１）。あるいは、インライン展開や特許文献２など呼出し側の翻訳時に呼出し方に適した手続きをコード生成する方法もある。
【特許文献１】特許第２５６０４９１号公報
【非特許文献１】国際公開第ＷＯ００／４５２６０号パンフレット
【発明の開示】
【発明が解決しようとする課題】
【０００９】
しかしながら、上記従来技術を使用した場合でも、分割コンパイルによる手続き毎の翻訳では一括翻訳と比較して以下のような問題がある。
（１）分割コンパイルでは、プログラムの実行開始時や早い時期に行いたい処理を生成することができないという問題がある。例えば、図１７に示すように、並列処理プログラム（ＳＰＭＤ（Ｓｉｎｇｌｅ  Ｐｒｏｇｒａｍ  Ｍｕｌｔｉｐｌｅ  Ｄａｔａ）型のコード）で、手続き内の作業領域のサイズが並列度に依存するために、その作業領域のサイズが実行開始まで不明な場合があるとする。このとき、動的な割付けコードを生成すると、ループ処理で手続きが呼ばれる度に割付けが行われるので効率が悪い。または、図１８に示すように、最初の呼出しに限って割付けを行う方法もある。
【００１０】
しかしながら、ループ処理実行中に、呼び出される関数など呼出し頻度が高い小さな手続きでは判断分岐のコストが無視できない。一方、一括コンパイルであれば、図１９に示すように、同じ割付けを呼び出し側プログラムのコード生成で作成することができる。
【００１１】
（２）分割コンパイルでは、プログラム全体を見たトレードオフを考慮した最適化ができないという問題がある。例えば、並列処理における通信やファイル入出力などでは作業領域の使用量と性能のトレードオフがあるので、性能上重要な手続きにはメモリを十分に割り当てて高速化を図りたいという要求がある。一方、あまり重要でない手続きではメモリを節約するようにしたい。
【００１２】
しかしながら、分割コンパイルではプログラム全体から見た相対的な重要度（呼び出し回数、大きさ）が分からない。一方、一括コンパイルであればプログラム全体の静的な解析である程度手続きの相対的な重要度を見積もることができる。
【００１３】
（３）分割コンパイルでは、手続きごとに使用する資源の終了処理を行うことができないという問題がある。例えば、呼び出される回数が不明な手続きに対して、継続的なファイル出力を伴う出力コードを生成し、最後に呼び出されたときにそのファイルの終了処理（バッファに残ったデータの書き出しなど）を行いたい場合、図２０に示すように、分割コンパイルでは手続きの生成コードだけで最後の呼出しかどうかの判断ができないため実現が困難である。一方、一括コンパイルであれば、図２１に示すように、呼出し側のコードでファイルの終了処理を行えばよい。
【００１４】
（４）分割コンパイルでは、プログラム実行中に手続きの状態に関わる変更を効率的に行うことが難しいという問題がある。例えば、実行時にメモリが不足してくるため適当なタイミングでごみ集め（ｇａｒｂａｇｅ  ｃｏｌｌｅｃｔｉｏｎ）をしなければならない場合や、並列処理プログラム（ＳＰＭＤ型のコード）でプログラム実行中の判断（負荷バランスの変動など）や外的な要因によってプロセス間の負荷バランスを変えるためにデータを移動したい場合、呼出し手続きに局所的なデータについては呼び出し側のプログラムでは変更することができない。一方、一括コンパイルであれば、呼出し手続きの局所変数に関する変更を呼出し側に反映させることができる。
【００１５】
図２２は、定期的なごみ集め（ｇａｒｂａｇｅ  ｃｏｌｌｅｃｔｉｏｎ）を自動生成するコンパイラへの入力の例である。サブルーチンｓｕｂ１の局所変数Ｂに関するごみ集めに着目する。一括コンパイルであれば、例えば、図２３のように、Ｂを大域変数に変えて呼出し側でごみ集めを行なわせることができる。
【００１６】
一方、分割コンパイルの場合には、ｍａｉｎのコンパイル時にはごみ集めに適したタイミングが分かっても変数Ｂの存在が分からないし、ｓｕｂ１のコンパイル時にはｓｕｂ１が呼び出される頻度が分からないため、ｓｕｂ１の内部でごみ集めを行うかどうかの判断が困難で効率が悪くなる。
【００１７】
上記の課題に鑑み、本発明では、分割コンパイルにおいて、各手続きに対して生成するコードを、その手続きの実行のタイミングではなく、主プログラムの開始時、終了時、あるいは実行の途中や割り込み処理で実行させることを目的とする。
【課題を解決するための手段】
【００１８】
本発明にかかる、プログラムを構成する複数の手続きを分割コンパイルすると共に、該複数の手続きを一通り横断的に実行させる手続きである横断的手続きを生成する処理をコンピュータに実行させるコンパイルプログラムは、入力された前記複数の手続きを逐次取得する取得手順と、前記各入力手続き（Ｐ）内から呼び出される手続き（Ｐ１，．．．，Ｐｎ）を検出する呼び出し手続き検出手順と、前記入力手続き（Ｐ）及び前記検出された呼び出し手続き（Ｐ１，．．．，Ｐｎ）の各手続き名に基づいて、該各手続き（Ｐ，Ｐ１，．．．，Ｐｎ）に対応する前記横断的手続きの名称（Ｔ，Ｔ１，．．．，Ｔｎ）を生成する横断的手続き名生成手順と、前記各入力手続き（Ｐ）の内容に基づいて所定の処理（Ｑ）を生成し、さらに、前記検出された呼び出し手続き（Ｐ１，．．．，Ｐｎ）があれば該呼び出し手続きに対応する前記横断的手続き名（Ｔ１，．．．，Ｔｎ）を呼び出す処理を生成し、該所定の処理（Ｑ）及び該（Ｔ１，．．．，Ｔｎ）呼び出す処理を含む手続き（Ｔ）を前記生成した横断的手続き名で命名して前記横断的手続きの出力コード（Ｔ）を生成する横断的手続き出力コード生成手順と、前記入力手続き（Ｐ）を翻訳したコードである入力手続き出力コード（Ｐ’）を生成する入力手続き出力コード生成手順と、前記入力手続き（Ｐ）が主手続きの場合、前記入力手続き出力コード（Ｐ’）に関して前記横断的手続き（Ｔ）を呼び出す処理を生成する横断的手続き呼び出し生成手順と、をコンピュータに実行させることを特徴とする。
【００１９】
このように構成することにより、従来分割コンパイルにより分断してコンパイルされていたために、効率が悪かったり実現できなかったりした処理を、元の手続きから切り離して手続き化し、元の手続きとは別のタイミングで一括して呼び出すことができる。
【００２０】
前記コンパイルプログラムにおいて、前記横断的手続き呼び出し生成手順は、前記入力手続き出力コード（Ｐ’）内の最初、最後、または所定箇所に前記横断的手続き（Ｔ）を呼び出す処理を生成することを特徴とする。
【００２１】
このように構成することにより、分割コンパイルであっても、手続きに対して生成するコードを、その手続きの実行のタイミングではなく、主プログラムの開始時、終了時、あるいは実行の途中で実行させることができる。
【００２２】
前記コンパイルプログラムにおいて、前記横断的手続き呼び出し生成手順は、前記入力手続き（Ｐ’）を実行させた際にその実行中に外部からの割り込みによって前記横断的手続き（Ｔ）を呼び出すようにする処理を生成することを特徴とする。
【００２３】
このように構成することにより、分割コンパイルであっても、手続きに対して生成するコードを、その手続きの実行のタイミングではなく、割り込み処理で実行させることができる。
【００２４】
本発明にかかる、プログラムを構成する複数の手続きを分割コンパイルすると共に、該複数の手続きを一通り横断的に実行させる手続きである横断的手続きを生成するコンパイル装置は、入力された前記複数の手続きを逐次取得する取得手段と、前記各入力手続き（Ｐ）内から呼び出される手続き（Ｐ１，．．．，Ｐｎ）を検出する呼び出し手続き検出手段と、前記入力手続き（Ｐ）及び前記検出された呼び出し手続き（Ｐ１，．．．，Ｐｎ）の各手続き名に基づいて、該各手続き（Ｐ，Ｐ１，．．．，Ｐｎ）に対応する前記横断的手続きの名称（Ｔ，Ｔ１，．．．，Ｔｎ）を生成する横断的手続き名生成手段と、前記各入力手続き（Ｐ）の内容に基づいて所定の処理（Ｑ）を生成し、さらに、前記検出された呼び出し手続き（Ｐ１，．．．，Ｐｎ）があれば該呼び出し手続きに対応する前記横断的手続き名（Ｔ１，．．．，Ｔｎ）を呼び出す処理を生成し、該所定の処理（Ｑ）及び該（Ｔ１，．．．，Ｔｎ）を呼び出す処理を含む手続き（Ｔ）を前記生成した横断的手続き名で命名して前記横断的手続きの出力コード（Ｔ）を生成する横断的手続き出力コード生成手段と、前記入力手続き（Ｐ）を翻訳したコードである入力手続き出力コード（Ｐ’）を生成する入力手続き出力コード生成手段と、前記入力手続き（Ｐ）が主手続きの場合、前記入力手続き出力コード（Ｐ’）に関して前記横断的手続き（Ｔ）を呼び出す処理を生成する横断的手続き呼び出し生成手段と、を備えることを特徴とする。
【００２５】
このように構成することにより、従来分割コンパイルにより分断してコンパイルされていたために、効率が悪かったり実現できなかったりした処理を、元の手続きから切り離して手続き化し、元の手続きとは別のタイミングで一括して呼び出すことができる。
【００２６】
本発明にかかる、プログラムを構成する複数の手続きを分割コンパイルすると共に、該複数の手続きを一通り横断的に実行させる手続きである横断的手続きを生成するコンパイル方法は、入力された前記複数の手続きを逐次取得し、前記各入力手続き（Ｐ）内から呼び出される手続き（Ｐ１，．．．，Ｐｎ）を検出し、前記入力手続き（Ｐ）及び前記検出された呼び出し手続き（Ｐ１，．．．，Ｐｎ）の各手続き名に基づいて、該各手続き（Ｐ，Ｐ１，．．．，Ｐｎ）に対応する前記横断的手続きの名称（Ｔ，Ｔ１，．．．，Ｔｎ）を生成し、前記各入力手続き（Ｐ）の内容に基づいて所定の処理（Ｑ）を生成し、さらに、前記検出された呼び出し手続き（Ｐ１，．．．，Ｐｎ）があれば該呼び出し手続きに対応する前記横断的手続き名（Ｔ１，．．．，Ｔｎ）を呼び出す処理を生成し、該所定の処理（Ｑ）及び該（Ｔ１，．．．，Ｔｎ）呼び出す処理を含む手続き（Ｔ）を前記生成した横断的手続き名で命名して前記横断的手続き（Ｔ）の出力コードを生成し、前記入力手続き（Ｐ）を翻訳したコードである入力手続き出力コード（Ｐ’）を生成し、前記入力手続き（Ｐ）が主手続きの場合、前記入力手続き出力コード（Ｐ’）に関して前記横断的手続き（Ｔ）を呼び出す処理を生成することを特徴とする。
【００２７】
このように構成することにより、従来分割コンパイルにより分断してコンパイルされていたために、効率が悪かったり実現できなかったりした処理を、元の手続きから切り離して手続き化し、元の手続きとは別のタイミングで一括して呼び出すことができる。
【発明の効果】
【００２８】
分割コンパイルであっても、手続きに対して生成するコードを、その手続きの実行のタイミングではなく、主プログラムの開始時、終了時、あるいは実行の途中や割り込み処理で実行させることができる。それによって、従来分割コンパイルでは実現できなかった実行効率の改善や最適化が実現できる。
【発明を実施するための最良の形態】
【００２９】
本発明では、従来分割コンパイルにより分断してコンパイルされていたために効率が悪かったり実現できなかったりした処理を、元の手続きから切り離して手続き化し（横断的手続きという）、元の手続きとは別のタイミング（例えば、プログラム全体の初期化、終了時、特定のイベント発生等のタイミング）で、その横断的手続きを一括して呼び出すようにする。
【００３０】
一般にプログラムでは、メインプログラムＰがサブプログラムＰ１，．．．，Ｐｎを自由な順番に、自由な回数呼び出す。サブプログラムがまたサブプログラムを呼ぶのも同様に自由である。Ｐ，Ｐ１，．．．，Ｐｎに対応する横断手続きＴ，Ｔ１，．．．，Ｔｎは、サブプログラムの呼び出しの順番には関係なく呼び出される。ＰからＴを呼び、Ｔから直接または間接にＴ１，．．．，Ｔｎの全部を呼ぶようにする。一方、Ｐ１，．．，Ｐｎからは、ＴやＴ１，．．．，Ｔｎを呼び出すことはできないようにする。横断的手続きと呼んでいるのは、このように1回だけ全部一度に呼ばれることに由来する。
【００３１】
図１は、本発明にかかる分割コンパイルを行うコンパイラの概念的な構成を示す。本発明にかかるコンパイラ１は、プログラムを構成する複数の手続きを分割コンパイルすると共に、該複数の手続きを一通り横断的に実行させる手続きである横断的手続きを生成する。
【００３２】
コンパイラ１は、取得手段７、呼び出し手続き検出手段２、横断的手続き名生成手段３、横断的手続き出力コード生成手段４、入力手続き出力コード生成手段５、横断的手続き呼び出し生成手段６から構成される。
【００３３】
取得手段７は、入力された前記複数の手続き１０を逐次取得する。呼び出し手続き検出手段２は、前記各入力手続き１０内から呼び出される手続きを検出する。横断的手続き名生成手段３は、前記入力手続き１０及び前記検出された呼び出し手続きの各手続き名に手続き名に基づいて、該各手続きに対応する前記横断的手続きの名称を生成する。
【００３４】
横断的手続き出力コード生成手段４は、前記各入力手続き１０の内容に基づいて所定の処理を生成し、さらに、前記検出された呼び出し手続きがあれば該呼び出し手続きに対応する前記横断的手続き名を呼び出す処理を生成し、該所定の処理及び該呼び出す処理を含む手続きを前記生成した横断的手続き名で命名して前記横断的手続きの出力コード１１を生成する。ここで、所定処理とは、例えば、各手続きの初期化処理、終了処理、またはガーベジコレクションである。
【００３５】
入力手続き出力コード生成手段５は、前記入力手続き１０を翻訳したコードである入力手続き出力コードを生成する。
横断的手続き呼び出し生成手段６は、前記入力手続きが主手続きの場合、前記入力手続き出力コードに関して前記横断的手続きを呼び出す処理を生成する。前記横断的手続き呼び出し生成手段６は、前記入力手続き出力コード内（例えば、前記入力手続き出力コード内の最初、最後、または所定箇所）に、前記横断的手続きを呼び出す処理を生成する。
【００３６】
また、前記横断的手続き呼び出し生成手段６は、前記入力手続きを実行させた際にその実行中に外部からの割り込みによって前記横断的手続きを呼び出すようにする処理を生成することもできる。
【００３７】
なお、前記横断的手続きの１組は、前記主手続きに対応する横断的手続きから樹状に派生した呼び出し体系となるように構成されている。
そこで、主手続きに対して複数組の前記横断的手続きを生成することもできる。この場合には、前記横断的手続き名生成手段３は、前記入力手続き及び前記検出された呼び出し手続きの各手続き名に手続き名に基づいて、該各手続きに対応する前記横断的手続きの名称を複数組生成し、前記横断的手続き出力コード生成手段は、前記各入力手続きの内容に基づいて前記各組に対応する前記所定処理を生成して、複数組の前記横断的手続き出力コードを生成し、横断的手続き呼び出し生成手段は、前記入力手続きに対して前記複数組の横断的手続きを呼び出す処理を生成する。
【００３８】
では、以下に本発明の実施の形態について詳述する。
＜第１の実施形態＞
本実施形態では、プログラムを構成する手続きＰの翻訳（翻訳後の手続きＰ’）において、この手続きＰに対応する横断的手続きＴを生成し、手続きＰが主手続きの場合には横断的手続きＴを主手続きＰ’の実行の最初に呼び出すように生成する。つまり、プログラムＰから生成されるすべての横断的手続きＴをプログラムＰの実行開始時に呼び出すようにする。
【００３９】
本実施形態では、一例として、手続きプログラムＰを翻訳してＰ’に変換するコンパイラにおいて、Ｐ’の最初の実行の前に所定の処理Ｑを実行させることについて説明する。
図２は、本実施形態におけるコンパイラ１の構成を示す。本実施形態におけるコンパイラ１は、呼び出し手続き検出手段２ａ、横断的手続き名生成手段３ａ、横断的手続き出力コード生成手段４ａ、入力手続き出力コード生成手段５ａ、入力手続き種別判定手段６ａ−１、横断的手続き呼び出し生成手段６ａ−２から構成される。入力手続き種別判定手段６ａ−１及び横断的手続き呼び出し生成手段６ａ−２は、横断的手続き呼び出し生成手段６に相当する。
【００４０】
まず、コンパイラ１に手続きＰ（手続きＰ内では、手続きＰ１，．．．，Ｐｎを呼び出す処理が含まれている）が入力される。すると、呼び出し手続き検出手段２ａは、手続きＰ内で呼び出される手続きＰ１，．．．，Ｐｎを検出する。
【００４１】
横断的手続き名生成手段３ａは、手続きＰ，Ｐ１，．．．，Ｐｎの名称からそれぞれ、横断的手続きの名前Ｔ，Ｔ１，．．．，Ｔｎを一意に生成する。
横断的手続き出力コード生成手段４ａは、横断的手続きＴをコード生成する。横断的手続き出力コード生成手段４ａは、Ｐから所定処理Ｑを生成する手段と、横断的手続きＴ内でＴ１〜Ｔｎを呼び出す処理を生成する手段とを有する。Ｔは最初に呼ばれたときにだけ、処理Ｑ及び横断的手続きＴ１，．．．，Ｔｎの呼出しを実行するように構成されている。
【００４２】
入力手続き出力コード生成手段５ａは、手続きＰを翻訳してコードＰ’を生成し、そのコードを出力する。すなわち、入力手続き出力コード生成手段５ａによる変換は、従来技術による任意のコンパイラの目的に沿った変換である。ただし、横断的手続き出力コード生成手段４ａによってQとして生成される処理は、重複のないように出力コードＰ’から削除されなければならない。この理由は、以下の通りである。まず、従来のコンパイラでの変換をＰ→Ｐ”とし、本実施形態にかかるコンパイラでの変換を、Ｐ→Ｑ＋Ｐ’とする。従来のＰ”のうち、初期化部分Ｑは切り出されて別の手続きＴを構成するので、Ｐ’の中にはＱの内容は残さないようにする必要がある。
【００４３】
入力手続き種別判定手段６ａ−１は、Ｐが主プログラムであるか否かを判断する。横断的手続き呼び出し生成手段６ａ−２は、Ｐが主プログラムである場合、Ｐ’の実行開始位置にＴの呼び出しを生成する。
【００４４】
図３は、本実施形態におけるコンパイルのフローの一例を示す。手続きＰが入力されると、本実施形態によるコンパイルにより当該フローが実行される。
まず、呼び出し手続き検出手段２ａは、手続きＰの中をスキャンし、手続きＰが直接呼び出す手続き（Ｐ１，．．．，Ｐｎ）の名前を全てリストアップする（ステップ１。以下、ステップを「Ｓ」と称する）。このとき、同じ手続きの呼出しは１つに数える。
【００４５】
次に、横断的手続き名生成手段３ａは、Ｐ，Ｐ１，．．．，Ｐｎの名前から、横断的手続きＴ，Ｔ１，．．．，Ｔｎの名前を他の大域的な名前と衝突しない任意の規則で生成する（Ｓ２）。例えば、手続き“ａｂｃ”から生成する名前は、必ず“_ＸＸＸ_ａｂｃ”とし、言語仕様の制限を利用したり（例えば、Ｆｏｒｔｒａｎではアンダースコア“＿”から始まる名前は利用できない）、または利用者への制限事項（例えば、特定の文字列から始まる名前は使用禁止とする）を設けたりするなどして名前の衝突を避ける。
【００４６】
次に、横断的手続き出力コード生成手段４ａは、横断的手続き出力コードＴを生成する（Ｓ３）。横断的手続き出力コード生成手段４ａは、Ｐを基に処理Ｑの出力コードを生成し、さらに、Ｔ１〜Ｔｎを呼び出すコードを生成する。そして、その生成した処理Ｑの出力コード及びそのＴ１〜Ｔｎを呼び出すコードを含んだ出力コードを横断的手続き出力コードＴとする。
【００４７】
ここで、処理Qの内容は任意であり、例えば図１７〜図１９の例であれば、変数ＷＯＲＫの割付け処理とすることができる。Ｔは最初に呼び出されたときだけ中身を実行するコードとし（Ｐが主プログラムの場合にはそのような制限をしなくてもよい。）、中身には処理Ｑのコードと、Ｔ１〜Ｔｎを呼び出すコードが含まれる。Ｔのコード生成のイメージを図４に示す。
【００４８】
次に、入力手続き出力コード生成手段５ａは、Ｐを翻訳してＰ’に変換して、Ｐ’のコードを生成する（Ｓ４）。
次に、入力手続き種別判定手段６ａ−１は、Ｐが主プログラムか否かの判定を行う（Ｓ５）。Ｐが主プログラムの場合、横断的手続き呼び出し生成手段６ａ−２は、Ｐ’内の所定位置に横断的手続きＴを呼び出す処理を生成する（Ｓ６）。
【００４９】
図４は、図３のＳ３において横断的手続きの出力コードが生成される様子を示す。手続きＰは、Ｐ１〜Ｐｎを呼び出す処理を含む。コンパイラ１は、この手続きＰから手続きＴを生成する。横断的手続きＴには、初めての呼び出しの場合には、処理Ｑを実行するコード及び手続きＴ１〜Ｔｎの呼び出しコードが生成されている。ところで、生成コードはコンパイラの目的によって任意の言語やアセンブラ、機械語であってよい。
【００５０】
図５は、図３のＳ６において入力手続きＰが主プログラムの場合に、コンパイルされたときの様子を示す。同図に示すように、手続きＰが主プログラムの場合、コンパイラ１により手続きＰは変換（翻訳）されて手続きＰ’となる。このとき、手続きＰ’の最初に横断的手続きＴを呼び出す処理が生成されている。
【００５１】
図６は、本実施形態において生成されるプログラムの生成コードの一例を示す。同図は、図１６に対応するコード生成の例である。それでは、図３のフローに対応させながら、図６を説明する。
【００５２】
まず、コンパイラ１により手続きｍａｉｎについてコンパイルを行う場合について述べる。コンパイラ１は、手続きｍａｉｎ内で呼び出されている手続きｓｕｂ１を検出する（Ｓ１）。コンパイラ１は「ｍａｉｎ」、「ｓｕｂ１」の名前から名前「ＸＸＸ＿ｍａｉｎ」、「ＸＸＸ＿ｓｕｂ１」を生成する（Ｓ２）。
【００５３】
それから、「ＸＸＸ＿ｍａｉｎ」のコードを生成する（Ｓ３）。具体的には、手続き「ｍａｉｎ」から、手続き「ｍａｉｎ」についての初期化処理Ｑを生成する。さらに、Ｔ１として「ＸＸＸ＿ｓｕｂ１」の呼び出し処理を生成する。なお、その他にも大域的な変数の定義が生成される。
【００５４】
それから、コンパイラ１は、手続き「ｍａｉｎ」を翻訳する（Ｓ４）。それから、コンパイラ１は、手続き「ｍａｉｎ」が主プログラムであるか否かを判断する（Ｓ５）。手続き「ｍａｉｎ」は主プログラムであるので（Ｓ５で「ｙｅｓ」へ進む）、翻訳後の手続き「ｍａｉｎ」の先頭に「ＸＸＸ＿ｍａｉｎ」を呼び出す処理を生成する（Ｓ６）。
【００５５】
次に、コンパイラ１により手続きｓｕｂ１についてコンパイルを行う場合について述べる。コンパイラ１は、手続きｓｕｂ１内で呼び出されている手続きがあるか否かを検索するが、手続きｓｕｂ１内で呼び出されている手続きはないので検出されない（Ｓ１）。コンパイラ１は「ｓｕｂ１」の名前から名前「ＸＸＸ＿ｓｕｂ１」を生成する（Ｓ２）。
【００５６】
それから、「ＸＸＸ＿ｓｕｂ１」のコードを生成する（Ｓ３）。具体的には、手続き「ｓｕｂ１」から、手続き「ｓｕｂ１」についての初期化処理Ｑを生成する。さらに、「ＸＸＸ＿ｓｕｂ１」の呼び出し処理を生成する。なお、その他にも大域的な変数の定義、ｓｕｂ１との間だけで共有する変数や手続き名等の定義、多重読み出しを避けるためのガード処理が生成される。
【００５７】
次に、コンパイラ１は、手続き「ｓｕｂ１」を翻訳する（Ｓ４）。図６の例では、ＸＸＸ＿ｓｕｂ１との間だけで共有するための変数等の定義が生成された後に翻訳が行われる。
【００５８】
それから、コンパイラ１は、手続き「ｓｕｂ１」が主プログラムか否かの判定をする（Ｓ５）。ｓｕｂ１は、主プログラムではないので（Ｓ５で「ｎｏ」へ進む）、コンパイルは終了する。
【００５９】
次に、図７及び図８を用いて手続きの呼出し関係が複雑な場合での変換例について説明する。図７は、本実施形態の別の実施例におけるプログラム（コンパイル前）を示す。図８は、図７のプログラムのコンパイル後を示す。
【００６０】
図７において、手続き「ｍａｉｎ」は手続き「ｓｕｂＡ」（２回），「ｓｕｂＢ」を呼び出している。手続き「ｓｕｂＡ」は、手続き「ｆｏｏ」，「ｓｕｂＢ」を呼び出している。手続き「ｓｕｂＢ」は、手続き「ｆｏｏ」を呼び出している。
【００６１】
次に、図８を参照しながら横断的手続きの呼び出し状況について説明する。図８において、「ｍａｉｎ」の翻訳により、「ｍａｉｎ」（翻訳後）と「ＸＸＸ＿ｍａｉｎ」が生成される。「ｓｕｂＡ」の翻訳により、「ｓｕｂＡ」（翻訳後）と「ＸＸＸ＿ｓｕｂＡ」が生成される。「ｓｕｂＢ」の翻訳により、「ｓｕｂＢ」（翻訳後）と「ＸＸＸ＿ｓｕｂＢ」が生成される。「ｆｏｏ」の翻訳により、「ｆｏｏ」（翻訳後）と「ＸＸＸ＿ｆｏｏ」が生成される。
【００６２】
手続き「ｍａｉｎ」において、手続き「ｓｕｂＡ」，「ｓｕｂＢ」，「ｓｕｂＡ」が呼び出される前に、横断的手続き「ＸＸＸ＿ｍａｉｎ」を呼び出す処理が生成されている。横断的手続き「ＸＸＸ＿ｍａｉｎ」では、順に横断的手続き「ＸＸＸ＿ｓｕｂＡ」，「ＸＸＸ＿ｓｕｂＢ」を呼び出している。
【００６３】
横断的手続き「ＸＸＸ＿ｓｕｂＡ」では、初めて呼び出されたか否かの判定処理を行い、初めて呼び出された場合には順に横断的手続き「ＸＸＸ＿ｆｏｏ」，「ＸＸＸ＿ｓｕｂＢ」を呼び出している。
【００６４】
横断的手続き「ＸＸＸ＿ｓｕｂＢ」では、初めて呼び出されたか否かの判定処理を行い、初めて呼び出された場合には横断的手続き「ＸＸＸ＿ｆｏｏ」を呼び出している。
横断的手続き「ＸＸＸ＿ｆｏｏ」では、初めて呼び出されたか否かの判定処理を行い、初めて呼び出された場合には所定の処理を行っている。
【００６５】
では、横断的手続きにより実行される処理順を説明する。まず、手続き「ｍａｉｎ」を実行すると、横断的手続き「ＸＸＸ＿ｍａｉｎ」が呼び出される（呼び出し１。以下、手続きを呼び出す場合を「＋Ｃ」と称し、呼び出し元へ戻る場合を「−Ｃ」と称する）。そうすると、横断的手続き「ＸＸＸ＿ｍａｉｎ」では、まず、横断的手続き「ＸＸＸ＿ｓｕｂＡ」が呼び出される（＋Ｃ２）。
【００６６】
そうすると、横断的手続き「ＸＸＸ＿ｓｕｂＡ」は初めて呼び出されるので、順に横断的手続き「ＸＸＸ＿ｆｏｏ」，「ＸＸＸ＿ｓｕｂＢ」が呼び出される（＋Ｃ３，＋Ｃ４）。そうすると横断的手続き「ＸＸＸ＿ｆｏｏ」は初めて呼び出されるので、所定の処理を行う。同様に、横断的手続き「ＸＸＸ＿ｓｕｂＢ」も初めて呼び出されるので、横断的手続き「ＸＸＸ＿ｓｕｂＢ」中で横断的手続き「ＸＸＸ＿ｆｏｏ」を呼び出す処理を行う（＋Ｃ５）。
【００６７】
しかしながら、Ｃ５で呼び出された横断的手続き「ＸＸＸ＿ｆｏｏ」は、Ｃ４で一度呼び出されているので、何もせずに横断的手続き「ＸＸＸ＿ｓｕｂＢ」に戻る（−Ｃ５）。そうすると、「ＸＸＸ＿ｓｕｂＢ」中での処理も終了したので、呼び出し元の「ＸＸＸ＿ｓｕｂＡ」に戻る（−Ｃ３）。そうすると、「ＸＸＸ＿ｓｕｂＡ」中での処理も終了したので、呼び出し元の「ＸＸＸ＿ｍａｉｎ」に戻る（−Ｃ２）。
【００６８】
そうすると、「ＸＸＸ＿ｍａｉｎ」において、次の「ＸＸＸ＿ｓｕｂＢ」が呼び出される（＋Ｃ６）。しかしながら、Ｃ６で呼び出される横断的手続き「ＸＸＸ＿ｓｕｂＢ」は、Ｃ３で一度呼び出されているので、何もせずに呼び出し元の「ＸＸＸ＿ｍａｉｎ」に戻る（−Ｃ６）。
【００６９】
そうすると、「ＸＸＸ＿ｍａｉｎ」の処理が終了したので、呼び出し元の手続き「ｍａｉｎ」に戻る（−Ｃ１）。そうすると、手続き「ｍａｉｎ」では、通常通り、順に手続き「ｓｕｂＡ」，「ｓｕｂＢ」，「ｓｕｂＡ」が実行される。
【００７０】
このように、横断的手続き「ＸＸＸ＿ｍａｉｎ」，「ＸＸＸ＿ｓｕｂＡ」，「ＸＸＸ＿ｓｕｂＢ」，「ＸＸＸ＿ｆｏｏ」はそれぞれ、一回しか実行されることはない。すなわち、複数の手続きから呼ばれる手続きがあっても、横断的手続きの中身の実行はそれぞれ１回ずつになることが分かる。よって、各手続きにおいて実際に処理が行われる前に予め１回づつ各手続きを実行して、初期処理をしておくことができる。
【００７１】
本実施形態によれば、主プログラムから呼び出される各サブルーチンの初期化処理を横断的手続きＴで行うことができる。したがって、サブルーチンＰ１〜Ｐｎを呼び出している主プログラムＰがある場合にＰをコンパイルすると、横断的手続きＴとこのＴを呼び出す処理が挿入されたＰ’が生成される。この横断的手続きＴが呼び出されると、サブルーチンＰ１〜Ｐｎに対応する横断的手続きＴ１〜Ｔｎが呼び出され、各Ｔｎでは対応するＰｎの処理Q（初期化処理等）を実行できる。よって、主プログラムの最初に処理Ｔをすれば、全てのサブルーチンの初期化処理をまとめて行うことができ、円滑に効率よく分割コンパイルを実行することができる。
【００７２】
＜第２の実施形態＞
本実施形態では、第１の実施形態における横断的手続きＴを主手続きＰ（翻訳後の手続きＰ’）に対して複数生成する場合について説明する。
【００７３】
本実施形態におけるコンパイラ１の構成は、第１の実施形態と基本的に同様である。まず、コンパイラ１に手続きＰ（手続きＰ内では、手続きＰ１，．．．，Ｐｎを呼び出す処理が含まれている）が入力される。呼び出し手続き検出手段２ａは、手続きＰ内で呼び出される手続きＰ１，．．．，Ｐｎを検出する。
【００７４】
横断的手続き名生成手段３ａは、手続きＰ，Ｐ１，．．．，Ｐｎからそれぞれ、横断的手続きの名前Ｔｋ，Ｔｋ１，．．．，Ｔｋｎ（ｋ＝１，．．．，ｍ）を一意に生成する。
横断的手続き出力コード生成手段４ａは、横断的手続きＴｋ（ｋ＝１，．．．，ｍ）をコード生成する。横断的手続き出力コード生成手段４ａは、手続きＰから所定の処理Ｑｋを生成する手段と、横断的手続きＴ内でＴｋ１〜Ｔｋｎを呼び出す処理を生成する手段とを有する。ここで、Ｔｋは最初に呼ばれたときにだけ、処理Ｑｋ及び横断的手続きＴｋ１，．．．，Ｔｋｎの呼出しを実行するように構成されている。
【００７５】
入力手続き出力コード生成手段５ａは、手続きＰを翻訳してコードＰ’を生成し、そのコードＰ’を出力する。入力手続き出力コード生成手段５ａによる変換は、従来技術による任意のコンパイラの目的に沿った変換である。ただし、横断的手続き出力コード生成手段４ａによってQとして生成される処理は、重複のないように出力コードＰ’から削除されなければならない。
【００７６】
入力手続き種別判定手段６ａ−１は、Ｐが主プログラムであるか否かを判断する。横断的手続き呼び出し生成手段６ａ−２は、Ｐが主プログラムである場合、Ｐ’の実行開始位置にＴの呼び出しを生成する。
【００７７】
図９は、本実施形態におけるコンパイルのフローの一例を示す。手続きＰが入力されると、本実施形態によるコンパイルにより当該フローが実行される。
まず、呼び出し手続き検出手段２ａは、手続きＰの中をスキャンし、手続きＰが直接呼び出す手続き（Ｐ１，．．．，Ｐｎ）の名前を全てリストアップする（Ｓ１１）。このとき、同じ手続きの呼出しは１つに数える。
【００７８】
次に、横断的手続き名生成手段３ａは、Ｐ，Ｐ１，．．．，Ｐｎの名前から、横断的手続きＴｋ，Ｔｋ１，．．．，Ｔｋｎ（ｋ＝１，．．．，ｍ）の名前を他の大域的な名前と衝突しない任意の規則で生成する（Ｓ１２）。命名規則は、第１の実施形態と同様である。
【００７９】
次に、横断的手続き出力コード生成手段４ａは、横断的手続き出力コードＴｋを生成する（Ｓ１３）。横断的手続き出力コード生成手段４ａは、Ｐを基に処理Ｑｋの出力コードを生成し、さらに、Ｔｋ１〜Ｔｋｎを呼び出すコードを生成する。そして、その生成した処理Ｑｋの出力コード及びそのＴｋ１〜Ｔｋｎを呼び出すコードを含んだ出力コードを横断的手続き出力コードＴｋとする。ここで、処理Qｋの内容は、第１の実施形態と同様に任意である。
【００８０】
次に、入力手続き出力コード生成手段５ａは、Ｐ’のコードを生成する（Ｓ１４）。ここでは、入力手続き出力コード生成手段５ａは、Ｐを翻訳してＰ’に変換する。
次に、入力手続き種別判定手段６ａ−１は、Ｐが主プログラムか否かの判定を行う（Ｓ１５）。Ｐが主プログラムの場合、横断的手続き呼び出し生成手段６ａ−２は、Ｐ’内の所定位置に横断的手続きＴｋを呼び出す処理を生成する（Ｓ１６）。
【００８１】
図１０は、本実施形態において生成される主プログラムの生成コードの一例を示す。同図は、手続き「ｍａｉｎ」から手続き「ｓｕｂ１」と手続き「ｓｕｂ２」を呼び出すプログラム及びその横断的手続きである。
【００８２】
手続き「ｍａｉｎ」をコンパイルすると、横断的手続き「ＸＸＸ１＿ｍａｉｎ」、「ＸＸＸ２＿ｍａｉｎ」が生成される。手続き「ｓｕｂ１」をコンパイルすると、横断的手続き「ＸＸＸ１＿ｓｕｂ１」、「ＸＸＸ２＿ｓｕｂ１」が生成される。手続き「ｓｕｂ２」をコンパイルすると、横断的手続き「ＸＸＸ１＿ｓｕｂ２」、「ＸＸＸ２＿ｓｕｂ２」が生成される。
【００８３】
図１１は、図１０の横断的手続きの呼び出し順を示す。「ｍａｉｎ」から「ＸＸＸ１＿ｍａｉｎ」が呼び出され（Ｃ１１）、「ＸＸＸ１＿ｍａｉｎ」から「ＸＸＸ１＿ｓｕｂ１」と「ＸＸＸ１＿ｓｕｂ２」が呼び出される（Ｃ１２，Ｃ１３）。
【００８４】
次に、「ｍａｉｎ」から「ＸＸＸ２＿ｍａｉｎ」が呼び出され（Ｃ１４）、「ＸＸＸ２＿ｍａｉｎ」から「ＸＸＸ２＿ｓｕｂ１」と「ＸＸＸ２＿ｓｕｂ２」が呼び出される（Ｃ１５，Ｃ１６）。
【００８５】
ここで、１組の横断的手続きとは、主手続きに対応する横断的手続きから樹状に派生した体系となるように構成される一連の手続きをいう。例えば、図１１でいえば、「ＸＸＸ１＿ｍａｉｎ」と「ＸＸＸ１＿ｓｕｂ１」と「ＸＸＸ１＿ｓｕｂ２」からなる一連の横断的手続きを１組の横断的手続きという。よって、もう１組の横断的手続きは、「ＸＸＸ２＿ｍａｉｎ」と「ＸＸＸ２＿ｓｕｂ１」と「ＸＸＸ２＿ｓｕｂ２」からなる。
【００８６】
したがって、図１１では、「ｍａｉｎ」より２組の横断的手続きが読み出されている。以下では、図１０及び図１１を参照しながら説明する。
この横断的手続きによるプログラムでは、実行開始時に各手続きのメモリ使用量を調べて合計を出し、その合計がある閾値（変数またはパラメタｔｈｓｌｄ）を超えた場合には、合計したメモリ量の４分の１のメモリ量を消費する手続きはメモリを節約するような初期化にスイッチする、というコードを生成している。
【００８７】
本実施形態では、１回目の横断手続きの呼出し（ＸＸＸ１＿ｍａｉｎ，ＸＸＸ１＿ｓｕｂ１，ＸＸＸ１＿ｓｕｂ２）でメモリ使用量をｔｏｔａｌｍｅｍに累計加算し、２回目の横断手続きの呼出しで個々の手続きがメモリ節約をするかしないかを決定し、論理型変数ｍｏｄｅ＿ｒｅｄに設定している。
【００８８】
図１０の例では横断手続きの段数は２段（２組）であり、生成手続きの命名規則はそれぞれ接頭語“ＸＸＸ１”と“ＸＸＸ２”を付けるとした。よって、ｍａｉｎのコンパイル時には手続き名は図１２のようになる。それでは、図９のフローに対応させながら、図１０及び図１１を説明する。
【００８９】
まず、コンパイラ１により手続きｍａｉｎについてコンパイルを行う場合について述べる。コンパイラ１は、手続きｍａｉｎ内で呼び出されている手続きｓｕｂ１，ｓｕｂ２を検出する（Ｓ１１）。コンパイラ１は「ｍａｉｎ」、「ｓｕｂ１」、「ｓｕｂ２」の名前から１段目の横断的手続き名として名前「ＸＸＸ１＿ｍａｉｎ」、「ＸＸＸ１＿ｓｕｂ１」、「ＸＸＸ１＿ｓｕｂ２」を生成し、さらに、２段目の横断的手続き名として「ＸＸＸ２＿ｍａｉｎ」、「ＸＸＸ２＿ｓｕｂ１」、「ＸＸＸ２＿ｓｕｂ２」を生成する（Ｓ１２）。
【００９０】
それから、「ＸＸＸ１＿ｍａｉｎ」及び「ＸＸＸ２＿ｍａｉｎ」のコードを生成する（Ｓ１３）。本実施形態では、手続き「ｍａｉｎ」から、「ＸＸＸ１＿ｍａｉｎ」内に手続き「ｍａｉｎ」のメモリ使用量を計測する処理Ｑ１を生成し、「ＸＸＸ２＿ｍａｉｎ」内にそのメモリ使用量の合計がある閾値（変数またはパラメタｔｈｓｌｄ）を超えた場合には、合計したメモリ量の４分の１のメモリ量を消費しているか否かの判定処理Ｑ２を生成する。さらに、「ＸＸＸ１＿ｍａｉｎ」内に「ＸＸＸ１＿ｓｕｂ１」及び「ＸＸＸ１＿ｓｕｂ２」の呼び出し処理を生成する。なお、その他にも大域的な変数の定義が生成される。
【００９１】
それから、コンパイラ１は、手続き「ｍａｉｎ」を翻訳する（Ｓ１４）。本実施形態では、１回目の横断手続きの呼出し（ＸＸＸ１＿ｍａｉｎ）でメモリ使用量をｔｏｔａｌｍｅｍに累計加算し、２回目の横断手続きの呼出し（ＸＸＸ２＿ｍａｉｎ）でメモリ節約をするかしないかを決定し、論理型変数ｍｏｄｅ＿ｒｅｄに設定している。そこで、手続き「ｍａｉｎ」内でそのｍｏｄｅ＿ｒｅｄに応じてメモリを節約する初期化を行うか通常の初期化を行うかの判定処理が生成された後に翻訳が行われる。
【００９２】
それから、コンパイラ１は、手続き「ｍａｉｎ」は主プログラムであるので（Ｓ１５）、翻訳後の手続き「ｍａｉｎ」の先頭に「ＸＸＸ１＿ｍａｉｎ」、「ＸＸＸ２＿ｍａｉｎ」の呼び出し処理を生成する（Ｓ１６）。
【００９３】
次に、コンパイラ１により手続きｓｕｂ１についてコンパイルを行う場合について述べる。コンパイラ１は、手続きｓｕｂ１内で呼び出されている手続きを検索するが、手続きｓｕｂ１で呼び出されている手続きはないので検出されない（Ｓ１１）。コンパイラ１は「ｓｕｂ１」の名前から名前「ＸＸＸ１＿ｓｕｂ１」、「ＸＸＸ２＿ｓｕｂ１」を生成する（Ｓ１２）。
【００９４】
それから、「ＸＸＸ１＿ｓｕｂ１」及び「ＸＸＸ２＿ｓｕｂ１」のコードを生成する（Ｓ１３）。本実施形態では、手続き「ｓｕｂ１」から、「ＸＸＸ１＿ｓｕｂ１」内に手続き「ｓｕｂ１」のメモリ使用量を計測する処理Ｑ１を生成し、「ＸＸＸ２＿ｓｕｂ１」内にそのメモリ使用量の合計がある閾値（変数またはパラメタｔｈｓｌｄ）を超えた場合には、合計したメモリ量の４分の１のメモリ量を消費しているか否かの判定処理Ｑ２を生成する。なお、その他にも大域的な変数の定義が生成される。
【００９５】
次に、コンパイラ１は、手続き「ｓｕｂ１」を翻訳する（Ｓ１４）。本実施形態では、１回目の横断手続きの呼出し（ＸＸＸ１＿ｓｕｂ１）でメモリ使用量をｔｏｔａｌｍｅｍに累計加算し、２回目の横断手続きの呼出し（ＸＸＸ２＿ｓｕｂ１）で手続きがメモリ節約をするかしないかを決定し、論理型変数ｍｏｄｅ＿ｒｅｄに設定している。そこで、「ｓｕｂ１」内で、そのｍｏｄｅ＿ｒｅｄに応じてメモリを節約する初期化を行うか通常の初期化を行うかの判定処理が生成された後に翻訳が行われる。
【００９６】
それから、コンパイラ１は、手続き「ｓｕｂ１」が主プログラムか否かの判定をする（Ｓ１５）。ｓｕｂ１は、主プログラムではないので（Ｓ１５で「ｎｏ」へ進む）、コンパイルは終了する。
【００９７】
次に、コンパイラ１により手続きｓｕｂ２についてコンパイルを行う場合について述べる。コンパイラ１は、手続きｓｕｂ２内で呼び出されている手続きを検索するが、手続きｓｕｂ２で呼び出されている手続きはないので検出されない（Ｓ１１）。コンパイラ１は「ｓｕｂ２」の名前から名前「ＸＸＸ１＿ｓｕｂ２」、「ＸＸＸ２＿ｓｕｂ２」を生成する（Ｓ１２）。
【００９８】
それから、「ＸＸＸ１＿ｓｕｂ２」及び「ＸＸＸ２＿ｓｕｂ２」のコードを生成する（Ｓ１３）。本実施形態では、手続き「ｓｕｂ２」から、「ＸＸＸ１＿ｓｕｂ２」内に手続き「ｓｕｂ２」のメモリ使用量を計測する処理Ｑ１を生成し、「ＸＸＸ２＿ｓｕｂ２」内にそのメモリ使用量の合計がある閾値（変数またはパラメタｔｈｓｌｄ）を超えた場合には、合計したメモリ量の４分の１のメモリ量を消費しているか否かの判定処理Ｑ２を生成する。なお、その他にも大域的な変数の定義が生成される。
【００９９】
次に、コンパイラ１は、手続き「ｓｕｂ２」を翻訳する（Ｓ１４）。本実施形態では、１回目の横断手続きの呼出し（ＸＸＸ１＿ｓｕｂ２）でメモリ使用量をｔｏｔａｌｍｅｍに累計加算し、２回目の横断手続きの呼出し（ＸＸＸ２＿ｓｕｂ２）で手続きがメモリ節約をするかしないかを決定し、論理型変数ｍｏｄｅ＿ｒｅｄに設定している。そこで、「ｓｕｂ２」内で、そのｍｏｄｅ＿ｒｅｄに応じてメモリを節約する初期化を行うか通常の初期化を行うかの判定処理が生成された後に翻訳が行われる。
【０１００】
それから、コンパイラ１は、手続き「ｓｕｂ２」が主プログラムか否かの判定をする（Ｓ１５）。ｓｕｂ２は、主プログラムではないので（Ｓ１５で「ｎｏ」へ進む）、コンパイルは終了する。
【０１０１】
本実施形態によれば、複数段の横断的手続きを生成することができる。したがって、従来分割コンパイルでは分からなかった、プログラム全体から見た相対的な重要度（呼び出し回数、大きさ）を確認することができる。したがって、一括コンパイルと同様に、プログラム全体における所定手続きの相対的な重要度を見積もることができる。
【０１０２】
＜第３の実施形態＞
本実施形態では、プログラムを構成する手続きＰの翻訳（翻訳後の手続きＰ’）において、手続きＰに対応する横断的手続きＴを生成し、手続きＰ’が主手続きの場合には横断的手続きを主手続きＰ’の実行の最後に呼び出すように生成する。つまり、プログラムＰから生成されるすべての横断的手続きＴを前記プログラムの実行終了時に呼び出す。
【０１０３】
すなわち、第１の実施形態では、プログラムの実行開始時に初期化処理を行うことを目的としたが、本実施形態では、プログラムの実行終了時に所定の処理を行うことを目的とする。
【０１０４】
それでは、手続きプログラムＰを翻訳しＰ’に変換するコンパイラにおいて、Ｐ’の最後の実行の後に処理Ｑを実行させたい場合について説明する。
本実施形態では、横断的手続き出力コード生成手段４は、横断的手続きＴをコード生成する。ここで、ＴはＰの終了処理を行う。Ｔは、処理Ｑ及び横断的手続きＴ１，．．．，Ｔｎの呼出しを実行する。
【０１０５】
横断的手続き呼び出し生成手段６ａ−２は、Ｐが主プログラムであるとき、Ｐ’の実行終了位置にＴの呼び出しを生成する。それ以外は第１の実施形態と同様である。
図１３は、第１の実施形態と第３の実施形態を組合せた出力コードの例、すなわち、プログラムの開始時及び終了時に横断的手続きを実行するコードの例を示す。同図は、図２０、図２１の従来例に対応する。
【０１０６】
手続き「ｍａｉｎ」を翻訳すると、横断的手続き「ＸＸＸ＿ｍａｉｎ」、「ＹＹＹ＿ｍａｉｎ」が生成される。「ＸＸＸ＿ｍａｉｎ」では、「ＸＸＸ＿ｓｕｂＸ」を呼び出している。「ＹＹＹ＿ｍａｉｎ」では、「ＹＹＹ＿ｓｕｂＸ」を呼び出している。そして、手続き「ｍａｉｎ」の最初には「ＸＸＸ＿ｍａｉｎ」の呼び出し処理が生成され、「ｍａｉｎ」の最後には「ＹＹＹ＿ｍａｉｎ」の呼び出し処理が生成されている。
【０１０７】
次に、手続き「ｓｕｂＸ」を翻訳すると、横断的手続き「ＸＸＸ＿ｓｕｂＸ」、「ＹＹＹ＿ｓｕｂＸ」が生成される。「ＸＸＸ＿ｓｕｂＸ」では、初期化処理Ｑとして、ファイル装置番号１０のファイル名「ｍｅｓｓａｇｅ．ｔｘｔ」をオープンしている。「ＹＹＹ＿ｓｕｂＸ」では、終了処理Ｑとして、出力バッファｓｂｕｆに残るデータをファイル装置番号１０へ出力している。
【０１０８】
図２１のような一括翻訳では、例えば手続きｓｕｂＸが変更されてファイル出力を行わなくなった場合には、ｓｕｂＸだけでなくｍａｉｎも翻訳し直さなければ効率が悪かったり誤動作したりする可能性があった。また、図２１の一括翻訳の場合には、元のプログラム（図２０）でｓｕｂＸに利用者が変更を加えると（例えばファイル出力を止めると）、ｍａｉｎのコードにも反映が必要なので（コンパイラは図２１のｍａｉｎの中身を修正しなければならないので）、ｓｕｂＸの局所的な修正であっても一括翻訳で再翻訳しなければならなかった。
【０１０９】
しかしながら、図１３のように、本実施形態における分割翻訳では、ｍａｉｎの再翻訳なしで、正しくかつ効率的に動作するコードが生成される。つまり、本実施形態では、ｓｕｂＸを再翻訳すればＸＸＸ＿ｓｕｂＸとＹＹＹ＿ｓｕｂＸも同時に更新される。図１３のプログラムの上半分は更新なしで結合できる。
【０１１０】
本実施形態によれば、手続きごとに使用する資源の終了処理を行うことができる。すなわち、主プログラムの最後に横断的手続きＴを実行することにより終了処理をまとめて行うことができるので、円滑に効率よく分割コンパイルを実行することができる。
【０１１１】
＜第４の実施形態＞
本実施形態では、プログラムを構成する手続きＰの翻訳（翻訳後の手続きＰ’）において、その手続きに対応する横断的手続きＴを生成し、横断的手続きＴをプログラムの任意の手続きの実行中に呼び出すようにする。つまり、プログラムＰから生成される横断的手続きＴをプログラムＰの実行中に呼び出すことができる。
【０１１２】
すなわち、第１の実施形態では、プログラムの実行開始時に初期化処理を行うことを目的としたが、本実施形態では、実行させたい位置で所定の処理を行うことを目的とする。
それでは、手続きプログラムＰを翻訳しＰ’に変換するコンパイラにおいて、Ｐ’の実行と実行の間に処理Ｑを実行させたい場合について説明する。
【０１１３】
本実施形態では、図２において横断的手続き出力コード生成手段４は、Ｐが主プログラムであるとき、Ｐ’内の実行させたい任意の位置にＴの呼び出しを生成する。それ以外は第１の実施形態と同様である。なお、主プログラムで横断的手続きを呼び出す場所は、コンパイラの解析によってもよいし、利用者の指示によって決定してもよい。
【０１１４】
図１４は、本実施形態において生成される主プログラムの生成コードの一例を示す。同図は、図２２に対応する利用例である。つまり、１０００回ｓｕｂ１を実行する度に「ｇａｒｂａｇｅ  ｃｏｌｌｅｃｔｉｏｎ」を実行する例である。
【０１１５】
手続き「ｍａｉｎ」を翻訳すると、横断的手続き「ＸＸＸ＿ｍａｉｎ」が生成される。「ＸＸＸ＿ｍａｉｎ」では、「ＸＸＸ＿ｓｕｂ１」を呼び出している。そして、手続き「ｍａｉｎ」内の処理間に「ＸＸＸ＿ｍａｉｎ」の呼び出し処理が生成されている。
【０１１６】
次に、手続き「ｓｕｂ１」を翻訳すると、横断的手続き「ＸＸＸ＿ｓｕｂ１」が生成される。「ＸＸＸ＿ｓｕｂ１」では、処理Ｑとして、「ｇａｒｂａｇｅ  ｃｏｌｌｅｃｔｉｏｎ」を実行している。
【０１１７】
本実施形態によれば、プログラム実行中に手続きの状態に関わる変更を効率的に行うことができる。
＜第５の実施形態＞
本実施形態では、プログラム実行中の外部からの割り込みによって横断的手続きＴを実行するように横断的手続きＴを生成する。つまり、第４の実施形態では、翻訳後のプログラム中に横断的手続きの呼出しを生成していたが、本実施形態では、主プログラムに対応する横断的手続きＴの呼出しを、主プログラムから行うのではなく、適当なインターバルかイベントによる割り込み実行とするように、横断的手続きＴを生成する。
【０１１８】
第４の実施形態では、横断的手続き呼び出し生成手段６ａ−２により手続きＰ’に対して横断的手続きＴを実行させたい位置に横断的手続きＴを静的に生成していたが、本実施形態では、横断的手続き呼び出し生成手段６ａ−２により割り込み処理によって動的に横断的手続きＴを実行するコードを生成するようにする。
【０１１９】
例えば、図１４の例では、ｍａｉｎ手続きから「ｃａｌｌ  ＸＸＸ＿ｍａｉｎ」の行を取り除き、ＸＸＸ＿ｍａｉｎの呼出しを割り込み実行で行うようにすればよい。
なお、横断的手続きの実行が許されない区間に対しては、割り込みを受け付けないようにガードを行う必要がある。
【０１２０】
図１５は、第１〜第５の実施形態におけるコンパイラ１が実行されるハードウェア環境の構成ブロック図である。同図において、コンピュータ２０は、ＣＰＵ２２、リードオンリメモリ（ＲＯＭ）２３、ランダムアクセスメモリ（ＲＡＭ）２６、通信インターフェース（以下、インターフェースをＩ／Ｆという）２４、記憶装置２７、出力Ｉ／Ｆ２１、入力Ｉ／Ｆ２５、可搬型記憶媒体の読み取り装置２８、およびこれらの全てが接続されたバス２９、出力Ｉ／Ｆ２１に接続している出力装置３０、入力Ｉ／Ｆ２５に接続している入力装置３１によって構成されている。
【０１２１】
記憶装置２７としてはハードディスク、磁気ディスクなど様々な形式の記憶装置を使用することができる。記憶装置２７またはＲＯＭ２３には、第１〜第５の実施形態で用いたコンパイラプログラムが格納されている。また、記憶装置２７には、マッピングレポジトリ等が格納される。
【０１２２】
第１〜第５の実施形態にかかるプログラムは、プログラム提供者側からネットワーク２９、および通信Ｉ／Ｆ２４を介して、例えば記憶装置２７に格納してもよい。また、このプログラムは、市販され、流通している可搬型記憶媒体に格納され、読み取り装置２８にセットされて、ＣＰＵ２２によって実行してもよい。可搬型記憶媒体としてはＣＤ−ＲＯＭ、フレキシブルディスク、光ディスク、光磁気ディスク、ＩＣカードなど様々な形式の記憶媒体を使用することができ、このような記憶媒体に格納されたプログラムが読み取り装置２８によって読み取られる。
【０１２３】
また、入力装置２１には、キーボード、マウス、または電子カメラ、マイク、スキャナ、センサ、タブレットなどを用いることが可能である。また、出力装置２０には、ディスプレイ、プリンタ、スピーカなどを用いることが可能である。また、ネットワーク２９は、インターネット、ＬＡＮ、ＷＡＮ、専用線、有線、無線等の通信網であってよい。
【０１２４】
以上より、本発明によれば、従来分割コンパイルにより分断してコンパイルされていたために、効率が悪かったり実現できなかったりした処理を、元の手続きから切り離して手続き化し、元の手続きとは別のタイミング（例えば、プログラム全体の初期化、終了時、特定のイベント発生等のタイミング）で一括して呼び出すことで、一括コンパイルのよさを実現することができる。例えば、サブルーチンのための初期化をこのサブルーチンが呼び出されたときに行うのではなく、このサブルーチンとは分離して横断的手続きＴとして作り、Ｔをプログラム全体の開始時に１回だけ呼び出すことができる。
【０１２５】
なお、本発明において、所定処理Ｑ（またはＱｋ）は、第１〜第５の実施形態で説明した処理（初期化処理（例えば、メモリ領域の割り当て等）、終了処理（例えば、ファイルの終了や割り当てたメモリ領域の開放等）、ガーベジコレクション、メモリ使用量算出）に限定されず、コンパイラにより行われる最適化処理や解析処理その他の処理も含む。
【０１２６】
また、なお、第１〜第５の実施形態で言う主プログラムは必ずしもＣ言語のｍａｉｎ関数やＦｏｒｔｒａｎの主プログラムのようにプログラムを開始する手続きでなくてもよく、本発明を適用してコンパイルする手続きの呼出し木の根となる手続きであればよい。
なお、本発明は、以上に述べた実施の形態に限定されるものではなく、本発明の要旨を逸脱しない範囲内で種々の構成または態様を採ることができる。
【０１２７】
（付記１）  プログラムを構成する複数の手続きを分割コンパイルすると共に、該複数の手続きを一通り横断的に実行させる手続きである横断的手続きを生成するコンパイル方法であって、
入力された前記複数の手続きを逐次取得し、
前記各入力手続き内から呼び出される手続きを検出し、
前記入力手続き及び前記検出された呼び出し手続きの各手続き名に基づいて、該各手続きに対応する前記横断的手続きの名称を生成し、
前記各入力手続きの内容に基づいて所定の処理を生成し、さらに、前記検出された呼び出し手続きがあれば該呼び出し手続きに対応する前記横断的手続き名を呼び出す処理を生成し、該所定の処理及び該呼び出す処理を含む手続きを前記生成した横断的手続き名で命名して前記横断的手続きの出力コードを生成し、
前記入力手続きを翻訳したコードである入力手続き出力コードを生成し、
前記入力手続きが主手続きの場合、前記入力手続き出力コードに関して前記横断的手続きを呼び出す処理を生成する、
ことを特徴とするコンパイル方法。
（付記２）  前記入力手続き出力コードに関して前記横断的手続きを呼び出す処理を生成する場合、前記入力手続き出力コード内に前記横断的手続きを呼び出す処理を生成する、
ことを特徴とする付記１に記載のコンパイル方法。
（付記３）  前記入力手続き出力コードに関して前記横断的手続きを呼び出す処理を生成する場合、前記入力手続き出力コード内の最初、最後、または所定箇所に前記横断的手続きを呼び出す処理を生成する
ことを特徴とする付記１または２に記載のコンパイル方法。
（付記４）  前記入力手続き出力コードに関して前記横断的手続きを呼び出す処理を生成する場合、前記入力手続きを実行させた際にその実行中に外部からの割り込みによって前記横断的手続きを呼び出すようにする処理を生成する
ことを特徴とする付記１に記載のコンパイル方法。
（付記５）  前記横断的手続きの名称を生成する場合、前記入力手続き及び前記検出された呼び出し手続きの各手続き名に手続き名に基づいて、該各手続きに対応する前記横断的手続きの名称を複数組生成し、
前記横断的手続き出力コードを生成する場合、前記各入力手続きの内容に基づいて前記各組に対応する前記所定処理を生成して、複数組の前記横断的手続き出力コードを生成し、
記入力手続き出力コードに関して前記横断的手続きを呼び出す処理を生成する場合、前記入力手続きに対して前記複数組の横断的手続きを呼び出す処理を生成する
ことを特徴とする付記１に記載のコンパイル方法。
（付記６）  前記各入力手続きの内容に基づいて生成される前記所定処理は、各手続きの初期化処理、終了処理、またはガーベジコレクションである
ことを特徴とする付記１に記載のコンパイル方法。
（付記７）  前記横断的手続きの１組は、前記主手続きに対応する横断的手続きから樹状に派生した体系となるように構成される
ことを特徴とする付記１に記載のコンパイル方法。
（付記８）  プログラムを構成する複数の手続きを分割コンパイルすると共に、該複数の手続きを一通り横断的に実行させる手続きである横断的手続きを生成する処理をコンピュータに実行させるコンパイルプログラムであって、
入力された前記複数の手続きを逐次取得する取得手順と、
前記各入力手続き内から呼び出される手続きを検出する呼び出し手続き検出手順と、
前記入力手続き及び前記検出された呼び出し手続きの各手続き名に基づいて、該各手続きに対応する前記横断的手続きの名称を生成する横断的手続き名生成手順と、
前記各入力手続きの内容に基づいて所定の処理を生成し、さらに、前記検出された呼び出し手続きがあれば該呼び出し手続きに対応する前記横断的手続き名を呼び出す処理を生成し、該所定の処理及び該呼び出す処理を含む手続きを前記生成した横断的手続き名で命名して前記横断的手続きの出力コードを生成する横断的手続き出力コード生成手順と、
前記入力手続きを翻訳したコードである入力手続き出力コードを生成する入力手続き出力コード生成手順と、
前記入力手続きが主手続きの場合、前記入力手続き出力コードに関して前記横断的手続きを呼び出す処理を生成する横断的手続き呼び出し生成手順と、
をコンピュータに実行させることを特徴とするコンパイルプログラム。
（付記９）  前記横断的手続き呼び出し生成手順は、前記入力手続き出力コード内に前記横断的手続きを呼び出す処理を生成する、
ことを特徴とする付記８に記載のコンパイルプログラム。
（付記１０）  前記横断的手続き呼び出し生成手順は、前記入力手続き出力コード内の最初、最後、または所定箇所に前記横断的手続きを呼び出す処理を生成する
ことを特徴とする付記８または９に記載のコンパイルプログラム。
（付記１１）  前記横断的手続き呼び出し生成手順は、前記入力手続きを実行させた際にその実行中に外部からの割り込みによって前記横断的手続きを呼び出すようにする処理を生成する
ことを特徴とする付記８に記載のコンパイルプログラム。
（付記１２）  前記横断的手続き名生成手順は、前記入力手続き及び前記検出された呼び出し手続きの各手続き名に手続き名に基づいて、該各手続きに対応する前記横断的手続きの名称を複数組生成し、
前記横断的手続き出力コード生成手順は、前記各入力手続きの内容に基づいて前記各組に対応する前記所定処理を生成して、複数組の前記横断的手続き出力コードを生成し、
横断的手続き呼び出し生成手順は、前記入力手続きに対して前記複数組の横断的手続きを呼び出す処理を生成する
ことを特徴とする付記８に記載のコンパイルプログラム。
（付記１３）  前記横断的手続き出力コード生成手順により生成される所定処理は、各手続きの初期化処理、終了処理、またはガーベジコレクションである
ことを特徴とする付記８に記載のコンパイルプログラム。
（付記１４）  前記横断的手続きの１組は、前記主手続きに対応する横断的手続きから樹状に派生した体系となるように構成される
ことを特徴とする付記８に記載のコンパイルプログラム。
（付記１５）  プログラムを構成する複数の手続きを分割コンパイルすると共に、該複数の手続きを一通り横断的に実行させる手続きである横断的手続きを生成するコンパイル装置であって、
入力された前記複数の手続きを逐次取得する取得手段と、
前記各入力手続き内から呼び出される手続きを検出する呼び出し手続き検出手段と、
前記入力手続き及び前記検出された呼び出し手続きの各手続き名に基づいて、該各手続きに対応する前記横断的手続きの名称を生成する横断的手続き名生成手段と、
前記各入力手続きの内容に基づいて所定の処理を生成し、さらに、前記検出された呼び出し手続きがあれば該呼び出し手続きに対応する前記横断的手続き名を呼び出す処理を生成し、該所定の処理及び該呼び出す処理を含む手続きを前記生成した横断的手続き名で命名して前記横断的手続きの出力コードを生成する横断的手続き出力コード生成手段と、
前記入力手続きを翻訳したコードである入力手続き出力コードを生成する入力手続き出力コード生成手段と、
前記入力手続きが主手続きの場合、前記入力手続き出力コードに関して前記横断的手続きを呼び出す処理を生成する横断的手続き呼び出し生成手段と、
を備えることを特徴とするコンパイル装置。
（付記１６）  前記横断的手続き呼び出し生成手段は、前記入力手続き出力コード内に前記横断的手続きを呼び出す処理を生成する、
ことを特徴とする付記１５に記載のコンパイル装置。
（付記１７）  前記横断的手続き呼び出し生成手段は、前記入力手続き出力コード内の最初、最後、または所定箇所に前記横断的手続きを呼び出す処理を生成する
ことを特徴とする付記１５または１６に記載のコンパイル装置。
（付記１８）  前記横断的手続き呼び出し生成手段は、前記入力手続きを実行させた際にその実行中に外部からの割り込みによって前記横断的手続きを呼び出すようにする処理を生成する
ことを特徴とする付記１５に記載のコンパイル装置。
（付記１９）  前記横断的手続き名生成手段は、前記入力手続き及び前記検出された呼び出し手続きの各手続き名に手続き名に基づいて、該各手続きに対応する前記横断的手続きの名称を複数組生成し、
前記横断的手続き出力コード生成手段は、前記各入力手続きの内容に基づいて前記各組に対応する前記所定処理を生成して、複数組の前記横断的手続き出力コードを生成し、
横断的手続き呼び出し生成手段は、前記入力手続きに対して前記複数組の横断的手続きを呼び出す処理を生成する
ことを特徴とする付記１５に記載のコンパイル装置。
（付記２０）  前記横断的手続き出力コード生成手段により生成される所定処理は、各手続きの初期化処理、終了処理、またはガーベジコレクションである
ことを特徴とする付記１５に記載のコンパイル装置。
（付記２１）  プログラムを構成する複数の手続きを分割コンパイルすると共に、該複数の手続きを一通り横断的に実行させる手続きである横断的手続きを呼び出す横断的手続き呼び出し方法であって、
入力された前記複数の手続きを逐次取得し、
前記各入力手続き内から呼び出される手続きを検出し、
前記入力手続き及び前記検出された呼び出し手続きの各手続き名に基づいて、該各手続きに対応する前記横断的手続きの名称を生成し、
前記各入力手続きの内容に基づいて所定の処理を生成し、さらに、前記検出された呼び出し手続きがあれば該呼び出し手続きに対応する前記横断的手続き名を呼び出す処理を生成し、該所定の処理及び該呼び出す処理を含む手続きを前記生成した横断的手続き名で命名して前記横断的手続きの出力コードを生成し、
前記入力手続きを翻訳したコードである入力手続き出力コードを生成し、
前記入力手続きが主手続きの場合、前記入力手続き出力コードに関して前記横断的手続きを呼び出す処理を生成し、
前記入力手続き出力コードの実行時に、前記横断的手続きを呼び出す
ことを特徴とする横断的手続き呼び出し方法。
（付記２２）  前記入力手続き出力コードに関して前記横断的手続きを呼び出す処理を生成する場合、前記入力手続き出力コード内に前記横断的手続きを呼び出す処理を生成する、
ことを特徴とする付記２１に記載の横断的手続き呼び出し方法。
（付記２３）  前記入力手続き出力コードに関して前記横断的手続きを呼び出す処理を生成する場合、前記入力手続き出力コード内の最初、最後、または所定箇所に前記横断的手続きを呼び出す処理を生成し、
前記入力手続き出力コードの実行の前記最初、前記最後、または、前記所定箇所に対応する所定のタイミングで前記横断的手続きを呼び出す
ことを特徴とする付記２１または２２に記載の横断的手続き呼び出し方法。
（付記２４）  前記入力手続き出力コードに関して前記横断的手続きを呼び出す処理を生成する場合、前記入力手続きを実行させた際にその実行中に外部からの割り込みによって前記横断的手続きを呼び出すようにする処理を生成し、
前記入力手続き出力コードの実行時に、前記外部からの割り込みによって前記横断的手続きを呼び出す
ことを特徴とする付記２１に記載の横断的手続き呼び出し方法。
（付記２５）  前記横断的手続きの名称を生成する場合、前記入力手続き及び前記検出された呼び出し手続きの各手続き名に手続き名に基づいて、該各手続きに対応する前記横断的手続きの名称を複数組生成し、
前記横断的手続き出力コードを生成する場合、前記各入力手続きの内容に基づいて前記各組に対応する前記所定処理を生成して、複数組の前記横断的手続き出力コードを生成し、
記入力手続き出力コードに関して前記横断的手続きを呼び出す処理を生成する場合、前記入力手続きに対して前記複数組の横断的手続きを呼び出す処理を生成し、
前記入力手続き出力コードの実行時に、前記複数組の横断的手続きを呼び出す
ことを特徴とする付記２１に記載の横断的手続き呼び出し方法。
（付記２６）  前記各入力手続きの内容に基づいて生成される前記所定処理は、各手続きの初期化処理、終了処理、またはガーベジコレクションである
ことを特徴とする付記２１に記載の横断的手続き呼び出し方法。
（付記２７）  前記横断的手続きの１組は、前記主手続きに対応する横断的手続きから樹状に派生した体系となるように構成される
ことを特徴とする付記２１に記載の横断的手続き呼び出し方法。
【図面の簡単な説明】
【０１２８】
【図１】本発明にかかる分割コンパイルを行うコンパイラの概念的な構成を示す。
【図２】第１の実施形態におけるコンパイラ１の構成を示す。
【図３】第１の実施形態におけるコンパイルのフローの一例を示す。
【図４】図３のＳ３において横断的手続きの出力コードが生成される様子を示す。
【図５】図３のＳ６において入力手続きＰが主プログラムの場合に、コンパイルされたときの様子を示す。
【図６】第１の実施形態において生成されるプログラムの生成コードの一例を示す。
【図７】第１の実施形態の別の実施例におけるプログラム（コンパイル前）を示す。
【図８】第１の実施形態の別の実施例におけるプログラム（コンパイル後）を示す。
【図９】第２の実施形態におけるコンパイルのフローの一例を示す。
【図１０】第２の実施形態において生成される主プログラムの生成コードの一例を示す。
【図１１】図１０の横断的手続きの呼び出し順を示す。
【図１２】第２の実施形態における横断的手続きの命名例を示す。
【図１３】第１の実施形態と第３の実施形態を組合せた出力コードの例を示す。
【図１４】第４の実施形態において生成される主プログラムの生成コードの一例を示す。
【図１５】第１〜第５の実施形態におけるコンパイラ１が実行されるハードウェア環境の構成ブロック図である。
【図１６】ＨＰＦ言語によるコンパイラに対する入力プログラムの例を示す。
【図１７】従来の分割コンパイル時の出力コードの例（その１）を示す。
【図１８】従来の分割コンパイル時の出力コードの例（その２）を示す。
【図１９】一括コンパイル時に可能な出力コードの例を示す。
【図２０】分割コンパイルでは生成できないコードの例を示す。
【図２１】図２０に相当するコードを一括コンパイルで生成したコードの例を示す。
【図２２】定期的なガーベジコレクションをコンパイラで生成するプログラムの例を示す。
【図２３】定期的なガーベジコレクションを一括コンパイルによりコンパイラが生成したコードの例を示す。
【符号の説明】
【０１２９】
１      コンパイラ
２，２ａ      呼び出し手続き検出手段
３，３ａ      横断的手続き名生成手段
４，４ａ      横断的手続き出力コード生成手段
５，５ａ      入力手続き出力コード生成手段
６      横断的手続き呼び出し生成手段
６ａ−１      入力手続き種別判定手段
６ａ−２      横断的手続き呼び出し生成手段
【図１】
2008083755.tif 000003
【図２】
2008083755.tif 000004
【図３】
2008083755.tif 000005
【図６】
2008083755.tif 000006
【図７】
2008083755.tif 000007
【図８】
2008083755.tif 000008
【図９】
2008083755.tif 000009
【図１０】
2008083755.tif 000010
【図１１】
2008083755.tif 000011
【図１２】
2008083755.tif 000012
【図１３】
2008083755.tif 000013
【図１４】
2008083755.tif 000014
【図１５】
2008083755.tif 000015
【図１６】
2008083755.tif 000016
【図１７】
2008083755.tif 000017
【図１８】
2008083755.tif 000018
【図１９】
2008083755.tif 000019
【図２０】
2008083755.tif 000020
【図２１】
2008083755.tif 000021
【図２２】
2008083755.tif 000022
【図２３】
2008083755.tif 000023
【図４】
2008083755.tif 000024
【図５】
2008083755.tif 000025