(57)【要約】【課題】参照先行のデータ依存があるループを並列化する。【解決手段】参照先行のデータ依存がある配列をワーク変数に設定し、ループを生成し、該ループの後に、データ依存のある配列を前記ワーク変数に置換したループの実行文を計算する。【選択図】図５
2010191506.tif 000002
【特許請求の範囲】
【請求項１】
ソースプログラムを解析して中間言語列を生成するソース解析手段と、
前記中間言語列を最適化する最適化手段と
前記最適化手段から出力された中間言語列からオブジェクトファイルを生成するコード生成手段と、
を備え、
前記最適化手段は、
参照された後に定義される依存関係である参照先行のデータ依存がある配列をワーク変数に、該配列が参照されてから定義されるまで実行されるループの回数だけ設定する中間言語を生成し、
ループを生成し、該ループ内に前記ソースプログラムのループ内の実行文に対応する中間言語をコピーし、
前記配列が参照されてから定義されるまで実行されるループの回数だけ、前記ソースプログラムのループ内の実行文に対応する中間言語をコピーし、該コピーした中間言語でデータ依存のある配列を前記ワーク変数に置換した中間言語を生成することを特徴とするコンパイル装置。
【請求項２】
前記最適化手段は、前記中間言語列に参照先行のデータ依存を持つループがあるかを判定することを特徴とする請求項１記載のコンパイル装置。
【請求項３】
前記最適化手段は、
各スレッドの初期値および各スレッドの終値を設定する中間言語を生成し、
前記生成したループは、前記初期値から前記終値までのループであることを特徴とする請求項１記載のコンパイル装置。
【請求項４】
前記最適化手段は、同期処理のためのバリアライブラリを呼び出す中間言語を生成することを特徴とする請求項１記載のコンパイル装置。
【請求項５】
コンピュータに
ソースプログラムを解析して中間言語列を生成するステップと、
前記中間言語列を最適化する最適化ステップと
前記最適化手段から出力された中間言語列からオブジェクトファイルを生成するコード生成ステップと、
を実行させるコンパイルプログラムにおいて、
前記最適化ステップは、
参照された後に定義される依存関係である参照先行のデータ依存がある配列をワーク変数に、該配列が参照されてから定義されるまで実行されるループの回数だけ設定する中間言語を生成するステップ、
ループを生成し、該ループ内に前記ソースプログラムのループ内の実行文に対応する中間言語をコピーするステップ、
前記配列が参照されてから定義されるまで実行されるループの回数だけ、前記中間言語列のループ内の実行文に対応する中間言語をコピーし、該コピーした中間言語でデータ依存のある配列を前記ワーク変数に置換した中間言語を生成するステップ、
を備えることを特徴とするコンパイルプログラム。
【請求項６】
前記最適化ステップは、前記中間言語列に参照先行のデータ依存をもつループがあるかを判定する判定ステップを備えることを特徴とする請求項５記載のコンパイルプログラム。
【請求項７】
前記最適化ステップは、各スレッドの初期値および各スレッドの終値を設定する中間言語を生成するステップを備え、
前記生成したループは、前記初期値から前記終値までのループであることを特徴とする請求項５記載のコンパイルプログラム。
【請求項８】
前記最適化ステップは、同期処理のためのバリアライブラリを呼び出す中間言語を生成するステップを備えることを特徴とする請求項５記載のコンパイルプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースプログラムをコンピュータが実行可能なオブジェクトファイルに変換するコンパイル装置およびコンパイルプログラムに関する。
【背景技術】
【０００２】
並列処理は、複数のCPU（Central Processing Unit）を持つ計算機（マルチコアプロセッサやSymmetric Multiprocessing）において、CPUを有効活用し、実行性能を向上させる上での重要な機能である。
【０００３】
コンパイラにおける最適化機能の一つに自動並列化がある。
自動並列化は、複数のCPUを持つ計算機において、並列に実行するために、逐次コードを並列実行可能なコードに変換するものである。
【０００４】
図１は、データ依存のないループを表すソースプログラムの例である。
図１では、変数Iを１からＮまで１ずつ増加させ、各ループでA(I)=A(I)+B(I)を計算することで、A(1)からA(N)までを算出している。
【０００５】
図２は、図１のプログラムの逐次実行および並列実行の順序を示す図である。
尚、以下の説明では、スレッドはCPUと１対１で割り当てられたスレッドとする。
ここで、変数Ｎは１０とし、A(1)からA(10)までを計算する場合を述べる。
【０００６】
図２の左側に示すように、逐次実行では、A(1)からA(10)まで順に計算されていく。
並列実行では、スライス位置で分割され、各スレッドで実行される。
図２の右側で示すように、２並列実行では、A(1)からA(5)がスレッド０で計算され、A(6)からA(10)がスレッド１で計算される。
【０００７】
図２の右側で示すように、２並列実行では、各配列要素の定義／参照がスレッドを跨ぐことは無いので、並列化しても問題はない。
【０００８】
次に、ループの回転を跨いだデータ依存があるために並列化が出来ない例を示す。
図３は、データ依存のあるループを表すソースプログラムである。
図３では、変数Iを１からＮ-２まで１ずつ増加させ、各ループでA(I)=A(I+2)+B(I)を計算することで、A(1)からA(N-2)までを算出している。
【０００９】
図４は、図３のプログラムの逐次実行および並列実行の順序を示す図である。ここで、変数Ｎは１２とする。
図４の左側に示すように、逐次実行では、A(1)からA(10)まで順に計算されていく。
【００１０】
並列実行では、上記と同様に、スライス位置で分割して、各スレッドで計算を実行する。
図４の右側で示すように、２並列実行では、A(1)からA(5)がスレッド０で計算され、A(6)からA(10)がスレッド１で計算される。
【００１１】
逐次実行では、A(4)の計算時にA(6)、A(5)の計算時にA(7)がそれぞれ参照され、A(4)およびA(5)の計算の後にA(6)およびA(7)が計算（定義）される。すなわち、A(6)およびA(7)が参照された後に、新たなA(6)およびA(7)が定義されている。
【００１２】
これに対し並列実行では、スレッド１でA(6)およびA(7)が計算（定義）された後に、スレッド０でA(6)を参照するA(4)およびA(7)を参照するA(5)が計算される。すなわち、A(6)およびA(7)が定義された後に、A(6)およびA(7)が参照されている。
【００１３】
したがって、並列実行では、逐次実行の結果とは異なる誤った結果が算出される。
このように、参照先行のデータ依存を持つループを従来の技術を用いて並列化を行うと、実行結果誤りとなってしまうため、自動並列化できないという問題があった。
【００１４】
インデックスセットが分配可能という条件は満たすが、代入文右辺のデータ依存が１つに決められるという条件は待たさないような特性を持つループを並列化する技術も知られている。
【先行技術文献】
【特許文献】
【００１５】
【特許文献１】特開平８−１８５３２５号公報
【発明の概要】
【発明が解決しようとする課題】
【００１６】
本発明の課題は、参照先行しているデータ依存を持つループを並列化可能な装置を提供することである。
【課題を解決するための手段】
【００１７】
開示の装置は、ソースプログラムを解析して中間言語列を生成するソース解析手段と、前記中間言語列を最適化する最適化手段と前記最適化手段から出力された中間言語列からオブジェクトファイルを生成するコード生成手段と、を備える。
【００１８】
前記最適化手段は、参照された後に定義される依存関係である参照先行のデータ依存がある配列をワーク変数に、該配列が参照されてから定義されるまで実行されるループの回数だけ設定する中間言語を生成し、ループを生成し、該ループ内に前記ソースプログラムのループ内の実行文に対応する中間言語をコピーし、前記配列が参照されてから定義されるまで実行されるループの回数だけ、前記ソーププログラムのループ内の実行文に対応する中間言語をコピーし、該コピーした中間言語でデータ依存のある配列を前記ワーク変数に置換した中間言語を生成することを特徴とする。
【発明の効果】
【００１９】
開示の装置により、参照先行しているデータ依存を持つループを並列化することで、オブジェクトファイルの実行性能を向上させることが出来る。
【図面の簡単な説明】
【００２０】
【図１】データ依存のないループを表すソースプログラムの例である。
【図２】逐次実行および並列実行の順序を示す図である。
【図３】データ依存のあるループを表すソースプログラムの例である。
【図４】逐次実行および並列実行の順序を示す図である。
【図５】実施の形態に係るコンパイル装置の構成図である。
【図６】実施の形態に係るコンパイル装置の処理のフローチャートである。
【図７Ａ】自動並列化の詳細なフローチャート（その１）である。
【図７Ｂ】自動並列化の詳細なフローチャート（その２）である。
【図８】ループの例を示す図である。
【図９】ループの例を示す図である。
【図１０】中間言語列のデータ構造を示す図である。
【図１１】逐次実行および並列実行の順序を示す図である。
【図１２】情報処理装置の構成図である。
【発明を実施するための形態】
【００２１】
以下、図面を参照しながら本発明の実施の形態を説明する。
本実施の形態において、コンパイルされたプログラムは、通常、複数のCPUを持つ計算機で実行される。複数のCPUを持つ計算機は、複数のスレッドで並列処理を行うことにより、効率よく処理を行うことができる。スレッドとは、CPU利用の単位であり、本実施形態において、スレッドはCPUと１対１で割り当てられているものとする。
【００２２】
図５は、実施の形態に係るコンパイル装置の構成図である。
コンパイル装置５０１は、コンパイル手段５０２を備える。
コンパイル手段５０２は、ソースプログラム５１１をコンパイルして、オブジェクトファイル５１２を生成する。
【００２３】
コンパイル手段５０２は、ソース解析手段５０３、最適化手段５０４、およびコード生成手段５０５を備える。
ソース解析手段５０３は、入力されたソースプログラム５１１を解析して、ソースプログラム５１１に対応する中間言語列（中間コード）に変換する。
【００２４】
ソースプログラム５１１は、FORTRAN等の高級言語で記述され、コンパイル装置５０１の記憶手段（不図示）に格納されている。
最適化手段は、ソース解析手段５０３から出力された中間言語列を最適化して、最適化した中間言語列を出力する。
【００２５】
コード生成手段５０５は、最適化手段で最適化された中間言語列をコンピュータが実行可能な機械語に変換し、オブジェクトファイル５１２を生成する。
【００２６】
図６は、本発明の実施の形態に係るコンパイル装置の処理のフローチャートである。
ステップＳ６０１において、ソース解析手段５０３はソースプログラム５１１を読み出し、コンパイルを開始する。
ステップＳ６０２において、ソース解析手段５０３はソースプログラム５１１を解析して中間言語列を生成し、最適化手段に出力する。
【００２７】
ステップＳ６０３において、最適化手段５０４は、入力された中間言語列を最適化して、最適化した中間言語列をコード生成手段５０５に出力する。尚、ステップＳ６０４の最適化に含まれる自動並列化の詳細については後述する。
【００２８】
ステップＳ６０４において、コード生成手段５０５は、入力された中間言語列をオブジェクトファイル５１２に変換する。
ステップＳ６０５において、コード生成手段５０５は、オブジェクトファイル５１２を出力して、コンパイルを終了する。
【００２９】
図７Ａ及び図７Ｂは、自動並列化の詳細なフローチャートである。
自動並列化はステップＳ６０４で行われる最適化の一部である。
ステップＳ７０１において、並列化解析処理を開始する。
【００３０】
ステップＳ７０２において、最適化手段５０４は、ループがあるか判定する。ループがある場合はステップＳ７０３に制御は進み、ループがない場合は処理を終了する。
ステップＳ７０３において、最適化手段５０４は、ループを跨いだデータ依存があるかどうかを判定する。ループを跨いだデータ依存としては、例えば参照先行、定義先行、手続呼び出し等がある。すなわち、ステップＳ７０３では従来の並列化生成処理が適応できるかを判断している。ループを跨いだデータ依存がある場合は、ステップＳ７０５に制御は進み、ループを跨いだデータ依存がない場合はステップＳ７０４に制御は進む。
【００３１】
ステップＳ７０４において、最適化手段５０４は、ループを跨いだデータ依存がない場合の並列化生成処理を実施する。
ステップＳ７０５において、最適化手段５０４は、参照先行のデータ依存があるかどうかを判定する。参照先行のデータ依存がある場合はステップＳ７０６に制御は進み、参照先行のデータ依存がない場合はステップＳ７１６に制御は進む。また、ステップＳ７０５において、データ依存のある配列の添え字の幅と回転数の幅を認識する。尚、添え字の幅と回転数の幅については後述する。
【００３２】
ステップＳ７０６において、最適化手段５０４は、参照先行のデータ依存以外の並列化阻害要因があるかどうか判定する。阻害要因がある場合はステップＳ７１６に制御は進み、阻害要因がない場合は、ステップＳ７０７に制御は進む。参照先行のデータ依存以外の並列化阻害要因としては、例えば定義先行、手続き呼び出し等がある。
【００３３】
ステップＳ７０７において、最適化手段５０４は、解析処理を終了し、参照先行のデータ依存を持つループの並列化が可能であると判定する。
ステップＳ７０８において、最適化手段５０４は、中間言語の生成処理を開始する。
【００３４】
ステップＳ７０９において、最適化手段５０４は、データ依存ある配列の添え字の幅WIDTHおよび回転数の幅Mをワーク変数に設定する中間言語を生成する。
尚、添え字の幅とは、データ依存のある配列において、参照する配列の添え字と定義する配列の添え字との差分である。図３においては、参照する配列はA(I+2)、定義する配列はA(I)であり、データ依存のある添え字の幅は(I+2)-(I)=2となる。
【００３５】
回転数の幅とは、ある配列要素が参照されてから、該配列要素が定義されるまで実行されるループの回数である。
例えば、図８に示すようなループを考える。図８に示すループは、変数Iを１からNまで１ずつ増分させる（ループ増分値が１である）ループである。このループを実行すると、各ループで行われる計算は
１回転目は、A(1)=A(3)+B(1)
２回転目は、A(2)=A(4)+B(2)
３回転目は、A(3)=A(5)+B(3)
４回転目は、A(4)=A(6)+B(4)
：
以上のようになる。
【００３６】
図８に示すループでは、例えば、データ依存のあるA(3)は１回転目で参照され、３回転目で定義されるので、データ依存のある回転数の幅は２となる。
次に、図９に示すようなループを考える。図９に示すループは、変数Iを１からNまで２ずつ増分させる（ループ増分値が２である）ループである。このループを実行すると、各ループで行われる計算は
１回転目は、A(1)=A(3)+B(1)
２回転目は、A(3)=A(5)+B(3)
３回転目は、A(5)=A(7)+B(5)
４回転目は、A(7)=A(9)+B(7)
：
以上のようになる。
【００３７】
図９に示すループでは、例えば、データ依存のあるA(3)は１回転目で参照され、２回転目で定義されるので、データ依存のある回転数の幅は１となる。
例えば、図３のループの場合、図４に示すようにデータ依存のあるA(6)はA(4)の計算とA(6)の計算で出てくる。A(4)とA(6)との間は２であるので、データ依存のある回転数の幅は２となる。
【００３８】
ステップＳ７１０において、最適化手段５０４は、各スレッドのループ回転数LL、配列の添え字の初期値IS、および配列の添え字の終値IEを設定する中間言語を生成する。
各スレッドのループ回転数LLは、逐次ループの回転数（（終値−初期値＋増分値）／増分値）をA、通常のスライス計算の回転数（A／スレッド数）をB、データ依存のある添え字の幅をWIDTHとすると、下式で求められる。
LL=B-WIDTH
【００３９】
また、各スレッドの配列の添え字の初期値ISは、従来と同様に通常の並列化の各スレッドの初期値の計算から求める。
また、各スレッドの配列の添え字の終値IEは、IS+LL-1で求められる。
【００４０】
ステップＳ７１１において、回転数の幅の分だけ、ループ内のデータ依存のある配列をワーク変数に退避する中間言語を生成する。
すなわち、データ依存のある配列をループの前でワーク変数TMPn,(n=1〜M)として設定する。
ここで、退避する配列の添え字は、IE+K*ループ増分値+WIDTH,(K=1〜M)である。
【００４１】
ステップＳ７１２において、最適化手段５０４は、バリアライブラリを呼び出す中間言語を生成する。バリアライブラリは、全てのスレッドにおける処理がバリアライブラリのある地点に達するまで、全スレッドが次の命令の実行を待つための命令列、ライブラリ、またはハード機構である。バリアライブラリは、命令やデータアクセスの順序を保証するために用いられる。
【００４２】
ステップＳ７１３において、最適化手段５０４は、ループを生成し、ソースプログラムのループ内の実行文に対応する中間言語をコピーする。
ステップＳ７１４において、最適化手段５０４は、回転数の幅の分だけ、ソースプログラムのループ内の中間言語をコピーし、コピーしたループ内の中間言語で右辺のデータ依存のある配列要素をステップＳ７１１で退避したワーク変数に置換する。
ここで算出する配列の添え字は、IE+K*ループ増分値,(K=1〜M)である。
【００４３】
ステップＳ７１５において、最適化手段５０４は、中間言語の生成処理を終了する。
ステップＳ７１６において、最適化手段５０４は、次のループを取り出し、ステップＳ７０２に制御は戻る。次のループがない場合は、処理を終了する。
【００４４】
次に、具体例として、図３に示すループに対して最適化を行った場合に生成される中間言語列ついて述べる。
図１０は、図３に示すループに対して最適化を行った場合に生成される中間言語列の構造を示す図である。
【００４５】
以下の例においては、変数Ｎは１２とする。
先ず、解析処理として、ループがあるか（ステップＳ７０２）、ループを跨いだデータ依存があるか（ステップＳ７０３）のチェックを行う。
【００４６】
参照先行のデータ依存があるかどうか判断し、ループを跨いだ参照先行のデータ依存のある配列、データ依存のある配列の添え字の幅、データ依存のある配列の回転数の幅を認識する（ステップＳ７０５）。
【００４７】
図３に示すループでは、ループを跨いだ参照先行のデータ依存のある配列はA(I)、その配列要素のデータ依存のある添え字の幅は２、その配列要素のデータ依存のある回転数の幅は２である。
【００４８】
参照先行のデータ依存以外の並列化阻害要因があるかチェックし（ステップＳ７０６）、解析処理を終了する。（ステップＳ７０７）。
そして、中間言語の生成処理を開始する（ステップＳ７０８）。
【００４９】
データ依存のある回転数の幅Mを２、データ依存のある添え字の幅WIDTHを２と設定する中間言語（図１０の中間言語１および２に対応）を生成する（ステップＳ７０９）。
各スレッドのループ回転数LL、初期値IS、終値IEを設定する中間言語（図１０の中間言語３、４、および５に対応）を生成する（ステップＳ７１０）。
【００５０】
データ依存のある配列を回転数の幅の分（本実施の形態では２つ）、ワーク変数TMP1、TMP2に退避する中間言語（図１０の中間言語６および７に対応）を生成する（ステップＳ７１１）。
【００５１】
ワーク変数に退避する前に、退避する配列要素が他のスレッドで定義されないようにするため、バリアライブラリを呼び出す中間言語（図１０の中間言語８に対応）を生成する（ステップＳ７１２）。
【００５２】
ISからIEまでループさせる中間言語（図１０の中間言語９、１１に対応）を生成する。そして、生成したループ内にソースプログラムのループ内の実行文に対応する中間言語（図１０の中間言語１０に対応）A(I)=A(I+2)+B(I)をコピーする（ステップＳ７１３）。
【００５３】
次に回転数の幅の分（本実施の形態では２）、ソースプログラムのループ内の実行分の中間言語（実施の形態ではA(I)=A(I+2)+B(I)に対応）をコピーする（ステップＳ７１４）。そして、コピーした中間言語で右辺のデータ依存関係にある配列要素（実施の形態ではA(I+2)に対応）をワーク変数TMP1、TMP2に置換した中間言語（図１０の中間言語１２および１３に対応）を生成する。
【００５４】
ここで計算する配列の添え字は、IE+K*ループ増分値,(K=1〜M)である。
上記のように最適化された中間言語列は、コード生成手段５０５に入力され、オブジェクトファイル５１２が生成される。
【００５５】
図１１は、図１０の中間言語列に基づいた逐次実行および並列実行の順序を示す図である。
尚、変数Ｎは１２とし、ループ回転数は１０回転となる。
【００５６】
図１１の左側に示すように、逐次実行では、A(1)からA(10)まで順に計算されていく。
次に並列実行した場合を説明する。
本実施の形態では、２つのスレッドが実行可能なコンピュータで実行した場合を考える。２つのスレッドをそれぞれスレッド０、スレッド１とする。
【００５７】
図１１の右側の左列はスレッド０で行われる計算、右列はスレッド１で行われる計算を示す。
プログラムの実行時にスレッド数が与えられ、コンピュータはライブラリを利用して処理を各スレッドに分散させる。
【００５８】
尚、以下の説明において、スレッド毎の変数を区別して理解を容易にするために、スレッドＸの通常のスレッドの初期値ISはISX、終値IEはIEX、ワーク変数TMP1、TMP2は、TMPX1、TMPX2と記載することもある。
【００５９】
図１０の各中間言語に対応する命令を実行していく。
（１）中間言語１および２
データ依存のある回転数の幅Mは２、データ依存のある添え字の幅WIDTHは２である。
【００６０】
（２）中間言語３〜５
各スレッドのループ回転数LLとして、３が得られる。
そして、通常の各スレッドの初期値ISとして、IS0=１、IS1=６が得られる。
各スレッドの終値IEとして、IE0=３、IE1=８が得られる。
【００６１】
（３）中間言語６および７
スレッド０において、データ依存のある配列をワーク変数に退避する。すなわち、スレッド０のワーク変数TMP01およびTMP02を、TMP01=A(IE0+1*1+WIDTH)=A(6)、TMP12=A(IE0+2*1+WIDTH)=A(7)とする（図１１のa0参照）。
スレッド１において、データ依存のある配列をワーク変数に退避する。すなわち、スレッド１のワーク変数TMP11およびTMP12を、TMP01=A(IE1+1*1+WIDTH)=A(11)、TMP12= A(IE1+2*1+WIDTH)=A(12)とする（図１１のa1参照）。
【００６２】
（４）中間言語８
スレッド０および１において、バリアライブラリを呼び出す（図１１のb参照）。
【００６３】
（５）中間言語９〜１１
スレッド０において、IS0=１からIE0=３まで、ループを計算する。すなわち、A(1)〜A(3)を算出する（図１１のc0参照）。
スレッド１において、IS1=６からIE1=８まで、ループを計算する。すなわち、A(6)〜A(8)を算出する（図１１のc1参照）。
【００６４】
（６）中間言語１２、１３
スレッド０において、A(IE0+1*1)=TMP01+B(IE0+1*1)、A(IE0+2*1)=TMP02+B(IE0+2*1)を計算する。すなわち、A(4)=A(6)+B(4)、A(5)=A(7)+B(5)を計算する（図１１のd0参照）。
スレッド１において、A(IE1+1*1)=TMP11+B(IE1+1*1)、A(IE1+2*1)=TMP12+B(IE1+2*1)を計算する。すなわち、A(9)=A(11)+B(9)、A(10)=A(12)+B(10)を計算する（図１１のd1参照）。
以上のように、各スレッドにおいてループが計算される。
【００６５】
図１１の右側で示すように、２並列実行では、A(1)からA(5)がスレッド０で計算され、A(6)からA(10)がスレッド１で計算される。
この時、スレッド０において、ループ計算の前に、データ依存のあるA(6)およびA(7)は、TMP1およびTMP2に退避している。
そして、A(4)およびA(5)の計算において、A(6)およびA(7)の代わりにTMP1およびTMP2をそれぞれ利用している。
【００６６】
したがって、A(6)およびA(7)の参照／定義の順番は変わらない。
これにより、スレッド０におけるA(4)およびA(5)の計算の前に、スレッド１でA(6)およびA(7)が定義されても、スレッド０におけるA(4)およびA(5)の計算に影響を及ぼすことは無く、正しい結果が得られる。
【００６７】
このように、実施の形態のコンパイル装置で最適化を行うことにより、参照先行のデータ依存のあるループを並列化して実行することができる。
また、上述のコンパイル装置５０１は、例えば、図１２に示すような情報処理装置（コンピュータ）を用いて構成される。
【００６８】
情報処理装置１０は、ＣＰＵ（Central Processing Unit）１１、メモリ１２、入力部１３、出力部１４、記憶部１５、記録媒体駆動部１６、およびネットワーク接続部１７を備え、それらはバス１８により互いに接続されている。
【００６９】
ＣＰＵ１１は、情報処理装置１０全体を制御する中央処理装置である。
メモリ１２は、プログラム実行の際に、記憶部１５（あるいは可搬記録媒体１９）に記憶されているプログラムあるいはデータを一時的に格納するＲＯＭ（read only memory）やＲＡＭ（random access memory）等のメモリである。ＣＰＵ１１は、メモリ１２を利用してプログラムを実行することにより、上述した各種処理を実行する。
【００７０】
この場合、可搬記録媒体等から読み出されたプログラムコード自体が本発明の新規な機能を実現することになり、そのプログラムコードを記録した記録媒体等は本発明を構成することになる。
【００７１】
入力部１３は、例えば、キーボード、マウス、タッチパネル等である。
出力部１４は、例えば、ディスプレイ、プリンタ等である。
記憶部１５は、例えば、磁気ディスク装置、光ディスク装置、テープ装置等である。情報処理装置１０は、記憶部１５に、上述のプログラムとデータを保存しておき、必要に応じて、それらをメモリ１２に読み出して使用する。
【００７２】
記録媒体駆動部１６は、可搬記録媒体１９を駆動し、その記録内容にアクセスする。可搬記録媒体１９としては、メモリカード、フレキシブルディスク、ＣＤ−ＲＯＭ（compact disk read only memory）、光ディスク、光磁気ディスク等、任意のコンピュータ読み取り可能な記録媒体が用いられる。ユーザは、この可搬記録媒体１９に上述のプログラムとデータを格納しておき、必要に応じて、それらをメモリ１２に読み出して使用する。
【００７３】
ネットワーク接続部１７は、ＬＡＮ（local area network）等の任意の通信ネットワークに接続され、通信に伴うデータ変換を行う。
本発明は、以上に述べた実施の形態に限定されるものではなく、本発明の要旨を逸脱しない範囲内で種々の構成または形状を取ることができる。
【符号の説明】
【００７４】
１０    情報処理装置
１１    ＣＰＵ
１２    メモリ
１３    入力部
１４    出力部
１５    記憶部
１６    記録媒体駆動部
１７    ネットワーク接続部
１８    バス
１９    可搬記録媒体
５０１    コンパイル装置
５０２    コンパイル手段
５０２    ソース解析手段
５０３    最適化手段
５０４    コード生成手段
５１１    ソースプログラム
５１２    オブジェクトファイル
【図１】
2010191506.tif 000003
【図２】
2010191506.tif 000004
【図３】
2010191506.tif 000005
【図４】
2010191506.tif 000006
【図５】
2010191506.tif 000007
【図６】
2010191506.tif 000008
【図７Ａ】
2010191506.tif 000009
【図７Ｂ】
2010191506.tif 000010
【図８】
2010191506.tif 000011
【図９】
2010191506.tif 000012
【図１０】
2010191506.tif 000013
【図１１】
2010191506.tif 000014
【図１２】
2010191506.tif 000015