"高級言語で記載されたソースプログラムをオブジェクトプログラムに変換するプログラム変換装置であって、任意の実レジスタに割り当てられうる複数の仮想レジスタを用いて、各仮想レジスタが区別して記述されたプログラム部分を含むソースプログラムを入力として受け付ける入力部と、前記ソースプログラム中の変数であって、前記プログラム部分を跨ぐ生存区間を有する変数を検出する検出手段と、前記プログラム部分に出現する前記複数の仮想レジスタのそれぞれに対して、同一の仮想レジスタには同一の実レジスタを割り当て、相互に異なる仮想レジスタには異なる実レジスタを割り当てるようにしながら、前記プログラム部分を跨ぐ生存区間を有する前記ソースプログラム中の変数に割り当てられる実レジスタとは異なるレジスタを割り当てる割り当て手段と、前記割り当て手段によって割り当てられた実レジスタに従って、オブジェクトプログラムを生成する生成手段とを備えることを特徴とするプログラム変換装置。前記割り当て手段は、優先的に仮想レジスタに実レジスタを割り当てた後、ソースプログラム中の変数へのレジスタ割り当てを行うことを特徴とする請求項1記載のプログラム変換装置。前記割り当て手段は、すべての実レジスタのうち特定の機能を有する実レジスタ群のうちの1つの実レジスタを仮想レジスタに割り当てることを特徴とする請求項1記載のプログラム変換装置。高級言語で記載されたソースプログラムをオブジェクトプログラムに変換するプログラム変換方法であって、メモリに記憶されたソースプログラムであって、任意の実レジスタに割り当てられうる複数の仮想レジスタを用いて、各仮想レジスタが区別して記述されたプログラム部分を含むソースプログラムを入力として受け付ける入力部と、前記ソースプログラム中の変数であって、前記プログラム部分を跨ぐ生存区間を有する変数を検出する検出ステップと、前記プログラム部分に出現する前記複数の仮想レジスタのそれぞれに対して、同一の仮想レジスタには同一の実レジスタを割り当て、相互に異なる仮想レジスタには異なる実レジスタを割り当てるようにしながら、前記プログラム部分を跨ぐ生存区間を有する前記ソースプログラム中の変数に割り当てられる実レジスタとは異なる実レジスタを割り当てる割り当てステップと、前記割り当てステップにおいて割り当てられた実レジスタに従って、オブジェクトプログラムを生成する生成ステップとからなることを特徴とするプログラム変換方法。高級言語で記載されたソースプログラムをオブジェクトプログラムに変換する処理をコンピュータに実行させるためのプログラムを記録したコンピュータ読み取り可能な記録媒体であって、当該プログラムはコンピュータに、メモリに記憶されたソースプログラムであって、任意の実レジスタに割り当てられうる複数の仮想レジスタを用いて、各仮想レジスタが区別して記述されたプログラム部分を含むソースプログラムを入力として受け付ける入力部と、前記ソースプログラム中の変数であって、前記プログラム部分を跨ぐ生存区間を有する変数を検出する検出ステップと、前記プログラム部分に出現する前記複数の仮想レジスタのそれぞれに対して、同一の仮想レジスタには同一の実レジスタを割り当て、相互に異なる仮想レジスタには異なる実レジスタを割り当てるようにしながら、前記プログラム部分を跨ぐ生存区間を有する前記ソースプログラム中の変数に割り当てられる実レジスタとは異なる実レジスタを割り当てる割り当てステップと、前記割り当てステップにおいて割り当てられた実レジスタに従って、オブジェクトプログラムを生成する生成ステップとを実行させることを特徴とするプログラムを記録した記録媒体。しかしながら、文献3の方式では、マクロdmの使用箇所によっては、コンパイラが必ずしも効率のよいアセンブラコードに変換できないという問題がある。この点を具体的な例で示す。図13は、図12cの関数f2をさらにコンパイラ内部で処理しやすいように内部変換したものである。特に図13のs1のように関数hの呼び出しの前に、コンパイラが生成した一時変数tに変数mの値を格納し、変数tを関数hの引数としている。これは、コンパイラが関数の引数の値を確実にレジスタで渡すために導入したものであり、一時変数tにはレジスタr0が割り付けられているものとする。引数をレジスタで渡すことは、高速な関数呼び出しを行なうために、広くコンパイラで行なわれている方式である。このとき図13の変数mは、asmブロックに跨って生きているので、レジスタr0,r1は変数mには割り付けることができない。その結果、変数mにはレジスタr0,r1以外のレジスタが割り付けられることになり、図13のs1において転送命令が生成されることとなる。そこで本発明の目的は、転送命令の生成を低減するプログラム変換装置コンパイラ装置、プログラム変換方法及び記録媒体を提供することを目的とする。上記目的を達成するため、本発明に係るプログラム変換装置は、高級言語で記載されたソースプログラムをオブジェクトプログラムに変換するプログラム変換装置であって、任意の実レジスタに割り当てられうる複数の仮想レジスタを用いて、各仮想レジスタが区別して記述されたプログラム部分を含むソースプログラムを入力として受け付ける入力部と、ソースプログラム中の変数であって、プログラム部分を跨ぐ生存区間を有する変数を検出する検出手段と、プログラム部分に出現する複数の仮想レジスタのそれぞれに対して、同一の仮想レジスタには同一の実レジスタを割り当て、相互に異なる仮想レジスタには異なる実レジスタを割り当てるようにしながら、プログラム部分を跨ぐ生存区間を有するソースプログラム中の変数に割り当てられる実レジスタとは異なるレジスタを割り当てる割り当て手段と、割り当て手段によって割り当てられた実レジスタに従って、オブジェクトプログラムを生成する生成手段とを備える。本構成によれば、プログラム部分を跨ぐ生存区間の変数と、当該変数と資源継承関係にある別の変数とに同じレジスタが割り当てられる可能性が高くなり、同じレジスタが割り当てられた場合には、資源継承関係にある変数と別の変数との間の転送命令を削除することができるので、無用な転送命令の数を低減することができるという効果がある。また、本発明に係るプログラム変換装置は、上記割り当て手段が、優先的に仮想レジスタに実レジスタを割り当てた後、ソースプログラム中の変数へのレジスタ割り当てを行うものであってもよい。また、本発明に係るプログラム変換装置は、上記割り当て手段が、すべての実レジスタのうち特定の機能を有する実レジスタ群のうちの1つの実レジスタを仮想レジスタに割り当てるものであってもよい。本構成によれば、仮想レジスタに割り当てられる実レジスタを特定の機能を有する実レジスタに限定することができるという効果がある。本発明の実施形態の説明に先だって、本発明に関連する文献を挙げ、以下で用いる用語について説明しておく。<文献>1.AVAhoRSethiJDUllmanCompilersPrincipleTechniquesandToolAddisonWesleyPublishingCompanyInc1986邦訳原田賢一:コンパイラI、IIサイエンス社19902.田中:資源割付装置及び資源割付プログラムが記録されたコンピュータ読み取り可能な記録媒体,出願番号特願平10-3445243.田中:コンパイラ装置及びコンパイラプログラムが記録されたコンピュータ読み取り可能な記録媒体およびコンパイル方法,出願番号特願平11-195717<用語の説明>変数の定義、参照、使用変数の値を設定することを定義すると呼び、設定した値を使用することを参照すると呼ぶ。またプログラム上で変数を定義したり、参照したりすることを、変数を使用すると呼ぶことにする。また、以下では仮引数も特に断らない限り変数と同様に扱う。一時変数コンパイラが計算結果を一時的に格納するために生成する変数や、処理の効率化を図る上で生成する変数のことを一時変数と呼ぶことにする。以下では特に断らない限り通常のソースプログラムで記述される変数と同様に扱う。中間命令処理をし易すくするためにコンパイラがソースプログラムのコードを中間的なコードに変換したものを中間コードと呼び、中間コードの1ステップを中間命令と呼ぶことにする。中間命令には4つ組や3つ組などが存在し、これらが変換されて最終的な目的プログラムオブジェクトプログラムが生成される。またソースプログラムを中間命令の列に変換したものを中間プログラムと呼ぶことにする。図6aは図5c関数f2のプログラムに対する中間プログラムの一例であり、4つ組の一つである3番地コードで表現している。また図6aのi1,i2など、iとそれに付随する番号で示したものは、中間命令の識別子を意味している。また、図5cのasmブロックは、図6aのように図面上は図5cと同一な形式の中間命令に変換されている。特に図6aのasmブロックの中間命令をasmブロック中間命令と呼ぶことにする。尚、本発明における中間命令は特にこの形式に限りるわけでなく他の形式の中間命令にも適用可能である。また、コンパイラ装置内の処理を簡単化するために、中間プログラムの最初と終りを表す中間命令や、関数の始めと終りを表す中間命令など特定のプログラム範囲を表す中間命令も用意されている。図6aでは中間命令i50,i51のように表現される関数の関数の始めと終りを示す中間命令が示されている。基本ブロック中間命令列のうち、中間命令列内部からの飛び越しも、また中間命令列内部への飛び越しもなく、中間命令列の実行順が一定順序である場合、その中間命令列を基本ブロックと言う。基本ブロックについては文献1に詳細に記載されている。生存区間生存区間とはそれぞれの変数に保持されている値が有効となる区間であり、正確には変数の値を定義する中間命令からその定義された値を最後に参照する中間命令までのプログラム上の区間のことである。また生存区間中において変数は生きていると言うことにする。生存区間のさらに詳しい説明は、文献1、2、3に記載されている。図7bが生存区間の一例である。図7bにおいて生存区間は縦線の実線で表されている。生存区間の開始点、及び終了点をそれぞれ白丸、黒丸で表現している。また、図7bのようにasmブロック中間命令に対する生存区間に関しては、asmブロック内のasm文毎の生存区間までも求める必要はなく、生存区間はasmブロック全体を表すもので十分である。変数への資源割り付け変数への資源割り付けとは、変数にレジスタやメモリを割り付けることである。一つのレジスタやメモリにはプログラムの同一区間で二つ以上の値を保持することは不可能であるため、生存区間が重なる変数には同じレジスタやメモリを割り付けることは不可能であり、異なるレジスタやメモリを割り付けることが必須となる。例えば、図7の変数mと変数s2s2に関しては後述の二つの生存区間が重なっており、それぞれの変数には異なるレジスタやメモリを割り付ける必要がある。以下ではレジスタやメモリを合わせて資源と呼ぶことにする。資源継承関係変数tと生存区間の始めと終りが一致し、同一の資源に割り付けると転送命令の発生を削減できる変数uが存在するとき、変数tと変数uは資源継承関係にあると言うことにする。例えば、図7bにおいて、変数eと変数t1、変数t1と変数m、変数mと変数t2はそれぞれ、資源継承関係にある。また、変数eと変数mは、間接的資源継承関係にあると言うことにする。資源継承関係の詳細な説明は文献2に記載されているので、これ以上の説明は省略する。得失値得失値とは、目的プログラムの転送命令の発生を抑える観点から考えて、既に変数に割り付けられた資源の要素レジスタやメモリを、これから割り付けようとする変数tに割り付けたとき、どれだけ転送命令の発生抑制に貢献するかを、変数tと資源継承関係または間接的資源継承関係にある変数に着目して定量化した値である。例えば、図7bにおいて、変数mにレジスタr0を割り付けると、中間命令i11は削除可能となるので、この場合、レジスタr0の得失値は増加し、得失値の算出結果から変数mにレジスタr0を割り付けると有利であると判断される。得失値の詳細な説明は文献2に記載されているので、これ以上の説明は省略する。<実施形態の説明>本実施形態のコンパイラ装置では、asmブロック内のレジスタの記述方法において、レジスタ名の前にv_をつけた場合は、特定のレジスタではなく、任意のレジスタを意味することとし、このv_付きのレジスタを仮想レジスタと呼ぶことにする。そして、その有効範囲は、asmブロック内であるとする。以下では、図5から図7のプログラム例を参照しながら説明を行なう。特に、図5aは従来技術の説明で用いた図12aのレジスタr0の使用部分を仮想レジスタv_r0としたものである。asmブロック中のレジスタを仮想レジスタで記述するのは、プログラム作成者が行なうものとする。図1は本実施形態のコンパイラ装置の構成図である。図1のコンパイラ装置1は、マクロ展開部11、構文解析部12、最適化部13、資源割付部14及びコード生成部15からなる一般的なコンパイラ装置を構成する部分と、レジスタ引数置換部16、asmブロック定義レジスタ検出部17、asmブロック定義レジスタ保持部18及びasmブロック生存区間生成部19からなる本発明に関係する部分から構成されている。次に各部の動作と機能について例を示しながら説明する。コンパイラ装置1はまず最初にマクロ展開部11を起動する。マクロ展開部11は、マクロ定義されたマクロ識別子をその本体で置き換える。この処理部分は一般的なC言語コンパイラのマクロプロセッサの処理と同様なので詳細説明は省略し処理結果の例について説明する。例えば、図5aがマクロ定義されたマクロdmであり、図5bがマクロdmのソースプログラムにおける使用例であり、図5cがマクロ展開部11によってマクロdmをその本体で置き換えた結果である。次にコンパイラ装置1は構文解析部12を起動する。構文解析部12はマクロ展開部11が出力するマクロ展開されたプログラムの字句解析、構文解析および意味解析を行い、コンパイラが処理し易い形の中間プログラムに変換する。例えば、図5cの関数f2は図6aの中間プログラムに変換される。この構文解析部12の詳細は本発明の主眼ではないので説明を省略する。次にコンパイラ装置1は最適化部13を起動する。最適化部13は、まず後述のレジスタ引数置換部16を起動し処理を終えた後、最終的にコンパイラ装置1が生成する目的プログラムのプログラムサイズ縮小化及び処理実行時間の短縮化を図るよう中間プログラムの最適化を行う。この最適化部13の詳細は本発明の主眼ではないので説明を省略し、本発明に関連のある点についてのみ説明する。最適化部13では、最適化を行なうために、基本ブロック解析、制御フロー解析、データフロー解析と言う処理を行なう。基本ブロック解析とは処理対象の中間プログラムを基本ブロックに分割することである。制御フロー解析とは各基本ブロック間の制御の流れを解析することである。データフロー解析とは各基本ブロック中、それぞれの変数がどこで定義され、どこで参照されているかについて解析することである。またこれらの解析結果から、後の資源割付部14は生存区間を算出する。最適化部13より起動されるレジスタ引数置換部16は、まずレジスタで渡される仮引数の値を一旦一時変数に格納する中間命令を関数の最初に挿入し、さらに中間プログラムの仮引数の使用部分を全て一時変数に置き換える。さらに、レジスタで引き渡す実引数の値を一旦一時変数に格納する中間命令を生成し、生成した関数呼び出しの前に挿入し、さらに一時変数に、引き渡しレジスタを割り付けるものである。例えば、図6bでは仮引数eを一旦一時変数t1に格納する中間命令i10を関数の最初に挿入し、仮引数eの使用箇所を一時変数t1に置き換えている。さらに、図6bでは実引数mに対して一旦一時変数t2に格納する中間命令i11を関数hの呼び出しの前に挿入し、一時変数t2を実引数として関数hを呼び出すように置き換えている。なお、ここで、仮引数eと、一時変数t2にはレジスタr0が割り付けられるものとする。次にコンパイラ装置1は資源割付部14を起動する。資源割付部14はまず最初にasmブロック定義レジスタ検出部17を起動する。asmブロック定義レジスタ検出部17は、中間プログラムからasmブロックの中間命令を抽出し、抽出したasmブロック内に存在するasm文で定義されるレジスタを検出し、結果をasmブロック定義レジスタ保持部18に格納する。図2はasmブロック定義レジスタ検出部17の処理フローチャートである。ステップa1では、全ての中間命令iについてステップa2からステップa3を繰り返し、全ての中間命令iについて処理を終えたらasmブロック定義レジスタ検出部17の処理を終了する。ステップa2では、中間命令iがasmブロック中間命令であるときステップa3を行なう。そうでないときはステップa1へ戻る。ステップa3では、仮想レジスタも含めて、中間命令iでレジスタrが定義されている場合、中間命令iとレジスタrをasmブロック定義レジスタ保持部18に格納し、ステップa1へ戻る。フローチャート終了例えば、図8はasmブロック定義レジスタ保持部18の図6bの中間プログラムの例に対する保持内容である。asmブロック中間命令毎に、asmブロック中間命令で定義するレジスタを保持しており、図6bのasmブロック中間命令i2では変数gの値が仮想レジスタv_r0に転送され、変数hの値が実レジスタr1に転送され、div命令では仮想レジスタv_r0が更新され、さらに実レジスタmdrも更新されるので、図8のasm文中間命令i2で定義されるレジスタの欄にはv_r0、r1、mdrが格納される。ステップa3。尚、ステップa3の処理において、asmブロックで定義されるレジスタを、単にasmブロックに出現するレジスタとして、処理の負荷を軽減させてももよい。なぜならば、特殊な場合を除いて、asmブロックで記述される大部分のレジスタは、asmブロック内で定義されてから参照されることが常だからである。次に資源割付部14は、最適化部13で解析された制御フロー情報とデータフロー情報を用いて、前述のレジスタ引数置換部16で生成した一時変数も含めて、全ての変数の生存区間を算出する。生存区間の算出方法は従来方式と同様なので詳細説明は省略し、ここでは、図6bの中間プログラム例に対する生存区間の算出結果を示すにとどめる。図7bが図6bの中間プログラムに対して生存区間を算出した結果である。生存区間は、文献2などのように中間命令の集合として表現されるが、ここでは直観的に解り易いように実線でその範囲を示している。また、図7bの仮引数eの生存区間に記載されているr0は、仮引数eにレジスタr0が割り付けられていることを意味している。一時変数t2も同様である。但し、変数s1、s2の生存区間は次に説明するasmブロック生存区間生成部19で生成さるものである。さらに資源割付部14は、asmブロック生存区間生成部19を起動して、asm文で定義されるレジスタに割り付けられた特殊な一時変数とその生存区間を生成する。図3がasmブロック生存区間生成部19の処理フローチャートである。ステップb1では、全てのasmブロック中間命令iについてステップd2からステップd5まで繰り返し、処理を終えたらasmブロック生存区間生成部19の処理を終了する。ステップb2では、仮想レジスタも含めて、asmブロック定義レジスタ保持部18からasmブロック中間命令iで定義されるレジスタrが存在するとき、全てのレジスタrに対して、ステップd3からステップd5を行ない、そうでないときはステップd1へ戻る。ステップb3では、新たに一時変数sを生成する。ステップb4では、生成した一時変数sに対してasmブロック中間命令iで生存区間が開始し終了する生存区間を生成する。ステップb5では、生成した一時変数sにレジスタrを割り付け、ステップd1へ戻る。フローチャート終了例えば、図7bにおいて、s1,s2が、asmブロック生存区間生成部19で生成された特殊な一時変数であり、生存区間が中間命令i2においてしか存在しておらず、かつ、一時変数s1には仮想レジスタv_r0一時変数s2には実レジスタr1が割り付けられている。尚、図7の例では、中間命令i2のdiv命令において、レジスタmdrも値が更新さるが、ここでは、レジスタmdr自体は変数への割り付けレジスタとはしないこととするので、レジスタmdrに割り付けられた一時変数は生成していない。次に資源割付部14は、前述のレジスタ引数置換部16で生成した未だレジスタが未割り付けの一時変数図7の例では一時変数t1および、asmブロック生存区間生成部19で生成した一時変数のうち仮想レジスタに割り付けられた一時変数図7の例では一時変数s1も含めた変数への資源割り付けを行なう。特に資源割付部14は、仮想レジスタに割り付けられた一時変数への割り付けを優先する。この割り付けのとき、仮想レジスタに割り付けられた一時変数と生存区間が重なる変数へ割り付けるべきレジスタを考慮してレジスタを割り付ける。図4が資源割付部14の処理フローチャートである。ステップc1では、全ての、仮想レジスタに割り付けられた変数sについてステップc2からステップc3まで繰り返し、全ての変数sについて処理を終えたらステップc5に進む。ステップc2では、変数sと生存区間が重なる変数に割り付けられているレジスタの集合R1を求める。ステップc3では、変数sと生存区間が重なる全ての変数tについて、変数tと資源継承関係または、間接的資源継承関係にある変数に着目して得失値を算出する。ステップc4では、集合R1に属さずかつ、ステップc3で求めた得失値が最小のレジスタを変数sに割り付ける。得失値が大きいレジスタは、変数tに割り付けた方が有利であるので、ここでは得失値のより小さいレジスタを変数sに割り付ける。尚、この得失値の詳細は文献2で述べられている資源排他関係にある変数文献2では割付対象に対する得失値計算と同様である。ここで変数sに得失値さ最小のレジスタを割り付けるとしているが、得失値が最小のレジスタに限らず、例えば得失値が最大ではないレジスタとしてもよい。ステップc5では、残りの全ての変数vについてステップc6からステップc9まで繰り返し、全ての変数vについて処理を終えたら資源割付部14の処理を終了する。ステップc6では、変数vと生存区間が重なる変数に割り付けられているレジスタの集合R2を求める。ステップc7、集合R2に属さないレジスタが存在しないときは変数vにメモリを割り付けステップc5に戻る。ステップc8では、変数vに関して得失値を算出する。ステップc9では、集合R2に属さないレジスタのうち、ステップc8で求めた得失値が最大のレジスタを変数vに割り付け、ステップc5に戻る。フローチャート終了尚、上記ステップc5からステップc9の変数vへの資源割り付けは、文献2と同様のより厳密な資源割り付けを行なってもよい。図7bの例では、一時変数s1へのレジスタ割り付けにおいて、まずステップc2で、一時変数s1と生存区間が重なる一時変数s2に割り付けられているレジスタr1を要素とする集合R1が求められる。次にステップc3では、一時変数s1と生存区間が重なる変数mについて得失値が求められ、この例の場合は、レジスタr0の得失値が最大となる。次にステップc4では、集合R1に属さない、つまりレジスタr1ではなく、かつ、変数mの得失値からレジスタr0でもない、レジスタr2が一時変数s1への割り付けレジスタとして選択される。また、変数mへのレジスタ割り付けにおいては、まず、ステップc6で、変数mと生存区間が重なる一時変数s1、s2に割り付けられているレジスタr2、r1を要素とする集合R2が求められる。次にステップc8では変数mの得失値が求められ、この例ではレジスタr0の得失値が最大となる。次にステップc9では、集合R2に属しておらず得失値が最大のレジスタr0が変数mへの割り付けレジスタとして選択される。変数t1も同様にレジスタr0に割り付けられる。結果、図7aの中間プログラムは、図7cのように変換され、asmブロック中間命令中の仮想レジスタv_r0は実レジスタr2に置き換えられ、また、中間命令i10、i11は同一レジスタへの転送となるので削除が可能となる。次にコンパイラ装置1はコード生成部15を起動し、中間命令をコンパイラがターゲットとするマシンのアセンブラ命令または機械語命令などの目的プログラムに変換する。コード生成部15自体は従来方式と同様なので詳細説明は省略する。以上述べた通り、図7、図8のasmブロック中間命令i2内で記述されている仮想レジスタv_r0はレジスタr2に置き換えられ、変数mはレジスタr0に割り付け可能となり、中間命令i11が削除できる。このように、asmブロックが記述された場所、または、asmブロックで定義されたマクロが記述された場所の状況によって、asmブロック内で記述された仮想レジスタがより適切な実レジスタに置き換わるので、より効率のよいコード生成を行なうことが可能となる。以下に図5から図7のプログラム例とは別のプログラム例を図9から図11を用いて説明する。図9aは図5aと同様のマクロ定義されたマクロdmであり、従来技術の説明で用いた図9aのレジスタr0の使用部分を仮想レジスタv_r0としたものである。asmブロック中のレジスタを仮想レジスタで記述するのは、プログラム作成者が行なうものとする。図9bはマクロdmのソースプログラムにおける使用例であり、図9cがマクロ展開部11によってマクロdmをその本体で置き換えた結果である。図9cの関数f2は図10aの中間プログラムに変換される。図10bは、図10aの中間プログラムに対して、レジスタ引数置換部16によって仮引数eを一旦一時変数t1に格納する中間命令i10が挿入され、実引数mに対して一旦一時変数t2に格納する中間命令i11と実引数nに対して一旦一時変数t3に格納する中間命令i12とが関数hの呼び出しの前に挿入されている。仮引数の使用部分が一時変数に置き換えられている。図11bは図10bの中間プログラムに対して生存区間を算出した結果である。ここで仮引数eに記載されているr0は、仮引数eにレジスタr0が割り付けられていることを意味する。同様に一時変数t2、t3にはそれぞれレジスタr0、r1が割り付けられていることを意味する。図11bの例において図4に示すフローチャートが実行された場合、一時変数s1へのレジスタ割り付けにおいて、まずステップc2で、一時変数s1と生存区間が重なる一時変数s2に割り付けられているレジスタr2を要素とする集合R1が求められる。次にステップc3では、一時変数s1と生存区間が重なる変数m、nについて得失値が求められ、この例の場合は、変数mについてはレジスタr0、変数nについてはr1の得失値が最大となる。次にステップc4では、集合R1に属さない、つまりレジスタr1ではなく、かつ、変数m、nの得失値からレジスタr0でもr1でもr2でもない、レジスタr3が一時変数s1への割り付けレジスタとして選択される。また、変数mへのレジスタ割り付けにおいては、まず、ステップc6で、変数mと生存区間が重なる一時変数s1、s2に割り付けられているレジスタr3、r2を要素とする集合R2が求められる。次にステップc8では変数mの得失値が求められ、この例ではレジスタr0の得失値が最大となる。次にステップc9では、集合R2に属しておらず得失値が最大のレジスタr0が変数mへの割り付けレジスタとして選択される。変数nも同様にレジスタr1に割り付けられる。変数t1、eも同様にしてレジスタr1に割り付けられる。結果、図11aの中間プログラムは、図11cのように変換され、asmブロック中間命令中の仮想レジスタv_r0は実レジスタr3に置き換えられ、また、中間命令i10、i11は同一レジスタへの転送となるので削除が可能となる。以上のようにプログラム部分実施例においてはasmブロック内で記述されている仮想レジスタの置換えレジスタを、プログラム部分に跨って生きている変数を考慮して決定することが可能となり、より効率のよいコード生成が可能となる。また、仮想レジスタ記述を含んだプログラム部分をしようして定義された、C言語のマクロ関数や、C言語のinline指定関数など、ソースプログラムにインラインされる埋め込まれる関数は、ソースプログラムの任意の場所に記述でき、かつ記述された場所の使用状況に応じて、仮想レジスタがより適切な実レジスタに置き換えられるのでコンパイラの生成コード効率が一段と高まる。以上本発明にかかるプログラム変換装置コンパイラ装置について実施形態に基いて説明したが本発明はこれらの実施形態に限らず、以下のようにしてもよい。1本実施の形態の具体例ではasmブロック内の仮想レジスタに対してのみコンパイラがより適切なレジスタに置き換える方式について示したが、特に仮想レジスタ記述を設けずに、asmブロック内の全てのレジスタ記述を仮想レジスタとして扱い、コンパイラがasmブロック内の全てのレジスタを適切なレジスタに置き換えることも可能である。2仮想レジスタが置き換えられるレジスタに制限を設けてもよい。例えばコンパイラでは、関数の始めでレジスタの値をメモリに退避し、関数の終りでレジスタの値を復帰する必要がある保証レジスタと、その必要がない破壊レジスタを設けることが一般的である。そのため、仮想レジスタの置き換えレジスタを破壊レジスタのいずれかにできると効率の良いコード生成が可能となる場合がある。この場合コンパイラ装置1は、破壊レジスタの集合を予め記憶し、図4のステップc4の処理において、破壊レジスタの集合に属し、集合R1に属さずかつステップc3で求めた得失値が最小のレジスタを変数sに割り付けるよう構成すればよい。このように本発明は、例えば破壊レジスタ等の特定の機能を有する実レジスタの集合のうちの1つの実レジスタを仮想レジスタに割り付けるよう構成してもよい。特定の機能を有する実レジスタの種類としては、破壊レジスタ以外に、アドレスレジスタやデータレジスタ等がある。3またアドレスレジスタ、データレジスタのように特定の機能を有する実レジスタの集合が複数ある場合において、これら複数の集合のうちの1つの集合のうちの1つの実レジスタを仮想レジスタに割り当てるよう構成してもよい。この場合、仮想レジスタの種類を仮想レジスタv_Ari、v_Briというように特定の機能を有する集合それぞれに対応するように設け、プログラマはそれら複数種類の仮想レジスタを使い分けた記述を行う。コンパイラ装置1は、仮想レジスタの種類と特定の機能を有する集合とを対応させて記憶しており、ソースプログラム中の仮想レジスタの種類に応じて、対応する特定の機能を有する集合に属し、当該仮想レジスタに割り付けられた変数sと生存区間が重なる変数に割り付けられた実レジスタの集合に属さずつまりR1に属さない、得失値が最小の実レジスタを変数sに割り付ける。より具体的には、図4の資源割付部14のフローチャートのステップc4をステップ4において、変数sに割り付けられている仮想レジスタの種類に対応する、特定の機能を有する集合に属し、集合R1に属さず、かつ、ステップ3で求めた得失値が最小のレジスタを変数sに割り付けるとなる。4以上の実施例では説明の簡単化のために、除算命令に関するものについて述べたが、単に除算命令に対してのみ適用できるだけでなく、積和演算命令などのマルチメディア処理対応の高機能命令にも適用できることは言うまでもない。5コンパイラ装置1の各構成要素の動作手順、特に図2、3、4に示すフローチャートに示した手順を、汎用のコンピュータ又はプログラム実行機能を有する機器等に実行させるためのコンピュータプログラムを、記録媒体に記録し又は各種通信路等を介して、流通させ頒布することもできる。このような記録媒体にはICカード、光ディスク、フレキシブルディスク、ROM等がある。"