(57)【特許請求の範囲】
【請求項１】
高級言語プログラムに使用される変数の主たる型が示すビット長と同じ長さのビット長で演算する命令に加えて、主たる型が示すビット長と異なるビット長で演算する命令を実行するマイクロプロセッサを対象とし、高級言語プログラムを目的コードに翻訳するプログラム翻訳装置であって、
高級言語プログラムの構文を解析し、プログラムに含まれる全ての演算子と被演算子との関係をツリー構造で表した解析木を出力するとともに、各部分木における演算子及び被演算子に、前記主たる型が示すビット長と同じビット長を表す型情報を付加する構文解析手段と、
演算子とそれに要する被演算子とからなる部分木であって、付加された型情報のうち所定の型情報をもつ演算子及び／又は被演算子を有する部分木を解析木から検出する部分木検出手段と、
検出された部分木に対して、前記所定の型情報を前記異なるビット長を表す型情報に変換する型情報変換手段と、
変換された部分木を有する解析木に基づいて、前記異なるビット長で演算する命令を含む目的コードを生成するコード生成手段と
を備えることを特徴とするプログラム翻訳装置。
【請求項２】
前記所定の型情報は、高級言語プログラム中の型宣言文に依存しない型情報であって、２のべき乗倍のバイト数分のビット長を表し、
前記異なるビット長は、前記所定の型情報より短いビット長を表す
ことを特徴とする請求項１記載のプログラム翻訳装置。
【請求項３】
高級言語プログラムに使用される変数の主たる型が示すビット長と同じ長さのビット長で演算する命令に加えて、主たる型が示すビット長より短い異なるビット長で演算する命令を実行するマイクロプロセッサを対象とし、高級言語プログラムを目的コードに翻訳するプログラム翻訳装置であって、
高級言語プログラムの構文を解析し、プログラムに含まれる全ての演算子と被演算子との関係を表すツリー構造を有し、かつ演算子とそれに要する被演算子とからなる複数の部分木で構成される解析木を出力するとともに、高級言語プログラム中の型宣言文に依存する変数の型であって被演算子及び演算子のビット長を表す第１の型情報を、部分木の被演算子及び／又は演算子に付加する構文解析手段と、
高級言語プログラム中の型宣言文に依存しない変数の型であって、被演算子又は演算子のビット長を表す第２の型情報を、部分木の被演算子及び／又は演算子に付加する型情報付加手段と、
前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木を検出する部分木検出手段と、
部分木検出手段により検出された部分木に対して、前記主たる型が示すビット長と同じビット長を表す第２の型情報をもつ被演算子の型情報を、前記異なるビット長を示す第２の型情報に変換する被演算子変換手段と、
被演算子型情報変換手段により変換された部分木に対して、前記主たる型が示すビット長と同じビット長を表す第２の型情報をもつ演算子の型情報を、前記異なるビット長を示す第２の型情報に変換する演算子変換手段と、
演算子型情報変換手段により変換された部分木を有する解析木に基づいて、前記異なるビット長で演算する命令を含む目的コードを生成するコード生成手段と
を備えることを特徴とするプログラム翻訳装置。
【請求項４】
前記コード生成手段は、
前記異なるビット長を示す演算子を有する部分木に対応する前記マイクロプロセッサの命令を表すコード生成情報を、演算子の演算種類毎に記憶するコード生成情報記憶部と、
演算子変換手段により変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する部分木と、その演算子の演算種類を検出する演算種類検出部と、
演算種類検出部により検出された演算種類に対応するコード生成情報に基づいて、検出された部分木に対応する命令コードを生成する生成部と
を備えることを特徴とする請求項３記載のプログラム翻訳装置。
【請求項５】
前記主たる型は２のべき乗倍のバイト数分のビット長を表し、前記異なるビット長は前記主たる型のうち最長のビット長より短いビット長を表す
ことを特徴とする請求項４記載のプログラム翻訳装置。
【請求項６】
前記部分木検出手段は、前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が加算を指示する加算部分木と、部分木の演算子が減算を指示する減算部分木と、部分木の演算子が乗算を指示する乗算部分木と、部分木の演算子が除算を指示する除算部分木とからなる部分木の種類のうちの少なくとも１種類以上の部分木を検出し、
前記演算種類検出部は、前記演算子変換手段により変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する部分木であって、加算部分木と減算部分木と乗算部分木と除算部分木とからなる部分木の種類のうちの少なくとも１種類以上の部分木を検出し、
前記コード生成情報記憶部は、前記異なるビット長を表す第２の型情報をもつ演算子を有する部分木であって、加算部分木と減算部分木と乗算部分木と除算部分木とからなる部分木の種類のうちの少なくとも１種類以上の部分木に対応する前記マイクロプロセッサの命令を表すコード生成情報を記憶し、
前記部分木検出手段と演算種類検出部とコード生成情報記憶部とは同じ種類の部分木に対応する
ことを特徴とする請求項５記載のプログラム翻訳装置。
【請求項７】
前記コード生成情報記憶部は、前記異なるビット長を表す第２の型情報をもつ演算子を有する除算部分木に対応する前記マイクロプロセッサの除算命令を表すコード生成情報を記憶する
ことを特徴とする請求項６記載のプログラム翻訳装置。
【請求項８】
前記コード生成情報記憶部は、前記異なるビット長を表す第２の型情報をもつ演算子を有する除算部分木に対応して、前記マイクロプロセッサに用いる除算支援ルーチンをコード生成情報として記憶する
ことを特徴とする請求項７記載のプログラム翻訳装置。
【請求項９】
前記コード生成情報記憶部は、前記異なるビット長を表す第２の型情報をもつ演算子を有する乗算部分木に対応して、前記マイクロプロセッサに用いる乗算支援ルーチンをコード生成情報として記憶する
ことを特徴とする請求項６記載のプログラム翻訳装置。
【請求項１０】
前記部分木検出手段は、さらに前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、演算子が乗算を指示し、演算子に要する被演算子の１つが２のべき乗である乗算部分木を検出し、
前記演算種類検出部は、さらに前記演算子変換手段により変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有し、演算子に要する被演算子の１つが２のべき乗である乗算部分木を検出し、
前記コード生成情報記憶部は、前記異なるビット長を表す第２の型情報をもつ演算子と、被演算子の１つが２のべき乗である乗算部分木に対応して、前記マイクロプロセッサのシフト命令を表すコード生成情報を記憶する
ことを特徴とする請求項９記載のプログラム翻訳装置。
【請求項１１】
前記部分木検出手段は、
前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が加算を指示する加算部分木を検出する第１の加算部分木検出部と、
前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が減算を指示する減算部分木を検出する第１の減算部分木検出部と、
前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が乗算を指示する乗算部分木を検出する第１の乗算部分木検出部と、
前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が除算を指示する除算部分木を検出する第１の除算部分木検出部と
を備え、
前記演算種類検出部は、
前記演算子変換手段により変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する加算部分木を検出する第２の加算部分木検出部と
前記演算子変換手段により変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する減算部分木を検出する第２の減算部分木検出部と
前記演算子変換手段により変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する乗算部分木を検出する第２の乗算部分木検出部と
前記演算子変換手段により変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する除算部分木を検出する第２の除算部分木検出部と
を備え、
前記コード生成情報記憶部は、
前記異なるビット長を表す第２の型情報をもつ演算子を有する加算部分木に対応する前記マイクロプロセッサの加算命令を記憶する加算コード記憶部と、
前記異なるビット長を表す第２の型情報をもつ演算子を有する減算部分木に対応する前記マイクロプロセッサの加算命令を記憶する減算コード記憶部と、
前記異なるビット長を表す第２の型情報をもつ演算子を有する乗算部分木に対応する前記マイクロプロセッサの加算命令を記憶する乗算コード記憶部と、
前記異なるビット長を表す第２の型情報をもつ演算子を有する除算部分木に対応する前記マイクロプロセッサの加算命令を記憶する除算コード記憶部と
を備えることを特徴とする請求項６記載のプログラム翻訳装置。
【請求項１２】
前記主たる型は１６ビット長と３２ビット長とを含み、前記異なるビット長は２４ビット長である
ことを特徴とする請求項６又は１１記載のプログラム翻訳装置。
【請求項１３】
高級言語プログラムに使用される変数の主たる型が示すビット長と同じ長さのビット長で演算する命令に加えて、主たる型が示すビット長と異なるビット長で演算する命令を実行するマイクロプロセッサを対象とし、高級言語プログラムを目的コードに翻訳するプログラム翻訳方法であって、
高級言語プログラムの構文を解析し、プログラムに含まれる全ての演算子と被演算子との関係をツリー構造で表した解析木を出力するとともに、各部分木における演算子及び被演算子に、前記主たる型が示すビット長と同じビット長を表す型情報を付加する構文解析ステップと、
演算子とそれに要する被演算子とからなる部分木であって、付加された型情報のうち所定の型情報をもつ演算子及び／又は被演算子を有する部分木を解析木から検出する部分木検出ステップと、
検出された部分木に対して、前記所定の型情報を前記異なるビット長を表す型情報に変換する型情報変換ステップと、
変換された部分木を有する解析木に基づいて、前記異なるビット長で演算する命令を含む目的コードを生成するコード生成ステップと
を有することを特徴とするプログラム翻訳方法。
【請求項１４】
前記所定の型情報は、高級言語プログラム中の型宣言文に依存しない型情報であって、２のべき乗倍のバイト数分のビット長を表し、
前記異なるビット長は、前記所定の型情報より短いビット長を表す
ことを特徴とする請求項１３記載のプログラム翻訳方法。
【請求項１５】
高級言語プログラムに使用される変数の主たる型が示すビット長と同じ長さのビット長で演算する命令に加えて、主たる型が示すビット長より短い異なるビット長で演算する命令を実行するマイクロプロセッサを対象とし、高級言語プログラムを目的コードに翻訳するプログラム翻訳方法であって、
高級言語プログラムの構文を解析し、プログラムに含まれる全ての演算子と被演算子との関係を表すツリー構造を有し、かつ演算子とそれに要する被演算子とからなる複数の部分木で構成される解析木を出力するとともに、高級言語プログラム中の型宣言文に依存する変数の型であって被演算子及び演算子のビット長を表す第１の型情報を、部分木の被演算子及び／又は演算子に付加する構文解析ステップと、
高級言語プログラム中の型宣言文に依存しない変数の型であって、被演算子又は演算子のビット長を表す第２の型情報を、部分木の被演算子及び／又は演算子に付加する型情報付加ステップと、
前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木を検出する部分木検出ステップと、
部分木検出ステップにおいて検出された部分木に対して、前記主たる型が示すビット長と同じビット長を表す第２の型情報をもつ被演算子の型情報を、前記異なるビット長を示す第２の型情報に変換する被演算子変換ステップと、
被演算子型情報変換ステップおいて変換された部分木に対して、前記主たる型が示すビット長と同じビット長を表す第２の型情報をもつ演算子の型情報を、前記異なるビット長を示す第２の型情報に変換する演算子変換ステップと、
演算子型情報変換ステップにおいて変換された部分木を有する解析木に基づいて、前記異なるビット長で演算する命令を含む目的コードを生成するコード生成ステップと
を有することを特徴とするプログラム翻訳方法。
【請求項１６】
前記コード生成ステップは、
演算子変換ステップにより変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する部分木と、その演算子の演算種類を検出する演算種類検出サブステップと、
前記異なるビット長を示す演算子を有する部分木に対応する前記マイクロプロセッサの命令を表すコード生成情報を、演算子の演算種類毎に記憶するコード生成情報記憶部を参照して、演算種類検出サブステップにおいて検出された演算種類に対応するコード生成情報に基づいて、検出された部分木に対応する命令コードを生成する生成サブステップと
を有することを特徴とする請求項１５記載のプログラム翻訳方法。
【請求項１７】
前記主たる型は２のべき乗倍のバイト数分のビット長を表し、前記異なるビット長は前記主たる型のうち最長のビット長より短いビット長を表す
ことを特徴とする請求項１６記載のプログラム翻訳方法。
【請求項１８】
前記部分木検出ステップは、前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が加算を指示する加算部分木と、部分木の演算子が減算を指示する減算部分木と、部分木の演算子が乗算を指示する乗算部分木と、部分木の演算子が除算を指示する除算部分木とからなる部分木の種類のうちの少なくとも１種類以上の部分木を検出し、
前記演算種類検出サブステップは、前記演算子変換ステップにより変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する部分木であって、加算部分木と減算部分木と乗算部分木と除算部分木とからなる部分木の種類のうちの少なくとも１種類以上の部分木を検出し、
前記部分木検出ステップと演算種類検出サブステップとは同じ種類の部分木に対応する
ことを特徴とする請求項１７記載のプログラム翻訳方法。
【請求項１９】
前記部分木検出ステップは、さらに前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、演算子が乗算を指示し、演算子に要する被演算子の１つが２のべき乗である乗算部分木を検出し、
前記演算種類検出サブステップは、さらに前記演算子変換ステップにより変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有し、演算子に要する被演算子の１つが２のべき乗である乗算部分木を検出する
ことを特徴とする請求項１８記載のプログラム翻訳方法。
【請求項２０】
前記部分木検出ステップは、
前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が加算を指示する加算部分木を検出する第１の加算部分木検出サブステップと、
前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が減算を指示する減算部分木を検出する第１の減算部分木検出サブステップと、
前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が乗算を指示する乗算部分木を検出する第１の乗算部分木検出サブステップと、
前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が除算を指示する除算部分木を検出する第１の除算部分木検出サブステップと
を有し、
前記演算種類検出サブステップは、
前記演算子変換ステップにより変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する加算部分木を検出する第２の加算部分木検出サブステップと、
前記演算子変換ステップにより変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する減算部分木を検出する第２の減算部分木検出サブステップと、
前記演算子変換ステップにより変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する乗算部分木を検出する第２の乗算部分木検出サブステップと、
前記演算子変換ステップにより変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する除算部分木を検出する第２の除算部分木検出サブステップと、
を有することを特徴とする請求項１８記載のプログラム翻訳方法。
【請求項２１】
前記主たる型は１６ビット長と３２ビット長とを含み、前記異なるビット長は２４ビット長である
ことを特徴とする請求項１８又は２０記載のプログラム翻訳方法。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は、高級言語で記述されたソースプログラムを、目的コードに翻訳するプログラム翻訳装置およびプログラム翻訳方法に関する。
【０００２】
【従来の技術】
近年、マイクロプロセッサ（以下ＭＰＵと略す）が普及し、プログラム／データサイズが大規模なものから小規模なものまで、各種アプリケーションに用いられている。
一般的なＭＰＵにおいては、データ演算のために１、２、４などのバイト長の数値データを演算する種々の演算命令を有している。高級言語における型宣言（例えばＣ言語でいう  ｃｈａｒ、ｉｎｔ、ｌｏｎｇ  ）された変数の長さもこれらのバイト長に一致している。従来、プログラム翻訳装置では、これらの型宣言に応じたバイト長の数値データを演算する演算命令に翻訳していた。また高級言語の型と異なる長さの変数（例えばアドレス）に対しても、それより長いバイト長のデータ演算を行う数値データ演算命令に翻訳していた。  従来のＭＰＵの一例と、それに対するプログラム翻訳装置の一例について説明する。
【０００３】
図２６は、高級言語で記述されたソースプログラムをＭＰＵ用の目的コードに翻訳する従来のプログラム翻訳装置の構成を示すブロック図である。このプログラム翻訳装置は、構文解析部２６１、型情報付与部２６２、４バイト部分木検出部２６３、４バイト演算コード生成情報記憶部２６４、コード生成部２６５から構成される。
【０００４】
同図において構文解析部２６１は、ソースプログラムに対して構文を解析し、プログラム中の演算子と被演算子との関係を表す解析木を出力し、型宣言文に依存した型情報を解析木に付与する。ここで、型情報とは被演算子が示す変数の型あるいは演算子が示す演算で得られた結果の型をいう。型宣言文に依存した型情報とは、解析木中の被演算子となっている変数が明示的に型宣言されている場合の変数の型、及びそれらの被演算子より直接定まる演算子の型をいう。図２７、図２８に解析木の一例を示す。同図のように解析木は、プログラム中の演算子とそれに対する被演算子との関係をツリー状に表したものであり、１つの演算子とその演算子が示す演算に用いられる被演算子とからなる複数の部分木が幾重にも連なって構成される。同図中の（２ｂｙｔｅ），（４ｂｙｔｅ），（ｐｏｉｎｔｅｒ）等は、演算子および被演算子に属性として付与される型情報であり、それぞれ２バイト整数型、４バイト整数型、ポインター型を表す。同図中の型情報のうち＃付きのものは、次の型情報付与部２６２によって付与された型情報を表す。
【０００５】
型情報付与部２６２は、構文解析部２６１が出力する解析木の被演算子及び演算子に対して、下記の付与規則（ルール１〜６）に基づいて型宣言文に依存しない型情報を付与する。ここで、型宣言文に依存しない型情報とは型宣言されていない被演算子がとるべき型、及び型宣言により定まらない演算子がとるべき変数の型をいう。
ルール１：対象となる部分木の左右の被演算子の型が両方とも（ｐｏｉｎｔｅｒ）の場合には、演算子の型を（４ｂｙｔｅ）とする。
ルール２：対象となる部分木の演算子が加減算を示す演算子で、左右の被演算子が（ｐｏｉｎｔｅｒ）以外で同じ場合には、演算子の型を被演算子の型と同じにする。
ルール３：ＯＰＰＴＲ（ｏｐｅｒａｔｉｏｎ  ｐｏｉｎｔｅｒ）を演算子とする部分木で、その部分木の被演算子の型は４バイトとする。ここで、ＯＰＰＴＲはその演算子以下の部分木で生成されるアドレスが指す領域を参照することを示す。
ルール４：対象となる部分木（例えば図２７の部分木１０２）を第１の部分木とし、第１の部分木の演算子を被演算子とする部分木を第２の部分（木例えば図２７の部分木１０３）とするとき、第１の部分木の演算子の型が決定されていない場合で、第２の部分木の演算子の型と、第２の部分木の両被演算子のどちらか一方の型が同じとき、第１の部分木の演算子の型を、第２の部分木の演算子の型と同じ型にし、まだ決定されていない第１の部分木のもう一方の被演算子の型も同じにする。
【０００６】
図２７の解析木を例に説明すると、第１の部分木１０２、第２のの部分木１０３において、第１の部分木２０１のＤＩＶ演算子の型が未決定の場合、第２の部分木１０３の＝演算子の型と、第１の部分木１０２の−被演算子か定数２のどちらか一方の型とが同じとき（＝演算子と−被演算子が４ｂｙｔｅで同じ）、第１の部分木１０２のＤＩＶ演算子の型を        （４ｂｙｔｅ）にして、定数２の型も（４ｂｙｔｅ）にする。
ルール５：対象となる部分木（例えば図２８の部分木２０１）を第１の部分木とし、第１の部分木の演算子を被演算子とする部分木を第２の部分木（例えば図２８の部分木２０２）とするとき、第１の部分木の演算子の型が決定されていない場合で、第２の部分木の演算子の型が決定されている場合、第１の部分木の演算子の型を第２の部分木の演算子の型と同じにする。図２８を例に説明すると、第１の部分木２０１、第２の部分木２０２において、第１の部分木２０１の＊演算子の型が未決定の場合で、第２の部分木２０２の＋演算子の型が決定されている場合、第１の部分木２０１の＊演算子の型を＋演算子の型と同じ（４ｂｙｔｅ）にする。
ルール６：対象となる部分木の演算子の型と片方の被演算子の型が決まっていて、もう一方の型が決まっていない場合、決まっていない部分木の型をもう一方の被演算子の型と同じにする。
【０００７】
４バイト部分木検出部２６３は、型情報付与部２６２が出力する解析木のうち、型情報が４バイト演算を含む部分木を検出する。
４バイト演算コード生成情報記憶部２６４は、４バイト演算を含む部分木に対応するコードを表すコード生成情報を保持する。このコード生成情報の具体例を図２９に示す。同図のように、演算子、演算子の型、被演算子の型により表される部分木に対応して、生成すべき命令コードおよび必要な引数の渡し方がコード生成情報として保持されている。
【０００８】
コード生成部２６５は、全ての部分木に対応する目的コードを生成する。その際、４バイト部分木検出部２６３により検出された部分木に対してはコード生成情報に基づいて目的コード生成する。
図３０は、上記コンパイラが対象とするＭＰＵの命令仕様の例を示す。同図において、左側はニーモニック形式の命令コード（ＯＰコードとオペランド）を、；の右側はその命令の内容を表している。ニーモニック中の２、４の数字は、扱う数値データのバイト長を示す。同図には代表的な命令のみ記載してあり、上から順に２バイトロード命令（ＬＤ２）、２バイトストア命令（ＳＴ２）、１バイトロード命令（ＬＤ１）、１バイトストア命令（ＳＴ１）、転送命令（ＭＯＶ２）、拡張命令（ＥＸＴ）、２バイト乗算命令（ＭＵＬ２）、加算命令（ＡＤＤ２）、キャリー付加算命令（ＡＤＤＣ２）、減算命令（ＳＵＢ２）、キャリー付減算命令（ＳＵＢＣ２）、４バイト乗算支援ルーチン呼び出し命令（ＪＳＲ  ＠ＭＵＬ４）、４バイト除算支援ルーチン呼び出し命令（ＪＳＲ  ＠ＤＩＶ４）を示している。例えば、ＬＤ２  ｓｒｃ，ｒｅｇは、ｓｒｃ（メモリ又はレジスタ）の２バイトデータをｒｅｇ（レジスタ）にロードする命令である。
【０００９】
このＭＰＵのアーキテクチャは、レジスタ長は４バイトであり、レジスタの上位２バイト、下位２バイトを、それぞれ独立したレジスタとして扱うことができるものとする。また、メモリに対するアクセスはロード／ストア命令によってのみ行なわれ、他の演算はレジスタに対して行なわれるものとする。
上記の構成を有する従来のプログラム翻訳装置について、以下その動作を２つのソースプログラム例を用いて説明する。
＜第１の動作例＞
図３１は、Ｃ言語で記述されたソースプログラムの第１の例を示す。
【００１０】
上からの２行は、変数を宣言する宣言文であり、ｐ，ｑがポインタ整数型、ｌｎｇが４バイト整数型の変数であることを宣言している。関数ｆは、ポインタ整数型ｐからポインタ整数型ｑまでの要素数（データ数）を求めて４バイト整数型変数ｌｎｇに代入すること、つまり、ｐからｑを引き算し、要素のサイズ（＊ｐ，＊ｑは整数型だから２バイト）２で割り算した値をｌｎｇに代入することを意味する。
【００１１】
構文解析部２６１は、このソースプログラムに対して、型宣言文に依存した型情報を付与した解析木を出力する。この解析木を図３２に示す。この解析木は、図２７と同じ解析木である。図中、＝は右辺の内容を左辺へ代入することを示す演算子である。−は減算、ＤＩＶは除算を示す演算子である。ｌｎｇ、ｐ、ｑは被演算子である。（４ｂｙｔｅ）、（ｐｏｉｎｔｅｒ）は型情報を示す。ポインタ整数型ならば（ｐｏｉｎｔｅｒ）が、４バイト整数型ならば（４ｂｙｔｅ）が付与される。この段階では、図３２のように、型宣言された変数ｌｎｇ、ｐ、ｑに対して型情報が付与されている。
【００１２】
さらに、図３２の解析木に対して、型情報付与部２６２により、ソースプログラムの型宣言文に依存しない型情報が上記付与規則に基づいて付与される。具体的には、型情報付与部２６２は、まだ型情報が付与されていない演算子又は被演算子を含む全ての部分木に対して、まずルール１に適合する部分木を検索して型情報を付与し、１つの部分木に対して型情報の付与が終われば、次の部分木に対して同様の処理を行う。同様にしてルール２〜６を適用して型情報を付与していく。ここでは図３２に対して、付与対象となる演算子と被演算子は−、ＤＩＶ、定数２の３つがある。まずルール１について、−演算子をもつ部分木が適合し、−演算子に（＃４ｂｙｔｅ）が付与される（図３３の部分木１０１）。次にルール４について、ＤＩＶ演算子をもつ部分木が適合し、ＤＩＶ演算子に（＃４ｂｙｔｅ）が付与され、さらに定数２に（＃４ｂｙｔｅ）が付与される（図３３の部分木１０２）。その結果、図３３の解析木が得られる。このように−の演算子、ＤＩＶの演算子ともに（＃４ｂｙｔｅ）が付与される。なお、型情報に付された＃は、型宣言に依存しないことを示す。
【００１３】
型宣言に依存しない型情報が付与された図３３の解析木に対して、４バイト部分木検出部２６３は、−演算子の部分木を検出し、これに適合するコード生成情報を４バイト演算コード生成情報記憶部２６４から検索し、コード生成情報として４バイト減算命令（図２９：ＳＵＢ２とＳＵＢＣ２）を取得する。さらに４バイト部分木検出部２６３は、ＤＩＶ演算子の部分木を検出し、このＤＩＶ演算子の部分木に適合するコード生成情報を４バイト演算コード生成情報記憶部２６４から検索し、４バイト除算演算支援ルーチン（図２９：ＪＳＲ  ＠ＤＩＶ４）を取得する。
【００１４】
コード生成部２６５は、コード生成情報に基づいて、対象となるＭＰＵの目的コードを生成する。図３３の解析木に基づいて生成された目的コードを図３４に示す。同図において、目的コードは、（１０７．１）〜（１０７．１７）の命令からなる。オペランドで指定されているＲ０，Ｒ１，Ｒ２は４バイト長のレジスタであり、Ｒ０Ｌは２バイト長のレジスタを示す。
＜第２の動作例＞
図３５は、Ｃ言語で記述されたソースプログラムの第２の例を示す。
【００１５】
上からの２行は、変数を宣言する宣言文であり、ａ［］は整数型の配列、ｉは整数型の変数であることを宣言している。関数ｆは、整数型の配列型変数ａのｉ番目の要素に定数３を代入することを意味する。変数ｉは、関数ｆより前の中略されている部分でその値が指定されているものとする。
図３５に示したソースプログラムに対し、構文解析部２６１によって、型宣言文に依存した型情報が付与された解析木を図３６に示す。この解析木で用いられている＝は右辺の内容を左辺へ代入することを示す演算子である。＋は加算、＊は乗算、＆はアドレスを示す演算子である。ａ、ｉは変数である被演算子、２、３は定数の被演算子である。＆演算子の型は（ｐｏｉｎｔｅｒ）、＊演算子の型は（４ｂｙｔｅ）、＋演算子の型は（４ｂｙｔｅ）、ＯＰＰＴＲ演算子の型は（２ｂｙｔｅ）である。他の演算子は、第１の動作例で示した通りである。
【００１６】
この図３６の解析木に対して、型情報付与部２６２はソースプログラムの型宣言文に依存しない型情報を上記付与規則に基づいて付与する。ここで、付与対象となる演算子と被演算子は＋、＊、定数２、３である。まず＋演算子に対し、ルール３が適応され（＃４ｂｙｔｅ）が付与される。次に＊演算子に対し、ルール５が適応され（＃４ｂｙｔｅ）が付与される。さらに定数２、３に対し、ルール６が適応され（＃２ｂｙｔｅ）が付与される。その結果を図３７に示す。
【００１７】
図３７の解析木に対して、４バイト部分木検出部２６３は、＊演算子の部分木を検出し、これに適合するコード生成情報を図２９に示した４バイト演算コード生成情報記憶部２６４より検索し、４バイト乗算支援ルーチンを取得する（図２９：ＪＳＲ  ＠ＭＵＬ４）。さらに同様にして４バイト部分木検出部２６３は、＋演算子の部分木に適合するコード生成情報として４バイト加算命令（図２９：ＡＤＤ２、ＡＤＤ２Ｃ）を取得する。
【００１８】
コード生成部２６５はコード生成情報に基づいて、対象となるＭＰＵの目的コードを生成する。図１２２の解析木に基づいて生成された目的コードを図１２３に示す。同図において、目的コードは（１０８．１）〜（１０８．１７）の命令からなる。オペランドで指定されているＲ０，Ｒ１，Ｒ２は４バイト長のレジスタであり、Ｒ０Ｌは２バイト長のレジスタを示す。
【００１９】
【発明が解決しようとする課題】
しかしながら上記従来のプログラム翻訳装置によれば、高級言語の型と異なる長さの計算（例えばアドレスの計算）に対して、高級言語の型と同じ長さの演算命令に翻訳するので、計算に先立って高級言語の型と同じ長さに型変換する命令が生成され、コードサイズが大きくなるという問題点があった。
【００２０】
より具体的には、図３４の（３４．５）のＳＵＢ２、（３４．６）のＳＵＢＣ２および図３８の（３８．１４）  ＡＤＤ２、（３８．１５）  ＡＤＤＣ２は、３バイト長のアドレスに対して４バイト長の演算を用いるためアドレスを上位と下位２バイトに分けて行っている。これに伴って（３４．１）〜（３４．４）または（３８．１２）〜（３８．１３）に示すような４バイト長に型変換を行うための命令まで生成される。その結果、プログラム中ポインタを扱う計算や配列の計算などは頻繁に行われるのが通常であるので、目的コードの中にはかなり多数の４バイト長演算命令と型変換命令とが頻出し、コードサイズの増加だけでなく実行時間も長くなるという問題があった。
【００２１】
上記の問題点については、対象となるＭＰＵが、高級言語の型と異なる長さの演算を行う命令をサポートしていれば、型変換が不要になるので解決しうると考えられる。ところが、そのようなＭＰＵに対して従来のプログラム翻訳装置を適用したとしても、プログラム翻訳装置自身がＭＰＵの全ての命令のコードを生成できるように対応していなければならず、従来のプログラム翻訳装置では対応できないという問題があった。換言すると、従来のプログラム翻訳装置では、ＭＰＵがアドレス長の演算を実行できる命令を備えていたとしても、そのような命令に対応していないので従来と同じく冗長な型変換をもつ目的コードをやはり生成してしまうという問題点を有していた。
【００２２】
本発明は上記問題点に鑑み、高級言語で宣言される型のバイト長と異なるバイト長で演算を実行できる命令を備えるＭＰＵを対象とし、冗長な型変換を含まない目的コードを生成するプログラム翻訳装置及び方法を提供することを目的とする。
【００２３】
【課題を解決するための手段】
上記問題点を解決するために請求項１の発明に係るプログラム翻訳装置は、高級言語プログラムに使用される変数の主たる型が示すビット長と同じ長さのビット長で演算する命令に加えて、主たる型が示すビット長と異なるビット長で演算する命令を実行するマイクロプロセッサを対象とし、高級言語プログラムを目的コードに翻訳するプログラム翻訳装置であって、
高級言語プログラムの構文を解析し、プログラムに含まれる全ての演算子と被演算子との関係をツリー構造で表した解析木を出力するとともに、各部分木における演算子及び被演算子に、前記主たる型が示すビット長と同じビット長を表す型情報を付加する構文解析手段と、
演算子とそれに要する被演算子とからなる部分木であって、付加された型情報のうち所定の型情報をもつ演算子及び／又は被演算子を有する部分木を解析木から検出する部分木検出手段と、
検出された部分木に対して、前記所定の型情報を前記異なるビット長を表す型情報に変換する型情報変換手段と、
変換された部分木を有する解析木に基づいて、前記異なるビット長で演算する命令を含む目的コードを生成するコード生成手段と
を備えている。
【００２４】
請求項２の発明に係るプログラム翻訳装置は請求項１に対して、
前記所定の型情報は、高級言語プログラム中の型宣言文に依存しない型情報であって、２のべき乗倍のバイト数分のビット長を表し、
前記異なるビット長は、前記所定の型情報より短いビット長を表す。
請求項３の発明に係るプログラム翻訳装置は、高級言語プログラムに使用される変数の主たる型が示すビット長と同じ長さのビット長で演算する命令に加えて、主たる型が示すビット長より短い異なるビット長で演算する命令を実行するマイクロプロセッサを対象とし、高級言語プログラムを目的コードに翻訳するプログラム翻訳装置であって、
高級言語プログラムの構文を解析し、プログラムに含まれる全ての演算子と被演算子との関係を表すツリー構造を有し、かつ演算子とそれに要する被演算子とからなる複数の部分木で構成される解析木を出力するとともに、高級言語プログラム中の型宣言文に依存する変数の型であって被演算子及び演算子のビット長を表す第１の型情報を、部分木の被演算子及び／又は演算子に付加する構文解析手段と、
高級言語プログラム中の型宣言文に依存しない変数の型であって、被演算子又は演算子のビット長を表す第２の型情報を、部分木の被演算子及び／又は演算子に付加する型情報付加手段と、
前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木を検出する部分木検出手段と、
部分木検出手段により検出された部分木に対して、前記主たる型が示すビット長と同じビット長を表す第２の型情報をもつ被演算子の型情報を、前記異なるビット長を示す第２の型情報に変換する被演算子変換手段と、
被演算子型情報変換手段により変換された部分木に対して、前記主たる型が示すビット長と同じビット長を表す第２の型情報をもつ演算子の型情報を、前記異なるビット長を示す第２の型情報に変換する演算子変換手段と、
演算子型情報変換手段により変換された部分木を有する解析木に基づいて、前記異なるビット長で演算する命令を含む目的コードを生成するコード生成手段と
を備えている。
請求項４の発明に係るプログラム翻訳装置は請求項３に対して、
前記コード生成手段は、
前記異なるビット長を示す演算子を有する部分木に対応する前記マイクロプロセッサの命令を表すコード生成情報を、演算子の演算種類毎に記憶するコード生成情報記憶部と、
演算子変換手段により変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する部分木と、その演算子の演算種類を検出する演算種類検出部と、
演算種類検出部により検出された演算種類に対応するコード生成情報に基づいて、検出された部分木に対応する命令コードを生成する生成部と
を備えている。
【００２５】
請求項５の発明に係るプログラム翻訳装置は請求項４に対して、
前記主たる型は２のべき乗倍のバイト数分のビット長を表し、前記異なるビット長は前記主たる型のうち最長のビット長より短いビット長を表す。
請求項６の発明に係るプログラム翻訳装置は請求項５に対して、
前記部分木検出手段は、前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が加算を指示する加算部分木と、部分木の演算子が減算を指示する減算部分木と、部分木の演算子が乗算を指示する乗算部分木と、部分木の演算子が除算を指示する除算部分木とからなる部分木の種類のうちの少なくとも１種類以上の部分木を検出し、
前記演算種類検出部は、前記演算子変換手段により変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する部分木であって、加算部分木と減算部分木と乗算部分木と除算部分木とからなる部分木の種類のうちの少なくとも１種類以上の部分木を検出し、
前記コード生成情報記憶部は、前記異なるビット長を表す第２の型情報をもつ演算子を有する部分木であって、加算部分木と減算部分木と乗算部分木と除算部分木とからなる部分木の種類のうちの少なくとも１種類以上の部分木に対応する前記マイクロプロセッサの命令を表すコード生成情報を記憶し、
前記部分木検出手段と演算種類検出部とコード生成情報記憶部とは同じ種類の部分木に対応する。
【００２６】
請求項７の発明に係るプログラム翻訳装置は請求項６に対して、
前記コード生成情報記憶部は、前記異なるビット長を表す第２の型情報をもつ演算子を有する除算部分木に対応する前記マイクロプロセッサの除算命令を表すコード生成情報を記憶する。
請求項８の発明に係るプログラム翻訳装置は請求項７に対して、
前記コード生成情報記憶部は、前記異なるビット長を表す第２の型情報をもつ演算子を有する除算部分木に対応して、前記マイクロプロセッサに用いる除算支援ルーチンをコード生成情報として記憶する。
【００２７】
請求項９の発明に係るプログラム翻訳装置は請求項６に対して、
前記コード生成情報記憶部は、前記異なるビット長を表す第２の型情報をもつ演算子を有する乗算部分木に対応して、前記マイクロプロセッサに用いる乗算支援ルーチンをコード生成情報として記憶する。
請求項１０の発明に係るプログラム翻訳装置は請求項９に対して、
前記部分木検出手段は、さらに前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、演算子が乗算を指示し、演算子に要する被演算子の１つが２のべき乗である乗算部分木を検出し、
前記演算種類検出部は、さらに前記演算子変換手段により変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有し、演算子に要する被演算子の１つが２のべき乗である乗算部分木を検出し、
前記コード生成情報記憶部は、前記異なるビット長を表す第２の型情報をもつ演算子と、被演算子の１つが２のべき乗である乗算部分木に対応して、前記マイクロプロセッサのシフト命令を表すコード生成情報を記憶する。
請求項１１の発明に係るプログラム翻訳装置は請求項６に対して、
前記部分木検出手段は、
前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が加算を指示する加算部分木を検出する第１の加算部分木検出部と、
前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が減算を指示する減算部分木を検出する第１の減算部分木検出部と、
前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が乗算を指示する乗算部分木を検出する第１の乗算部分木検出部と、
前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が除算を指示する除算部分木を検出する第１の除算部分木検出部と
を備え、
前記演算種類検出部は、
前記演算子変換手段により変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する加算部分木を検出する第２の加算部分木検出部と
前記演算子変換手段により変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する減算部分木を検出する第２の減算部分木検出部と
前記演算子変換手段により変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する乗算部分木を検出する第２の乗算部分木検出部と
前記演算子変換手段により変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する除算部分木を検出する第２の除算部分木検出部と
を備え、
前記コード生成情報記憶部は、
前記異なるビット長を表す第２の型情報をもつ演算子を有する加算部分木に対応する前記マイクロプロセッサの加算命令を記憶する加算コード記憶部と、
前記異なるビット長を表す第２の型情報をもつ演算子を有する減算部分木に対応する前記マイクロプロセッサの加算命令を記憶する減算コード記憶部と、
前記異なるビット長を表す第２の型情報をもつ演算子を有する乗算部分木に対応する前記マイクロプロセッサの加算命令を記憶する乗算コード記憶部と、
前記異なるビット長を表す第２の型情報をもつ演算子を有する除算部分木に対応する前記マイクロプロセッサの加算命令を記憶する除算コード記憶部と
を備えている。
【００２８】
請求項１２の発明に係るプログラム翻訳装置は請求項６又は１１に対して、
前記主たる型は１６ビット長と３２ビット長とを含み、前記異なるビット長は２４ビット長である。
また、請求項１３の発明に係るプログラム翻訳方法は、高級言語プログラムに使用される変数の主たる型が示すビット長と同じ長さのビット長で演算する命令に加えて、主たる型が示すビット長と異なるビット長で演算する命令を実行するマイクロプロセッサを対象とし、高級言語プログラムを目的コードに翻訳するプログラム翻訳方法であって、
高級言語プログラムの構文を解析し、プログラムに含まれる全ての演算子と被演算子との関係をツリー構造で表した解析木を出力するとともに、各部分木における演算子及び被演算子に、前記主たる型が示すビット長と同じビット長を表す型情報を付加する構文解析ステップと、
演算子とそれに要する被演算子とからなる部分木であって、付加された型情報のうち所定の型情報をもつ演算子及び／又は被演算子を有する部分木を解析木から検出する部分木検出ステップと、
検出された部分木に対して、前記所定の型情報を前記異なるビット長を表す型情報に変換する型情報変換ステップと、
変換された部分木を有する解析木に基づいて、前記異なるビット長で演算する命令を含む目的コードを生成するコード生成ステップと
を有する。
【００２９】
請求項１４の発明に係るプログラム翻訳方法は請求項１３に対して、
前記所定の型情報は、高級言語プログラム中の型宣言文に依存しない型情報であって、２のべき乗倍のバイト数分のビット長を表し、
前記異なるビット長は、前記所定の型情報より短いビット長を表す。
請求項１５の発明に係るプログラム翻訳方法は、高級言語プログラムに使用される変数の主たる型が示すビット長と同じ長さのビット長で演算する命令に加えて、主たる型が示すビット長より短い異なるビット長で演算する命令を実行するマイクロプロセッサを対象とし、高級言語プログラムを目的コードに翻訳するプログラム翻訳方法であって、
高級言語プログラムの構文を解析し、プログラムに含まれる全ての演算子と被演算子との関係を表すツリー構造を有し、かつ演算子とそれに要する被演算子とからなる複数の部分木で構成される解析木を出力するとともに、高級言語プログラム中の型宣言文に依存する変数の型であって被演算子及び演算子のビット長を表す第１の型情報を、部分木の被演算子及び／又は演算子に付加する構文解析ステップと、
高級言語プログラム中の型宣言文に依存しない変数の型であって、被演算子又は演算子のビット長を表す第２の型情報を、部分木の被演算子及び／又は演算子に付加する型情報付加ステップと、
前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木を検出する部分木検出ステップと、
部分木検出ステップにおいて検出された部分木に対して、前記主たる型が示すビット長と同じビット長を表す第２の型情報をもつ被演算子の型情報を、前記異なるビット長を示す第２の型情報に変換する被演算子変換ステップと、
被演算子型情報変換ステップおいて変換された部分木に対して、前記主たる型が示すビット長と同じビット長を表す第２の型情報をもつ演算子の型情報を、前記異なるビット長を示す第２の型情報に変換する演算子変換ステップと、
演算子型情報変換ステップにおいて変換された部分木を有する解析木に基づいて、前記異なるビット長で演算する命令を含む目的コードを生成するコード生成ステップとを有する。
【００３０】
請求項１６の発明に係るプログラム翻訳方法は請求項１５に対して、
前記コード生成ステップは、
演算子変換ステップにより変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する部分木と、その演算子の演算種類を検出する演算種類検出サブステップと、
前記異なるビット長を示す演算子を有する部分木に対応する前記マイクロプロセッサの命令を表すコード生成情報を、演算子の演算種類毎に記憶するコード生成情報記憶部を参照して、演算種類検出サブステップにおいて検出された演算種類に対応するコード生成情報に基づいて、検出された部分木に対応する命令コードを生成する生成サブステップとを有する。
【００３１】
請求項１７の発明に係るプログラム翻訳方法は請求項１６に対して、
前記主たる型は２のべき乗倍のバイト数分のビット長を表し、前記異なるビット長は前記主たる型のうち最長のビット長より短いビット長を表す。
請求項１８の発明に係るプログラム翻訳方法は請求項１７に対して、
前記部分木検出ステップは、前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が加算を指示する加算部分木と、部分木の演算子が減算を指示する減算部分木と、部分木の演算子が乗算を指示する乗算部分木と、部分木の演算子が除算を指示する除算部分木とからなる部分木の種類のうちの少なくとも１種類以上の部分木を検出し、
前記演算種類検出サブステップは、前記演算子変換ステップにより変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する部分木であって、加算部分木と減算部分木と乗算部分木と除算部分木とからなる部分木の種類のうちの少なくとも１種類以上の部分木を検出し、
前記部分木検出ステップと演算種類検出サブステップとは同じ種類の部分木に対応する。
【００３２】
請求項１９の発明に係るプログラム翻訳方法は請求項１８に対して、
前記部分木検出ステップは、さらに前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、演算子が乗算を指示し、演算子に要する被演算子の１つが２のべき乗である乗算部分木を検出し、
前記演算種類検出サブステップは、さらに前記演算子変換ステップにより変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有し、演算子に要する被演算子の１つが２のべき乗である乗算部分木を検出する。
【００３３】
請求項２０の発明に係るプログラム翻訳方法は請求項１８に対して、
前記部分木検出ステップは、
前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が加算を指示する加算部分木を検出する第１の加算部分木検出サブステップと、
前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が減算を指示する減算部分木を検出する第１の減算部分木検出サブステップと、
前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が乗算を指示する乗算部分木を検出する第１の乗算部分木検出サブステップと、
前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が除算を指示する除算部分木を検出する第１の除算部分木検出サブステップとを有し、
前記演算種類検出サブステップは、
前記演算子変換ステップにより変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する加算部分木を検出する第２の加算部分木検出サブステップと、
前記演算子変換ステップにより変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する減算部分木を検出する第２の減算部分木検出サブステップと、
前記演算子変換ステップにより変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する乗算部分木を検出する第２の乗算部分木検出サブステップと、
前記演算子変換ステップにより変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する除算部分木を検出する第２の除算部分木検出サブステップとを有する。
【００３４】
請求項２１の発明に係るプログラム翻訳方法は請求項１８又は２０に対して、前記主たる型は１６ビット長と３２ビット長とを含み、前記異なるビット長は２４ビット長である。
【００３５】
【作用】
上記の手段によって請求項１のプログラム翻訳装置では、部分木検出手段は、演算子とそれに要する被演算子とからなる部分木であって、付加された型情報のうち所定の型情報をもつ演算子及び／又は被演算子を有する部分木を、構文解析手段により出力された解析木から検出する。型情報変換手段は、検出された部分木に対して、前記所定の型情報を前記異なるビット長を表す型情報に変換する。コード生成手段は、変換された部分木を有する解析木に基づいて、前記異なるビット長で演算する命令を含む目的コードを生成する。これにより、高級言語の型と同じ長さの演算命令の他に、主たる型と異なるビット長で演算する命令を使用する目的コードが生成されるので、高級言語の型と同じ長さに型変換する命令が生成されることなく、コードサイズを小さくできる。主たる型と異なるビット長で演算する命令を実行するマイクロプロセッサに適した目的コードを得ることができる。
【００３６】
請求項２のプログラム翻訳装置では請求項１において、前記所定の型情報が高級言語プログラム中の型宣言文に依存しない型情報であって、２のべき乗倍のバイト数分のビット長を表し、前記異なるビット長は、前記所定の型情報より短いビット長を表す。これにより、２のべき乗倍のバイト数分のビット長と異なるビット長で演算する命令を実行するマイクロプロセッサに適した目的コードを得ることができる。
【００３７】
請求項３のプログラム翻訳装置では、構文解析手段からの解析木に対して、型情報付加手段は、高級言語プログラム中の型宣言文に依存しない変数の型であって、被演算子又は演算子のビット長を表す第２の型情報を、部分木の被演算子及び／又は演算子に付加する。部分木検出手段は、前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木を検出する。被演算子変換手段は、部分木検出手段により検出された部分木に対して、前記主たる型が示すビット長と同じビット長を表す第２の型情報をもつ被演算子の型情報を、前記異なるビット長を示す第２の型情報に変換する。演算子変換手段は、被演算子型情報変換手段により変換された部分木に対して、前記主たる型が示すビット長と同じビット長を表す第２の型情報をもつ演算子の型情報を、前記異なるビット長を示す第２の型情報に変換する。コード生成手段は、演算子型情報変換手段により変換された部分木を有する解析木に基づいて、前記異なるビット長で演算する命令を含む目的コードを生成する。これにより、高級言語の型と同じ長さの演算命令の他に、主たる型と異なるビット長で演算する命令を使用する目的コードが生成されるので、高級言語の型と同じ長さに型変換する命令が生成されることなく、コードサイズを小さくできる。主たる型と異なるビット長で演算する命令を実行するマイクロプロセッサに適した目的コードを得ることができる。
【００３８】
請求項４のプログラム翻訳装置では請求項３のコード生成手段において、演算種類検出部は、演算子変換手段により変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する部分木と、その演算子の演算種類を検出する。生成部は演算種類検出部により検出された演算種類に対応するコード生成情報に基づいて、検出された部分木に対応する命令コードを生成する。これにより主たる型と異なるビット長で演算する命令を実行するマイクロプロセッサの命令をコード生成情報として準備しておけば、そのマイクロプロセッサに適した目的コードを生成することができる。
【００３９】
請求項５のプログラム翻訳装置では請求項４において、前記主たる型は２のべき乗倍のバイト数分のビット長を表し、前記異なるビット長は前記主たる型のうち最長のビット長より短いビット長を表す。
請求項６のプログラム翻訳装置では請求項５において、前記部分木検出手段は、前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が加算を指示する加算部分木と、部分木の演算子が減算を指示する減算部分木と、部分木の演算子が乗算を指示する乗算部分木と、部分木の演算子が除算を指示する除算部分木とからなる部分木の種類のうちの少なくとも１種類以上の部分木を検出する。前記演算種類検出部は、前記演算子変換手段により変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する部分木であって、加算部分木と減算部分木と乗算部分木と除算部分木とからなる部分木の種類のうちの少なくとも１種類以上の部分木を検出する。前記コード生成情報記憶部は、前記異なるビット長を表す第２の型情報をもつ演算子を有する部分木であって、加算部分木と減算部分木と乗算部分木と除算部分木とからなる部分木の種類のうちの少なくとも１種類以上の部分木に対応する前記マイクロプロセッサの命令を表すコード生成情報を記憶する。前記部分木検出手段と演算種類検出部とコード生成情報記憶部とは同じ種類の部分木に対応する。これにより演算種類に応じた効率の良い命令コードを生成することができる。
【００４０】
請求項７のプログラム翻訳装置では請求項６において、前記コード生成情報記憶部は、前記異なるビット長を表す第２の型情報をもつ演算子を有する除算部分木に対応する前記マイクロプロセッサの除算命令を表すコード生成情報を記憶する。
請求項８のプログラム翻訳装置では請求項７において、前記コード生成情報記憶部は、前記異なるビット長を表す第２の型情報をもつ演算子を有する除算部分木に対応して、前記マイクロプロセッサに用いる除算支援ルーチンをコード生成情報として記憶する。これにより、除算支援ルーチンを生成することができ、引数渡しによる冗長なロード／ストア命令がなくなり、冗長な型変換を削除することができ、より効率のよい除算を実行する目的コードを生成することができる。
【００４１】
請求項９のプログラム翻訳装置では請求項６において、前記コード生成情報記憶部は、前記異なるビット長を表す第２の型情報をもつ演算子を有する乗算部分木に対応して、前記マイクロプロセッサに用いる乗算支援ルーチンをコード生成情報として記憶する。これによりコード生成手段により効率のよい乗算を実行する目的コードを生成することができる。
【００４２】
請求項１０のプログラム翻訳装置では請求項９において、前記部分木検出手段は、さらに前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、演算子が乗算を指示し、演算子に要する被演算子の１つが２のべき乗である乗算部分木を検出する。前記演算種類検出部は、さらに前記演算子変換手段により変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有し、演算子に要する被演算子の１つが２のべき乗である乗算部分木を検出する。前記コード生成情報記憶部は、前記異なるビット長を表す第２の型情報をもつ演算子と、被演算子の１つが２のべき乗である乗算部分木に対応して、前記マイクロプロセッサのシフト命令を表すコード生成情報を記憶する。これによりコード生成手段により、被演算子の１つが２べき乗である場合に、シフト命令により乗算を実現するのでさらに効率のよい目的コードを生成することができる。
【００４３】
請求項１１のプログラム翻訳装置では請求項６の前記部分木検出手段において、第１の加算部分木検出部、第１の減算部分木検出部、第１の乗算部分木検出部、および第１の除算部分木検出部が、前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、加算、減算、除算、乗算を指示する部分木をそれぞれ検出する。また、前記演算種類検出部において、第２の加算部分木検出部、第２の減算部分木検出部、第２の乗算部分木検出部、第２の除算部分木検出部は、前記演算子変換手段により変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する加算部分木、減算部分木、乗算部分木、除算部分木をそれぞれ検出する。この検出結果に基づいてコード生成部は、前記コード生成情報記憶部において加算コード記憶部、減算コード記憶部、乗算コード記憶部、除算コード記憶部から対応する命令コードを生成することができる。
【００４４】
請求項１２のプログラム翻訳装置では請求項６又は１１において、前記主たる型は１６ビット長と３２ビット長とを含み、前記異なるビット長は２４ビット長であるので、２４ビット長で演算する命令を実行するマイクロプロセッサに好適する。具体的には４バイト演算命令を用いて３バイトのアドレス計算をすることがなくなり、冗長なロード・ストア命令や型変換のための命令を削除することができる。その結果コードサイズを削減し、実行時間を短縮することができる。
【００４５】
請求項１３のプログラム翻訳方法では、構文解析ステップで得られた解析木から、部分木検出ステップは、演算子とそれに要する被演算子とからなる部分木であって、付加された型情報のうち所定の型情報をもつ演算子及び／又は被演算子を有する部分木を検出する。型情報変換ステップは、検出された部分木に対して、前記所定の型情報を前記異なるビット長を表す型情報に変換する。コード生成ステップは、変換された部分木を有する解析木に基づいて、前記異なるビット長で演算する命令を含む目的コードを生成する。これにより、高級言語の型と同じ長さの演算命令の他に、主たる型と異なるビット長で演算する命令を使用する目的コードが生成されるので、高級言語の型と同じ長さに型変換する命令が生成されることなく、コードサイズを小さくできる。主たる型と異なるビット長で演算する命令を実行するマイクロプロセッサに適した目的コードを得ることができる。
【００４６】
請求項１４のプログラム翻訳方法では請求項１３において、前記所定の型情報は、高級言語プログラム中の型宣言文に依存しない型情報であって、２のべき乗倍のバイト数分のビット長を表し、前記異なるビット長は、前記所定の型情報より短いビット長を表す。これにより、２のべき乗倍のバイト数分のビット長と異なるビット長で演算する命令を実行するマイクロプロセッサに適した目的コードを得ることができる。
【００４７】
請求項１５のプログラム翻訳方法では、
構文解析ステップで得られた解析木に対して、型情報付加ステップは、高級言語プログラム中の型宣言文に依存しない変数の型であって、被演算子又は演算子のビット長を表す第２の型情報を、部分木の被演算子及び／又は演算子に付加する。部分木検出ステップは、前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木を検出する。被演算子変換ステップは、部分木検出ステップにおいて検出された部分木に対して、前記主たる型が示すビット長と同じビット長を表す第２の型情報をもつ被演算子の型情報を、前記異なるビット長を示す第２の型情報に変換する。演算子変換ステップは、被演算子型情報変換ステップおいて変換された部分木に対して、前記主たる型が示すビット長と同じビット長を表す第２の型情報をもつ演算子の型情報を、前記異なるビット長を示す第２の型情報に変換する。コード生成ステップは、演算子型情報変換ステップにおいて変換された部分木を有する解析木に基づいて、前記異なるビット長で演算する命令を含む目的コードを生成する。これにより、高級言語の型と同じ長さの演算命令の他に、主たる型と異なるビット長で演算する命令を使用する目的コードが生成されるので、高級言語の型と同じ長さに型変換する命令が生成されることなく、コードサイズを小さくできる。主たる型と異なるビット長で演算する命令を実行するマイクロプロセッサに適した目的コードを得ることができる。
【００４８】
請求項１６のプログラム翻訳方法では請求項１５のコード生成ステップにおいて、演算種類検出サブステップは、演算子変換ステップにより変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する部分木と、その演算子の演算種類を検出する。生成サブステップは、前記異なるビット長を示す演算子を有する部分木に対応する前記マイクロプロセッサの命令を表すコード生成情報を、演算子の演算種類毎に記憶するコード生成情報記憶部を参照して、演算種類検出サブステップにおいて検出された演算種類に対応するコード生成情報に基づいて、検出された部分木に対応する命令コードを生成する。これにより主たる型と異なるビット長で演算する命令を実行するマイクロプロセッサの命令をコード生成情報として準備しておけば、そのマイクロプロセッサに適した目的コードを生成することができる。
【００４９】
請求項１７のプログラム翻訳方法では請求項１６において、前記主たる型は２のべき乗倍のバイト数分のビット長を表し、前記異なるビット長は前記主たる型のうち最長のビット長より短いビット長を表す。
請求項１８のプログラム翻訳方法では請求項１７において、前記部分木検出ステップは、前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、部分木の演算子が加算を指示する加算部分木と、部分木の演算子が減算を指示する減算部分木と、部分木の演算子が乗算を指示する乗算部分木と、部分木の演算子が除算を指示する除算部分木とからなる部分木の種類のうちの少なくとも１種類以上の部分木を検出する。前記演算種類検出サブステップは、前記演算子変換ステップにより変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する部分木であって、加算部分木と減算部分木と乗算部分木と除算部分木とからなる部分木の種類のうちの少なくとも１種類以上の部分木を検出する。前記部分木検出ステップと演算種類検出サブステップとは同じ種類の部分木に対応する。これにより演算種類に応じた効率の良い命令コードを生成することができる。
【００５０】
請求項１９のプログラム翻訳方法では請求項１８において、前記部分木検出ステップは、さらに前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、演算子が乗算を指示し、演算子に要する被演算子の１つが２のべき乗である乗算部分木を検出する。前記演算種類検出サブステップは、さらに前記演算子変換ステップにより変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有し、演算子に要する被演算子の１つが２のべき乗である乗算部分木を検出する。これによりコード生成ステップにより、被演算子の１つが２べき乗である場合に、シフト命令により乗算を実現するのでさらに効率のよい目的コードを生成することができる。
【００５１】
請求項２０のプログラム翻訳方法では請求項１８において、第１の加算部分木検出サブステップ、第１の減算部分木検出サブステップ、第１の乗算部分木検出サブステップ、および第１の除算部分木検出サブステップが、前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、加算、減算、除算、乗算を指示する部分木をそれぞれ検出する。また、前記演算種類検出サブステップにおいて、第２の加算部分木検出サブステップ、第２の減算部分木検出サブステップ、第２の乗算部分木検出サブステップ、第２の除算部分木検出サブステップは、前記演算子変換手段により変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する加算部分木、減算部分木、乗算部分木、除算部分木をそれぞれ検出する。この検出結果に基づいてコード生成サブステップは、部分木の演算種類に対応する命令コードを生成することができる。
【００５２】
請求項２１のプログラム翻訳方法では請求項１８又は２０において、前記主たる型は１６ビット長と３２ビット長とを含み、前記異なるビット長は２４ビット長であるので、２４ビット長で演算する命令を実行するマイクロプロセッサに好適する。具体的には４バイト演算命令を用いて３バイトのアドレス計算をすることがなくなり、冗長なロード・ストア命令や型変換のための命令を削除することができる。その結果コードサイズを削減し、実行時間を短縮することができる。
【００５３】
【実施例】
図１は本発明の実施例におけるプログラム翻訳装置の構成を示す機能ブロック図である。
同図において、１は構文解析部であり、記憶装置（図外）のソースプログラムの構文を解析し、解析結果に基づいてプログラム中の演算子と被演算子との関係を表す解析木を出力する。その際、ソースプログラム中の型宣言文に依存した型情報を解析木に付加する。
【００５４】
２は型情報付与部で、構文解析部１が出力する解析木に対して、まだ型情報が付与されていない演算子と被演算子について従来例のルール１〜９に従って型情報を付与し、型情報付解析木を出力する。型情報付与部２によって付与される型情報は、ソースプログラムの型宣言に依存しないことを示す＃が付与され、構文解析部１により付与された型情報と区別される。図２（ａ）（ｂ）は、型情報が付与された解析木のデータ構造を示す説明図である。同図（ａ）は解析木を構成する２種類の式ノード（オペレーションの式ノード、葉の式ノード）を示す。オペレーションの式ノードは、”ｏｐｎｏｄｅ”、”ｌｐｔｒ”、”ｒｐｔｒ”、”型情報”フィールドからなる。ここで”ｏｐｎｏｄｅ”は、＋，−，＊，ＤＩＶ，ＯＰＰＴＲなどの演算子の種類を、”ｌｐｔｒ”は左辺の子ノードを指すポインタを、”ｒｐｔｒ”は右辺の子ノードを指すポインタを、”型情報”は演算子の型をそれぞれ表している。葉の式ノードは、”ｌｅａｆｎｏｄｅ”，”ｖａｌｕｅ”，”型情報”フィールドからなる。”ｌｅａｆｎｏｄｅ”は変数や即値など被演算子の種類を、”ｖａｌｕｅ”は変数又は即値の値を、”型情報”は被演算子の型を表す。同図（ｂ）は、図２７に示した解析木を式ノードによって表した説明図である。同図のように解析木は、上記の式ノードがポインタ（ｌｐｔｒ，ｒｐｔｒ）により論理的に接続されて表される。
【００５５】
３は部分木取得部で、型情報付与部２が出力する解析木を検索し、解析木を構成する個々の部分木を深さ優先の順序にしたがって順に取得する。ここで深さ優先の順序は、階層が深い部分木を優先することをいう。例えば図２７の解析木に対しては部分木１０１〜部分木１０３の順序で検索することになる。
４は４バイト演算部分木検出部で、４バイト加算、減算、乗算、除算部分木検出部４１〜４４を備え、部分木の演算子（加算、減算、乗算、除算）に付与されている型情報が（４ｂｙｔｅ）又は（＃４ｂｙｔｅ）であるとき、４バイト演算を示す部分木であることを検出する。
【００５６】
５は被演算子型情報変換部で、４バイト演算部分木検出部が検出する部分木に対し、以下の変換規則（ルール１４）に基づいて被演算子の型を（４ｂｙｔｅ）又は（＃４ｂｙｔｅ）から（３ｂｙｔｅ）に変換する。
ルール１４：被演算子の型が（＃４ｂｙｔｅ）で、その値が３バイト内にある場合、被演算子の型を（３ｂｙｔｅ）に変換する。
【００５７】
６は演算子型情報変換部で、前記被演算子型情報変換部５を経た部分木に対して以下の変換規則（ルール１０〜１３）に基づいて演算子の型を（４ｂｙｔｅ）又は（＃４ｂｙｔｅ）から（３ｂｙｔｅ）に変換する。
ルール１０：＋演算子の型が（＃４ｂｙｔｅ）で＋演算子に結合されているすべての被演算子の型情報が（ｐｏｉｎｔｅｒ）あるいは（ｐｏｉｎｔｅｒ）と同じ長さの（３ｂｙｔｅ）である場合、＋演算子の型を（３ｂｙｔｅ）に変換する。
ルール１１：−演算子の型が（＃４ｂｙｔｅ）で−演算子に結合されているすべての被演算子の型情報が（ｐｏｉｎｔｅｒ）あるいは（ｐｏｉｎｔｅｒ）と同じ長さの（３ｂｙｔｅ）である場合、−演算子の型を（３ｂｙｔｅ）に変換する。
ルール１２：＊演算子の型が（＃４ｂｙｔｅ）で、＊演算子に結合されているすべての被演算子の型情報が（２ｂｙｔｅ、＃付き含む）、（ｐｏｉｎｔｅｒ）又は（３ｂｙｔｅ）のいずれかであり、それより上位の部分木の演算子がＯＰＰＴＲである場合、＊演算子の型を（３ｂｙｔｅ）に変換する。
ルール１３：ＤＩＶ演算子の型が（＃４ｂｙｔｅ）で、ＤＩＶ演算子に結合されているすべての被演算子の型情報が（ｐｏｉｎｔｅｒ）又は（ｐｏｉｎｔｅｒ）と同じ長さの（３ｂｙｔｅ）である場合、ＤＩＶ演算子の型を（３ｂｙｔｅ）に変換する。
【００５８】
７はコード生成部で、出力部分木取得部７０と、３バイト演算部分木検出部７１と、コード出力部７２とを備え、演算子型情報変換部６から出力される解析木に対応する命令コードを生成する。
出力部分木取得部７０は、演算子型情報変換部６を経て型情報が変換された解析木に対して深さ優先の順序に従ってコード生成の対象となる部分木を順に取得する。
【００５９】
３バイト演算部分木検出部７１は、３バイト加算、減算、乗算、除算部分木検出部７１１〜７１４、３バイト加算、減算、乗算、除算コード生成情報記憶部７１１ａ〜７１４ａを備え、このうちバイト乗算部分木検出部７１３は被演算子検出部７１３１とシフト演算変換部７１３２とを有する。
３バイト加算、減算、乗算、除算部分木検出部７１１〜７１４は、出力部分木取得部７０によって取得された部分木の中から、３バイト加算部分木、３バイト減算部分木、３バイト乗算部分木、３バイト除算部分木を検出し、その部分木に適合するコード生成情報を３バイト加算、減算、乗算、除算コード生成情報記憶部７１１ａ〜７１４ａから検索して出力する。
【００６０】
被演算子検出部７１３１は、３バイト乗算部分木検出部７１３において３バイト乗算を示す部分木が検出された場合には、３バイト乗算部分木の被演算子の型と値とを検出し、検出結果に応じたコード生成情報を取得する。より具体的には被演算子検出部７１３１は、被演算子の一方の値が２のべき乗であるかどうかを検出し、２のべき乗であるとき、シフト演算変換部７１３２に、３バイト乗算の部分木をシフト演算の部分木に変換させ、被演算子の型が３バイトより小さいとき、２バイトで乗算し結果を３バイトで保持する乗算命令（ＭＵＬ２３）を取得し、被演算子の型が３バイトより大きいとき、３バイト乗算支援ルーチン（ＪＳＲ  ＠ＭＵＬ３）を取得する。
【００６１】
シフト演算変換部７１３２は、被演算子検出部７１３１に検出された被演算子の型が（３ｂｙｔｅ）又は（ｐｏｉｎｔｅｒ）で、被演算子の一方の値が２でべき乗である場合には演算子をｓｈｉｆｔ演算に変換し、３バイトシフト命令（本実施例では、他方の被演算子同士を加算するＡＤＤ３命令を１つ以上実行させる）命令を取得する。
３バイト加算、減算、乗算、除算コード生成情報記憶部７１１ａ、７１２ａ、７１３ａ、７１４ａは、３バイト加算部分木、３バイト減算部分木、３バイト乗算部分木、３バイト除算部分木に対応するコード生成情報をそれぞれ記憶する。図３（ａ）〜（ｄ）に、それぞれの記憶内容を示す。同図（ａ）〜（ｄ）のように、演算子、演算子の型、被演算子の型により表される部分木に対応して、生成すべき命令コードおよび必要な引数の渡し方がコード生成情報として保持されている。
【００６２】
７２はコード出力部で、３バイト演算部分木検出部７１からのコード生成情報、および、他の部分木に対応するコード生成情報に基づいて、ＭＰＵが実行できる命令からなる目的コードを生成する。
図４は、上記のプログラム翻訳装置の対象となるＭＰＵの命令仕様を示す。同図において「；」の左側はニーモニック形式の命令コード（ＯＰコードとオペランド）を、「；」の右側はその命令の内容を表わしている。ＯＰコード中の２、３の文字は、扱う数値データ（データ、アドレス等）のバイト長を示す。同図には代表的な命令のみ記載してあり、上から順に２バイトロード命令（ＬＤ２）、２バイトストア命令（ＳＴ２）、３バイトロード命令（ＬＤ３）、３バイトストア命令（ＳＴ３）、２バイト転送命令（ＭＯＶ２）、３バイト転送命令（ＭＯＶ３）、拡張命令（ＥＸＴ）、拡張付き乗算命令（ＭＵＬ２３）、加算命令（ＡＤＤ３）、減算命令（ＳＵＢ３）、３バイト乗算支援ルーチン（ＪＳＲ  ＠ＭＵＬ３）、３バイト除算支援ルーチン（ＪＳＲ  ＠ＤＩＶ３）である。例えば、ＬＤ３  ｓｒｃ，ｒｅｇ２はｓｒｃ（レジスタ又はメモリ）の３バイトの数値データをｒｅｇ２（レジスタ２）にロードする命令、また、ＭＵＬ２３  ｒｅｇ１，ｒｅｇ２は２バイトで乗算した結果を３バイトでｒｅｇ２に格納する命令である。このＭＰＵのアーキテクチャについては、レジスタ長は３バイトであり、レジスタの３バイト長で演算を行う命令と、レジスタの下位２バイト長で演算を行う命令と、２バイトの演算（またはロード／ストア）すると同時に３バイトに拡張する命令を備えている。メモリに対するアクセスはロード／ストアによってのみ行われ、他の演算はレジスタに対して行われるものとする。
【００６３】
図５と図６は、プログラム翻訳装置の詳細な処理手順を示すフローチャートである。同図において、プログラム翻訳装置の対象となる入力されたソースプログラムは、構文解析部１によって解析木に変換され、ソースプログラムの宣言文に基づいて、解析木のうち宣言された変数に対応する被演算子に型情報を付与する（ステップ１）。
【００６４】
構文解析部１から出力された解析木に対し、型情報付与部２は、まだ型情報が付与されていない演算子と被演算子について上記のルール１〜９に合致したら、型情報を付与し、型情報付与部２によって付与されたことを示す＃を同時に付与する（ステップ２）。
部分木取得部３は、型情報付与部２によって出力された解析木から検索対象の部分木を取得する。検索対象となる部分木の順序は、１つの解析木に対し、深さ優先の順序に従って部分木をたどっていき、部分木の被演算子を演算子とする部分木
がなくなるまでたどり、まだ検索対象となっていない部分木で、最後に到達した部分木から順に検索対象の部分木として取得する（ステップ３：Ｙｅｓ、ステップ３０）。
【００６５】
４バイト加算、減算、乗算、除算部分木検出部４１、４２、４３、４４はそれぞれ、部分木取得部３により取得された部分木について、＋、−、＊、ＤＩＶ演算子の型情報が（＃４ｂｙｔｅ）であるか否かを判定し、型情報が（＃４ｂｙｔｅ）である場合には取得された部分木を検出結果として出力してステップ４に進み（ステップ３１〜３４）、そうでない場合にはステップ３に戻る。
【００６６】
検出された部分木に対して、被演算子型情報変換部５は、ルール１４に従って被演算子の型を（４ｂｙｔｅ）から（３ｂｙｔｅ）に変換する（ステップ４）。さらに被演算子型情報変換部５を経た部分木に対して、演算子型情報変換部６は、ルール１０〜１３に従って演算子の型を（４ｂｙｔｅ）から（３ｂｙｔｅ）に変換する（ステップ５）。
上記動作は、部分木取得部３によって深さ優先の順序に基づき次の順位の部分木がなくなるまで行われ、次の部分木がなくなると（ステップ３０：Ｎｏ）ステップ６に進む。
【００６７】
演算子型情報変換部６により変換された解析木に対して、出力部分木取得部７０は、深さ優先の順序に基づいて部分木を取得して３バイト演算部分木検出部７１に出力する。まだ検索されていない出力対象の部分木が存在しなければステップ７に進む（ステップ６：Ｙｅｓ、ステップ６ｂ）。
３バイト加算部分木検出部７１１によって、＋演算子の型が（３ｂｙｔｅ）または（ｐｏｉｎｔｅｒ）である部分木を検出し（ステップ６１）、使用するコード生成情報として３バイト加算命令（図３（ａ）：ＡＤＤ３）を取得し（ステップ６１ａ）、ステップ７に進む。検出しなければステップ６２に進む。  ３バイト減算部分木検出部７１２によって、−演算子の型が（３ｂｙｔｅ）または（ｐｏｉｎｔｅｒ）である部分木を検出し（ステップ６２）、使用するコード生成情報として３バイト減算命令（図３（ｂ）：ＳＵＢ３）を取得し（ステップ６２ａ）、ステップ７に進む。検出しなければステップ６３に進む。
【００６８】
３バイト乗算部分木検出部７１３によって、＊演算子の型が（３ｂｙｔｅ）または（ｐｏｉｎｔｅｒ）である部分木を検出し（ステップ６３）、該当する部分木があればステップ６３１に進み、検出しなければステップ６４に進む。
被演算子検出部７１３１によって、被演算子の値が２のべき乗であるかどうかを検出し（ステップ６３１）、２のべき乗であるとき、シフト演算変換部７１３２によって、３バイト乗算の部分木をシフト演算の部分木（図３０）に変換し（ステップ６３１１）、使用するコード生成情報として３バイトシフト命令（図３（ｃ）：ＡＤＤ３）を取得し（ステップ６３１ａ）、ステップ７に進む。ステップ６３１で２のべき乗でない時、ステップ６３２に進む。
【００６９】
被演算子検出部７１３１によって、被演算子の型を検出し（ステップ６３２）、３バイトより小さい時、使用するコード生成情報として、２バイトで乗算し結果を３バイトで保持する乗算命令（図３（ｃ）：ＭＵＬ２３）を取得し（ステップ６３２ａ）、ステップ７に進む。
被演算子検出部７１３１によって、被演算子の型を検出し（ステップ６３２）、３バイトより大きい時、使用するコード生成情報として３バイト乗算支援ルーチン（図３（ｃ）：ＪＳＲ  ＠ＭＵＬ３）を取得し（ステップ６３２ａ）、ステップ７に進む。
【００７０】
３バイト除算部分木検出部７１４によって、ＤＩＶ演算子の型が（３ｂｙｔｅ）または（ｐｏｉｎｔｅｒ）である部分木を検出し（ステップ６４）、使用するコード生成情報として３バイト除算支援ルーチン（図３（ｄ）：ＪＳＲ  ＠ＤＩＶ３）を取得し（ステップ６４ａ）、ステップ７に進む。
コード出力部７２によって検索対象の部分木に対して、コード生成情報に基づいて目的コードを生成する。（ステップ７）
上記ステップ６ｂからステップ７までの処理をすべての解析木について繰り返す。
【００７１】
以上のように構成された本発明の実施例におけるプログラム翻訳装置の動作について、２つの具体的な動作例を説明する。
（第１の動作例）
第１の動作例では従来技術で示した図３１のプログラム例に対するコンパイル動作を説明する。
【００７２】
（１．１）いま、図３１のソースプログラムが入力されたとする。
（１．２）構文解析部１は入力された図３１のソースプログラムの構文を解析し、ソースプログラムの宣言文に基づいて、ｌｎｇに対し（４ｂｙｔｅ）、ｐ、ｑに対し（ｐｏｉｎｔｅｒ）の型情報を付与する。その結果、解析木は従来例と同じく図３２となる。
（１．３）型情報付与部２は図３２の解析木に対し、ルール１〜９に従って、まだ型情報が付与されていない−演算子、ＤＩＶ演算子に対し（＃４ｂｙｔｅ）、定数２に（＃４ｂｙｔｅ）を付与する。型情報の付与方法の詳細は従来例の第１の例の同様である。その結果、解析木は従来例と同じく図３３の状態となり、部分木１０１〜１０３からなっている。
【００７３】
（１．４）部分木取得部３は、図３３の解析木に対し、部分木１０１〜１０３の順に順序付けし、まず部分木１０１を検索対象として取得する。
（１．５）４バイト減算部分木検出部４２は、部分木１０１に対し、−演算子に付与されている型情報について、型が（４ｂｙｔｅ）である−演算子と、その−演算子に結合されている被演算子からなる部分木であることを検出する。図７に、検出された部分木を示す。
【００７４】
（１．６）被演算子型情報変換部５は、４バイト減算部分木検出部４２により検出された部分木の被演算子について、ルール１４に基づいて被演算子の型を（４ｂｙｔｅ）から（３ｂｙｔｅ）に変換できるかを試す。この場合、図７の部分木は両方の被演算子が（ｐｏｉｎｔｅｒ）なので、被演算子型情報変換部５は何もせず次に進む。
（１．７）演算子型情報変換部６は、被演算子型情報変換部５を経た図７の部分木に対し、ルール１０〜１３にしたがって−演算子の型を（＃４ｂｙｔｅ）から（３ｂｙｔｅ）に変換する。この場合、−演算子に結合されている被演算子の型情報が両方とも（ｐｏｉｎｔｅｒ）であるので、ルール１１が適用され、−演算子の型を（＃４ｂｙｔｅ）から（３ｂｙｔｅ）に変換される。図８に、図７の部分木の−演算子が変換された結果を示す。また、図９に、元の図３３の解析木に対して変換結果の図８の部分木を含む解析木を示す。
【００７５】
（１．８）次に部分木取得部３は、図９の解析木から部分木１０２を検索対象の部分木として取得する。
（１．９）４バイト除算部分木検出部４４は、部分木１０２において、ＤＩＶ演算子に付与されている型情報について、型が（＃４ｂｙｔｅ）であるＤＩＶ演算子と、そのＤＩＶ演算子に結合されている被演算子からなる部分木を検出する。図１０に、検出された部分木を示す。
【００７６】
（１．１０）被演算子型情報変換部５は、４バイト除算部分木検出部４４により検出された図１０の部分木の被演算子について、ルール１４に基づいて被演算子の型を（＃４ｂｙｔｅ）から（３ｂｙｔｅ）に変換できるかを試す。この場合、定数２の被演算子が（＃４ｂｙｔｅ）で、ソースプログラムの型宣言文に依存しない型であり、値自身が３ｂｙｔｅ内にある値であるので（３ｂｙｔｅ）に変換可能であり、ルール１４が適用される。図１１に、定数２の型情報が変換された部分木を示す。
【００７７】
（１．１１）演算子型情報変換部６は、被演算子型情報変換部５を経た図１１の部分木に対し、ルール１０〜１３に基づいて演算子の型を（４ｂｙｔｅ）から（３ｂｙｔｅ）に変換する。この場合、図１１の部分木はＤＩＶ演算子に結合されている被演算子の型情報が両方とも（３ｂｙｔｅ）であるので、ルール１３が適用され、ＤＩＶ演算子の型が（＃４ｂｙｔｅ）から（３ｂｙｔｅ）に変換される。図１２に、図１１のＤＩＶ演算子の型が変換された結果の部分木１０２を示す。また図１３に、変換された図１２の部分木１０２を含む解析木を示す。
【００７８】
（１．１２）次に部分木取得部３は、図１３の解析木に対し、部分木１０３を検索対象の部分木として取得する。部分木１０３は４バイト演算部分木検出部４で検出されず、次の検索対象となる部分木を取得しにいき、次の部分木が存在しないのでステップ６に進む。
（１．１３）出力部分木取得部７０は、深さ優先の順序に基づき、図１３の部分木１０１を出力対象の部分木として取得する。
【００７９】
（１．１４）３バイト減算部分木検出部７１２は、部分木１０１が３バイト減算の部分木であることを検出し、その部分木に対応するコード生成情報を３バイト減算コード生成情報記憶部７１２ａから検索し、コード生成情報として３バイト減算命令（図３（ｂ）：ＳＵＢ３）を取得する。
（１．１５）コード出力部７２は、取得されたコード生成情報（ＳＵＢ３）に基づいて部分木１０１に対応する命令群を出力する。ここで出力された命令群を図１４の（１４．１）〜（１４．３）に示す。
【００８０】
（１．１６）出力部分木取得部７０は、深さ優先の順序に基づき、図１３の部分木１０２を出力対象の部分木として取得する。
（１．１７）３バイト除算部分木検出部７１４は、部分木１０２が３バイト除算の部分木であることを検出し、その部分木に対応するコード生成情報を３バイト除算コード生成情報記憶部７１４ａから検索し、コード生成情報として３バイト除算支援ルーチン（図３（ｄ）：ＪＳＲ  ＠ＤＩＶ３）を取得する。
【００８１】
（１．１８）コード出力部７２は、取得されたコード生成情報（ＪＳＲ  ＠ＤＩＶ３）に基づいて部分木１０２に対応する命令群を出力する。ここで出力された命令群を図１４の（１４．４）〜（１４．７）に示す。
（１．１９）出力部分木取得部７０は、深さ優先の順序に基づき、部分木１０３を出力対象の部分木として取得する。
【００８２】
（１．２０）コード出力部７２は、部分木１０３に対応する命令群を出力する。ここで出力された命令群を図１４の（１４．８）〜（１４．９）に示す。
上記の結果、最終的に得られる目的コードは、図１４（１４．１）〜（１４．９）になる。図１４の目的コードは従来技術による図３８の目的コードと比べると、３バイト長のポインタ型変数のロード／ストアを従来例では下位２バイト、上位１バイトに分け、２命令のロード／ストア命令から、本発明では３バイトのみ１命令のロード／ストア命令に減少する。  また、４バイトの減算を従来例では上位、下位２バイトずつにわけ、２命令で実現するのに対し、本発明では４バイト減算を３バイト減算で実現し、１命令に減少する。さらに、４バイトの除算を従来例では引数渡しを上位、下位２バイトずつにわけることにより、４命令のストア命令が必要であり、４バイト除算支援ルーチンで実現するのに対し、本発明では４バイト減算を３バイト減算で実現し、引数渡しは、２命令のストア命令ですみ、３バイト除算支援ルーチンで実現できる。さらに３バイト演算を使用することにより従来必要であった拡張命令（１０７．１０）  ＥＸＴ  Ｒ２Ｌ）がなくなっているので、コードサイズが小さくなっている。
【００８３】
上述のように本実施例の第１の例でプログラム翻訳装置においては、４バイト除算部分木検出部４４と、被演算子型情報変換部５と演算子型情報変換部６と３バイト除算部分木検出部７１４と３バイト除算部分木検出部７１４と３バイト除算コード生成情報記憶部７１４ａを設けることにより、３バイト除算支援ルーチンを生成することができ、引数渡しによる冗長なロード／ストア命令がなくなり、冗長な型変換を削除することができる。
【００８４】
さらに４バイト減算部分木検出部４２と、被演算子型情報変換部５と演算子型情報変換部６と３バイト減算部分木検出部７１２と３バイト減算部分木検出部７１２と３バイト減算コード生成情報記憶部７１２ａを設けることにより、３バイト減算命令を生成することができ、冗長なロード／ストア命令が削除することができる。
（第２の動作例）
第２の動作例では従来技術で示した図３５のプログラム例に対するコンパイル動作を説明する。まず被演算子検出部７１３１およびシフト演算変換部７１３２の機能が停止している場合を説明する。
【００８５】
（２．１）いま、図３５のソースプログラムが入力されたとする。
（２．２）構文解析部１は入力された図３５のソースプログラムの構文を解析し、ソースプログラムの宣言文に基づいて、被演算子ｉに対し（２ｂｙｔｅ）、演算子ＯＰＰＴＲに対し（２ｂｙｔｅ）、被演算子＆に対し（ｐｏｉｎｔｅｒ）を型情報として付与する。その結果解析木は従来例と同様に図３６の状態となる。
【００８６】
（２．３）型情報付与部２は図３６の解析木に対し、ルール１〜９に従って、まだ型情報が付与されていない＋演算子、＊演算子に対し（＃４ｂｙｔｅ）、定数２に（＃２ｂｙｔｅ）を付与する。型情報の付与方法の詳細は従来例の第２の例を同様である。その結果、解析木は従来例と同じく図３７となり、部分木２０１〜２０３からなっている。
【００８７】
（２．４）部分木取得部３は、図３７の解析木に対し、部分木２０１〜２０４の順に順序付けし、まず検索対象として部分木２０１を取得する。
（２．５）４バイト乗算部分木検出部４３は、部分木２０１に対し、＊演算子に付与されている型情報に着目し、型が（４ｂｙｔｅ）である＊演算子と、その＊演算子に結合されている被演算子からなる部分木であることを検出する。図１５に、検出された部分木を示す。
【００８８】
（２．６）被演算子型情報変換部５は、４バイト乗算部分木検出部４３に検出された部分木の被演算子について、ルール１４に基づいて被演算子の型を（４ｂｙｔｅ）から（３ｂｙｔｅ）に変換できるかを試す。この場合、図１５の部分木は、２つ被演算子がそれぞれ（＃２ｂｙｔｅ）、（２ｂｙｔｅ）なので、何もせず次に進む。
（２．７）演算子型情報変換部６は、被演算子型情報変換部５を経た図１５の部分木に対し、ルール１０〜１３にしたがって演算子の型を（４ｂｙｔｅ）から（３ｂｙｔｅ）に変換する。この場合、＊演算子に結合されている被演算子の型情報が両方とも（＃２ｂｙｔｅ）、（２ｂｙｔｅ）であり、乗算結果の型が（＃４ｂｙｔｅ）でソースプログラムの型宣言文に依存せず、乗算結果が３バイトに納まる値であるので、ルール１２が適用され、＊演算子の型が（＃４ｂｙｔｅ）から（３ｂｙｔｅ）に変換される。図１６に、図１５の部分木の＊演算子が変換された結果を示す。また、図１７に、元の図３７の解析木に対して変換結果の図１６の部分木を含む新たな解析木を示す。
【００８９】
（２．８）次に部分木取得部３は、図１７の解析木において部分木２０２を検索対象として取得する。
（２．９）４バイト加算部分木検出部４１は、部分木２０２に対し、ＤＩＶ演算子に付与されている型情報に着目し、型が（４ｂｙｔｅ）である＋演算子と、その＋演算子に結合されている被演算子からなる部分木を検出する。図１８に、検出された部分木を示す。
【００９０】
（２．１０）被演算子型情報変換部５は、４バイト加算部分木検出部４１により検出された図１８の部分木の被演算子について、ルール１４に基づいて被演算子の型を（４ｂｙｔｅ）から（３ｂｙｔｅ）に変換できるかを試す。この場合、左辺＆の被演算子の型が（ｐｏｉｎｔｅｒ）で、右辺＊の被演算子の型が（３ｂｙｔｅ）であるので、何もせず次に進む。
【００９１】
（２．１１）演算子型情報変換部６は、被演算子型情報変換部５を経た図１８の部分木に対し、ルール１０〜１３に基づいて演算子の型を（４ｂｙｔｅ）から（３ｂｙｔｅ）に変換する。この場合、＋演算子に結合されている左辺＆の被演算子の型が（ｐｏｉｎｔｅｒ）で、右辺＊の被演算子の型が（３ｂｙｔｅ）であるので、加算結果の型は３バイト内に納まる値であり、ルール１０が適用され、＋演算子の型を（＃４ｂｙｔｅ）から（ｐｏｉｎｔｅｒ）に変換する。図１９に、図１８の＋演算子の型が変換された結果の部分木２０２を示す。また図２０に、変換された図１９の部分木２０２を含む解析木を示す。
【００９２】
（２．１２）次に部分木取得部３は、図２０の解析木に対し、部分木２０３を検索対象の部分木として取得する。部分木２０３は４バイト演算部分木検出部４で検出されず、次の検索対象となる部分木を取得しにいくが、次の部分木が存在しないのでステップ６に進む。
（２．１３ａ）出力部分木取得部７０は、深さ優先の順序に基づき、図２０の部分木２０１を取得して出力する。
【００９３】
（２．１４ａ）３バイト乗算部分木検出部７１３は、部分木２０１が３バイト乗算の部分木であることを検出し、この部分木に対応するコード生成情報を３バイト乗算コード生成情報記憶部７１３ａから検索し、コード生成情報として３バイト乗算命令（図３（ｃ）：ＭＵＬ２３）を取得する。
（２．１５ａ）コード出力部７２は、コード生成情報（ＭＵＬ２３）に基づいて部分木２０１に対応する命令群を出力する。ここで出力された命令群を図２１の（２１．１）〜（２１．３）に示す。
【００９４】
（２．１６ａ）出力部分木取得部７０は、深さ優先の順序に基づき、出力対象として部分木２０２を取得して出力する。
（２．１７ａ）３バイト加算部分木検出部７１１は、部分木２０２が３バイト加算の部分木であることを検出し、この部分木に対応するコード生成情報を３バイト加算コード生成情報記憶部７１１ａから検索し、コード生成情報として３バイト加算命令（図３（ｃ）：ＡＤＤ３）を取得する。
【００９５】
（２．１８ａ）コード出力部７２は、取得された３バイト加算命令（ＡＤＤ３）に基づいて、部分木２０２に対応する命令群を出力する。ここで出力された命令群を図２１の（２１．４）〜（２１．５）に示す。
（２．１９ａ）出力部分木取得部７０は、深さ優先の順序に基づき部分木２０３を取得して出力する。
【００９６】
（２．２０ａ）コード出力部７２は、部分木２０３に対応する命令群として図２１の（２１．６）〜（２１．７）を出力する。
上記の結果、最終的に得られる目的コードは、図２１（２１．１）〜（２１．７）になる。
次に、本実施例の３バイト乗算部分木検出部７１３における被演算子検出部７１３１およびシフト演算変換部７１３２が機能している場合について述べる。
【００９７】
図３５のソースプログラムに対して、上記（２．１）〜（２．１２）の動作により図２０の解析木を得る。
（２．１３ｂ）出力部分木取得部７０は、深さ優先の順序に基づき、出力対象の部分木２０１を取得して出力する。
（２．１４ｂ）３バイト乗算部分木検出部７１３は、図２０の部分木２０１が３バイト乗算の部分木であることを検出する。
【００９８】
（２．１５ｂ）被演算子検出部７１３１は、部分木２０１に対し、被演算子の一方の値が２のべき乗であるかどうかを検出する。部分木２０１の被演算子が２の１乗であるので、シフト演算変換部７１３２は、３バイト乗算の部分木をシフト演算の部分木に変換し、使用するコード生成情報として３バイトシフト命令（図３（ｃ）：ＡＤＤ３）を取得する。図２２に、＊演算子がｓｈｉｆｔ演算子に変換された部分木２０１を示す。図２３に、図２２の部分木を含む新たな解析木を示す。
【００９９】
（２．１６ｂ）コード出力部７２は、取得されたコード生成情報（ＡＤＤ３）に基づいて、図２２の部分木２０１に対応する命令群を出力する。図２５（２５．１）〜（２５．２）に、この命令群を示す。
（２．１７ｂ）出力部分木取得部７０は、深さ優先の順序に基づき、図２３の部分木２０２を取得する。
【０１００】
（２．１８ｂ）３バイト加算部分木検出部７１１は、部分木２０２が３バイト加算の部分木であることを検出し、この部分木に対応するコード生成情報を３バイト加算コード生成情報記憶部７１１ａから検索し、コード生成情報として３バイト加算命令（ＡＤＤ３）を取得する。
（２．１９ｂ）コード出力部７２は、取得された３バイト加算命令（ＡＤＤ３）に基づいて部分木２０２に対応する命令群を出力する、図２５（２５．３）〜（２５．４）にこの命令群を示す。
【０１０１】
（２．２０ｂ）出力部分木取得部７０は、深さ優先の順序に基づき図２３の部分木２０３を取得する。
（２．２１ｂ）コード出力部７２は、部分木２０３に対応する命令群を出力する。図２５（２５．５）〜（２５．６）にこの命令群を示す。
上記の動作の結果、コード出力部によって出力される目的コードは、図２５の（２５．１）〜（２５．６）になる。
【０１０２】
図２１の目的コードは従来技術による図３８の目的コードと比べると、図１５の部分木２０１に対し、左右の被演算子に対して、２バイトから４バイトへの型変換が必要なのに対し、演算子の型を４バイトから３バイトに変換することにより、型変換がなくなり（図３８の（３８．２）、（３８．４））、４バイト乗算支援ルーチンを使用しなくてすみ（図３８の（３８．９））、引数渡しによるロード／ストア命令がいらなくなり（図３８の（３８．５）〜（３８．９）、（３８．１０）〜（３８．１１））、大幅にコードサイズが小さくなる。さらに、図２１と図２５を比べると、３バイトシフト（図２５では同じレジスタどうしを加算することで、左シフトを実現している）を使えるようになり、定数のレジスタへの転送（（２１．２）  ＭＯＶ２  ２，Ｒ１）がなくなる。
【０１０３】
また３バイト長のポインタ型変数のロード／ストアを従来例では下位２バイト、上位１バイトに分け、２命令のロード／ストア命令から（図３８の（３８．１２）〜（３８．１３））、本発明では３バイトのみ１命令のロード／ストア命令に減少する。
また、４バイトの加算を従来例では上位、下位２バイトずつにわけ、２命令で実現するのに対し（図３８の（３８．１４）〜（３８．１５））、本発明では４バイト加算を３バイト加算で実現し、１命令に減少し、コードサイズが小さくなる。
【０１０４】
上述のように本実施例の第２のプログラム例に対しては、４バイト乗算部分木検出部４３と、被演算子型情報変換部５と演算子型情報変換部６と３バイト乗算部分木検出部７１３と３バイト乗算部分木検出部７１３と３バイト乗算コード生成情報記憶部７１３ａを設けることにより、４バイト乗算支援ルーチンを削除でき、３バイト乗算命令を生成することができ、引数渡しによる冗長なロード／ストア命令がなくなり、冗長な型変換を削除することができる。
【０１０５】
さらに、被演算子検出部７１３１とシフト演算変換部７１３２を設けることにより、３バイト乗算に対し３バイトシフト命令を生成でき、２のべき乗の定数の転送命令が削除できる。
さらに４バイト加算部分木検出部４１と、３バイト加算部分木検出部７１１と３バイト加算コード生成情報記憶部７１１ａを設けることにより、３バイト加算命令を生成することができ、冗長なロード／ストア命令を削除することができる。
【０１０６】
【発明の効果】
請求項１のプログラム翻訳装置によれば、高級言語の変数の主たる型と異なるビット長で演算する命令を含む目的コードを生成する。これにより、高級言語の型と同じ長さの演算命令の他に、主たる型と異なるビット長で演算する命令を使用する目的コードが生成されるので、主たる型と異なるポインタの計算時に、高級言語の主たる型と同じ長さに型変換する命令や、主たる型より短いのに主たる型と同じビット長で計算する冗長な命令が生成されることなく、コードサイズを小さくできる。主たる型と異なるビット長で演算する命令を実行するマイクロプロセッサに適した目的コードを得ることができる。より具体的には、ポインタを扱う計算や配列の計算などの解析木において、ソースプログラムの型宣言文に依存しない演算子の型をＭＰＵのアドレスのビット長に相当するアドレス型（例えば３バイト）の変数を用いた命令に対応した型に変換するので、ポインタ型と他の型との間の型変換命令が不要になり、かつＭＰＵの有するアドレス長の演算を行う命令に対応した目的コードを生成することができ、冗長な型変換を行う命令コードを生成せず、コードサイズが小さくなるという効果がある。また、プログラム中で配列要素を扱う場合などアドレス計算は頻繁に行われるのが通常であるので、目的コード中に頻出していた型変換がなくなることは、コードサイズを小さくするだけでなくＭＰＵでの実行時間も短くなるという効果がある。
【０１０７】
請求項２のプログラム翻訳装置によれば、請求項１の効果に加えて、前記所定の型情報が高級言語プログラム中の型宣言文に依存しない型情報であって、２のべき乗倍のバイト数分のビット長を表し、前記異なるビット長は、前記所定の型情報より短いビット長を表す。これにより、２のべき乗倍のバイト数分のビット長と異なるビット長で演算する命令を実行するマイクロプロセッサに適した目的コードを得ることができる。例えば、所定の型情報が４バイトで、異なるビット数が３バイトであるとき、３バイトのアドレス計算を行う場合には、４バイト演算によりアドレス計算をすることがなくなるので、冗長なロードストア命令や型変換がなくなることになる。その結果、コードサイズの削減、実行時間の短縮が可能となる。
【０１０８】
請求項３のプログラム翻訳装置によれば、請求項１と同じ効果があり、高級言語の型と同じ長さの演算命令の他に、主たる型と異なるビット長で演算する命令を使用する目的コードが生成されるので、高級言語の型と同じ長さに型変換する命令が生成されることなく、コードサイズを小さくできる。主たる型と異なるビット長で演算する命令を実行するマイクロプロセッサに適した目的コードを得ることができる。
【０１０９】
請求項４のプログラム翻訳装置によれば、請求項３の効果に加えて、主たる型と異なるビット長で演算する命令を実行するマイクロプロセッサの命令をコード生成情報として準備しておけば、そのマイクロプロセッサに適した目的コードを生成することができる。
請求項５のプログラム翻訳装置によれば請求項４の効果に加えて、前記主たる型が２のべき乗倍のバイト数分のビット長を表し、前記異なるビット長は、主たる型の最長のビット長より短いビット長を表す。これにより、２のべき乗倍のバイト数分のビット長と異なるビット長で演算する命令を実行するマイクロプロセッサに適した目的コードを得ることができる。例えば、所定の型情報が４バイトで、異なるビット数が３バイトであるとき、３バイトのアドレス計算を行う場合には、４バイト演算によりアドレス計算をすることがなくなるので、冗長なロードストア命令や型変換がなくなることになる。その結果、コードサイズの削減、実行時間の短縮が可能となる。
【０１１０】
請求項６のプログラム翻訳装置によれば請求項５の効果に加えて、演算種類に応じた効率の良い命令コードを生成することができる。
請求項７のプログラム翻訳装置によれば請求項６の効果に加えて、前記コード生成情報記憶部は、前記異なるビット長を表す第２の型情報をもつ演算子を有する除算部分木に対応する前記マイクロプロセッサの除算命令を表すコード生成情報を記憶するので、ビット長に適した除算命令を生成できる。
【０１１１】
請求項８のプログラム翻訳装置によれば請求項７の効果に加えて、前記コード生成情報記憶部は、前記異なるビット長を表す第２の型情報をもつ演算子を有する除算部分木に対応して、前記マイクロプロセッサに用いる除算支援ルーチンをコード生成情報として記憶する。これにより、除算支援ルーチンを生成することができ、引数渡しによる冗長なロード／ストア命令がなくなり、冗長な型変換を削除することができ、より効率のよい除算を実行する目的コードを生成することができる。
【０１１２】
請求項９のプログラム翻訳装置によれば請求項６の効果に加えて、前記コード生成情報記憶部は、前記異なるビット長を表す第２の型情報をもつ演算子を有する乗算部分木に対応して、前記マイクロプロセッサに用いる乗算支援ルーチンをコード生成情報として記憶する。これによりコード生成手段により効率のよい乗算を実行する目的コードを生成することができる。
【０１１３】
請求項１０のプログラム翻訳装置によれば請求項９の効果に加えて、コード生成手段により、被演算子の１つが２べき乗である場合に、シフト命令により乗算を実現するのでさらに効率のよい目的コードを生成することができる。
請求項１１のプログラム翻訳装置によれば請求項６効果に加えて、第１の加算部分木検出部、第１の減算部分木検出部、第１の乗算部分木検出部、および第１の除算部分木検出部が、前記主たる型が示すビット長と同じビット長を表す第２の型情報が付加された被演算子を有する部分木の中から、加算、減算、除算、乗算を指示する部分木をそれぞれ検出する。演算種類検出部において、第２の加算部分木検出部、第２の減算部分木検出部、第２の乗算部分木検出部、第２の除算部分木検出部は、前記演算子変換手段により変換された部分木を含む解析木から、前記異なるビット長を表す第２の型情報をもつ演算子を有する加算部分木、減算部分木、乗算部分木、除算部分木をそれぞれ検出する。この検出結果に基づいてコード生成部は、前記コード生成情報記憶部において加算コード記憶部、減算コード記憶部、乗算コード記憶部、除算コード記憶部から対応する命令コードを生成することができる。
【０１１４】
請求項１２のプログラム翻訳装置によれば、請求項６又は１１の効果に加えて、前記主たる型は１６ビット長と３２ビット長とを含み、前記異なるビット長は２４ビット長であるので、２４ビット長で演算する命令を実行するマイクロプロセッサに好適する目的コードを生成することができる。具体的には４バイト演算命令を用いて３バイトのアドレス計算をすることがなくなり、冗長なロード・ストア命令や型変換のための命令を削除することができる。その結果コードサイズを削減し、実行時間を短縮することができる。
【０１１５】
請求項１３のプログラム翻訳方法によれば、高級言語の型と同じ長さの演算命令の他に、主たる型と異なるビット長で演算する命令を使用する目的コードが生成されるので、高級言語の型と同じ長さに型変換する命令が生成されることなく、コードサイズを小さくできる。主たる型と異なるビット長で演算する命令を実行するマイクロプロセッサに適した目的コードを得ることができる。
【０１１６】
請求項１４のプログラム翻訳方法によれば、請求項１３の効果に加えて、前記所定の型情報は、高級言語プログラム中の型宣言文に依存しない型情報であって、２のべき乗倍のバイト数分のビット長を表し、前記異なるビット長は、前記所定の型情報より短いビット長を表ので、２のべき乗倍のバイト数分のビット長と異なるビット長で演算する命令を実行するマイクロプロセッサに適した目的コードを得ることができる。
【０１１７】
請求項１５のプログラム翻訳方法によれば、高級言語の型と同じ長さの演算命令の他に、主たる型と異なるビット長で演算する命令を使用する目的コードが生成されるので、高級言語の型と同じ長さに型変換する命令が生成されることなく、コードサイズを小さくできる。主たる型と異なるビット長で演算する命令を実行するマイクロプロセッサに適した目的コードを得ることができる。
【０１１８】
請求項１６のプログラム翻訳方法によれば、請求項１５の効果に加えて、主たる型と異なるビット長で演算する命令を実行するマイクロプロセッサの命令をコード生成情報として準備しておけば、そのマイクロプロセッサに適した目的コードを生成することができる。
請求項１７のプログラム翻訳方法によれば請求項１６の効果に加えて、前記主たる型は２のべき乗倍のバイト数分のビット長を表し、前記異なるビット長は前記主たる型のうち最長のビット長より短いビット長を表ので、２のべき乗倍のバイト数分のビット長と異なるビット長で演算する命令を実行するマイクロプロセッサに適した目的コードを得ることができる。
【０１１９】
請求項１８のプログラム翻訳方法によれば請求項１７の効果に加えて演算種類に応じた効率の良い命令コードを生成することができる。
請求項１９のプログラム翻訳方法によれば、請求項１８の効果に加えてコード生成ステップにより、被演算子の１つが２べき乗である場合に、シフト命令により乗算を実現するのでさらに効率のよい目的コードを生成することができる。
【０１２０】
請求項２０のプログラム翻訳方法によれば、請求項１８の効果に加えて、部分木の演算種類に対応する命令コードを生成することができる。
請求項２１のプログラム翻訳方法によれば請求項１８又は２０の効果に加えて前記主たる型は１６ビット長と３２ビット長とを含み、前記異なるビット長は２４ビット長であるので、２４ビット長で演算する命令を実行するマイクロプロセッサに好適する。具体的には４バイト演算命令を用いて３バイトのアドレス計算をすることがなくなり、冗長なロード・ストア命令や型変換のための命令を削除することができる。その結果コードサイズを削減し、実行時間を短縮することができる。
【図面の簡単な説明】
【図１】本発明の実施例におけるプログラム翻訳装置の構成図である。
【図２】（ａ）解析木のデータ構造を示す式ノードのフォーマット図である。
（ｂ）式ノードにより表される解析木を示す説明図である。
【図３】（ａ）３バイト加算部分木に対応するコード生成情報を示す。
（ｂ）３バイト減算部分木に対応するコード生成情報を示す。
（ｃ）３バイト乗算部分木に対応するコード生成情報を示す。
（ｄ）３バイト除算部分木に対応するコード生成情報を示す。
【図４】同実施例における対象となるＭＰＵの命令仕様である。
【図５】同実施例におけるプログラム翻訳装置の処理フローを表すフローチャート図である。
【図６】同実施例におけるプログラム翻訳装置の処理フロー（図５の続き）を表すフローチャート図である。
【図７】同実施例の第１の動作例において４バイト減算部分木検出部４２により検出された４バイト減算を含む部分木の例である。
【図８】同実施例の第１の動作例において図７の部分木の−演算子の型情報が変換された後の部分木の例である。
【図９】同実施例の第１の動作例において図８の部分木を含む解析木の例である。
【図１０】同実施例の第１の例における４バイト除算部分木検出部４４により検出された４バイト除算部分木の例である。
【図１１】同実施例の第１の例における４バイト除算部分木に対し、被演算子型情報変換部５により定数２の型情報が変換された部分木を示す。
【図１２】同実施例の第１の例における４バイト除算部分木に対し、演算子型情報変換部６によりＤＩＶ演算子の型情報が変換された部分木の例である。
【図１３】同実施例の第１の例における図１２の部分木１０２を含む解析木を示す。
【図１４】同実施例の第１の例におけるコード出力部７２により出力される目的コードである。
【図１５】同実施例の第２の例における４バイト乗算部分木検出部４３により検出された４バイト乗算部分木の例である。
【図１６】同実施例の第２の例における４バイト乗算部分木に対し、変換された後の部分木の例である。
【図１７】同実施例の第２の例における解析木の４バイト乗算部分木に対し変換後の解析木の例である
【図１８】同実施例の第２の例における４バイト加算部分木検出部４１が検出する４バイト加算部分木の例である。
【図１９】同実施例の第２の例における４バイト加算部分木に対し、演算子型情報変換部６が変換した後の部分木の例である。
【図２０】同実施例の第２の例における解析木に対し変換後の解析木の例である。
【図２１】同実施例の第２のプログラム例に対してコード出力部７２により出力される目的コードの例を示す。
【図２２】同実施例の第２の例における３バイト乗算部分木に対し、シフト演算変換部７１３２が変換した後の３バイトシフト演算部分木の例である。
【図２３】同実施例の第２の例における３バイト乗算部分木に対し、シフト演算変換部７１３２が変換した後の解析木の例である。
【図２４】同実施例の第２の例における３バイト加算部分木検出部７１１により検出された３バイト加算部分木の例である。
【図２５】同実施例の第２の例における３バイトシフトを用いたコード出力部７２により出力される目的コードの例を示す。
【図２６】従来技術におけるプログラム翻訳装置の構成を示すブロック図である。
【図２７】従来技術の型情報付与規則のルール４が適用される解析木の一例を示す。
【図２８】従来技術の型情報付与規則のルール５が適用される解析木の一例を示す。
【図２９】従来技術における４バイト演算コード生成情報記憶部２６４に保持される４バイト演算を含む部分木に対応するコード生成情報の具体例を示す。
【図３０】従来技術におけるコンパイラが対象とするＭＰＵの命令仕様の例を示す。
【図３１】Ｃ言語で記述された第１のソースプログラム例を示す。
【図３２】第１のソースプログラム例に対応する解析木を表す。
【図３３】図３２の解析木に型情報が付与された解析木を表す。
【図３４】従来技術の図３３の解析木に基づいてコード生成部が出力する目的コードである。
【図３５】Ｃ言語で記述された第２のソースプログラム例を示す。
【図３６】第２のソースプログラム例に対応する解析木を表す。
【図３７】図３６の解析木に型情報が付与された解析木を表す。
【図３８】従来技術の第２の例におけるコード生成部が出力する目的コードである。
【符号の説明】
１    構文解析部
２    型情報付与部
３    部分木取得部
４    バイト演算部分木検出部
５    被演算子型情報変換部
６    演算子型情報変換部
７    コード生成部
４１    ４バイト加算部分木検出部
４２    ４バイト減算部分木検出部
４３    ４バイト乗算部分木検出部
４４    ４バイト除算部分木検出部
７０    出力部分木取得部
７１    ３バイト演算部分木検出部
７２    コード出力部
７１１    ３バイト加算部分木検出部
７１１ａ  ３バイト加算コード生成情報記憶部
７１２    ３バイト減算部分木検出部
７１２ａ  ３バイト減算コード生成情報記憶部
７１３    ３バイト乗算部分木検出部
７１３ａ  ３バイト乗算コード生成情報記憶部
７１４    ３バイト除算部分木検出部
７１４ａ  ３バイト除算コード生成情報記憶部
７１３１    被演算子検出部
７１３２    シフト演算変換部
【図１】
0003575851.tif 000002
【図２】
0003575851.tif 000003
【図３】
0003575851.tif 000004
【図４】
0003575851.tif 000005
【図５】
0003575851.tif 000006
【図６】
0003575851.tif 000007
【図７】
0003575851.tif 000008
【図８】
0003575851.tif 000009
【図９】
0003575851.tif 000010
【図１０】
0003575851.tif 000011
【図１１】
0003575851.tif 000012
【図１２】
0003575851.tif 000013
【図１３】
0003575851.tif 000014
【図１４】
0003575851.tif 000015
【図１５】
0003575851.tif 000016
【図１６】
0003575851.tif 000017
【図１７】
0003575851.tif 000018
【図１８】
0003575851.tif 000019
【図１９】
0003575851.tif 000020
【図２０】
0003575851.tif 000021
【図２１】
0003575851.tif 000022
【図２２】
0003575851.tif 000023
【図２３】
0003575851.tif 000024
【図２４】
0003575851.tif 000025
【図２５】
0003575851.tif 000026
【図２６】
0003575851.tif 000027
【図２７】
0003575851.tif 000028
【図２８】
0003575851.tif 000029
【図２９】
0003575851.tif 000030
【図３０】
0003575851.tif 000031
【図３１】
0003575851.tif 000032
【図３２】
0003575851.tif 000033
【図３３】
0003575851.tif 000034
【図３４】
0003575851.tif 000035
【図３５】
0003575851.tif 000036
【図３６】
0003575851.tif 000037
【図３７】
0003575851.tif 000038
【図３８】
0003575851.tif 000039