(57)【要約】【課題】異なるプロセッサ間でプログラムコードの変換を行う場合に、変換元のバイナリコードに含まれるプログラム上の工夫を、変換先のバイナリコードに反映することができるプログラムコード変換装置を提供する。【解決手段】プログラム変換装置１は、Aプロセッサにおいて実行可能なAバイナリコード１５ａを、Bプロセッサ用のプログラムコードに変換するために、Aバイナリコード１５ａを解析するコード解析部と、コード解析部により解析して得られたAプロセッサ用の所定の命令に対応する、Bプロセッサ用の所定の機械命令関数を抽出する機械命令関数抽出部と、Aプロセッサ用の所定の命令を、機械命令関数抽出部により抽出された所定の機械命令関数に書き換えて、AバイナリコードからBプロセッサ用のソースコード２３を生成するトランスレータ部と、を有する。【選択図】図３
2008276735.tif 000002
【特許請求の範囲】
【請求項１】
第１のプロセッサにおいて実行可能な第１のバイナリコードを、第２のプロセッサ用のプログラムコードに変換するプログラムコード変換装置であって、
前記第１のバイナリコードを解析するコード解析部と、
該コード解析部により解析して得られた前記第１のプロセッサ用の所定の１以上の命令に対応する、前記第２のプロセッサ用の所定の１以上の機械命令関数を抽出する機械命令関数抽出部と、
前記第１のプロセッサ用の前記所定の１以上の命令を、前記機械命令関数抽出部により抽出された前記所定の１以上の機械命令関数に書き換えて、前記第１のバイナリコードから前記第２のプロセッサ用のプログラムコードとして、前記第２のプロセッサ用のソースコードを生成するトランスレータ部と、
を有することを特徴とするプログラムコード変換装置。
【請求項２】
前記第１のプロセッサ用の前記所定の１以上の命令と、前記第２のプロセッサ用の前記所定の１以上の機械命令関数とが対応付けられた対応テーブルを有し、
前記機械命令関数抽出部は、前記対応テーブルを参照することによって、解析して得られた前記第１のプロセッサ用の前記所定の１以上の命令に対応する、前記第２のプロセッサ用の前記所定の１以上の機械命令関数を抽出することを特徴とする請求項１に記載のプログラムコード変換装置。
【請求項３】
前記第１のバイナリコードに対応する前記第１のプロセッサ用のソースコードを参照して、前記第１のプロセッサ用のソースコード中のコメント文が所定の形式で記述されているか否かを判定するコメント文記述形式判定部を有し、
前記トランスレータ部は、前記コメント文記述形式判定部が前記第１のプロセッサ用のソースコード中の前記コメント文が前記所定の形式で記述されていると判定した場合は、前記所定の形式に従って、前記所定の形式で記述されていると判定された前記コメント文を、前記第２のプロセッサ用のソースコード中に埋め込んで、前記第２のプロセッサ用のソースコードを生成することを特徴とする請求項１または２に記載のプログラムコード変換装置。
【請求項４】
前記トランスレータ部によって生成された前記第２のプロセッサ用のソースコードを、前記第２のプロセッサ用のプログラムコードとして、前記第２のプロセッサにおいて実行可能な、並列プログラムの第２のバイナリコードを生成する並列化コンパイラ部を、さらに有することを特徴とする請求項１から３のいずれか１つに記載のプログラムコード変換装置。
【請求項５】
コード解析部と、機械命令関数抽出部と、トランスレータ部とを有するコンピュータにより、第１のプロセッサにおいて実行可能な第１のバイナリコードを、第２のプロセッサ用のプログラムコードに変換するプログラムコード変換方法であって、
前記コード解析部により、前記第１のバイナリコードを解析し、
前記機械命令関数抽出部により、前記コード解析部により解析して得られた前記第１のプロセッサ用の所定の１以上の命令に対応する、前記第２のプロセッサ用の所定の１以上の機械命令関数を抽出し、
前記トランスレータ部により、前記第１のプロセッサ用の前記所定の１以上の命令を、前記機械命令関数抽出部により抽出された前記所定の１以上の機械命令関数に書き換えて、前記第１のバイナリコードから前記第２のプロセッサ用のプログラムコードとして、前記第２のプロセッサ用のソースコードを生成することを特徴とするプログラムコード変換方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムコード変換装置及びプログラムコード変換方法に関し、特に、第１のプロセッサにおいて実行可能な第１のバイナリコードを、第２のプロセッサ用のプログラムコードに変換するプログラムコード変換装置及びプログラムコード変換方法に関する。
【背景技術】
【０００２】
従来より、あるプロセッサで実行可能なプログラムを、他の別なプロセッサでも実行可能なようにプログラムの変換が行われている。例えば、互いに異なるプロセッサXとYがあったとき、プロセッサX用のバイナリコードからプロセッサY用のバイナリコードを得る方法としては、一般的には、次の２つの方法がある。
【０００３】
第１の方法は、トランスレータプログラムを用いて、プロセッサX用のバイナリコードを、プロセッサY用のバイナリコードに直接変換する方法である。  
この方法では、変換後もバイナリコードであるため、変換されたバイナリコードは可読性が低く、プログラマのユーザは、変換されたバイナリコードに対して、マニュアルでデバッグしたり、新たな仕様変更に対応させたり、性能のチューニングをしたりすることが困難であった。また、プロセッサX用の命令体系と、プロセッサY用の命令体系が異なるとき、プロセッサX用の命令コードをプロセッサY用の命令コードに、一対一に置き換えられない場合もある。
【０００４】
第２の方法は、プロセッサX用のバイナリコードを逆コンパイルして、一旦、いわゆる高級言語コードに変換し、その高級言語コードを、プロセッサY用のコンパイラにより、コンパイルしてプロセッサY用のバイナリコードを得る方法である（例えば、特許文献１参照）。
【０００５】
しかし、この方法では、第１の方法の問題は解決されるが、次のような問題がある。  
逆コンパイルにより、プロセッサに依存しない高級言語コードが生成されるとき、元々プロセッサX用のバイナリコードにおいて施されていた最適化が、プロセッサY用のバイナリコードでは保証されない、という問題である。例えば、人手によりアセンブリコードにおいて最適化のために工夫されたコード片が、バイナリコードに含まれるような場合、逆コンパルされて得られた高級言語コードには、そのようなコード片の工夫あるいは知恵は、反映されない、という問題である。すなわち、プログラム上の工夫のためのコード片の例として、機械命令関数がバイナリコードに含まれていても、逆コンパイルされて得られた高級言語コードには、そのコード片は含まれず、その結果、プロセッサY用のコンパイラが高級言語コードから生成するプロセッサＹ用のバイナリコードには、プロセッサX用のバイナリコードと同等の最適化が施されない。
【特許文献１】特開2004-252807号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
そこで、本発明は、このような問題に鑑みてなされたものであり、異なるプロセッサ間でプログラムコードの変換を行う場合に、変換元のバイナリコードに含まれるプログラム上の工夫を、変換先のバイナリコードに反映することができるプログラムコード変換装置を提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の一態様によれば、第１のプロセッサにおいて実行可能な第１のバイナリコードを、第２のプロセッサ用のプログラムコードに変換するプログラムコード変換装置であって、前記第１のバイナリコードを解析するコード解析部と、該コード解析部により解析して得られた前記第１のプロセッサ用の所定の１以上の命令に対応する、前記第２のプロセッサ用の所定の１以上の機械命令関数を抽出する機械命令関数抽出部と、前記第１のプロセッサ用の前記所定の１以上の命令を、前記機械命令関数抽出部により抽出された前記所定の１以上の機械命令関数に書き換えて、前記第１のバイナリコードから前記第２のプロセッサ用のプログラムコードとして、前記第２のプロセッサ用のソースコードを生成するトランスレータ部と、を有するプログラムコード変換装置を提供することができる。
【発明の効果】
【０００８】
本発明によれば、異なるプロセッサ間でプログラムコードの変換を行う場合に、変換元のバイナリコードに含まれるプログラム上の工夫を、変換先のバイナリコードに反映することができるプログラムコード変換装置を提供することができる。
【発明を実施するための最良の形態】
【０００９】
以下、図面を参照して本発明の実施の形態を説明する。  
まず図１に基づき、本実施の形態に係わるプログラム変換装置の構成を説明する。図１は、本実施の形態に係わるプログラムコード変換装置の構成を示す構成図である。  
プログラムコード変換装置（以下、プログラム変換装置という）１は、中央処理装置（以下、CPUという）１１ａ、ROM、RAM等を有する計算機本体１１と、キーボード、マウス等の入力装置１２と、画面を有する表示装置１３と、変換する対象プログラム（変換元プログラム）及び変換されたプログラム（変換先あるいは変換後のプログラム）等を記憶する記憶装置１４を含んで構成されている、パーソナルコンピュータ（以下、PCという）等のコンピュータである。記憶装置１４には、変換元のオブジェクトコードであるバイナリプログラム（以下、バイナリコードという）１５と、変換後のバイナリコード１６と、後述するプログラムの変換処理プログラム１７と、後述する変換テーブル１８とが記憶されている。また、記憶装置１４には、デバッグプログラムであるデバッガ１９も記憶されており、デバッグを行うときに、CPU１１ａがデバッガ１９を読み出して実行することができる。
【００１０】
なお、プログラム変換装置１は、このようなコンピュータに限らず、ネットワークを介して接続されたクライアント・サーバシステムのような装置であってもよい。
【００１１】
プログラム変換装置１を利用して、プログラム変換を行うユーザは、変換元のバイナリコード１５に対して、後述するプログラムの変換処理を施し、変換後のバイナリコード１６を得ることができる。ユーザは、入力装置１２と表示装置１３を含むマンマシンインターフェース（以下、MMIという）を利用して、記憶装置１４に記憶された変換元のバイナリコード１５を指定し、かつ変換後のバイナリコード１６を記憶する記憶装置１４の記憶領域を指定する。  
また、ユーザは、MMIを利用して、後述するプログラム変換処理を行う変換処理プログラム１７、及び後述する変換テーブル１８を指定して、変換処理プログラム１７を実行させることができる。
【００１２】
本実施の形態では、ある一つのプロセッサで実行可能なバイナリコードを、他の異なるプロセッサで実行可能なバイナリコードに変換する場合を説明するが、その一つのプロセッサをAプロセッサとし、そのAプロセッサで実行可能なバイナリコードをAバイナリコードとし、Aプロセッサとは異なるプロセッサをBプロセッサとし、そのBプロセッサで実行可能なバイナリコードをBバイナリコードとする。そして、これらに合わせて、Aバイナリコードに対応するソースプログラム（以下、ソースコードという）をAソースコードとし、Bバイナリコードに対応するソースコードをBソースコードとする。さらに、AソースコードをコンパイルしてAバイナリコードを生成するコンパイラを、Aコンパイラとし、BソースコードをコンパイルしてBバイナリコードを生成するコンパイラを、Bコンパイラとする。
【００１３】
図２は、本実施の形態におけるプログラム変換処理の流れの例を説明するための図である。  
図２に示すように、Aバイナリコード１５ａは、Aソースコード２１をAコンパイラ２２によってコンパイルして生成されたコードである。Aソースコード２１は、所定の処理を実行するための命令群から構成される。Aコンパイラ２２は、Aソースコード２１をコンパイルして、Aプロセッサで実行可能なオブジェクトコード、すなわちAバイナリコード１５ａを生成する。
【００１４】
Aバイナリコード１５ａは、トランスレータ部としてのトランスレータ１７ａにより、汎用の高級言語のソースコード、例えば、C言語ソースコード２３に逆コンパイルされる。トランスレータ１７ａは、Aバイナリコード１５ａを逆コンパイルする逆コンパイラである。
【００１５】
C言語ソースコード２３は、Bソースコードであり、Bプロセッサ用のBコンパイラ１７ｂによってコンパイルされることによって、Bバイナリコード１６ａがC言語ソースコードから生成される。Bコンパイラ１７ｂは、C言語ソースコード２３をコンパイルして、Bプロセッサで実行可能なオブジェクトコード、すなわちBバイナリコード１６ａを生成する。
【００１６】
本実施の形態に係るプログラム変換装置１では、Aバイナリコード１５ａからBバイナリコード１６ａを生成する際に、途中で、Ｂプロセッサ用のプログラムコードとしてのC言語ソースコード２３が、トランスレータ１７ａによって生成される。この高級言語のソースコードを生成するときに、トランスレータ１７ａは、Aバイナリコード１５ａ中の所定の命令を抽出し、その抽出された命令を、対応するBプロセッサ用の１以上の機械命令関数（Intrinsic Function:組み込み関数ともいう）に置き換える置換処理を行う。従って、Ｃ言語ソースコード２３は、Bプロセッサ用の機械命令関数を含むものとなる。さらに、トランスレータ１７ａは、Aソースコード２１を参照して、所定の形式で書かれたコメント文等を抽出し、抽出したコメント文等を、生成するＣ言語ソースコード２３中に埋め込む埋込処理を行う。
【００１７】
従来であれば、Aバイナリコード１５ａを逆コンパイルすると、Aソースコード２１のレベルで、あるいはアセンブリコードのレベルで施された最適化は、Ｃ言語ソースコード２３中からは消失することがある。さらには、逆コンパイルして得られたＣ言語ソースコード２３には、Ａソースコード２１中のコメント文等も再生されない。
【００１８】
具体的に説明する。プログラマは、Aソースコード２１のレベルで、あるいはアセンブリコードレベルで、Aプロセッサ用にプログラムの最適化を行っている場合がある。例えば、Aプロセッサ用の機械命令関数を用いたり、Aプロセッサにおける実行可能な並列度に応じたソースコードを作成して、Aソースコード２１の最適化を行う。しかし、ソースコードレベルあるいはアセンブリコードレベルで短いコードに最適化されても、逆コンパイルによりその短いコード部分は、長いコードに変更されてしまうことがある。
【００１９】
また、Aソースコード２１中のコメント文等は、通常はAバイナリコード１５ａ中にはデバッグ情報として含まれないため、逆アセンブルされて得られたC言語ソースコード２３中には、コメント文等は含まれない。  
そこで、本実施の形態によれば、上述したような置換処理と埋込処理を行うことによって、最適化されたプログラム部分の残存、およびコメント文等の生成が可能となる。以下、詳細に説明する。
【００２０】
図３と図４は、本実施の形態に係るプログラム変換装置１の変換処理プログラム１７の処理の流れの例を示すフローチャートである。  
図３の処理は、記憶装置１４中の変換処理プログラム１７を、プログラム変換装置１の計算機本体１１のCPU１１ａが、読み出して実行することによって行われる。
【００２１】
まず、CPU１１ａは、変換元のAバイナリコード１５ａを解析する（ステップS1）。そして、CPU１１ａは、解析して得られた情報から、内部表現として、Aバイナリコード１５ａのコントロールデータフローグラフ（CDFG）を生成する（ステップS2）。従って、ステップS1の処理が、コード解析部を構成し、ステップS2が、コントロールデータフローグラフの情報を生成するコントロールデータフローグラフ（CDFG）情報生成部を構成する。
【００２２】
Aバイナリコード１５ａについてコントロールデータフローグラフの生成が完了すると、CPU１１ａは、Ａバイナリコード１５ａの中から機械命令関数（IF）を抽出する（ステップS3）。ステップS3が、Aプロセッサ用の所定の命令に対応するBプロセッサ用の所定の機械命令関数を抽出する機械命令関数抽出部を構成する。
【００２３】
次に、CPU１１ａは、抽出された機械命令関数を、変換テーブル１８を参照することによって、Bプロセッサ用の機械命令関数を抽出して置き換える（ステップS4）。この置き換えは、例えば、コントロールデータフローグラフ（CDFG）の節点上で、行われる。図５は、その変換テーブルの構成例を示す図である。
【００２４】
図５は、変換元のバイナリコード中に含まれている所定の命令と、変換後のソースコード中に含まれる機械命令関数との対応付けがされた変換テーブル１８の構成を示す。変換テーブル１８は、Aプロセッサ用の所定の複数の命令と、それぞれ対応するBプロセッサ用の複数の機械命令関数（IF）との対応が付けられた対応テーブルである。ここでは、変換テーブル１８の左側の欄３１には、Aプロセッサ用の複数の命令が記述されており、右側の欄３２には、Bプロセッサ用の複数の機械命令関数（IF）が記述されている。すなわち、図５では、左側の欄３１の複数の命令のそれぞれに対応して、右側の欄３２に機械命令関数が記憶されている。
【００２５】
例えば、Aバイナリコード中に、次の最大値検出命令A_MAXが含まれていたとする。  
A_MAX a, b, c        ・・・    （１）
この命令（A_MAX a, b, c）は、bとcのうち大きい方の値をaに代入する命令であるとする。なお、バイナリコードは、０と１とからなるバイナリコードであるので、上記の表記（A_MAX a, b, c）は、アセンブリコードの表記である。このような機械命令関数は、プロセッサに依存しない高級言語のC言語ソースコードでは、例えば、以下のようになる。
【００２６】
if(b ＞ c) a = b;
else a = c;              ・・・（２）
Bプロセッサ用の命令として、上記（１）と同等の命令、例えば（B_MAX a, b, c)、がある場合でも、Bコンパイラ１７ｂが、上記（２）の命令群から(B_MAX a, b, c）を生成できる保証は一般的には無い。通常、Bコンパイラ１７ｂは、上記（２）の命令群から、比較、分岐、及び代入の命令を用いた数命令かかるコードを生成してしまうかもしれない。
【００２７】
そこで、本実施の形態では、命令（A_MAX a, b, c）に対応する機械命令関数として、機械命令関数（B_MAX(a, b, c)）が存在することが分かっているとき、命令（A_MAX a, b, c）に対して、高級言語であるC言語コードを次のように生成する。
【００２８】
B_MAX(a, b, c);        ・・・（３）
図５は、変換元のAプロセッサ用の命令と、それに対応するＢプロセッサ用の機械命令関数とを対応付けている。よって、CPU１１ａは、ステップS3で抽出されたAプロセッサ用の命令が、図５の変換テーブル１８の左側の欄３１にあって、その対応する、Bプロセッサ用の機械命令関数が、右側の欄３２にある場合は、CPU１１ａは、ステップS4において、Aバイナリコード１５ａ中の命令（A_MAX a, b, c）を機械命令関数B_MAX(a, b, c)に置き換える。
【００２９】
図５には、さらに、Aプロセッサ用に平均化処理の命令（A_AVE a, b, c）に対応して、Bプロセッサ用の対応する命令として、複数の機械命令関数からなる命令群（B_ADD(a, b, c)とB_SHIFR(a, 1)）が記憶されている例が示されている。
【００３０】
図５には、Aプロセッサ用の命令と、それに対応するＢプロセッサ用の１以上の機械命令関数とが対応していることを示す例とが示されているが、変換テーブル１８において、左側３１には、通常のＡプロセッサで実行可能な命令あるいは命令群で、右側３２には、左側３１の命令、あるいは命令群のそれぞれに対応する、Bプロセッサ用の１以上の機械命令関数を含むようにしてもよい。
【００３１】
そして、次に、CPU１１ａは、Aバイナリコード１５ａから高級言語のC言語ソースコードを生成する（ステップS5）。Ｃ言語ソースコードを生成するときに、変換テーブル１８を参照して抽出した、Bプロセッサ用の機械命令関数を含むように、CPU１１ａは、C言語ソースコードを生成する。従って、Aバイナリコード１５ａは、プログラマにより最適化され、Aプロセッサ用の命令が使われていたが、結果として、その最適化の知恵をBプロセッサ用のBバイナリコード１６ａにも反映させることができる。ステップS4とS5は、Aプロセッサ用の所定の命令を、抽出された所定の機械命令関数に書き換えて、Aバイナリコード１５ａから、Bプロセッサ用のプログラムコードとして、Bプロセッサ用のC言語ソースコード２３を生成するトランスレータ部を構成する。
【００３２】
以上のように、ステップS5において出力されたC言語ソースコードは、Bプロセッサ用の機械命令関数を含む高級言語のソースコードである。従って、後述するステップS7においてコンパイルされるときには、Bプロセッサ用の機械命令関数を使ったBバイナリコード１６ａが生成されるので、Aプロセッサ用に最適化されたAバイナリコード１５ａと同様の最適化されたＢバイナリコード１６ａとなる。上述の例では、Bコンパイラ１７ｂは、確実にB_MAX命令を生成することが可能となる。
【００３３】
従って、Bプロセッサ用の機械命令関数を含むC言語ソースコードが生成されるので、C言語ソースコードの可読性が向上し、かつそのC言語ソースコードをBコンパイラ１７ｂでコンパイルすると、Bプロセッサ上での性能が、Aプロセッサと同等に維持することが期待できる。
【００３４】
次に、CPU１１ａは、Aソースコード２１を参照して、Aソースコード２１中に、所定の形式で書かれたコメント文を抽出し、ステップS5で生成して得られたC言語ソースコード中に、所定のルールに従って、抽出したコメント文を埋め込む、すなわち挿入する（ステップS6）。ステップS6が、コメント文記述形式判定部を構成する。
【００３５】
一般に、従来方法による逆コンパイル方法では、Aバイナリコード１５ａから逆コンパイルして得られた高級言語ソースコード中には、Aプロセッサ向けのAソースコードのコメント文は復元されないため、高級言語ソースコードの可読性は低い。これは、通常のデバッグ情報にはコメント文の情報は含まれないうえに、従来の逆コンパイル技術は、ソースコードの入手ができない状況を想定しているためである。
【００３６】
また、最終的に作成されたAプロセッサ向けに書かれたAソースコード２１は、Aプロセッサのアーキテクチャに特化した人手により修正等されたアセンブリコードや、Aコンパイラ２２のみが認識可能な指示子を含んでおり、Bコンパイラ１７ｂではそのような修正等に対応したバイナリコードが生成できない。
【００３７】
しかし、Aソースコード２１が入手可能な場合であっても、一旦Aコンパイラ２２によりAバイナリコード１５ａを得てから、高級言語のC言語ソースコード２３へ逆コンパイルをする方法は有効であり、かつその場合に、Aソースコード２１中のコメント文の復元は望ましい。
【００３８】
そこで、本実施の形態のプログラム変換装置１においては、Aソースコード２１を利用して、C言語ソースコード２３中にコメント文が復元されるように構成されている。
【００３９】
ステップS6における、所定の形式で書かれたコメント文とは、例えば、Doxygenのようなドキュメント自動生成システムで採用されているような記述ルールに基づいて書かれたコメント文である。従って、CPU１１ａは、ソースコード中のコメント文が、所定の形式で書かれているか否かを判定し、判定の結果、あるコメント文がその所定の形式で書かれている場合は、ステップS5で生成されたC言語ソースコードに、その所定の形式に従って、そのコメント文を埋め込む。
【００４０】
従って、トラスレータ部１７ａは、Aソースコードを参照して、Aプロセッサ用のソースコード中のコメント文が所定の形式で記述されているか否かを判定するコメント文記述形式判定部を含む。そして、トランスレータ部１７ａは、Aソースコード２１中のコメント文が所定の形式で記述されていると判定した場合は、その所定の形式に従って、所定の形式で記述されていると判定されたコメント文を、Bプロセッサ用のソースコードであるC言語ソースコード２３中に埋め込んで、C言語ソースコード２３を生成する。
【００４１】
例を挙げて説明する。  
例えば、Aプロセッサ用のソースコードであるAソースコード２１に、次のようなコードがあったとする。
【００４２】
・・・・
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); }      ・・・（４）
・・・・
上記ソースコード（４）は、２つの関数定義と、その２つの関数定義の間に書かれた１行のコメント文を含むソースコードである。このソースコード（４）をコンパイル後、高級言語のＣ言語ソースコードに逆変換する際、コメント文の部分を関数maxと共に復元できれば可読性を上げることができる。しかし、一般的には、Aバイナリコード１５ａにデバッグ情報が含まれていれば、関数名や変数名は復元可能であるが、上記のコメント文は、２つの関数定義、すなわちmaxとminのどちらの関数について書かれたものなのかを自動的に判断することは不可能である。
【００４３】
これに対して、本実施の形態では、Aソースコード２１のコメント文が、ドキュメント自動生成システム等のために所定の形式で書かれている場合、その形式に従って、コメント文の位置を判定し、その判定した位置に対応するように、その所定の形式に従って、生成したC言語ソースコード中にコメント文を埋め込むようにした。
【００４４】
例えば、上記ソースコード（４）をDoxygen（例えば、http://www.stack.nl/~dimitri/doxygen/を参照）のドキュメント自動生成システムにおいて予め定められた形式に従って書くと、次のようになる。
【００４５】
・・・・
/** 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); }    ・・・（５）
・・・・
ソースコード（５）において、「/**」 から始まるコメントは、Doxygenのドキュメント自動生成システムにおいて定められた形式に基づいて書かれたコメントであることを示す。言い換えれば、ソースコード（５）中の変数、関数等についてのコメント文は、Doxygenのドキュメント自動生成システムにおいて定められた形式に従って、書かれていることを明示的に表している。  
Doxygenのドキュメント自動生成システムには、そのコメント文と対応する変数、関数は、その直後に定義されているものであるという予め決められたルールがあり、そのルールに従った形式で、コメント文が書かれている。
【００４６】
従って、本実施の形態のトランスレータ１７ａは、生成した高級言語のC言語ソースコード中に、その所定の形式の記述に従って、抽出したコメント文を埋め込むようにした。具体的には、「/**」のようなシンボル、すなわち記号等の識別子と、「this function returns max value」のようなコメント文との対応関係を利用することにより、トランスレータ１７ａは、生成した高級言語のC言語ソースコード中に、関係する関数等に適切に対応付けて、コメントを復元することが可能になる。
【００４７】
その結果、ユーザは、C言語ソースコード２３中に適切にコメント文が復元されているので、可読性が上がり、C言語ソースコード２３のデバッグ、仕様変更対応、性能チューニング等を容易にすることができる。
【００４８】
次に、CPU１１ａは、Aソースコード２１を参照して、Aソースコード２１中のマクロ宣言文を抽出し、ステップS5で生成して得られたC言語ソースコード中に、抽出されたマクロ宣言のテキスト表現等がないかマッチングを行う。一致する箇所が見つかった場合は、C言語ソースコード中に、そのマクロ宣言文とマクロ表現を埋め込む（ステップS7）。ステップS7は、Aソースコード２１を参照してAソースコード２１中のマクロ宣言文を抽出するマクロ宣言抽出部を構成する。例えば、ステップS7では、Aソースコード２１中のマクロ宣言文のリストが生成され、その生成されたリストに含まれるマクロの定義を参照して、C言語ソースコード２３について、各マクロの定義に該当する、すなわち各マクロと一致する箇所にその定義が埋め込まれる。
【００４９】
さらに、CPU１１ａは、Aソースコード２１を参照して、Aソースコード２１からinclude宣言文を抽出し、ステップS5で生成して得られたC言語ソースコード中に、抽出されたincludeファイルの内容と等価な箇所がないかマッチングをする。等価な箇所が見つかった場合は、C言語ソースコード中に、該当するinclude宣言文を埋め込む（ステップS8）。ステップS8が、Aバイナリコード２１を参照してAソースコード２１中のinclude宣言文を抽出するインクルード宣言抽出部を構成する。例えば、ステップS8では、Aソースコード２１中のinclude宣言文を含むファイルの内容を参照して、C言語ソースコード２３中にそのinclude宣言文を含むファイル中に記述された内容と等価な内容が検出されたときには、そのC言語ソースコード２３にinclude宣言文を追加する。
【００５０】
ステップS7とS8について、具体的に説明する。  
例えば、Aプロセッサ用のソースコードであるAソースコード２１が次の２つのファイル”myheader.h”と”main.c”から構成されていたとする。
【００５１】
・ファイル名 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」がスレッシュホールド値であることを宣言している。
【００５２】
include宣言文である「#include “myheader.h”」は、ファイル名が「myheader.h」は、includeされることを宣言している。
【００５３】
これらのinclude宣言文やマクロ宣言文は全てAコンパイラ２２によって展開されるため、これらのソースコードに対応するバイナリコードに対してステップS1〜S5の処理を適用した結果は、以下のように１つのファイル”main2.c”となる。
【００５４】
・ファイル名  main2.cの内容
int binary_filter(unsigned char a){return (a>127 ? 255:0);}
int main(){
unsigned char x = 120;
return binary_filter(x);
}
Aソースコード２１で使われているinclude宣言文の数やマクロ宣言文の数が増えるに従い、上記の結果のソースコードの可読性は下がる。
【００５５】
そこで、本実施の形態のトランスレータ１７ａは、生成した高級言語のC言語ソースコードに対してマクロ宣言文とinclude宣言文を復元する。
【００５６】
ここでは、ステップS7では、ソースコード２１を参照し、「#define・・・」のようなマクロ宣言文が抽出され、ファイル名がmyheader.hであるマクロ宣言文が追加される。さらに、ステップS7では、ファイル名  main2.c中において、「１２７」が、そのマクロ表現である「THRETHHOLD」に置き換えられる。このようにして、マクロ宣言文とマクロ表現が埋め込まれる。
【００５７】
また、ステップS8では、Aソースコード２１を参照し、Aソースコード２１中からinclude宣言文が抽出される。そして、include宣言文の追加は、ファイル名  main2.c中の「binary filter・・」が、参照したAソースコード２１中にあるため、そのinclude宣言された関数myheader.hをincludeするinclude宣言文が生成され追加される。
【００５８】
その結果、上記の１つのファイルであるプログラムmain2.cは、上記２つのファイルmain.cとmyheader.hに置換される。言い換えると、元のAソースコード２１で使用されていたマクロ宣言文とinclude宣言文が復元される。よって、C言語ソースコード２３の可読性は上がり、デバッグ、仕様変更、性能チューニング等を容易にすることができる。
【００５９】
さらに、CPU１１ａは、Aソースコード２１を参照して、Aソースコード２１中の行番号情報とシンボル情報を、ステップS5で生成して得られたC言語ソースコード中に埋め込む（ステップS9）。ステップS9が、C言語ソースコード２３に、Aソースコード２１のシンボル情報と行番号情報を埋め込む、シンボル及び行番号情報埋め込み部を構成する。
【００６０】
例えば、CPU１１ａは、Aプロセッサ用のソースコードであるAソースコード２１に次のようなコードがあったとする。左端の数字は便宜的な行番号であり、実際のソースコードには含まれない。
【００６１】
・ファイル名 func.c  の内容
1: void function(){
2:      if(b ＞ c) a = b;
3:       else a = c;
4: }
上記に対してステップS1〜S5を適用した結果、例えば、次のようになったとする。
【００６２】
void f(){
B_MAX(a, b, c);
}
ここでは、トランスレータ１７ａがプロセッサＢの最大値命令B_MAXを利用したコードを生成している例である。この例ではB_MAX(a,b,c)が最大値を得る処理をしていることは、そのテキスト表現から容易に類推できるが、一般的に、プロセッサBのために並列化などの高度な最適化を施した機械命令関数が出力された場合、処理内容を把握し、デバッグ・チューニングをすることは困難になる。
【００６３】
そこで、ステップS9では、本実施の形態のトランスレータ１７ａは、生成した高級言語のC言語ソースコードに対して、次のように、行番号情報とシンボル情報を埋め込む。
【００６４】
void f(){  /** func.c, L1 function */
B_MAX(a, b, c); /** func.c, L2,3 */
}
上記のプログラムには、関数f()に対応するAソースコード２１の内容が”func.c”の１行目にあり、シンボル情報としてのシンボル名が”function”であること、B_MAX()に対応する内容が”func.c”の2,3行目にあることの情報が含まれている。これらの情報をユーザが直接解釈してAソースコード２１を参照することで処理内容を理解することも可能である。
【００６５】
さらに、この埋め込まれた情報を、プロセッサBの並列化コンパイラ部が適切に解釈し、所定の形式で、プロセッサBのバイナリコード中に、デバッガ１９が利用可能なデバッグ情報として埋め込む。通常、プロセッサBのデバッガ１９は、プロセッサBのバイナリコード１６ａをデバッグする際、プロセッサBのソースコード２３を参照可能である。そして、ユーザは、プロセッサBのデバッガ１９により、プロセッサAのソースコード２１を適宜参照することが可能となる。
【００６６】
図６は、Bバイナリコードをデバッガ１９によりデバッグしているときに、表示装置１３の画面上に表示されるデバッグ画面の例を示す図である。画面３１上には、Ｂバイナリコードあるいはアセンブリコードを表示するバイナリコード表示部３２と、Ｃ言語ソースコード２３を表示するＢバイナリコードに対応するソースコード表示部３３と、Aソースコードを表示するソースコード表示部３４とが表示される。
【００６７】
ユーザは、バイナリコード表示部３２に表示されたバイナリコードあるいはアセンブリコードと、ソースコード表示部３３に表示されたC言語ソースコードとだけでなく、ソースコード表示部３４に表示されたAソースコード２１も参照しながら、Bバイナリコードのデバッグ等をすることができる。
【００６８】
ユーザは、バイナリコード表示部３２に表示されたコード中、所望の行を選択すると、その選択された行に対応するプログラム部分が、ソースコード表示部３３と３４において例えば、ハイライト表示等が行われる。
【００６９】
よって、入力装置１２を利用してユーザが指定するBバイナリコード部分に対応するC言語ソースコード部分だけでなく、Bバイナリコード部分に対応するAソースコード部分も、ソースコード表示部３４に表示されるので、ユーザは、変換元のソースプログラムを参照しながら、Bバイナリコード１６ａのデバッグ等を行うことができる。
【００７０】
なお、シンボル情報と行番号の埋め込みは、トランスレータ１７ａを介した処理に限定されない。例えば、プロセッサAのソースコードをプロセッサAの並列化コンパイラにより、いったんプロセッサAマルチコア向けのソースコードあるいはマルチスレッド化コードを生成する場合、上記した例と同様に、プロセッサAマルチコア向けのソースコード、あるいはマルチスレッド化コード中に、プロセッサAのソースコードのシンボル情報と行番号情報を埋め込むようにしてもよい。これにより、プロセッサA並列化コードデバッガから元のソースコードの参照が可能となる。
【００７１】
図４に戻り、ステップS5により、C言語ソースコード２３が生成され、さらに上述したステップS6からS9の処理が終了すると、次に、Bコンパイラ１７ｂが、C言語ソースコード２３をコンパイルして、Bバイナリコード１６ａを生成する（ステップS10）。
【００７２】
ここで、コンパイラ部であるBコンパイラ１７ｂとして、並列化コンパイラが使用される。並列化コンパイラを用いることによって、Aプロセッサが並列処理に対応していないが、Bプロセッサが並列処理に対応している場合、C言語ソースコード２３からBバイナリコード１６ａを生成するときに、バイナリコード１６ａはＢプロセッサ用の並列度に対応した、並列プログラムのコードとすることができる。並列化コンパイラによって、C言語ソースコード２３を並列化プログラムにすることができる。
【００７３】
例えば、次のようなループ処理を考える。
【００７４】
for(int i = 0; i < 256; i++) a[i] = b[i] + c[i];      ・・・（６）
そして、Aプロセッサが２並列SIMD（Single Instruction/Multiple Data）加算命令を持たず、一方でBプロセッサが２並列SIMD加算命令、例えばB_ADD_SIMD2、を持つ場合を仮定する。このとき、Aプロセッサでは256回加算命令を繰り返すが、Bプロセッサでは128（=256/2）回のSIMD加算命令で済む。そこで、Bコンパイラ１７ｂとしてVLIW(Very Long Instruction Word)/SIMD並列化コンパイラを使用することにより、AプロセッサとBプロセッサの演算並列度の差異を吸収することができる。
【００７５】
以上のようにして、Bコンパイラ１７ｂに、並列化コンパイラを用いることによって、Aプロセッサが並列処理に対応していなくても、Bプロセッサが並列化処理に対応している場合には、バイナリコード１６ａは、Ｂプロセッサ用の並列度に対応したコードとすることができる。
【００７６】
言い換えると、BプロセッサがAプロセッサよりも高並列な命令実行が可能な場合、当然Aバイナリコード１５ａにはそのような高並列命令は含まれないため、Ｂプロセッサの高並列命令を生かしきれない虞れがある。そこで、Bコンパイラ１７ｂとして、Bプロセッサの高並列度に対応したコンパイラを用いることにより、Aバイナリコード１５ａから生成されるＢバイナリコード１６ａは、Ｂプロセッサの高並列度に対応したコードとすることができる。
【００７７】
さらに、Bコンパイラの並列化コンパイル機能に、マルチスレッド化あるいはマルチコア化の機能が含まれている場合でも、上記と同様の効果、すなわち高並列度に対応したコードとすることができるという効果が得られる。
【００７８】
以上のように、本実施の形態によれば、異なるプロセッサ間でプログラムコードの変換を行う場合に、変換元のバイナリコードに含まれるプログラム上の工夫を、変換先のバイナリコードに反映することができるプログラムコード変換装置を実現することができる。
【００７９】
さらに、本実施の形態によれば、変換元のオブジェクトコードであるバイナリコードから、高級言語コードを生成するときに、変換元のバイナリコードの元となるソースコードに含まれていたコメント文、マクロ宣言文等が、その高級言語コード中に適切に復元されるので、ユーザは、高級言語コードのデバッグ、仕様変更対応、性能チューニング等を容易にすることができる。
【００８０】
なお、本明細書における各「部」は、実施の形態の各機能に対応する概念的なもので、必ずしも特定のハードウエアやソフトウエア・ルーチンに１対１には対応しない。従って、本実施の形態における各手順の各ステップは、その性質に反しない限り、実行順序を変更し、複数同時に実行し、あるいは実行毎に異なった順序で実行してもよい。
【００８１】
さらに、以上説明した動作を実行するプログラムコードは、フレキシブルディスク、ＣＤ−ＲＯＭ等の可搬媒体や、ハードディスク等の記憶装置等の記録媒体に、その全体あるいは一部が記録され、あるいは記憶される。そのプログラムコードは、コンピュータにより読み取られて、動作の全部あるいは一部が実行されるコンピュータプログラム製品として提供することができる。あるいは、そのプログラムコードの全体あるいは一部を通信ネットワークを介して流通または提供することができる。利用者は、通信ネットワークを介してそのプログラムコードをダウンロードしてコンピュータにインストールしたり、あるいは記録媒体からコンピュータにインストールすることで、容易に本発明のプログラムコード変換装置を実現することができる。  
本発明は、上述した実施の形態に限定されるものではなく、本発明の要旨を変えない範囲において、種々の変更、改変等が可能である。
【図面の簡単な説明】
【００８２】
【図１】本発明の実施の形態に係わるプログラム変換装置の構成を示す構成図である。
【図２】本発明の実施の形態に係わるプログラム変換処理の流れの例を説明するための図である。
【図３】本発明の実施の形態に係る変換処理プログラムの処理の流れの例を示すフローチャートである。
【図４】本発明の実施の形態に係る変換処理プログラムの処理の流れの例を示すフローチャートである。
【図５】本発明の実施の形態に係る変換テーブルの構成例を示す図である。
【図６】本発明の実施の形態に係わるデバッグ画面の例を示す図である。
【符号の説明】
【００８３】
１  プログラム変換装置、１１  計算機本体、１２  入力装置、１３  表示装置、１４  
記憶装置、１５  変換元のバイナリコード、１６  変換先のバイナリコード、１７  変換
処理プログラム、１８  変換テーブル、３１  画面
【図１】
2008276735.tif 000003
【図２】
2008276735.tif 000004
【図３】
2008276735.tif 000005
【図４】
2008276735.tif 000006
【図５】
2008276735.tif 000007
【図６】
2008276735.tif 000008