説明

プログラムコード変換装置及びプログラムコード変換方法

【課題】異なるプロセッサ間でプログラムコードの変換を行う場合に、変換元のバイナリコードに含まれるプログラム上の工夫を、変換先のバイナリコードに反映することができるプログラムコード変換装置を提供する。
【解決手段】プログラム変換装置1は、Aプロセッサにおいて実行可能なAバイナリコード15aを、Bプロセッサ用のプログラムコードに変換するために、Aバイナリコード15aを解析するコード解析部と、コード解析部により解析して得られたAプロセッサ用の所定の命令に対応する、Bプロセッサ用の所定の機械命令関数を抽出する機械命令関数抽出部と、Aプロセッサ用の所定の命令を、機械命令関数抽出部により抽出された所定の機械命令関数に書き換えて、AバイナリコードからBプロセッサ用のソースコード23を生成するトランスレータ部と、を有する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、プログラムコード変換装置及びプログラムコード変換方法に関し、特に、第1のプロセッサにおいて実行可能な第1のバイナリコードを、第2のプロセッサ用のプログラムコードに変換するプログラムコード変換装置及びプログラムコード変換方法に関する。
【背景技術】
【0002】
従来より、あるプロセッサで実行可能なプログラムを、他の別なプロセッサでも実行可能なようにプログラムの変換が行われている。例えば、互いに異なるプロセッサXとYがあったとき、プロセッサX用のバイナリコードからプロセッサY用のバイナリコードを得る方法としては、一般的には、次の2つの方法がある。
【0003】
第1の方法は、トランスレータプログラムを用いて、プロセッサX用のバイナリコードを、プロセッサY用のバイナリコードに直接変換する方法である。
この方法では、変換後もバイナリコードであるため、変換されたバイナリコードは可読性が低く、プログラマのユーザは、変換されたバイナリコードに対して、マニュアルでデバッグしたり、新たな仕様変更に対応させたり、性能のチューニングをしたりすることが困難であった。また、プロセッサX用の命令体系と、プロセッサY用の命令体系が異なるとき、プロセッサX用の命令コードをプロセッサY用の命令コードに、一対一に置き換えられない場合もある。
【0004】
第2の方法は、プロセッサX用のバイナリコードを逆コンパイルして、一旦、いわゆる高級言語コードに変換し、その高級言語コードを、プロセッサY用のコンパイラにより、コンパイルしてプロセッサY用のバイナリコードを得る方法である(例えば、特許文献1参照)。
【0005】
しかし、この方法では、第1の方法の問題は解決されるが、次のような問題がある。
逆コンパイルにより、プロセッサに依存しない高級言語コードが生成されるとき、元々プロセッサX用のバイナリコードにおいて施されていた最適化が、プロセッサY用のバイナリコードでは保証されない、という問題である。例えば、人手によりアセンブリコードにおいて最適化のために工夫されたコード片が、バイナリコードに含まれるような場合、逆コンパルされて得られた高級言語コードには、そのようなコード片の工夫あるいは知恵は、反映されない、という問題である。すなわち、プログラム上の工夫のためのコード片の例として、機械命令関数がバイナリコードに含まれていても、逆コンパイルされて得られた高級言語コードには、そのコード片は含まれず、その結果、プロセッサY用のコンパイラが高級言語コードから生成するプロセッサY用のバイナリコードには、プロセッサX用のバイナリコードと同等の最適化が施されない。
【特許文献1】特開2004-252807号公報
【発明の開示】
【発明が解決しようとする課題】
【0006】
そこで、本発明は、このような問題に鑑みてなされたものであり、異なるプロセッサ間でプログラムコードの変換を行う場合に、変換元のバイナリコードに含まれるプログラム上の工夫を、変換先のバイナリコードに反映することができるプログラムコード変換装置を提供することを目的とする。
【課題を解決するための手段】
【0007】
本発明の一態様によれば、第1のプロセッサにおいて実行可能な第1のバイナリコードを、第2のプロセッサ用のプログラムコードに変換するプログラムコード変換装置であって、前記第1のバイナリコードを解析するコード解析部と、該コード解析部により解析して得られた前記第1のプロセッサ用の所定の1以上の命令に対応する、前記第2のプロセッサ用の所定の1以上の機械命令関数を抽出する機械命令関数抽出部と、前記第1のプロセッサ用の前記所定の1以上の命令を、前記機械命令関数抽出部により抽出された前記所定の1以上の機械命令関数に書き換えて、前記第1のバイナリコードから前記第2のプロセッサ用のプログラムコードとして、前記第2のプロセッサ用のソースコードを生成するトランスレータ部と、を有するプログラムコード変換装置を提供することができる。
【発明の効果】
【0008】
本発明によれば、異なるプロセッサ間でプログラムコードの変換を行う場合に、変換元のバイナリコードに含まれるプログラム上の工夫を、変換先のバイナリコードに反映することができるプログラムコード変換装置を提供することができる。
【発明を実施するための最良の形態】
【0009】
以下、図面を参照して本発明の実施の形態を説明する。
まず図1に基づき、本実施の形態に係わるプログラム変換装置の構成を説明する。図1は、本実施の形態に係わるプログラムコード変換装置の構成を示す構成図である。
プログラムコード変換装置(以下、プログラム変換装置という)1は、中央処理装置(以下、CPUという)11a、ROM、RAM等を有する計算機本体11と、キーボード、マウス等の入力装置12と、画面を有する表示装置13と、変換する対象プログラム(変換元プログラム)及び変換されたプログラム(変換先あるいは変換後のプログラム)等を記憶する記憶装置14を含んで構成されている、パーソナルコンピュータ(以下、PCという)等のコンピュータである。記憶装置14には、変換元のオブジェクトコードであるバイナリプログラム(以下、バイナリコードという)15と、変換後のバイナリコード16と、後述するプログラムの変換処理プログラム17と、後述する変換テーブル18とが記憶されている。また、記憶装置14には、デバッグプログラムであるデバッガ19も記憶されており、デバッグを行うときに、CPU11aがデバッガ19を読み出して実行することができる。
【0010】
なお、プログラム変換装置1は、このようなコンピュータに限らず、ネットワークを介して接続されたクライアント・サーバシステムのような装置であってもよい。
【0011】
プログラム変換装置1を利用して、プログラム変換を行うユーザは、変換元のバイナリコード15に対して、後述するプログラムの変換処理を施し、変換後のバイナリコード16を得ることができる。ユーザは、入力装置12と表示装置13を含むマンマシンインターフェース(以下、MMIという)を利用して、記憶装置14に記憶された変換元のバイナリコード15を指定し、かつ変換後のバイナリコード16を記憶する記憶装置14の記憶領域を指定する。
また、ユーザは、MMIを利用して、後述するプログラム変換処理を行う変換処理プログラム17、及び後述する変換テーブル18を指定して、変換処理プログラム17を実行させることができる。
【0012】
本実施の形態では、ある一つのプロセッサで実行可能なバイナリコードを、他の異なるプロセッサで実行可能なバイナリコードに変換する場合を説明するが、その一つのプロセッサをAプロセッサとし、そのAプロセッサで実行可能なバイナリコードをAバイナリコードとし、Aプロセッサとは異なるプロセッサをBプロセッサとし、そのBプロセッサで実行可能なバイナリコードをBバイナリコードとする。そして、これらに合わせて、Aバイナリコードに対応するソースプログラム(以下、ソースコードという)をAソースコードとし、Bバイナリコードに対応するソースコードをBソースコードとする。さらに、AソースコードをコンパイルしてAバイナリコードを生成するコンパイラを、Aコンパイラとし、BソースコードをコンパイルしてBバイナリコードを生成するコンパイラを、Bコンパイラとする。
【0013】
図2は、本実施の形態におけるプログラム変換処理の流れの例を説明するための図である。
図2に示すように、Aバイナリコード15aは、Aソースコード21をAコンパイラ22によってコンパイルして生成されたコードである。Aソースコード21は、所定の処理を実行するための命令群から構成される。Aコンパイラ22は、Aソースコード21をコンパイルして、Aプロセッサで実行可能なオブジェクトコード、すなわちAバイナリコード15aを生成する。
【0014】
Aバイナリコード15aは、トランスレータ部としてのトランスレータ17aにより、汎用の高級言語のソースコード、例えば、C言語ソースコード23に逆コンパイルされる。トランスレータ17aは、Aバイナリコード15aを逆コンパイルする逆コンパイラである。
【0015】
C言語ソースコード23は、Bソースコードであり、Bプロセッサ用のBコンパイラ17bによってコンパイルされることによって、Bバイナリコード16aがC言語ソースコードから生成される。Bコンパイラ17bは、C言語ソースコード23をコンパイルして、Bプロセッサで実行可能なオブジェクトコード、すなわちBバイナリコード16aを生成する。
【0016】
本実施の形態に係るプログラム変換装置1では、Aバイナリコード15aからBバイナリコード16aを生成する際に、途中で、Bプロセッサ用のプログラムコードとしてのC言語ソースコード23が、トランスレータ17aによって生成される。この高級言語のソースコードを生成するときに、トランスレータ17aは、Aバイナリコード15a中の所定の命令を抽出し、その抽出された命令を、対応するBプロセッサ用の1以上の機械命令関数(Intrinsic Function:組み込み関数ともいう)に置き換える置換処理を行う。従って、C言語ソースコード23は、Bプロセッサ用の機械命令関数を含むものとなる。さらに、トランスレータ17aは、Aソースコード21を参照して、所定の形式で書かれたコメント文等を抽出し、抽出したコメント文等を、生成するC言語ソースコード23中に埋め込む埋込処理を行う。
【0017】
従来であれば、Aバイナリコード15aを逆コンパイルすると、Aソースコード21のレベルで、あるいはアセンブリコードのレベルで施された最適化は、C言語ソースコード23中からは消失することがある。さらには、逆コンパイルして得られたC言語ソースコード23には、Aソースコード21中のコメント文等も再生されない。
【0018】
具体的に説明する。プログラマは、Aソースコード21のレベルで、あるいはアセンブリコードレベルで、Aプロセッサ用にプログラムの最適化を行っている場合がある。例えば、Aプロセッサ用の機械命令関数を用いたり、Aプロセッサにおける実行可能な並列度に応じたソースコードを作成して、Aソースコード21の最適化を行う。しかし、ソースコードレベルあるいはアセンブリコードレベルで短いコードに最適化されても、逆コンパイルによりその短いコード部分は、長いコードに変更されてしまうことがある。
【0019】
また、Aソースコード21中のコメント文等は、通常はAバイナリコード15a中にはデバッグ情報として含まれないため、逆アセンブルされて得られたC言語ソースコード23中には、コメント文等は含まれない。
そこで、本実施の形態によれば、上述したような置換処理と埋込処理を行うことによって、最適化されたプログラム部分の残存、およびコメント文等の生成が可能となる。以下、詳細に説明する。
【0020】
図3と図4は、本実施の形態に係るプログラム変換装置1の変換処理プログラム17の処理の流れの例を示すフローチャートである。
図3の処理は、記憶装置14中の変換処理プログラム17を、プログラム変換装置1の計算機本体11のCPU11aが、読み出して実行することによって行われる。
【0021】
まず、CPU11aは、変換元のAバイナリコード15aを解析する(ステップS1)。そして、CPU11aは、解析して得られた情報から、内部表現として、Aバイナリコード15aのコントロールデータフローグラフ(CDFG)を生成する(ステップS2)。従って、ステップS1の処理が、コード解析部を構成し、ステップS2が、コントロールデータフローグラフの情報を生成するコントロールデータフローグラフ(CDFG)情報生成部を構成する。
【0022】
Aバイナリコード15aについてコントロールデータフローグラフの生成が完了すると、CPU11aは、Aバイナリコード15aの中から機械命令関数(IF)を抽出する(ステップS3)。ステップS3が、Aプロセッサ用の所定の命令に対応するBプロセッサ用の所定の機械命令関数を抽出する機械命令関数抽出部を構成する。
【0023】
次に、CPU11aは、抽出された機械命令関数を、変換テーブル18を参照することによって、Bプロセッサ用の機械命令関数を抽出して置き換える(ステップS4)。この置き換えは、例えば、コントロールデータフローグラフ(CDFG)の節点上で、行われる。図5は、その変換テーブルの構成例を示す図である。
【0024】
図5は、変換元のバイナリコード中に含まれている所定の命令と、変換後のソースコード中に含まれる機械命令関数との対応付けがされた変換テーブル18の構成を示す。変換テーブル18は、Aプロセッサ用の所定の複数の命令と、それぞれ対応するBプロセッサ用の複数の機械命令関数(IF)との対応が付けられた対応テーブルである。ここでは、変換テーブル18の左側の欄31には、Aプロセッサ用の複数の命令が記述されており、右側の欄32には、Bプロセッサ用の複数の機械命令関数(IF)が記述されている。すなわち、図5では、左側の欄31の複数の命令のそれぞれに対応して、右側の欄32に機械命令関数が記憶されている。
【0025】
例えば、Aバイナリコード中に、次の最大値検出命令A_MAXが含まれていたとする。
A_MAX a, b, c ・・・ (1)
この命令(A_MAX a, b, c)は、bとcのうち大きい方の値をaに代入する命令であるとする。なお、バイナリコードは、0と1とからなるバイナリコードであるので、上記の表記(A_MAX a, b, c)は、アセンブリコードの表記である。このような機械命令関数は、プロセッサに依存しない高級言語のC言語ソースコードでは、例えば、以下のようになる。
【0026】
if(b > c) a = b;
else a = c; ・・・(2)
Bプロセッサ用の命令として、上記(1)と同等の命令、例えば(B_MAX a, b, c)、がある場合でも、Bコンパイラ17bが、上記(2)の命令群から(B_MAX a, b, c)を生成できる保証は一般的には無い。通常、Bコンパイラ17bは、上記(2)の命令群から、比較、分岐、及び代入の命令を用いた数命令かかるコードを生成してしまうかもしれない。
【0027】
そこで、本実施の形態では、命令(A_MAX a, b, c)に対応する機械命令関数として、機械命令関数(B_MAX(a, b, c))が存在することが分かっているとき、命令(A_MAX a, b, c)に対して、高級言語であるC言語コードを次のように生成する。
【0028】
B_MAX(a, b, c); ・・・(3)
図5は、変換元のAプロセッサ用の命令と、それに対応するBプロセッサ用の機械命令関数とを対応付けている。よって、CPU11aは、ステップS3で抽出されたAプロセッサ用の命令が、図5の変換テーブル18の左側の欄31にあって、その対応する、Bプロセッサ用の機械命令関数が、右側の欄32にある場合は、CPU11aは、ステップS4において、Aバイナリコード15a中の命令(A_MAX a, b, c)を機械命令関数B_MAX(a, b, c)に置き換える。
【0029】
図5には、さらに、Aプロセッサ用に平均化処理の命令(A_AVE a, b, c)に対応して、Bプロセッサ用の対応する命令として、複数の機械命令関数からなる命令群(B_ADD(a, b, c)とB_SHIFR(a, 1))が記憶されている例が示されている。
【0030】
図5には、Aプロセッサ用の命令と、それに対応するBプロセッサ用の1以上の機械命令関数とが対応していることを示す例とが示されているが、変換テーブル18において、左側31には、通常のAプロセッサで実行可能な命令あるいは命令群で、右側32には、左側31の命令、あるいは命令群のそれぞれに対応する、Bプロセッサ用の1以上の機械命令関数を含むようにしてもよい。
【0031】
そして、次に、CPU11aは、Aバイナリコード15aから高級言語のC言語ソースコードを生成する(ステップS5)。C言語ソースコードを生成するときに、変換テーブル18を参照して抽出した、Bプロセッサ用の機械命令関数を含むように、CPU11aは、C言語ソースコードを生成する。従って、Aバイナリコード15aは、プログラマにより最適化され、Aプロセッサ用の命令が使われていたが、結果として、その最適化の知恵をBプロセッサ用のBバイナリコード16aにも反映させることができる。ステップS4とS5は、Aプロセッサ用の所定の命令を、抽出された所定の機械命令関数に書き換えて、Aバイナリコード15aから、Bプロセッサ用のプログラムコードとして、Bプロセッサ用のC言語ソースコード23を生成するトランスレータ部を構成する。
【0032】
以上のように、ステップS5において出力されたC言語ソースコードは、Bプロセッサ用の機械命令関数を含む高級言語のソースコードである。従って、後述するステップS7においてコンパイルされるときには、Bプロセッサ用の機械命令関数を使ったBバイナリコード16aが生成されるので、Aプロセッサ用に最適化されたAバイナリコード15aと同様の最適化されたBバイナリコード16aとなる。上述の例では、Bコンパイラ17bは、確実にB_MAX命令を生成することが可能となる。
【0033】
従って、Bプロセッサ用の機械命令関数を含むC言語ソースコードが生成されるので、C言語ソースコードの可読性が向上し、かつそのC言語ソースコードをBコンパイラ17bでコンパイルすると、Bプロセッサ上での性能が、Aプロセッサと同等に維持することが期待できる。
【0034】
次に、CPU11aは、Aソースコード21を参照して、Aソースコード21中に、所定の形式で書かれたコメント文を抽出し、ステップS5で生成して得られたC言語ソースコード中に、所定のルールに従って、抽出したコメント文を埋め込む、すなわち挿入する(ステップS6)。ステップS6が、コメント文記述形式判定部を構成する。
【0035】
一般に、従来方法による逆コンパイル方法では、Aバイナリコード15aから逆コンパイルして得られた高級言語ソースコード中には、Aプロセッサ向けのAソースコードのコメント文は復元されないため、高級言語ソースコードの可読性は低い。これは、通常のデバッグ情報にはコメント文の情報は含まれないうえに、従来の逆コンパイル技術は、ソースコードの入手ができない状況を想定しているためである。
【0036】
また、最終的に作成されたAプロセッサ向けに書かれたAソースコード21は、Aプロセッサのアーキテクチャに特化した人手により修正等されたアセンブリコードや、Aコンパイラ22のみが認識可能な指示子を含んでおり、Bコンパイラ17bではそのような修正等に対応したバイナリコードが生成できない。
【0037】
しかし、Aソースコード21が入手可能な場合であっても、一旦Aコンパイラ22によりAバイナリコード15aを得てから、高級言語のC言語ソースコード23へ逆コンパイルをする方法は有効であり、かつその場合に、Aソースコード21中のコメント文の復元は望ましい。
【0038】
そこで、本実施の形態のプログラム変換装置1においては、Aソースコード21を利用して、C言語ソースコード23中にコメント文が復元されるように構成されている。
【0039】
ステップS6における、所定の形式で書かれたコメント文とは、例えば、Doxygenのようなドキュメント自動生成システムで採用されているような記述ルールに基づいて書かれたコメント文である。従って、CPU11aは、ソースコード中のコメント文が、所定の形式で書かれているか否かを判定し、判定の結果、あるコメント文がその所定の形式で書かれている場合は、ステップS5で生成されたC言語ソースコードに、その所定の形式に従って、そのコメント文を埋め込む。
【0040】
従って、トラスレータ部17aは、Aソースコードを参照して、Aプロセッサ用のソースコード中のコメント文が所定の形式で記述されているか否かを判定するコメント文記述形式判定部を含む。そして、トランスレータ部17aは、Aソースコード21中のコメント文が所定の形式で記述されていると判定した場合は、その所定の形式に従って、所定の形式で記述されていると判定されたコメント文を、Bプロセッサ用のソースコードであるC言語ソースコード23中に埋め込んで、C言語ソースコード23を生成する。
【0041】
例を挙げて説明する。
例えば、Aプロセッサ用のソースコードであるAソースコード21に、次のようなコードがあったとする。
【0042】
・・・・
int max(int a,int b){ return (a > b ? a : b); }
/* this function returns max value */
int min(int a,int b){ return (a > b ? b : a); } ・・・(4)
・・・・
上記ソースコード(4)は、2つの関数定義と、その2つの関数定義の間に書かれた1行のコメント文を含むソースコードである。このソースコード(4)をコンパイル後、高級言語のC言語ソースコードに逆変換する際、コメント文の部分を関数maxと共に復元できれば可読性を上げることができる。しかし、一般的には、Aバイナリコード15aにデバッグ情報が含まれていれば、関数名や変数名は復元可能であるが、上記のコメント文は、2つの関数定義、すなわちmaxとminのどちらの関数について書かれたものなのかを自動的に判断することは不可能である。
【0043】
これに対して、本実施の形態では、Aソースコード21のコメント文が、ドキュメント自動生成システム等のために所定の形式で書かれている場合、その形式に従って、コメント文の位置を判定し、その判定した位置に対応するように、その所定の形式に従って、生成したC言語ソースコード中にコメント文を埋め込むようにした。
【0044】
例えば、上記ソースコード(4)をDoxygen(例えば、http://www.stack.nl/~dimitri/doxygen/を参照)のドキュメント自動生成システムにおいて予め定められた形式に従って書くと、次のようになる。
【0045】
・・・・
/** this function returns max value */
int max(int a,int b){ return (a > b ? a : b); }
int min(int a,int b){ return (a > b ? b : a); } ・・・(5)
・・・・
ソースコード(5)において、「/**」 から始まるコメントは、Doxygenのドキュメント自動生成システムにおいて定められた形式に基づいて書かれたコメントであることを示す。言い換えれば、ソースコード(5)中の変数、関数等についてのコメント文は、Doxygenのドキュメント自動生成システムにおいて定められた形式に従って、書かれていることを明示的に表している。
Doxygenのドキュメント自動生成システムには、そのコメント文と対応する変数、関数は、その直後に定義されているものであるという予め決められたルールがあり、そのルールに従った形式で、コメント文が書かれている。
【0046】
従って、本実施の形態のトランスレータ17aは、生成した高級言語のC言語ソースコード中に、その所定の形式の記述に従って、抽出したコメント文を埋め込むようにした。具体的には、「/**」のようなシンボル、すなわち記号等の識別子と、「this function returns max value」のようなコメント文との対応関係を利用することにより、トランスレータ17aは、生成した高級言語のC言語ソースコード中に、関係する関数等に適切に対応付けて、コメントを復元することが可能になる。
【0047】
その結果、ユーザは、C言語ソースコード23中に適切にコメント文が復元されているので、可読性が上がり、C言語ソースコード23のデバッグ、仕様変更対応、性能チューニング等を容易にすることができる。
【0048】
次に、CPU11aは、Aソースコード21を参照して、Aソースコード21中のマクロ宣言文を抽出し、ステップS5で生成して得られたC言語ソースコード中に、抽出されたマクロ宣言のテキスト表現等がないかマッチングを行う。一致する箇所が見つかった場合は、C言語ソースコード中に、そのマクロ宣言文とマクロ表現を埋め込む(ステップS7)。ステップS7は、Aソースコード21を参照してAソースコード21中のマクロ宣言文を抽出するマクロ宣言抽出部を構成する。例えば、ステップS7では、Aソースコード21中のマクロ宣言文のリストが生成され、その生成されたリストに含まれるマクロの定義を参照して、C言語ソースコード23について、各マクロの定義に該当する、すなわち各マクロと一致する箇所にその定義が埋め込まれる。
【0049】
さらに、CPU11aは、Aソースコード21を参照して、Aソースコード21からinclude宣言文を抽出し、ステップS5で生成して得られたC言語ソースコード中に、抽出されたincludeファイルの内容と等価な箇所がないかマッチングをする。等価な箇所が見つかった場合は、C言語ソースコード中に、該当するinclude宣言文を埋め込む(ステップS8)。ステップS8が、Aバイナリコード21を参照してAソースコード21中のinclude宣言文を抽出するインクルード宣言抽出部を構成する。例えば、ステップS8では、Aソースコード21中のinclude宣言文を含むファイルの内容を参照して、C言語ソースコード23中にそのinclude宣言文を含むファイル中に記述された内容と等価な内容が検出されたときには、そのC言語ソースコード23にinclude宣言文を追加する。
【0050】
ステップS7とS8について、具体的に説明する。
例えば、Aプロセッサ用のソースコードであるAソースコード21が次の2つのファイル”myheader.h”と”main.c”から構成されていたとする。
【0051】
・ファイル名 myheader.hの内容
#define THRESHOLD 127
int binary_filter(unsigned char a){return (a>THRESHOLD ? 255:0);}
・ファイル名 main.cの内容
#include “myheader.h”
int main(){
unsigned char x = 120;
return binary_filter(x);
}
マクロ宣言文である「#define THRESHOLD 127」は、「127」がスレッシュホールド値であることを宣言している。
【0052】
include宣言文である「#include “myheader.h”」は、ファイル名が「myheader.h」は、includeされることを宣言している。
【0053】
これらのinclude宣言文やマクロ宣言文は全てAコンパイラ22によって展開されるため、これらのソースコードに対応するバイナリコードに対してステップS1〜S5の処理を適用した結果は、以下のように1つのファイル”main2.c”となる。
【0054】
・ファイル名 main2.cの内容
int binary_filter(unsigned char a){return (a>127 ? 255:0);}
int main(){
unsigned char x = 120;
return binary_filter(x);
}
Aソースコード21で使われているinclude宣言文の数やマクロ宣言文の数が増えるに従い、上記の結果のソースコードの可読性は下がる。
【0055】
そこで、本実施の形態のトランスレータ17aは、生成した高級言語のC言語ソースコードに対してマクロ宣言文とinclude宣言文を復元する。
【0056】
ここでは、ステップS7では、ソースコード21を参照し、「#define・・・」のようなマクロ宣言文が抽出され、ファイル名がmyheader.hであるマクロ宣言文が追加される。さらに、ステップS7では、ファイル名 main2.c中において、「127」が、そのマクロ表現である「THRETHHOLD」に置き換えられる。このようにして、マクロ宣言文とマクロ表現が埋め込まれる。
【0057】
また、ステップS8では、Aソースコード21を参照し、Aソースコード21中からinclude宣言文が抽出される。そして、include宣言文の追加は、ファイル名 main2.c中の「binary filter・・」が、参照したAソースコード21中にあるため、そのinclude宣言された関数myheader.hをincludeするinclude宣言文が生成され追加される。
【0058】
その結果、上記の1つのファイルであるプログラムmain2.cは、上記2つのファイルmain.cとmyheader.hに置換される。言い換えると、元のAソースコード21で使用されていたマクロ宣言文とinclude宣言文が復元される。よって、C言語ソースコード23の可読性は上がり、デバッグ、仕様変更、性能チューニング等を容易にすることができる。
【0059】
さらに、CPU11aは、Aソースコード21を参照して、Aソースコード21中の行番号情報とシンボル情報を、ステップS5で生成して得られたC言語ソースコード中に埋め込む(ステップS9)。ステップS9が、C言語ソースコード23に、Aソースコード21のシンボル情報と行番号情報を埋め込む、シンボル及び行番号情報埋め込み部を構成する。
【0060】
例えば、CPU11aは、Aプロセッサ用のソースコードであるAソースコード21に次のようなコードがあったとする。左端の数字は便宜的な行番号であり、実際のソースコードには含まれない。
【0061】
・ファイル名 func.c の内容
1: void function(){
2: if(b > c) a = b;
3: else a = c;
4: }
上記に対してステップS1〜S5を適用した結果、例えば、次のようになったとする。
【0062】
void f(){
B_MAX(a, b, c);
}
ここでは、トランスレータ17aがプロセッサBの最大値命令B_MAXを利用したコードを生成している例である。この例ではB_MAX(a,b,c)が最大値を得る処理をしていることは、そのテキスト表現から容易に類推できるが、一般的に、プロセッサBのために並列化などの高度な最適化を施した機械命令関数が出力された場合、処理内容を把握し、デバッグ・チューニングをすることは困難になる。
【0063】
そこで、ステップS9では、本実施の形態のトランスレータ17aは、生成した高級言語のC言語ソースコードに対して、次のように、行番号情報とシンボル情報を埋め込む。
【0064】
void f(){ /** func.c, L1 function */
B_MAX(a, b, c); /** func.c, L2,3 */
}
上記のプログラムには、関数f()に対応するAソースコード21の内容が”func.c”の1行目にあり、シンボル情報としてのシンボル名が”function”であること、B_MAX()に対応する内容が”func.c”の2,3行目にあることの情報が含まれている。これらの情報をユーザが直接解釈してAソースコード21を参照することで処理内容を理解することも可能である。
【0065】
さらに、この埋め込まれた情報を、プロセッサBの並列化コンパイラ部が適切に解釈し、所定の形式で、プロセッサBのバイナリコード中に、デバッガ19が利用可能なデバッグ情報として埋め込む。通常、プロセッサBのデバッガ19は、プロセッサBのバイナリコード16aをデバッグする際、プロセッサBのソースコード23を参照可能である。そして、ユーザは、プロセッサBのデバッガ19により、プロセッサAのソースコード21を適宜参照することが可能となる。
【0066】
図6は、Bバイナリコードをデバッガ19によりデバッグしているときに、表示装置13の画面上に表示されるデバッグ画面の例を示す図である。画面31上には、Bバイナリコードあるいはアセンブリコードを表示するバイナリコード表示部32と、C言語ソースコード23を表示するBバイナリコードに対応するソースコード表示部33と、Aソースコードを表示するソースコード表示部34とが表示される。
【0067】
ユーザは、バイナリコード表示部32に表示されたバイナリコードあるいはアセンブリコードと、ソースコード表示部33に表示されたC言語ソースコードとだけでなく、ソースコード表示部34に表示されたAソースコード21も参照しながら、Bバイナリコードのデバッグ等をすることができる。
【0068】
ユーザは、バイナリコード表示部32に表示されたコード中、所望の行を選択すると、その選択された行に対応するプログラム部分が、ソースコード表示部33と34において例えば、ハイライト表示等が行われる。
【0069】
よって、入力装置12を利用してユーザが指定するBバイナリコード部分に対応するC言語ソースコード部分だけでなく、Bバイナリコード部分に対応するAソースコード部分も、ソースコード表示部34に表示されるので、ユーザは、変換元のソースプログラムを参照しながら、Bバイナリコード16aのデバッグ等を行うことができる。
【0070】
なお、シンボル情報と行番号の埋め込みは、トランスレータ17aを介した処理に限定されない。例えば、プロセッサAのソースコードをプロセッサAの並列化コンパイラにより、いったんプロセッサAマルチコア向けのソースコードあるいはマルチスレッド化コードを生成する場合、上記した例と同様に、プロセッサAマルチコア向けのソースコード、あるいはマルチスレッド化コード中に、プロセッサAのソースコードのシンボル情報と行番号情報を埋め込むようにしてもよい。これにより、プロセッサA並列化コードデバッガから元のソースコードの参照が可能となる。
【0071】
図4に戻り、ステップS5により、C言語ソースコード23が生成され、さらに上述したステップS6からS9の処理が終了すると、次に、Bコンパイラ17bが、C言語ソースコード23をコンパイルして、Bバイナリコード16aを生成する(ステップS10)。
【0072】
ここで、コンパイラ部であるBコンパイラ17bとして、並列化コンパイラが使用される。並列化コンパイラを用いることによって、Aプロセッサが並列処理に対応していないが、Bプロセッサが並列処理に対応している場合、C言語ソースコード23からBバイナリコード16aを生成するときに、バイナリコード16aはBプロセッサ用の並列度に対応した、並列プログラムのコードとすることができる。並列化コンパイラによって、C言語ソースコード23を並列化プログラムにすることができる。
【0073】
例えば、次のようなループ処理を考える。
【0074】
for(int i = 0; i < 256; i++) a[i] = b[i] + c[i]; ・・・(6)
そして、Aプロセッサが2並列SIMD(Single Instruction/Multiple Data)加算命令を持たず、一方でBプロセッサが2並列SIMD加算命令、例えばB_ADD_SIMD2、を持つ場合を仮定する。このとき、Aプロセッサでは256回加算命令を繰り返すが、Bプロセッサでは128(=256/2)回のSIMD加算命令で済む。そこで、Bコンパイラ17bとしてVLIW(Very Long Instruction Word)/SIMD並列化コンパイラを使用することにより、AプロセッサとBプロセッサの演算並列度の差異を吸収することができる。
【0075】
以上のようにして、Bコンパイラ17bに、並列化コンパイラを用いることによって、Aプロセッサが並列処理に対応していなくても、Bプロセッサが並列化処理に対応している場合には、バイナリコード16aは、Bプロセッサ用の並列度に対応したコードとすることができる。
【0076】
言い換えると、BプロセッサがAプロセッサよりも高並列な命令実行が可能な場合、当然Aバイナリコード15aにはそのような高並列命令は含まれないため、Bプロセッサの高並列命令を生かしきれない虞れがある。そこで、Bコンパイラ17bとして、Bプロセッサの高並列度に対応したコンパイラを用いることにより、Aバイナリコード15aから生成されるBバイナリコード16aは、Bプロセッサの高並列度に対応したコードとすることができる。
【0077】
さらに、Bコンパイラの並列化コンパイル機能に、マルチスレッド化あるいはマルチコア化の機能が含まれている場合でも、上記と同様の効果、すなわち高並列度に対応したコードとすることができるという効果が得られる。
【0078】
以上のように、本実施の形態によれば、異なるプロセッサ間でプログラムコードの変換を行う場合に、変換元のバイナリコードに含まれるプログラム上の工夫を、変換先のバイナリコードに反映することができるプログラムコード変換装置を実現することができる。
【0079】
さらに、本実施の形態によれば、変換元のオブジェクトコードであるバイナリコードから、高級言語コードを生成するときに、変換元のバイナリコードの元となるソースコードに含まれていたコメント文、マクロ宣言文等が、その高級言語コード中に適切に復元されるので、ユーザは、高級言語コードのデバッグ、仕様変更対応、性能チューニング等を容易にすることができる。
【0080】
なお、本明細書における各「部」は、実施の形態の各機能に対応する概念的なもので、必ずしも特定のハードウエアやソフトウエア・ルーチンに1対1には対応しない。従って、本実施の形態における各手順の各ステップは、その性質に反しない限り、実行順序を変更し、複数同時に実行し、あるいは実行毎に異なった順序で実行してもよい。
【0081】
さらに、以上説明した動作を実行するプログラムコードは、フレキシブルディスク、CD−ROM等の可搬媒体や、ハードディスク等の記憶装置等の記録媒体に、その全体あるいは一部が記録され、あるいは記憶される。そのプログラムコードは、コンピュータにより読み取られて、動作の全部あるいは一部が実行されるコンピュータプログラム製品として提供することができる。あるいは、そのプログラムコードの全体あるいは一部を通信ネットワークを介して流通または提供することができる。利用者は、通信ネットワークを介してそのプログラムコードをダウンロードしてコンピュータにインストールしたり、あるいは記録媒体からコンピュータにインストールすることで、容易に本発明のプログラムコード変換装置を実現することができる。
本発明は、上述した実施の形態に限定されるものではなく、本発明の要旨を変えない範囲において、種々の変更、改変等が可能である。
【図面の簡単な説明】
【0082】
【図1】本発明の実施の形態に係わるプログラム変換装置の構成を示す構成図である。
【図2】本発明の実施の形態に係わるプログラム変換処理の流れの例を説明するための図である。
【図3】本発明の実施の形態に係る変換処理プログラムの処理の流れの例を示すフローチャートである。
【図4】本発明の実施の形態に係る変換処理プログラムの処理の流れの例を示すフローチャートである。
【図5】本発明の実施の形態に係る変換テーブルの構成例を示す図である。
【図6】本発明の実施の形態に係わるデバッグ画面の例を示す図である。
【符号の説明】
【0083】
1 プログラム変換装置、11 計算機本体、12 入力装置、13 表示装置、14
記憶装置、15 変換元のバイナリコード、16 変換先のバイナリコード、17 変換
処理プログラム、18 変換テーブル、31 画面

【特許請求の範囲】
【請求項1】
第1のプロセッサにおいて実行可能な第1のバイナリコードを、第2のプロセッサ用のプログラムコードに変換するプログラムコード変換装置であって、
前記第1のバイナリコードを解析するコード解析部と、
該コード解析部により解析して得られた前記第1のプロセッサ用の所定の1以上の命令に対応する、前記第2のプロセッサ用の所定の1以上の機械命令関数を抽出する機械命令関数抽出部と、
前記第1のプロセッサ用の前記所定の1以上の命令を、前記機械命令関数抽出部により抽出された前記所定の1以上の機械命令関数に書き換えて、前記第1のバイナリコードから前記第2のプロセッサ用のプログラムコードとして、前記第2のプロセッサ用のソースコードを生成するトランスレータ部と、
を有することを特徴とするプログラムコード変換装置。
【請求項2】
前記第1のプロセッサ用の前記所定の1以上の命令と、前記第2のプロセッサ用の前記所定の1以上の機械命令関数とが対応付けられた対応テーブルを有し、
前記機械命令関数抽出部は、前記対応テーブルを参照することによって、解析して得られた前記第1のプロセッサ用の前記所定の1以上の命令に対応する、前記第2のプロセッサ用の前記所定の1以上の機械命令関数を抽出することを特徴とする請求項1に記載のプログラムコード変換装置。
【請求項3】
前記第1のバイナリコードに対応する前記第1のプロセッサ用のソースコードを参照して、前記第1のプロセッサ用のソースコード中のコメント文が所定の形式で記述されているか否かを判定するコメント文記述形式判定部を有し、
前記トランスレータ部は、前記コメント文記述形式判定部が前記第1のプロセッサ用のソースコード中の前記コメント文が前記所定の形式で記述されていると判定した場合は、前記所定の形式に従って、前記所定の形式で記述されていると判定された前記コメント文を、前記第2のプロセッサ用のソースコード中に埋め込んで、前記第2のプロセッサ用のソースコードを生成することを特徴とする請求項1または2に記載のプログラムコード変換装置。
【請求項4】
前記トランスレータ部によって生成された前記第2のプロセッサ用のソースコードを、前記第2のプロセッサ用のプログラムコードとして、前記第2のプロセッサにおいて実行可能な、並列プログラムの第2のバイナリコードを生成する並列化コンパイラ部を、さらに有することを特徴とする請求項1から3のいずれか1つに記載のプログラムコード変換装置。
【請求項5】
コード解析部と、機械命令関数抽出部と、トランスレータ部とを有するコンピュータにより、第1のプロセッサにおいて実行可能な第1のバイナリコードを、第2のプロセッサ用のプログラムコードに変換するプログラムコード変換方法であって、
前記コード解析部により、前記第1のバイナリコードを解析し、
前記機械命令関数抽出部により、前記コード解析部により解析して得られた前記第1のプロセッサ用の所定の1以上の命令に対応する、前記第2のプロセッサ用の所定の1以上の機械命令関数を抽出し、
前記トランスレータ部により、前記第1のプロセッサ用の前記所定の1以上の命令を、前記機械命令関数抽出部により抽出された前記所定の1以上の機械命令関数に書き換えて、前記第1のバイナリコードから前記第2のプロセッサ用のプログラムコードとして、前記第2のプロセッサ用のソースコードを生成することを特徴とするプログラムコード変換方法。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate


【公開番号】特開2008−276735(P2008−276735A)
【公開日】平成20年11月13日(2008.11.13)
【国際特許分類】
【出願番号】特願2007−333098(P2007−333098)
【出願日】平成19年12月25日(2007.12.25)
【出願人】(000003078)株式会社東芝 (54,554)
【Fターム(参考)】