(57)【特許請求の範囲】
【請求項１】
アセンブラブロックを含む高級言語プログラムをアセンブラプログラムに変換するプログラム変換装置であって、
前記高級言語プログラムを中間プログラムに変換する構文解析部と前記中間プログラムの最適化を行う最適化部を備え、
前記構文解析部は、
前記アセンブラブロックの変数アクセス指定記述部において第１の制約文字と関連して指定される変数と第２の制約文字と関連して指定される変数とを検出し、前記アセンブラブロックに含まれるアセンブラ命令列を検出し、前記第１の制約文字と関連して指定される変数を含むａｓｍ参照変数集合と、前記第２の制約文字と関連して指定される変数を含むａｓｍ定義変数集合と、前記アセンブラ命令列に対応する命令列であるａｓｍアセンブラ命令列を含むａｓｍブロック中間命令を生成するａｓｍブロック解析部を含み、
前記最適化部は、
前記ａｓｍブロック中間命令を含む中間命令列から構成される基本ブロックにおいて、
前記ａｓｍブロック中間命令の前記ａｓｍ定義変数集合に格納されている変数を定義している中間命令であり、かつ前記基本ブロック内で前記ａｓｍブロック中間命令の前に該変数を定義する中間命令を集合から削除するように生成されたＤＥＦ集合を算出するＤＥＦ集合算出部と、前記ａｓｍブロック中間命令の前記ａｓｍ定義変数集合に格納されている変数を前記基本ブロック外の基本ブロックで定義する中間命令を集合に含めるように生成されたＫＩＬＬ集合を算出するＫＩＬＬ集合算出部を含み、前記最適化部は、前記ＤＥＦ集合と前記ＫＩＬＬ集合から到達する定義を算出し、前記ａｓｍ参照変数集合に格納されている変数を定義している中間命令であって、前記到達する定義で前記ａｓｍブロック中間命令に到達しているものがあるとき、前記中間命令と前記ａｓｍブロック中間命令を参照定義連鎖情報として関連付けることを特徴とするプログラム変換装置。
【請求項２】
前記ａｓｍブロック解析部は、
前記第２の制約文字が全変数を示すものであるとき、全変数であることを示す記号を含むように前記ａｓｍ定義変数集合を生成することを特徴とする請求項１記載のプログラム変換装置。
【請求項３】
前記ａｓｍ定義変数集合に全変数であることを示す記号が含まれているとき、前記ＤＥＦ集合算出部は、前記ａｓｍブロック中間命令の前で変数を定義する全ての中間命令を前記ＤＥＦ集合から削除することを特徴とする請求項２記載のプログラム変換装置。
【請求項４】
前記ａｓｍブロック解析部は、
前記アセンブラブロックの入力記述部における、第１の変数を含む代入元から第１のレジスタを代入先とする代入式より、前記第１のレジスタに割り付けた第１の一時変数と、前記第１の変数を含む代入元から前記第１の一時変数を代入先とする代入式に相当する第１の中間命令とを生成し、前記アセンブラブロックの出力記述部における、代入元である第２のレジスタから第２の変数を含む代入先への代入式より、前記第２のレジスタに割り付けた第２の一時変数と、代入元である前記第２の一時変数から前記第２の変数を含む代入先への代入式に相当する第２の中間命令とを生成し、
前記最適化部は、
前記第１の中間命令と前記ａｓｍブロック中間命令と前記第２の中間命令を含む中間命令列から構成される基本ブロックにおいて、前記ａｓｍブロック中間命令の前記ａｓｍ定義変数集合に格納されている変数を定義している中間命令であり、かつ前記基本ブロック内で前記ａｓｍブロック中間命令の前に該変数を定義する中間命令を集合から削除するように生成されたＤＥＦ集合を算出するＤＥＦ集合算出部と、前記ａｓｍブロック中間命令の前記ａｓｍ定義変数集合に格納されている変数を前記基本ブロック外の基本ブロックで定義する中間命令を集合に含めるように生成されたＫＩＬＬ集合を算出するＫＩＬＬ集合算出部を含むことを特徴とする請求項１記載のプログラム変換装置。
【請求項５】
アセンブラブロックを含む高級言語プログラムをコンパイルすることでアセンブラプログラムに変換するプログラム変換方法であって、
前記高級言語プログラムを中間プログラムに変換する構文解析ステップと前記中間プログラムの最適化を行う最適化ステップを備え、
前記構文解析ステップは、
前記アセンブラブロックの変数アクセス指定記述部において第１の制約文字と関連して指定される変数と第２の制約文字と関連して指定される変数とを検出し、前記アセンブラブロックに含まれるアセンブラ命令列を検出し、前記第１の制約文字と関連して指定される変数を含むａｓｍ参照変数集合と、前記第２の制約文字と関連して指定される変数を含むａｓｍ定義変数集合と、前記アセンブラ命令列に対応する命令列であるａｓｍアセンブラ命令列を含むａｓｍブロック中間命令を生成するａｓｍブロック解析ステップを含み、
前記最適化ステップは、
前記ａｓｍブロック中間命令を含む中間命令列から構成される基本ブロックにおいて、
前記ａｓｍブロック中間命令の前記ａｓｍ定義変数集合に格納されている変数を定義している中間命令であり、かつ前記基本ブロック内で前記ａｓｍブロック中間命令の前に該変数を定義する中間命令を集合から削除するように生成されたＤＥＦ集合を算出するＤＥＦ集合算出ステップと、前記ａｓｍブロック中間命令の前記ａｓｍ定義変数集合に格納されている変数を前記基本ブロック外の基本ブロックで定義する中間命令を集合に含めるように生成されたＫＩＬＬ集合を算出するＫＩＬＬ集合算出ステップを含み、前記最適化ステップは、前記ＤＥＦ集合と前記ＫＩＬＬ集合から到達する定義を算出し、前記ａｓｍ参照変数集合に格納されている変数を定義している中間命令であって、前記到達する定義で前記ａｓｍブロック中間命令に到達しているものがあるとき、前記中間命令と前記ａｓｍブロック中間命令を参照定義連鎖情報として関連付けることを特徴とするプログラム変換方法。
【請求項６】
前記ａｓｍブロック解析ステップは、
前記第２の制約文字が全変数を示すものであるとき、全変数であることを示す記号を含むように前記ａｓｍ定義変数集合を生成することを特徴とする請求項５記載のプログラム変換方法。
【請求項７】
前記ａｓｍ定義変数集合に全変数であることを示す記号が含まれているとき、前記ＤＥＦ集合算出ステップは、前記ａｓｍブロック中間命令の前に変数を定義する全ての中間命令を前記ＤＥＦ集合から削除することを特徴とする請求項６記載のプログラム変換方法。
【請求項８】
前記ａｓｍブロック解析ステップは、
前記アセンブラブロックの入力記述部における、第１の変数を含む代入元から第１のレジスタを代入先とする代入式より、前記第１のレジスタに割り付けた第１の一時変数と、前記第１の変数を含む代入元から前記第１の一時変数を代入先とする代入式に相当する第１の中間命令とを生成し、前記アセンブラブロックの出力記述部における、代入元である第２のレジスタから第２の変数を含む代入先への代入式より、前記第２のレジスタに割り付けた第２の一時変数と、代入元である前記第２の一時変数から前記第２の変数を含む代入先への代入式に相当する第２の中間命令とを生成し、
前記最適化ステップは、
前記第１の中間命令と前記ａｓｍブロック中間命令と前記第２の中間命令を含む中間命令列から構成される基本ブロックにおいて、前記ａｓｍブロック中間命令の前記ａｓｍ定義変数集合に格納されている変数を定義している中間命令であり、かつ前記基本ブロック内で前記ａｓｍブロック中間命令の前に該変数を定義する中間命令を集合から削除するように生成されたＤＥＦ集合を算出するＤＥＦ集合算出ステップと、前記ａｓｍブロック中間命令の前記ａｓｍ定義変数集合に格納されている変数を前記基本ブロック外の基本ブロックで定義する中間命令を集合に含めるように生成されたＫＩＬＬ集合を算出するＫＩＬＬ集合算出ステップを含むことを特徴とする請求項５記載のプログラム変換方法。
【請求項９】
アセンブラブロックを含む高級言語プログラムをアセンブラプログラムに変換する処理をコンピュータに実行させるためのプログラムを記録したコンピュータ読み取り可能な記録媒体であって、
当該プログラムは、
前記高級言語プログラムを中間プログラムに変換する構文解析手順と前記中間プログラムの最適化を行う最適化手順を前記コンピュータに実行させ、
前記構文解析手順は、
前記アセンブラブロックの変数アクセス指定記述部において第１の制約文字と関連して指定される変数と第２の制約文字と関連して指定される変数とを検出し、前記アセンブラブロックに含まれるアセンブラ命令列を検出し、前記第１の制約文字と関連して指定される変数を含むａｓｍ参照変数集合と、前記第２の制約文字と関連して指定される変数を含むａｓｍ定義変数集合と、前記アセンブラ命令列に対応する命令列であるａｓｍアセンブラ命令列を含むａｓｍブロック中間命令を生成するａｓｍブロック解析手順を含み、
前記最適化手順は、
前記ａｓｍブロック中間命令を含む中間命令列から構成される基本ブロックにおいて、
前記ａｓｍブロック中間命令の前記ａｓｍ定義変数集合に格納されている変数を定義している中間命令であり、かつ前記基本ブロック内で前記ａｓｍブロック中間命令の前に該変数を定義する中間命令を集合から削除するように生成されたＤＥＦ集合を算出するＤＥＦ集合算出手順と、前記ａｓｍブロック中間命令の前記ａｓｍ定義変数集合に格納されている変数を前記基本ブロック外の基本ブロックで定義する中間命令を集合に含めるように生成されたＫＩＬＬ集合を算出するＫＩＬＬ集合算出手順を含み、前記最適化手順は、前記ＤＥＦ集合と前記ＫＩＬＬ集合から到達する定義を算出し、前記ａｓｍ参照変数集合に格納されている変数を定義している中間命令であって、前記到達する定義で前記ａｓｍブロック中間命令に到達しているものがあるとき、前記中間命令と前記ａｓｍブロック中間命令を参照定義連鎖情報として関連付けることを特徴とするプログラムを記録した記録媒体。
【請求項１０】
前記ａｓｍブロック解析手順は、
前記第２の制約文字が全変数を示すものであるとき、全変数であることを示す記号を含むように前記ａｓｍ定義変数集合を生成することを特徴とする請求項９記載の記録媒体。
【請求項１１】
前記ａｓｍ定義変数集合に全変数であることを示す記号が含まれているとき、前記ＤＥＦ集合算出ステップは、前記ａｓｍブロック中間命令の前に変数を定義する全ての中間命令を前記ＤＥＦ集合から削除することを特徴とする請求項１０記載の記録媒体。
【請求項１２】
前記ａｓｍブロック解析手順は、
前記アセンブラブロックの入力記述部における、第１の変数を含む代入元から第１のレジスタを代入先とする代入式より、前記第１のレジスタに割り付けた第１の一時変数と、前記第１の変数を含む代入元から前記第１の一時変数を代入先とする代入式に相当する第１の中間命令とを生成し、前記アセンブラブロックの出力記述部における、代入元である第２のレジスタから第２の変数を含む代入先への代入式より、前記第２のレジスタに割り付けた第２の一時変数と、代入元である前記第２の一時変数から前記第２の変数を含む代入先への代入式に相当する第２の中間命令とを生成し、
前記最適化手順は、
前記第１の中間命令と前記ａｓｍブロック中間命令と前記第２の中間命令を含む中間命令列から構成される基本ブロックにおいて、前記ａｓｍブロック中間命令の前記ａｓｍ定義変数集合に格納されている変数を定義している中間命令であり、かつ前記基本ブロック内で前記ａｓｍブロック中間命令の前に該変数を定義する中間命令を集合から削除するように生成されたＤＥＦ集合を算出するＤＥＦ集合算出手順と、前記ａｓｍブロック中間命令の前記ａｓｍ定義変数集合に格納されている変数を前記基本ブロック外の基本ブロックで定義する中間命令を集合に含めるように生成されたＫＩＬＬ集合を算出するＫＩＬＬ集合算出手順を含むことを特徴とする請求項９記載の記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、高級プログラミング言語で書かれたソースプログラムを機械語プログラムやアセンブラプログラムなどの目的プログラムに翻訳するプログラム言語処理系において、高級プログラミング言語で書かれたプログラム部分と、プログラムの特定部分を高速実行するために、より機械語に近いアセンブラ言語で記述した部分の両方を含むソースプログラムを翻訳するプログラム変換装置、プログラム変換方法及び記録媒体に関する。
【０００２】
【従来の技術】
近年、機器組み込み用プロセッサとともに機器に搭載されるプログラム（以下、組み込みプログラムと呼ぶ）の規模が増大し、組み込みプログラムと言えども、そのプログラム開発はＣ言語などの高級言語で行なわれるのが一般的である。特に、近年急速に発展している通信、画像、文字、音声処理などを扱う、マルチメディア処理を行なう情報機器に搭載される組み込みプログラムでは、プログラムサイズが増大し、高級言語開発は必須となっている。
【０００３】
ところで、これらマルチメディア処理は、大量のデータを高速に処理する事が要求されるため、頻繁に実行されかつ短時間実行を強く要求されるプログラム部分は、高級言語を用いた記述をせずに、機械語に近いアセンブラ言語による記述を行なうことが多い。これは、高級言語記述を用いたプログラム部分は、コンパイラによって、より機械語に近いアセンブラ言語などに変換されるが、コンパイラでは高級言語記述された様々な形のプログラムを想定して翻訳処理を行なうので、どうしても冗長なアセンブラ言語プログラムに変換してしまう場合があるからである。
【０００４】
そこで高級言語、特にＣ言語の拡張機能として、Ｃ言語記述部分にアセンブラ言語記述部分を埋め込むことができる、「インラインアセンブラ機能」を有するコンパイラが多数存在している。
【０００５】
図１２がインラインアセンブラ機能を使って、Ｃ言語記述部分にアセンブラ言語記述部分を挿入した例である。アセンブラ言語記述部分は図１２のように、「ａｓｍ」キーワードを用いて、アセンブラ記述部分を特定することが一般的である。また、図１２のアセンブラ記述部分の処理は、変数ａを変数ｂで割算した場合の除算結果と剰余算結果を、それぞれ変数ｃ、ｄに格納するものである。ここで、除算命令「ｄｉｖ  ｒｍ，ｒｎ」は、レジスタｒｎをレジスタｒｍで除算し、除算結果をｒｎに格納し、剰余結果を特殊レジスタｍｄｒに格納することを意味する。このように多くのマイクロプロセッサの除算命令は、除算と剰余算を１命令で同時に算出することが可能である。また図１２などに記述されている転送命令ｍｏｖは第１オペランドの値を第２オペランドに転送することを意味する。
【０００６】
ところで、図１２においてＣ言語記述で除算と剰余算を行なう場合は、「ｃ＝ａ／ｃ」「ｄ＝ａ％ｃ」と記述するのが自然である。しかし、この場合コンパイラは除算演算と剰余演算毎にｄｉｖ命令を生成してしまう（つまりｄｉｖ命令を２回実行してしまう）。さらに、ｄｉｖ命令は他の機械命令と比較して実行時間が長いので図１２のように、インラインアセンブラ機能を使って１回のｄｉｖ命令で除算と剰余算を求める方が効率がよい。また、実際にはこの例だけでなくマルチメディア処理で多用される積和演算など、Ｃ言語記述では直接書けない演算などにもインラインアセンブラ機能を使って記述した方が実行効率が向上するため非常に有用な機能である。以下、説明の簡単化のために「ａｓｍ」キーワードを用いたアセンブラ記述部分を「ａｓｍブロック」と呼ぶことにする。
【０００７】
次に従来のプログラム変換装置について説明する。従来のプログラム変換装置は、ソースプログラムをアセンブラプログラムに変換するコンパイラと、アセンブラプログラムをターゲットの機械プログラムに変換するアセンブラで構成される。図１１のプログラム変換装置に示すように、コンパイラ２１は、高級言語（例えばＣ言語）の文法を解析する機能と言語記述の意味を解析する機能を有しかつ、ソースプログラムを後述のコンパイラ内部のプログラム表現である中間命令列に変換する高級言語構文解析部２２と、最終の機械語プログラムが効率良く実行できるように中間命令列を最適化する最適化部２３と、中間命令列上の変数へメモリやレジスタを割り付ける資源割付部２４と、中間命令列をアセンブラプログラムに変換するアセンブラコード生成部２５より構成される。さらに、アセンブラ２６は、アセンブラ言語の文法を解析する機能とアセンブラ言語の意味を解析する機能を有するアセンブラ言語構文解析部２７と、アセンブラプログラムを機械語プログラムに変換するオブジェクトコード生成部２８より構成される。
【０００８】
このようにプログラム変換装置２０をコンパイラ２１とアセンブラ２６で分けて構成することのメリットは、例えば、Ｃ、Ｃ＋＋、ｊａｖａ、ＦＯＲＴＲＡＮなど複数の高級言語に対するプログラム変換装置を作成する場合に、コンパイラ部分を新たに作成するだけで済む点や、コンパイラ終了時のアセンブラコード生成時のプログラム状態を見ることによるデバッグ容易性や、アセンブラ単独でのプログラム開発可能性の点など、役割分担により処理単位の単純化と独立性が増し開発工数の削減と保守性の向上が図れる点にある。
【０００９】
【発明が解決しようとする課題】
ここで、Ｃ言語プログラムを例にして、まず第１の課題について説明する。従来方法ではａｓｍブロックにＣ言語変数を記述する場合は注意が必要である。例えば図１２を図１３（１）に示すようにｍｏｖ  ｂ，ｒ１を削除して、ｄｉｖ  ｒ１，ｒ０をｄｉｖ  ｂ，ｒ０に置き換えることも記述としては可能である。しかし、ターゲットマシンが、ロードストア形式のマシンであり、ｄｉｖ命令の第一オペランドにメモリオペランドを許さない場合は、アセンブラでエラーを発生してしまう。何故かというとコンパイラはアセンブラ言語構文解析部２７の機能を有しないので、ｄｉｖ  ｂ，ｒ０が正しいアセンブラ言語記述であるのか否かは判断できないからである。この場合は、変数ｂが外部変数であり、外部変数は必ずメモリに割り付けられるので、プログラマが注意して、変数ｂをｄｉｖの第一オペランドに書かないように注意することも可能である。しかし、図１３（２）の場合は事情が異なってくる。図１３（２）の変数ｂは自動変数であり、この場合、変数ｂはコンパイラによりレジスタかメモリのどちらかに割り付けられる。よってレジスタに割り付けられればアセンブラエラーは発生しないが、メモリに割り付けられればエラーが発生するということになり、プログラマが注意しても仕方の無い状況が発生する。
【００１０】
第２の課題は、図１４（１）のように自動変数ｂをａｓｍブロック内に記述した場合である。ここでコンパイラ２１がたまたま変数ｂへレジスタｒ０を割り付けてしまうと、ｍｏｖ  ａ，ｒ０により変数ｂの値が破壊されて誤った計算をしてしまう。これはもちろんプログラマがａｓｍブロック内の記述を注意することで回避できるものではなく、コンパイラが回避しなくてはならない。しかし、そのためには、図１４（１）の矢印ｓ１で代入された変数ｂの値が矢印ｓ３で参照されており、さらに矢印ｓ２で設定されたレジスタｒ０の値が矢印ｓ４で参照されていることを解析した上で、変数ｂにはレジスタｒ０以外のレジスタを割り付けることをしなくてはならない。しかし、この解析を行なうにはアセンブラ言語の文法解析と意味解析を行なう必要があり、結局図１１のアセンブラ言語構文解析部２７と同等の解析機能が必要となり、さらに、ａｓｍブロック内でレジスタがどこで値が設定されどこで参照されるかといった、いわゆるデータフロー解析（後述の文献１を参照）が必要となる。つまり、コンパイラ２１によるａｓｍブロック内の詳細な解析を必要とし、これは、コンパイラ開発の工数の増大と、アセンブラ命令追加時の保守コストの増加を招きかねない。
【００１１】
第３の課題は外部変数に関わるものであり、ａｓｍブロックではどの外部変数がどのようにアクセスされるかは正確には判明しないので、ａｓｍブロックが置かれている付近において、外部変数に対するコンパイラにおける最適化処理に制約が課せられてしまうということである。例えば、図１４（２）において、ａｓｍブロックでは外部変数ｇの値は更新されないので、矢印ｓ１の変数ｇを値１０と置き換えて、変数ａに直接値１５を代入するような最適化処理の可能が存在することが解る。この最適化を行なうには、ａｓｍブロック内で外部変数ｇの値は更新されないことを解析する必要がある。しかし、この解析を行なうにはａｓｍブロック内のアセンブラ命令の文法解析と意味解析を行なう必要があり、課題２と同様の不具合が発生してしまう。よって、コンパイラが不正なアセンブラプログラムを生成しないという安全側に立つ場合は、ａｓｍブロック内で変数ｇに対する更新があるとして、コンパイラは変数ｇに対する最適化を抑制してしまう。
【００１２】
仮に、第３の課題の解決策として、コンパイラ２１にアセンブラ言語構文解析部２７と同等の解析機能を持たせたとしても、かなり複雑な解析を要する状況が発生する。例えば図１５の矢印ｓ１のようなレジスタ間接によって値が更新される命令がある場合や、同図の矢印ｓ２のような関数呼び出しがある場合や、同図の矢印ｓ３のようなａｓｍブロックの外に分岐がある場合は、更にそれぞれの命令や分岐先で変数ｇが更新されないか解析する必要がある。しかし、この解析にはアセンブラ言語構文解析部２７だけでなく、Ｃ言語の変数や、レジスタが保持する値のデータフロー解析および、分岐先をたどる為の制御フロー解析（後述の文献［１］参照）が必要であり、さらに、図１５の矢印ｓ２、ｓ３の分岐先がコンパイルしているファイルとは異なる場合は、ファイル間にまたがった解析も必要となる。
【００１３】
そこで本発明の目的は、第１、２の課題に関しては、ａｓｍブロックにおけるＣ言語変数の記述を特定の場所のみに限定することとし、さらに、第３の課題に関しては、ａｓｍブロック内で値の更新および参照がある外部変数をプログラマが指定可能とすることとし、これらに対応した処理部分を実装するだけで、コンパイラ開発工数と保守コストの増大を抑え、かつ、ａｓｍブロックを使用した高効率プログラムが生成可能なプログラム変換装置を提供することである。
【００１４】
【課題を解決するための手段】
上記目的を達成するために、本発明のプログラム変換装置は、アセンブラブロックを含む高級言語プログラムをアセンブラプログラムに変換するプログラム変換装置であって、前記高級言語プログラムを中間プログラムに変換する構文解析部と前記中間プログラムの最適化を行う最適化部を備え、前記構文解析部は、前記アセンブラブロックの変数アクセス指定記述部において第１の制約文字と関連して指定される変数と第２の制約文字と関連して指定される変数とを検出し、前記アセンブラブロックに含まれるアセンブラ命令列を検出し、前記第１の制約文字と関連して指定される変数を含むａｓｍ参照変数集合と、前記第２の制約文字と関連して指定される変数を含むａｓｍ定義変数集合と、前記アセンブラ命令列に対応する命令列であるａｓｍアセンブラ命令列を含むａｓｍブロック中間命令を生成するａｓｍブロック解析部を含み、前記最適化部は、前記ａｓｍブロック中間命令を含む中間命令列から構成される基本ブロックにおいて、前記ａｓｍブロック中間命令の前記ａｓｍ定義変数集合に格納されている変数を定義している中間命令であり、かつ前記基本ブロック内で前記ａｓｍブロック中間命令の前に該変数を定義する中間命令を集合から削除するように生成されたＤＥＦ集合を算出するＤＥＦ集合算出部と、前記ａｓｍブロック中間命令の前記ａｓｍ定義変数集合に格納されている変数を前記基本ブロック外の基本ブロックで定義する中間命令を集合に含めるように生成されたＫＩＬＬ集合を算出するＫＩＬＬ集合算出部を含み、前記最適化部は、前記ＤＥＦ集合と前記ＫＩＬＬ集合から到達する定義を算出し、前記ａｓｍ参照変数集合に格納されている変数を定義している中間命令であって、前記到達する定義で前記ａｓｍブロック中間命令に到達しているものがあるとき、前記中間命令と前記ａｓｍブロック中間命令を参照定義連鎖情報として関連付けることを特徴とする。
【００１５】
この構成によれば、インラインアセンブラで参照される外部変数および定義される外部変数をプログラマが指定可能となり、結果、インラインアセンブラで値が更新されない外部変数に対するプログラム改良化など、さまざまな外部変数に関係し改良化が可能となるので、コンパイラが効率の良いプログラムを出力するという効果がある。また、変数とインラインアセンブラとの値の授受を入力記述部分と出力記述部分に限ることによって、インラインアセンブラ内の詳細な解析を行なう必要がなくなるので、コンパイラ開発工数と保守コストの増大を抑えられるという効果がある。
【００１６】
【発明の実施の形態】
本発明の実施形態の説明の前に先だって、本発明に関連する文献を挙げ、以下で用いる用語について説明しておく。さらに、本発明で説明するａｓｍブロックの記述仕様についても説明しておく。
【００１７】
＜文献＞
１．中田：”コンパイラの構成と最適化”，  朝倉書店，  １９９９
２．Ａ．Ｖ．Ａｈｏ，  Ｒ．Ｓｅｔｈｉ，  Ｊ．Ｄ．Ｕｌｌｍａｎ：”Ｃｏｍｐｉｌｅｒｓ，  Ｐｒｉｎｃｉｐｌｅ，  Ｔｅｃｈｎｉｑｕｅｓ，ａｎｄ  Ｔｏｏｌ”，  Ａｄｄｉｓｏｎ  Ｗｅｓｌｅｙ  Ｐｕｂｌｉｓｈｉｎｇ  Ｃｏｍｐａｎｙ  Ｉｎｃ．，１９８６，（邦訳）原田賢一：”コンパイラＩ、ＩＩ”，サイエンス社，１９９０
３．田中：”コンパイラ装置及びコンパイラプログラムが記録されたコンピュータ読み取り可能な記録媒体およびコンパイル方法”，特願平１１−１９５７１７
４．田中：”プログラム変換装置、プログラム変換方法及び記録媒体”，特願平１２−１０２７５１
＜用語の説明＞
・変数の定義、参照
変数の値を設定（又は更新）することを「定義する」と呼び、設定した値を使用することを「参照する」と呼ぶ。
・一時変数
コンパイラが計算結果を一時的に格納するために生成する変数や、処理の効率化を図る上で生成する変数のことを「一時変数」と呼ぶことにする。以下では特に断らない限り通常のソースプログラムで記述される変数と同様に扱う。
・中間命令
処理をし易くするためにコンパイラがソースプログラムのコードを中間的なコードに変換したものを「中間コード」と呼び、中間コードの１ステップを「中間命令」と呼ぶことにする。中間命令には４つ組や３つ組などが存在し、これらが変換されて最終的な目的プログラムが生成される。またソースプログラムを中間命令の列に変換したものを「中間プログラム」と呼ぶことにする。図５（２）は図５（１）関数ｆのプログラムに対する中間プログラムの一例であり、４つ組の一つである３番地コードで表現している。また図５（２）のｉ１，ｉ２など、「ｉ」とそれに付随する番号で示したものは、中間命令の識別子を意味している。また、ａｓｍブロックに対する中間命令の仕様については後述する。また、図５（１）のａｓｍブロックは、同図（２）の「ａｓｍ＿ｉｒ（．．．．．．）」というような特別な中間命令に変換されるとする。以下では、このａｓｍブロックの中間命令を「ａｓｍブロック中間命令」と呼ぶことにする。また、ａｓｍブロック中間命令の仕様に関しては後述する。
・基本ブロック
中間命令列のうち、中間命令列内部からの飛び越しも、また中間命令列内部への飛び越しもなく、中間命令列の実行順が一定順序である場合、その中間命令列を基本ブロックと言う。基本ブロックについては文献１に詳細に記載されている。
・到達する定義（ｒｅａｃｈｉｎｇ  ｄｅｆｉｎｉｔｉｏｎ）
文献１に示すように、到達する定義は変数の参照に対応する変数の定義を解析するものであり、各中間命令で参照される変数の定義がどれであるかを特定するものである。到達する定義の解析のうち、本発明に関係するＤＥＦ集合とＫＩＬＬ集合について説明する。ＤＥＦ、ＫＩＬＬ集合とは各基本ブロック毎に求められる中間命令を要素とする集合である。ある基本ブロックＢのＤＥＦ集合（ＤＥＦ［Ｂ］）は次の条件を満たす中間命令ｓの集合である。つまり、基本ブロックＢの中である変数ｘを定義する中間命令ｓでありかつ、中間命令ｓの次の中間命令から基本ブロックＢの終りまでに、変数ｘを定義する他の中間命令が存在しないような中間命令ｓである。ある基本ブロックＢのＫＩＬＬ集合（ＫＩＬＬ［Ｂ］）は次の条件を満たす中間命令ｔの集合である。つまり、ある基本ブロックＢの中である変数ｘを定義する中間命令が存在するとき、基本ブロックＢ以外の基本ブロックに存在する中間命令でありかつ変数ｘを定義する中間命令ｔである。
・参照定義連鎖情報
文献２に示すように、参照定義連鎖情報（文献２では、ｕｄ連鎖情報）は、ある中間命令ｘで参照する変数を定義する中間命令ｙを求め、中間命令ｘとｙを関係付けるものである。例えば単純な例であるが、図５（２）の中間命令ｉ８で参照される変数ａを定義しているのは中間命令ｉ７であるので、中間命令ｉ８とｉ７は参照定義連鎖情報により関係付けられる。
【００１８】
＜ａｓｍブロック記述仕様＞
図２にａｓｍブロックの記述仕様を示す。入力記述部はＣ言語変数が保持する値および定数値（アドレスも含む）をレジスタへ代入する部分であり、出力記述部はレジスタが保持する値をＣ言語変数へ代入する部分である。そして、アセンブラ命令列記述部には直接変数名を記述できないとし、アセンブラ命令列記述部とＣ言語プログラムとの値の授受は入出力記述部に限定するとする。但し、アセンブラ命令列記述部内で外部変数名のラベルを使用して外部変数にアクセスするなど、プログラマが、コンパイラが出力するアセンブラ命令の形式に従って、アセンブラ命令列記述部でＣ言語変数にアクセスすることは、プログラマが注意する上では可能とする。この規約によりＣ言語変数の使用が入出力記述部に限定されるので、コンパイラはアセンブラ命令列記述部内を解析する必要が無くなり、上述の課題１、２に関する問題が解決される。
【００１９】
アセンブラ命令列記述部で参照、定義される外部変数を指定する外部変数アクセス指定解析部の仕様として、ここでは、ｍｒｅｆ、ｍｄｅｆ、ｍｒｅｆ＿ａｌｌ、ｍｄｅｆ＿ａｌｌ、ｍｒｅｆ＿ｎｏｎ、ｍｄｅｆ＿ｎｏｎがある。ｍｒｅｆは、ｍｒｅｆに続く外部変数のリストに記載されている外部変数がａｓｍブロック内で参照されることを、ｍｄｅｆはｍｄｅｆに続く外部変数のリストに記載されている外部変数がａｓｍブロック内で定義されることを、ｍｒｅｆ＿ａｌｌはａｓｍブロック内で全ての外部変数が参照されることを、ｍｄｅｆ＿ａｌｌはａｓｍブロック内で全ての外部変数が定義されることを、ｍｒｅｆ＿ｎｏｎはａｓｍブロック内で参照される外部変数が一つもないことを、ｍｄｅｆ＿ｎｏｎはａｓｍブロック内で定義される外部変数が一つもないことを示す。この記述方式によりプログラマがａｓｍブロック内でアクセスする外部変数を正確に指定可能となるので、上述の第３の課題が解決される。
【００２０】
また、外部変数アクセス指定記述部の仕様として、ｍｒｅｆ＿ｎｏｎ、ｍｄｅｆ＿ｎｏｎを設ける意味は、外部変数アクセス指定記述部を省略した場合のコンパイラの仕様に関係する。もし、外部変数アクセス指定記述部を省略した場合は、ａｓｍブロック内でアクセスされる外部変数は一つもないという仕様にするのであれば、ｍｒｅｆ＿ｎｏｎ、ｍｄｅｆ＿ｎｏｎを設ける必要はない。しかし、コンパイラが安全なコード生成を行なう立場に立てば、むしろ外部変数アクセス指定記述部を省略した場合は、ｍｒｅｆ＿ａｌｌ、ｍｄｅｆ＿ａｌｌが記述されていると扱った方がよい。これは、図４（２）のようにａｓｍブロックの外に分岐があって、分岐先でどのような外部変数へアクセスするか不明である場合に、プログラマが誤って外部変数アクセス指定記述部を記述をするべきところ記述しなかった場合でも、コンパイラが安全なコードを生成することを保証するというメリットがある。このため本発明では外部変数アクセス指定記述部を省略した場合は、ｍｒｅｆ＿ａｌｌ、ｍｄｅｆ＿ａｌｌ指定がされたものとして扱う。尚、もちろん、外部変数アクセス指定記述部を省略した場合をａｓｍブロック内でアクセスされる外部変数は一つもないという仕様としても少しの修正で本発明が適用可能である。
【００２１】
図４に例を示す。図４（１）は前述した図１４（１）を本記述仕様で書き換えたものである。Ｃ言語変数ｂの参照先がａｓｍブロックの入力記述部に記載され、アセンブラ命令列記述部内には出現しなくなり、アセンブラ命令列記述部内の解析は不要になる。図４（２）は前述した図１５を本記述仕様で書き換えたものである。アセンブラ命令列記述部内で参照される外部変数として変数ｃ、ｄと、定義される外部変数として変数ｃが記載されており、これから、外部変数ｇがアセンブラ命令列記述部内で定義されないことをコンパイラが検出可能となるので外部変数ｇに関する最適化が施されることになる。
【００２２】
最後に図４（３）を説明する。図４（３）のａｓｍブロックの処理は、配列Ａ、Ｂのｎ個の要素に関して、積和演算（ｍａｃ）を行ない、結果を変数ｓに格納するものである。入力記述部におけるＡ、ＢはＣ言語文法にのっとりともに配列Ａ、Ｂの先頭アドレスを示すものであり定数である。アセンブラ命令列記述部内で参照および定義される外部変数は無しと指定されているので、この例においても外部変数ｇに対する最適化が可能となる。尚、さらにこの例において、ａｓｍブロックで使用するレジスタを、ａｓｍブロックを跨がって生きているＣ言語変数へ割り付けないことを保証する後述の文献３の方式と共に本方式を用いれば、図４（３）のａｓｍブロックを積和演算を行なうマクロ関数として独立に定義でき、至る所で使用可能な高速マクロ関数となり極めて有用な関数となる。
【００２３】
＜ａｓｍブロック中間命令仕様＞
図３はａｓｍブロックの中間命令仕様である。ａｓｍ＿ｂｏｄｙは、ａｓｍブロック記述仕様におけるアセンブラ命令列記述部を保持するものであり、ｒｅｆ＿ｖａｒｓは、ａｓｍブロックで参照される変数のリストを保持するものであり、外部変数アクセス指定記述部で指定された参照される外部変数や、ａｓｍブロック記述仕様の入力記述部を中間命令へ変換する際に生成する一時変数を保持する。ｄｅｆ＿ｖａｒｓはａｓｍブロックで定義される変数のリストを保持するものであり、外部変数アクセス指定記述部で指定された定義される外部変数や、ａｓｍブロック記述仕様の出力記述部を中間命令へ変換する際に生成する一時変数を保持する。図５（２）は同図（１）関数ｆのプログラムに対する中間プログラムの一例である。特に、ａｓｍブロックの入力記述部、出力記述部に対する中間命令は、通常の代入の中間命令に変換され、コンパイラが新たに生成した一時変数ｔ１、ｔ２、ｔ３にはそれぞれレジスタｒ０、ｒ１、ｒ０が割り付けられている。さらに、一時変数ｔ１、ｔ２は、ａｓｍブロックで参照される変数として、ｒｅｆ＿ｖａｒｓに保持され、一時変数ｔ３はａｓｍブロックで定義される変数としてｄｅｆ＿ｖａｒｓに保持されている。
【００２４】
また、外部変数アクセス指定記述部において＃ｍｒｅｆ＿ａｌｌ、＃ｍｄｅｆ＿ａｌｌが指定されているときや、外部変数アクセス指定記述部の記述を省略した場合には、全ての外部変数を示す識別子「＄ＡＯＶ」をそれぞれｒｅｆ＿ｖａｒｓ、ｄｅｆ＿ｖａｒｓに格納するとする。尚、外部変数アクセス指定記述部の記述を省略した場合のコンパイラの仕様を、前述のように外部変数へのアクセスが一切ないという仕様にするのであれば、外部変数アクセス指定記述部の記述を省略した場合には、ｒｅｆ＿ｖａｒｓ、ｄｅｆ＿ｖａｒｓに特に何も格納する必要はない。
【００２５】
また、以下では、ｒｅｆ＿ｖａｒｓを「ａｓｍ参照変数集合」、ｄｅｆ＿ｖａｒｓを「ａｓｍ定義変数集合」、ａｓｍ＿ｂｏｄｙを「ａｓｍアセンブラ命令列本体」と呼ぶことにする。
【００２６】
＜実施形態の説明＞
図１は本実施形態のプログラム変換装置の一例であるコンパイラ１の構成図である。当該コンパイラ１は、従来で説明した図１１のコンパイラ２１に対応する。コンパイラ１は、ソースプログラムを中間プログラムに変換する構文解析部１１、中間プログラムから冗長な部分を取り去る最適化部１２、中間プログラム中の変数にレジスタを割り付ける資源割付部１３、変数にレジスタを割り付け済みの中間プログラムをアセンブラプログラムに変換するコード生成部１４の一般的なコンパイラを構成する主要な部分と、ａｓｍブロック解析部１１１、ＤＥＦ集合算出部１２１、ＫＩＬＬ集合算出部１２２と、当該解析部および算出部から使用される、ａｓｍ参照変数保持部１１２、ａｓｍ定義変数保持部１１３、ａｓｍ本体保持部１１４、ＤＥＦ集合保持部１２３、定義変数集合保持部１２４、ＫＩＬＬ集合保持部１２５の本発明に関係している部分で構成されている。
【００２７】
次に各部の動作と機能について例を示しながら説明するが、ここでは、本発明に関係のある構文解析部１１と、最適化部１２について説明し、残りの資源割付部１３とコード生成部１４に関しては、文献１、２等に示したものと同様であるので省略する。
【００２８】
コンパイラ１はまず最初に構文解析部１１を起動する。構文解析部１１はソースプログラムを中間プログラムに変換する。例えば図５（１）のソースプログラムを同図（２）のような中間命令列に変換する。一般の中間命令への変換は従来と同様であるため省略し、ここでは、本発明に関係があり、構文解析部１１が、ソースプログラム中のａｓｍブロックが出現するたびに起動するａｓｍブロック解析部１１１の動作について説明する。
【００２９】
ａｓｍブロック解析部１１１は、ａｓｍブロックを解析しａｓｍブロックを中間命令に変換するものであり、ａｓｍ参照変数保持部１１２、ａｓｍ定義変数保持部１１３、ａｓｍ本体保持部１１４より構成されている。図１６はａｓｍブロック解析部１１１の処理のフローチャートである。但し、ａｓｍ参照変数保持部１１２、ａｓｍ定義変数保持部１１３、ａｓｍ本体保持部１１４は、処理前に空に初期化されているとする。
【００３０】
ステップａ１では、ａｓｍブロックの入力記述部を解析し、入力記述部の各代入式に対して、代入式の左辺に対応するレジスタに割り付けた一時変数ｓ１を生成し、一時変数ｓ１に代入式の右辺を代入する中間命令を生成する。
【００３１】
ステップａ２では、ステップａ１で生成した一時変数ｓ１をａｓｍ参照変数保持部１１２に格納する。
【００３２】
ステップａ３では、ａｓｍブロックの外部変数アクセス指定記述部を解析し、指定方法によって次のように、ａｓｍ参照変数保持部１１２またはａｓｍ定義変数保持部１１３に要素を格納する。もし、指定方法が「＃ｍｒｅｆ」である場合は、外部変数リストに記述されている外部変数をａｓｍ参照変数保持部１１２に格納し、指定方法が「＃ｍｄｅｆ」である場合は、外部変数リストに記述されている外部変数をａｓｍ定義変数保持部１１３に格納し、指定方法が「＃ｍｒｅｆ＿ａｌｌ」である場合は、外部変数全体を表す「＄ＡＯＶ」をａｓｍ参照変数保持部１１２に格納し、指定方法が「＃ｍｄｅｆ＿ａｌｌ」である場合は、外部変数全体を表す「＄ＡＯＶ」をａｓｍ定義変数保持部１１３に格納し、指定方法が「＃ｍｒｅｆ＿ｎｏｎ，＃ｍｄｅｆ＿ｎｏｎ」である場合は、特に何もせず、外部変数アクセス指定記述部自体が記述されていなかった場合は、外部変数全体を表す「＄ＡＯＶ」をａｓｍ参照変数保持部１１２およびａｓｍ定義変数保持部１１３に格納する。
【００３３】
ステップａ４では、ａｓｍブロックのアセンブラ命令列記述部を解析し、ａｓｍ本体保持部１１４にアセンブラ命令列を格納する。尚ここでの処理は、ソースプログラム中のアセンブラ命令列を単純にコンパイラが扱う内部表現に変換するだけであり、特に複雑な解析は必要とせず、単純にアセンブラ命令列をそのまま、ａｓｍ本体保持部１１４に格納してもよい。
【００３４】
ステップａ５では、ａｓｍブロックの出力記述部を解析し、出力記述部の各代入式に対して、代入式の右辺に対応するレジスタに割り付けた一時変数ｓ２を生成し、一時変数ｔ２を代入式の左辺に代入する中間命令を生成する。
【００３５】
ステップａ６では、ステップａ５で生成した一時変数ｓ２をａｓｍ定義変数保持部１１３に格納する。
【００３６】
ステップａ７では、ａｓｍ本体保持部１１４、ａｓｍ参照変数保持部１１２、ａｓｍ定義変数保持部１１３の内容を、それぞれ、ａｓｍブロック中間言語仕様のａｓｍアセンブラ命令列本体（ａｓｍ＿ｂｏｄｙ）、ａｓｍ参照変数集合（ｒｅｆ＿ｖａｒｓ），ａｓｍ定義変数集合（ｄｅｆ＿ｖａｒｓ）に出力する。
【００３７】
（フローチャート終了）。
【００３８】
図５（２）は、構文解析部１１により  同図（１）のソースプログラムを中間プログラムに変換した結果である。次にａｓｍブロック解析部１１１の動作を図５、６の例で示す。まず、ａｓｍブロック解析部１１１はステップａ１において、図５（１）のａｓｍブロックの入力記述部に記述されている「ｒ０＝ａ」を解析し、図５（２）の中間命令ｉ３に示すように、一時変数ｔ１を生成し、代入中間命令「ｔ１＝ａ」を生成する。同様に、ａｓｍブロックの入力記述部に記述されている「ｒ１＝ｂ」に関しては、図５（２）の中間命令ｉ４のように、一時変数ｔ２を生成し、代入中間命令「ｔ２＝ｂ」を生成する。
【００３９】
次にａｓｍブロック解析部１１１はステップａ２において、ステップａ１で生成した一時変数ｔ１、ｔ２を図６の矢印ａ１のようにａｓｍ参照変数保持部１１２に格納する。次にａｓｍブロック解析部１１１は、ステップａ３において外部変数アクセス指定記述部を解析する。図５（１）では、「＃ｍｒｅｆ  ｃ，ｄ」と記述されているので、外部変数ｃ、ｄを図６の矢印ａ２のようにａｓｍ参照変数保持部１１２に格納する。さらに、図５（１）では、「＃ｍｄｅｆ  ｃ」と記述されているので図６の矢印ａ３のようにａｓｍ定義変数保持部１１３に格納する。
【００４０】
次にａｓｍブロック解析部１１１は、ステップａ４においてアセンブラ命令列記述部を解析し、図６（３）のようにａｓｍ本体保持部１１４にアセンブラ命令列を格納する。次にａｓｍブロック解析部１１１は、ステップａ５において、図５（１）のａｓｍブロックの出力記述部に記述されている「ｂ＝ｒ０」を解析し、図５（２）の中間命令ｉ６に示すように、一時変数ｔ３を生成し、代入中間命令「ｂ＝ｔ３」を生成する。次にａｓｍブロック解析部１１１はステップａ６において、ステップａ５で生成した一時変数ｔ３を図６の矢印ａ４のようにａｓｍ定義変数保持部１１３に格納する。
【００４１】
次にａｓｍブロック解析部１１１はステップａ７において、図６（１）の矢印ａ２、同図（２）の矢印ａ４、同図（３）に保持しているａｓｍ参照変数保持部１１２、ａｓｍ定義変数保持部１１３、ａｓｍ本体保持部１１４の内容を、図５（２）の中間命令ｉ５に示すように、それぞれ「ｒｅｆ＿ｖａｒｓ」，「ｄｅｆ＿ｖａｒｓ」，「ａｓｍ＿ｂｏｄｙ」に出力する。尚、図７（１）（２）は、図５（１）（２）と対比させて、外部変数アクセス指定記述部を変更して、「＃ｍｒｅｆ＿ａｌｌ」，「＃ｍｄｅｆ＿ａｌｌ」とした場合のソースプログラムと、対応する中間プログラムの例である。図７（２）の「ｒｅｆ＿ｖａｒｓ」，「ｄｅｆ＿ｖａｒｓ」が外部変数全体を表す「＄ＡＯＶ」になっているのは、ステップａ３の外部変数アクセス指定記述部の解析において、指定方法が＃ｍｒｅｆ＿ａｌｌ、＃ｍｄｅｆ＿ａｌｌである場合を適用したためである。その他の動作は図５の例と同様である。
【００４２】
次にコンパイラ１は最適化部１２を起動する。最適化部１２は最終的にプログラム変換装置が生成するオブジェクトプログラムのプログラムサイズ縮小化及び処理実行時間の短縮化を図るように中間プログラムの最適化を行なう。この最適化部１２の詳細は本発明の主眼ではないので説明を省略し、本発明に関連のある、到達する定義情報の解析に必要な、上述のＤＥＦ集合、ＫＩＬＬ集合を求める、ＤＥＦ集合算出部１２１と、ＫＩＬＬ集合算出部１２２について説明する。
【００４３】
最適化部１２では、到達する定義情報を解析する際に各基本ブロックＢ毎に、ＤＥＦ集合算出部１２１と、ＫＩＬＬ集合算出部１２２を起動する。
【００４４】
図１７はＤＥＦ集合算出部１２１の処理のフローチャートである。但し、ＤＥＦ集合保持部１２３は処理前に空に初期化されているとする。
【００４５】
ステップｂ１では、基本ブロックＢ内の全ての中間命令ｓについて、実行順番にステップｂ２からステップｂ９を行ない、終了したらステップｂ１０へ進む。
【００４６】
ステップｂ２では、定義変数集合保持部１２４を空にする。
【００４７】
ステップｂ３では、もし中間命令ｓがａｓｍブロック中間命令である場合は、ステップｂ４に進み、そうでない時はステップｂ５に進む。
【００４８】
ステップｂ４では、ａｓｍブロック中間命令ｓのａｓｍ定義変数集合（ｄｅｆ＿ｖａｒｓ）に格納されている全ての変数を、定義変数集合保持部１２４に格納し、ステップｂ６に進む。
【００４９】
ステップｂ５では、中間命令ｓで定義される全ての変数を定義変数集合保持部１２４に格納する。
【００５０】
ステップｂ６では、定義変数集合保持部１２４に格納されている、全ての要素ｘ（変数か外部変数全てを示す「＄ＡＯＶ」）について、ステップｂ７からｂ９を繰り返し、終了したらステップｂ１へ進む。
【００５１】
ステップｂ７では、要素ｘが変数ｖである時でかつ、ＤＥＦ集合保持部１２３中に、変数ｖを定義する中間命令ｓ１が存在する時は、中間命令ｓ１をＤＥＦ集合保持部１２３から取り去る。
【００５２】
ステップｂ８では、要素ｘが「＄ＡＯＶ」である時でかつ、ＤＥＦ集合保持部１２３中に、外部変数を定義する中間命令ｓ２が存在する時は、中間命令ｓ２をＤＥＦ集合保持部１２３から取り去る。
【００５３】
ステップｂ９では、中間命令ｓをＤＥＦ集合保持部１２３に格納する。
【００５４】
ステップｂ１０では、ＤＥＦ集合保持部１２３に格納されている集合を基本ブロックＢのＤＥＦ集合として基本ブロックＢの付随情報として保持する。
【００５５】
（フローチャート終了）。
【００５６】
図８は、図５（２）の中間命令ｉ１からｉ９までを基本ブロックとした場合の定義変数集合保持部１２４と、ＤＥＦ集合保持部１２３の推移を示したものである。各欄の横に付けられているｉ１からｉ９は中間命令のｉ１からｉ９に対応し、各中間命令について処理を終えたあとの状態を示す。例えば、中間命令ｉ１に関しては、定義される変数ｇをステップｂ５において定義変数集合保持部１２４に格納する。また、ステップｂ９において中間命令ｉ１をＤＥＦ集合保持部１２３に格納する。中間命令ｉ２、ｉ３、ｉ４に関しても同様である。次に中間命令ｉ５はａｓｍブロック中間命令であり、ａｓｍ定義変数集合に格納されている変数ｃ、ｔ３を、ステップｂ４において定義変数集合保持部１２４に格納する。ステップｂ７において、変数ｃを定義する中間命令ｉ２をＤＥＦ集合保持部１２３から取り去り、ステップｂ９において、ａｓｍブロック中間命令ｉ５をＤＥＦ集合保持部１２３に格納する。残りの中間命令に関しては、中間命令ｉ１と同様な処理が行なわれる。
【００５７】
ここで注目すべき点は、図８（２）の中間命令ｉ９に対する処理後のＤＥＦ集合保持部１２３の状態をみてみると、中間命令ｉ１は基本ブロックの終りである中間命令ｉ９に到達しているが、中間命令ｉ５で更新される変数ｃを定義する中間命令ｉ２は到達していないことがわかる。
【００５８】
また、同様に、図９は図７（２）の中間命令ｉ１からｉ９までを基本ブロックとした場合の定義変数集合保持部１２４と、ＤＥＦ集合保持部１２３の推移を示したものである。図８との違いは、中間命令ｉ５の処理のステップｂ４においてａｓｍ定義変数集合に格納されている外部変数全体を表す「＄ＡＯＶ」を定義変数集合保持部１２４に格納し、ステップｂ８において、外部変数ｇ、ｃを定義する中間命令ｉ１、ｉ２をＤＥＦ集合保持部１２３から取り去っている点である。これにより中間命令ｉ１は基本ブロックの終りである中間命令ｉ９に到達しなくなる。
【００５９】
図１８はＫＩＬＬ集合算出部１２２の処理のフローチャートである。但し、ＫＩＬＬ集合保持部１２５、定義変数集合保持部１２４は処理前に空に初期化されているとする。
【００６０】
ステップｃ１では、基本ブロックＢ内の全ての中間命令ｓについて、実行順番にステップｃ２からステップｃ４を行ない、終了したらステップｃ５へ進む。
【００６１】
ステップｃ２では、もし中間命令ｓがａｓｍブロック中間命令である場合は、ステップｃ３に進み、そうでない時はステップｃ４に進む。
【００６２】
ステップｃ３では、ａｓｍブロック中間命令ｓのａｓｍ定義変数集合に格納されている全ての変数を定義変数集合保持部１２４に格納し、ステップｃ５に進む。
【００６３】
ステップｃ４では、中間命令ｓで定義される全ての変数を定義変数集合保持部１２４に格納する。
【００６４】
ステップｃ５では、定義変数集合保持部１２４に格納されている変数を定義する基本ブロックＢ以外の基本ブロック中に存在する中間命令をＫＩＬＬ集合保持部１２５に格納する。但し、定義変数集合保持部１２４に外部変数全体を示す「＄ＡＯＶ」が存在する時は、基本ブロックＢ以外の基本ブロック中に存在しかつ、外部変数を定義する中間命令をＫＩＬＬ集合保持部１２５に格納する。
【００６５】
（フローチャート終了）。
【００６６】
図５（２）の中間命令ｉ１からｉ９までを基本ブロックとした場合には、変数ｇ，ｃ，ｔ１，ｔ２，ｔ３，ｂ，ａ，ｔ４，ｄがステップｃ４で定義変数集合保持部１２４に格納され、これらの変数を定義する当該基本ブロック以外の中間命令が、ステップｃ５でＫＩＬＬ集合保持部１２５に格納されることとなる。同様に図７（２）の中間命令ｉ１からｉ９までを基本ブロックとした場合には、変数ｇ，ｃ，ｔ１，ｔ２，ｔ３，ｂ，ａ，ｔ４，ｄ，＄ＡＯＶがステップｃ３、ｃ４で定義変数集合保持部１２４に格納される。「＄ＡＯＶ」が格納さているので外部変数全てと、その他の定義変数集合保持部１２４に格納されている変数を定義する当該基本ブロック以外の中間命令が、ＫＩＬＬ集合保持部１２５に格納されることとなる。
【００６７】
次に最適化部１２は、ＤＥＦ集合算出部１２１と、ＫＩＬＬ集合算出部１２２で算出したＤＥＦ集合、ＫＩＬＬ集合を使って到達する定義を求める。到達する定義自体の処理は文献１と同じであるのでその詳細は省略し、結果のみを図１０に示す。図１０（１）は図５（２）の中間プログラムに対する到達する定義を示しており、各欄の横に付けられているｉ１からｉ９は中間命令のｉ１からｉ９に対応し、それぞれの中間命令に到達する定義の集合を示す。図中、「．．．．．」で示した部分は図５（２）の中間プログラムに示されていない到達する定義を示している。例えば、中間命令ｉ７には中間命令ｉ１が到達している。図１０（２）は同様に図７（２）の中間プログラムに対するものである。
【００６８】
次に最適化部１２は、求めた到達する定義の情報を使って、最適化の情報としても重要である参照定義連鎖情報を求める。ａｓｍブロック中間命令以外の中間命令に対しての参照定義連鎖情報の求め方は文献２と同様であるので説明を省略し、ａｓｍブロック中間命令に関して説明する。
【００６９】
ａｓｍブロック中間命令との関係付けは次のように行なわれる。ａｓｍブロック中間命令ｓのａｓｍ参照変数集合（ｒｅｆ＿ｖａｒｓ）に格納されている変数ｖを定義しており、かつａｓｍブロック中間命令ｓに到達する中間命令ｔがあるとき、ａｓｍブロック中間命令ｓと中間命令ｔを参照定義連鎖情報として関係付ける。例えば、図５（２）と図１０（１）においては、ａｓｍブロック中間命令ｉ５に到達する中間命令にはｉ１、ｉ２、ｉ３、ｉ４があり、そのうち、ａｓｍブロック中間命令ｉ５のａｓｍ参照変数集合に格納されている変数ｔ１、ｔ２、ｃを定義する中間命令がそれぞれ中間命令ｉ３、ｉ４、ｉ２であるためａｓｍブロック中間命令ｉ５と参照定義連鎖情報が付けられる。
【００７０】
また、ａｓｍブロック中間命令ｓのａｓｍ参照変数集合（ｒｅｆ＿ｖａｒｓ）に外部変数全体を表す「＄ＡＯＶ」が格納されている場合は、外部変数を定義しており、かつａｓｍブロック中間命令ｓに到達する中間命令ｔがあるとき、ａｓｍブロック中間命令ｓと中間命令ｔを参照定義連鎖情報として関係付ける。例えば、図７（２）と図１０（２）においては、ａｓｍブロック中間命令ｉ５に到達する中間命令にはｉ１、ｉ２、ｉ３、ｉ４があり、そのうち、外部変数を定義するのは、ｉ１とｉ２であるためａｓｍブロック中間命令ｉ５と参照定義連鎖情報が付けられる。
【００７１】
次に最適化部１２は、求めた参照定義連鎖情報を使用して最適化を行なう。詳細は従来と同様であるので省略するが、ここでは  図５（２）、図１０（１）と図７（２）、図１０（２）を用いて説明する。図５（２）では変数ｇを定義する中間命令ｉ１が中間命令ｉ７に到達し、中間命令ｉ７と中間命令ｉ１は参照定義連鎖情報で関係付けされる。ここで、変数ｇを定義しかつ中間命令ｉ７と参照定義情報で関係付けされている中間命令がｉ１のみであるとき、変数ｇが保持する値１０が定数伝搬（文献２参照）され、最終的に、中間命令ｉ７は、「ａ＝１５」と改良化が可能となる。一方、図７（２）、図１０（２）に関しては、中間命令ｉ７には中間命令ｉ１は到達しないので、参照定義連鎖情報で関係付けられることはなく、誤って中間命令ｉ７を改良化することはない。
【００７２】
尚、本発明に文献４で導入されている仮想レジスタを扱える機能を付加してもよい。この場合は、図２に示した入力記述部、出力記述部のレジスタ記述の仕様において、文献４に示すような仮想レジスタの指定も可能としてもよい。また、図２では入力記述部の代入の右辺には変数と定数しか許していないが、ここを通常のＣ言語の式としてもよい。
【００７４】
【発明の効果】
以上説明したように、本発明のプログラム変換装置は、インラインアセンブラで参照される外部変数および定義される外部変数をプログラマが指定可能となり、結果、インラインアセンブラで値が更新されない外部変数に対しては、インラインアセンブラを跨がったプログラム改良化が可能となり、逆に、インラインアセンブラで値が更新される外部変数に対しては確実に安全なプログラム変換が可能となるという効果がある。
【００７５】
また、変数とインラインアセンブラとの値の授受を入力記述部分と出力記述部分に限ることによって、プログラム変換装置はインラインアセンブラ内の詳細な解析を行なう必要がなくなるので、プログラム変換装置の処理時間の短縮や、プログラム変換装置の開発工数と保守コストの増大を抑えることが可能となるという効果がある。
【図面の簡単な説明】
【図１】本発明のプログラム変換装置に係るコンパイラ１の構成図
【図２】ａｓｍブロックの記述仕様を示す図
【図３】ａｓｍブロックの中間命令仕様を示す図
【図４】ａｓｍブロックの記述仕様に従ったａｓｍブロックのプログラムの例を示す図
【図５】ａｓｍブロックのプログラム例とその中間プログラムを示す図
【図６】ａｓｍ参照変数保持部１１２の推移とａｓｍ定義変数保持部１１３の推移とａｓｍ本体保持部１１４の具体的な例を示す図
【図７】ａｓｍブロックのプログラム例とその中間プログラムを示す図
【図８】図５の例に対する定義変数集合保持部１２４の推移とＤＥＦ集合保持部１２３の推移を示す具体的な例を示す図
【図９】図７の例に対する定義変数集合保持部１２４の推移とＤＥＦ集合保持部１２３の推移を示す具体的な例を示す図
【図１０】各中間命令に到達する定義の例を示す図
【図１１】従来のプログラム変換装置２０の構成を示す図
【図１２】従来のａｓｍブロックの記述例を示す図
【図１３】従来のａｓｍブロックの記述方法の課題を示す図
【図１４】従来のａｓｍブロックの記述方法の課題を示す図
【図１５】従来のａｓｍブロックの記述方法の課題を示す図
【図１６】ａｓｍブロック解析部１１１の処理のフローチャート
【図１７】ＤＥＦ集合算出部１２１の処理のフローチャート
【図１８】ＫＩＬＬ集合算出部１２２の処理のフローチャート
【符号の説明】
１  コンパイラ
１１  構文解析部
１２  最適化部
１３  資源割付部
１４  コード生成部
２０  プログラム変換装置
２１  コンパイラ
２２  高級言語構文解析部
２３  最適化部
２４  資源割付部
２５  アセンブラコード生成部
２６  アセンブラ
２７  アセンブラ言語構文解析部
２８  オブジェクトコード生成部
１１１  ａｓｍブロック解析部
１１２  ａｓｍ参照変数保持部
１１３  ａｓｍ定義変数保持部
１１４  ａｓｍ本体保持部
１２１  ＤＥＦ集合算出部
１２２  ＫＩＬＬ集合算出部
１２３  ＤＥＦ集合保持部
１２４  定義変数集合保持部
１２５  ＫＩＬＬ集合保持部
【図１】
0003630086.tif 000002
【図２】
0003630086.tif 000003
【図３】
0003630086.tif 000004
【図４】
0003630086.tif 000005
【図５】
0003630086.tif 000006
【図６】
0003630086.tif 000007
【図７】
0003630086.tif 000008
【図８】
0003630086.tif 000009
【図９】
0003630086.tif 000010
【図１０】
0003630086.tif 000011
【図１１】
0003630086.tif 000012
【図１２】
0003630086.tif 000013
【図１３】
0003630086.tif 000014
【図１４】
0003630086.tif 000015
【図１５】
0003630086.tif 000016
【図１６】
0003630086.tif 000017
【図１７】
0003630086.tif 000018
【図１８】
0003630086.tif 000019