(57)【要約】【課題】最適化にかかる時間を低減すること。【解決手段】本発明にかかるコンパイル装置は、それぞれに命令とオペランドとが記述された複数の文を含む第１のソースコードを、中間コードに変換し、さらに第１のソースコードよりも低級な言語の第２のソースコードに変換することでコンパイルするコンパイル装置９である。中間コードにおいて、命令及びオペランドの形式が相互に同一となる文である類似文を検出する類似文検出部９１と、中間コードを第２のソースコードに変換するときに、中間コードにおいて、類似文検出部９１が検出した類似文に対応するコードを、類似文のオペランドを引数として、類似文の命令を実行する共通関数を呼び出すコードとして変換するコード変換部９２とを備える。【選択図】図１０
2013210920.tif 000002
【特許請求の範囲】
【請求項１】
それぞれに命令とオペランドとが記述された複数の文を含む第１のソースコードを、中間コードに変換し、さらに前記第１のソースコードよりも低級な言語の第２のソースコードに変換することでコンパイルするコンパイル装置であって、
前記中間コードにおいて、前記命令及び前記オペランドの形式が相互に同一となる文である類似文を検出する類似文検出部と、
前記中間コードを前記第２のソースコードに変換するときに、前記中間コードにおいて、前記類似文検出部が検出した類似文に対応するコードを、当該類似文のオペランドを引数として、当該類似文の命令を実行する共通関数を呼び出すコードとして変換するコード変換部と、
を備えたコンパイル装置。
【請求項２】
前記類似文検出部は、前記類似文に、当該類似文の命令及びオペランドの形式を一意に特定する類似特定情報を含め、
前記コード変換部は、前記類似文に対応するコードを、当該類似文に含まれる類似特定情報で特定されるオペランドの形式で当該類似文のオペランドを引数として、当該類似特定情報で特定される命令を実行する共通関数を呼び出すコードとして変換する、
請求項１に記載のコンパイル装置。
【請求項３】
前記コンパイル装置は、さらに、任意の情報が格納される記憶部を有し、
前記類似文検出部は、前記中間コードにおける文に基づいて、当該文の命令を示す命令情報と、当該文のオペランドの形式を示すオペランド形式情報とを含む中間コード情報を、前記中間コードに含まれる文のそれぞれについて生成して、前記記憶部に格納し、
前記類似文検出部は、前記記憶部に格納された中間コード情報のうち、前記命令情報及び前記オペランド形式情報のそれぞれが示す命令及びオペランドの形式が相互に一致する中間コード情報を検出し、検出した中間コード情報に対応する文を類似文と判定する、
請求項２に記載のコンパイル装置。
【請求項４】
前記類似文検出部は、前記類似文を検出したときに、当該類似文の命令及びオペランドの形式を一意に特定する類似特定情報と、当該類似文の命令及びオペランドの形式のそれぞれを示す命令情報及びオペランド情報とを含む類似文情報を生成して、前記記憶部に格納し、
前記類似文検出部は、前記類似文情報が示す命令及びオペランドの形式と、前記中間コード情報が示す命令及びオペランドの形式とが一致する場合、当該類似文情報に含まれる類似特定情報を、当該中間コード情報に対応する文に含める、
請求項３に記載のコンパイル装置。
【請求項５】
前記オペランドの形式は、オペランドの型及び長さである、
請求項１乃至４のいずれか１項に記載のコンパイル装置。
【請求項６】
前記第１のソースコードは、ＣＯＢＯＬ言語で記述されたソースコードであり、
前記第２のソースコードは、アセンブラコードである、
請求項１乃至５のいずれか１項に記載のコンパイル装置。
【請求項７】
それぞれに命令とオペランドとが記述された複数の文を含む第１のソースコードを、中間コードに変換し、さらに前記第１のソースコードよりも低級な言語の第２のソースコードに変換することでコンパイルするコンパイル方法であって、
前記中間コードにおいて、前記命令及び前記オペランドの形式が相互に同一となる文である類似文を検出するステップと、
前記中間コードを前記第２のソースコードに変換するときに、前記中間コードにおいて、前記検出した類似文に対応するコードを、当該類似文のオペランドを引数として、当該類似文の命令を実行する共通関数を呼び出すコードとして変換するステップと、
を備えたコンパイル方法。
【請求項８】
それぞれに命令とオペランドとが記述された複数の文を含む第１のソースコードを、中間コードに変換し、さらに前記第１のソースコードよりも低級な言語の第２のソースコードに変換することでコンパイルするためのコンパイラであって、
前記中間コードにおいて、前記命令及び前記オペランドの形式が相互に同一となる文である類似文を検出する処理と、
前記中間コードを前記第２のソースコードに変換するときに、前記中間コードにおいて、前記検出した類似文に対応するコードを、当該類似文のオペランドを引数として、当該類似文の命令を実行する共通関数を呼び出すコードとして変換する処理と、
をコンピュータに実行させるコンパイラ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイル装置、コンパイル方法及びコンパイラに関し、特に、ソースコードを、それよりも低級な言語のソースコードに変換することでコンパイルする技術に関する。
【背景技術】
【０００２】
ソースコードを翻訳して機械語コードを生成するときには、最終的に生成する機械語コードを実行する際における実行時間やメモリ使用量等を最小化するために、最適化が行われている（例えば、特許文献１）。
【０００３】
ここで、ユーザーが記述したソースコード中に類似したコードが複数ある場合には、その分、ソースコードのコードサイズが大きくなってしまうことになる。コードサイズが大きいと、最適化の処理対象となるデータ量も大きくなることになるため、最適化にかかる時間が増大してしまうという問題がある。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１０−４９３１５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
上述したように、ソースコードに類似したコードが複数存在し、そのコードサイズが大きい場合には、最適化にかかる時間が増大してしまうという課題がある。
【０００６】
本発明の目的は、上述したような課題を解決するために、最適化にかかる時間を低減することができるコンパイル装置、コンパイル方法、及び、コンパイラを提供することである。
【課題を解決するための手段】
【０００７】
本発明の第１の態様にかかるコンパイル装置は、それぞれに命令とオペランドとが記述された複数の文を含む第１のソースコードを、中間コードに変換し、さらに前記第１のソースコードよりも低級な言語の第２のソースコードに変換することでコンパイルするコンパイル装置であって、前記中間コードにおいて、前記命令及び前記オペランドの形式が相互に同一となる文である類似文を検出する類似文検出部と、前記中間コードを前記第２のソースコードに変換するときに、前記中間コードにおいて、前記類似文検出部が検出した類似文に対応するコードを、当該類似文のオペランドを引数として、当該類似文の命令を実行する共通関数を呼び出すコードとして変換するコード変換部と、を備えたものである。
【０００８】
本発明の第２の態様にかかるコンパイル方法は、それぞれに命令とオペランドとが記述された複数の文を含む第１のソースコードを、中間コードに変換し、さらに前記第１のソースコードよりも低級な言語の第２のソースコードに変換することでコンパイルするコンパイル方法であって、前記中間コードにおいて、前記命令及び前記オペランドの形式が相互に同一となる文である類似文を検出するステップと、前記中間コードを前記第２のソースコードに変換するときに、前記中間コードにおいて、前記検出した類似文に対応するコードを、当該類似文のオペランドを引数として、当該類似文の命令を実行する共通関数を呼び出すコードとして変換するステップと、を備えたものである。
【０００９】
本発明の第３の態様にかかるコンパイラは、それぞれに命令とオペランドとが記述された複数の文を含む第１のソースコードを、中間コードに変換し、さらに前記第１のソースコードよりも低級な言語の第２のソースコードに変換することでコンパイルするためのコンパイラであって、前記中間コードにおいて、前記命令及び前記オペランドの形式が相互に同一となる文である類似文を検出する処理と、前記中間コードを前記第２のソースコードに変換するときに、前記中間コードにおいて、前記検出した類似文に対応するコードを、当該類似文のオペランドを引数として、当該類似文の命令を実行する共通関数を呼び出すコードとして変換する処理と、をコンピュータに実行させるものである。
【発明の効果】
【００１０】
上述した各態様によれば、上述したような課題を解決するために、最適化にかかる時間を低減することができるコンパイル装置、コンパイル方法、及び、コンパイラを提供することができる。
【図面の簡単な説明】
【００１１】
【図１】発明の実施の形態にかかるコンパイル装置の構成を示すブロック図である。
【図２】発明の実施の形態にかかるＣＰＵの処理構成図であるである。
【図３】発明の実施の形態にかかる最適化部によるコード共通化単位を説明する図である。
【図４】発明の実施の形態にかかる中間コード情報テーブル、類似コードテーブル、及び、最適化済中間コードのフォーマットを示す図である。
【図５】発明の実施の形態にかかる最適化部の処理を示すフローチャートである。
【図６】発明の実施の形態にかかる中間コード情報テーブルの一例を示す図である。
【図７】発明の実施の形態にかかる類似コードテーブルの一例を示す図である。
【図８】発明の実施の形態にかかる最適化済中間コードの一例を示す図である。
【図９】発明の実施の形態にかかる効果を説明するための図である。
【図１０】発明の実施の形態にかかるコンパイル装置の概要構成を示すブロック図である。
【発明を実施するための形態】
【００１２】
＜発明の実施の形態＞
まず、図１を参照して、発明の実施の形態にかかるコンパイル装置１の構成について説明する。図１は、発明の実施の形態にかかるコンパイル装置１の構成を示すブロック図である。
【００１３】
コンパイル装置１は、ＣＰＵ（Central Processing Unit）１０、メモリ１１、及び、記憶部１２を有する。
【００１４】
ＣＰＵ１０は、記憶部１２に格納されたソースコード（ソースプログラム）１２３を機械語コード（機械語プログラム）に翻訳する処理を実行する。具体的には、ＣＰＵ１０は、記憶部１２に格納されたコンパイラ１２０をメモリ１１にロードして実行することによって、ソースプログラム１２３をコンパイルしてアセンブラコードを生成する。ＣＰＵ１０は、アセンブラ１２１をメモリ１１にロードして実行することによって、アセンブラコードをアセンブルしてオブジェクトコードを生成する。ＣＰＵ１０は、記憶部１２に格納されたリンカ１２２をメモリ１１にロードして実行することによって、オブジェクトコードをリンクして機械語コードを生成する。ＣＰＵ１０によって生成されたアセンブラコード、オブジェクトコード、及び、機械語コードは、メモリ１１又は記憶部１２に格納される。
【００１５】
また、ＣＰＵ１０は、コンパイラ１２０を実行することによって、後述するように、展開部１００、コード生成部１０１、最適化部１０２、及び、アドレッシング部１０３として機能する。
【００１６】
メモリ１１は、ＣＰＵ１０によってロードされたプログラム（１２０〜１２２）、及び、ＣＰＵ１０がソースコード１２２の翻訳時に生成する各種データ等が格納される。メモリ１１は、例えば、ＲＡＭ（Random Access Memory）である。
【００１７】
記憶部１２は、コンパイラ１２０、アセンブラ１２１、リンカ１２２、及び、ソースコード１２３が格納される。記憶部１２は、これらのデータ１２０〜１２３を格納するための少なくとも１つの任意の記憶装置を含む。記憶装置は、例えば、メモリ及びハードディスク等である。ここで、本実施の形態では、ソースコード１２３がＣＯＢＯＬのソースコードである場合について例示する。
【００１８】
続いて、図２を参照して、発明の実施の形態にかかるＣＰＵ１０の処理構成について説明する。図２は、発明の実施の形態にかかるＣＰＵ１０の処理構成図である。
【００１９】
ＣＰＵ１０は、コンパイラ１２０を実行することによって、フロントエンドの処理（字句解析、構文解析、及び、意味解析等）を行って、ソースコード１２３から構文解析済中間コードを生成する。
【００２０】
ＣＰＵ１０は、コンパイラ１２０を実行することによって、バックエンドを処理するときに、展開部１００、コード生成部１０１、最適化部１０２、及び、アドレッシング部１０３として機能する。各部１００〜１０３における処理は、バックエンドにおける各フェーズに対応した処理となる。
【００２１】
展開部１００は、コンパイルにおける最適化の一部を実行する。ここでの最適化として、例えば、デッドコードの削除、及び、ループの最適化（複数ループの結合）等が行われる。展開部１００は、構文解析済中間コードを最適化したオブジェクト生成用中間コード１を生成する。コード生成部１０１は、オブジェクト生成用中間コード１をプラットフォームに依存した形式に変換したオブジェクト生成用中間コード２を生成する。
【００２２】
最適化部１０２は、オブジェクト生成用中間コード２において、文単位で比較を行うことによって、他の文と類似する文を検出する。最適化部１０２は、各文の命令及びパラメータの形式を比較することによって、他の文と類似する文を検出する。最適化部１０２は、他の文と類似する文を、その文における処理を実行する共通関数を呼び出す処理への置き換え対象として検出する。そして、最適化部１０２は、オブジェクト生成用中間コード２において文に対応するように呼び出す共通関数を特定する情報を埋め込んだ最適化済中間コードを生成する。
【００２３】
アドレッシング部１０３は、最適化済中間コードをアセンブラコードに変換する。このときに、アドレッシング部１０３は、最適化部１０２によって最適化済中間コードに埋め込まれた情報に基づいて、他の文と類似する文に対応するコードを、それぞれの文における処理を実行する共通関数を呼び出すコードとなるように変換する。このように、本実施の形態では、文単位で相互に類似するコードを抽出し、抽出したコードを、共通関数を呼び出すコードに置き換えることで、過剰なオブジェクトコードを生成しないようにする。
【００２４】
続いて、図３を参照して、本発明の実施の形態にかかる最適化部１０２によるコード共通化単位について説明する。図３は、本発明の実施の形態にかかる最適化部１０２によるコード共通化単位を説明する図である。
【００２５】
図３に示すように、ソースコード１２３において、「ＣＯＭＰＵＴＥ Ａ＝Ａ＊Ｂ＋Ｃ」と記述されている場合であっても、乗算（ＭＵＬＴＩＰＬＹ）、加算（ＡＤＤ）、及び、代入（ＭＯＶＥ）のそれぞれを実行する文に分解して、それぞれの文について共通化を行う。すなわち、分解可能な単位まで文を分解してから共通化を行う。なお、この分解は、通常、フロントエンドのフェーズで行われる。
【００２６】
このように、ＭＵＬＴＩＰＬＹ文、ＡＤＤ文、ＭＯＶＥ文、ＤＥＶＩＤＥ文、及び、ＳＵＢＳＴＲＡＣＴ文等のように、ソースコード１２３の言語（ＣＯＢＯＬ）における命令文の単位での共通化を行う。
【００２７】
ここで、上述したように、ＣＯＢＯＬのような高級言語では、１文のコードで表現される処理であっても、コンパイルの過程で生成されるアセンブリコードのような低級言語では、複数文のコードで表現される。そこで、本実施の形態では、ソースコード１２３及びその中間コードで１文で表現される処理であっても、アセンブリコードでは、その１文に対応する複数文のコードにおける処理を実行する共通関数を呼び出す処理に置き換えることで、過剰なオブジェクトコードを生成しないようにする。
【００２８】
なお、本実施の形態では、高級言語がＣＯＢＯＬであり、それよりも低級（低水準）の言語がアセンブリコードである場合について例示したが、この関係を満たす言語であれば、他の言語の組み合わせを適用するようにしてもよい。
【００２９】
続いて、図４を参照して、図４を参照して、本発明の実施の形態にかかる中間コード情報テーブル、類似コードテーブル、及び、最適化済中間コードのフォーマットについて説明する。図４は、本発明の実施の形態にかかる中間コード情報テーブル、類似コードテーブル、及び、最適化済中間コードのフォーマットを示す図である。
【００３０】
図４は、中間コード情報テーブルと、類似コードテーブルと、最適化部１０２によって生成される最適化済中間コードのそれぞれのフォーマットを示す。
【００３１】
中間コード情報テーブルは、コード生成部１０１によって生成されるオブジェクト生成用中間コード２に含まれる文のそれぞれに対応する複数のレコードを含む。１つのレコードには、文コードと、パラメータ属性情報とが含まれる。パラメータ属性情報は、パラメータのそれぞれについて含まれる。中間コード情報テーブルは、コード生成部１０１によって、オブジェクト生成用中間コード２に基づいて生成されて、メモリ１１又は記憶部１２に格納される。
【００３２】
文コードは、文における命令（上述したＭＵＬＴＩＰＬＹ、ＡＤＤ等）を一意に特定する情報である。コード生成部１０１は、例えば、命令を一意に特定する値を文コードとして生成してもよく、オブジェクト生成用中間コード２に含まれる命令に対して一意に割り当てられたコードをそのまま文コードとして使用するようにしてもよい。
【００３３】
パラメータ属性情報は、パラメータの属性（型、長さ等）を示す情報である。パラメータ属性情報は、各文が関数として共通化できる程度に、パラメータの形式が一致しているか否かを判定するために使用される。一般的に、中間コード（オブジェクト生成用中間コード２）からは、各文におけるパラメータの値、型、長さ等の情報を抽出することができる。そのため、コード生成部１０１は、オブジェクト生成用中間コード２からパラメータ属性情報を抽出してレコードに格納する。ここで、アセンブリコードで関数を共通化する場合には、その引数となるパラメータの型及び長さが一致することが好ましい。そのため、本実施の形態では、パラメータの属性として、パラメータの型及び長さを抽出して比較する場合について例示する。したがって、パラメータ属性情報は、各文が関数として共通化できる程度に、パラメータの形式が一致しているか否かを判定することができる情報であれば、扱う言語に応じてパラメータの型及び長さに限られず、その内容を変更してよい。
【００３４】
類似コードテーブルは、オブジェクト生成用中間コード２において、相互に類似する文の種類毎のレコードが含められる。具体的には、命令及びパラメータの形式が同じ文は、同一の種類の文として扱われる。１つのレコードには、類似コード番号と、文コードと、パラメータ属性情報とが含まれる。類似コードテーブルは、最適化部１０２によって生成されて、メモリ１１又は記憶部１２に格納される。
【００３５】
類似コード番号は、相互に類似する文の種類を一意に特定する情報である。文コード及びパラメータ属性情報については、上述した通りである。最適化部１０２は、中間コード情報テーブルに基づいて、文コード及びパラメータ属性情報が相互に一致する文を、相互に類似する文として検出する。最適化部１０２は、他の文と類似する文を検出したときに、その文の種類についてのレコードが類似コードテーブルに存在しない場合、検出した文に関するレコードを類似コードテーブルに追加する。このとき、追加するレコードには、検出した文の種類を示す類似コード番号と、検出した文の文コードと、検出した文のパラメータ属性情報とが含められる。最適化部１０２は、レコードに含める類似コード番号として、類似コードテーブルに含まれる他の類似コード番号と重複しない番号を生成する。また、最適化部１０２は、レコードに含める文コード及びパラメータ属性情報として、他の文と類似する文を検出ときに、中間コード情報テーブルからその文の文コード及びパラメータ属性情報を取得する。
【００３６】
最適化済中間コードは、１文に、類似コード番号、及び、パラメータの情報が含まれる。最適化部１０２は、他の文に類似する文を検出した場合、検出した文の文コードを、検出した文の種類に対応する類似コード番号に置き換えて、最適化済中間コードを生成する。なお、最適化部１０２は、他の文に類似する文を検出しなかった場合には、元の文コードをそのまま残して、最適化済中間コードを生成する。また、文において、文コードを置き換えずに、類似コード番号を追加するようにしてもよい。最適化済中間コードは、最適化部１０２によって生成されて、メモリ１１又は記憶部１２に格納される。
【００３７】
類似コード番号については、上述した通りである。パラメータは、文におけるパラメータの情報を示している。この情報には、上述したように、パラメータの値、型、長さ等の情報が含まれる。このようにして、文コードが類似コード番号に置き換えられた文は、アドレッシング部１０３において、文のコードを、最適化済中間コードからアセンブラコードに変換するときに、類似コード番号に対応する文の処理を実行する共通関数を呼び出すコードとして変換される。
【００３８】
続いて、図５〜図８を参照して、本発明の実施の形態にかかる共通化処理について説明する。図５は、本発明の実施の形態にかかる最適化部１０２の処理を示すフローチャートである。図６は、本発明の実施の形態にかかる中間コード情報テーブルの一例を示す図である。図７は、本発明の実施の形態にかかる類似コードテーブルの一例を示す図である。図８は、本発明の実施の形態にかかる最適化済中間コードの一例を示す図である。
【００３９】
なお、ここでは、図３に、分解後として示す６つの文のコードを含む、オブジェクト生成用中間コード２を処理対象とする場合について例示する。よって、コード生成部１０１によって、図６に示すように、オブジェクト生成用中間コード２の各文についての中間コード情報テーブルが生成される。
【００４０】
具体的には、中間コード情報テーブルとして、１文目のレコードには、ＭＵＬＴＩＰＬＹ命令を示す文コードと、パラメータＡの型及び長さのそれぞれを示すパラメータ属性情報、パラメータＢの型及び長さを示すパラメータ属性情報、及び、パラメータＸの型及び長さを示すパラメータ属性情報が含まれる。２文目のレコードには、ＡＤＤ命令を示す文コードと、パラメータＣの型及び長さのそれぞれを示すパラメータ属性情報、パラメータＸの型及び長さを示すパラメータ属性情報、及び、パラメータＹの型及び長さを示すパラメータ属性情報が含まれる。３文目のレコードには、ＭＯＶ命令を示す文コードと、パラメータＹの型及び長さのそれぞれを示すパラメータ属性情報、及び、パラメータＡの型及び長さを示すパラメータ属性情報が含まれる。
【００４１】
３文目のレコードには、ＭＵＬＴＩＰＬＹ命令を示す文コードと、パラメータＥの型及び長さのそれぞれを示すパラメータ属性情報、パラメータＦの型及び長さを示すパラメータ属性情報、及び、パラメータＶの型及び長さを示すパラメータ属性情報が含まれる。２文目のレコードには、ＡＤＤ命令を示す文コードと、パラメータＤの型及び長さのそれぞれを示すパラメータ属性情報、パラメータＶの型及び長さを示すパラメータ属性情報、及び、パラメータＷの型及び長さを示すパラメータ属性情報が含まれる。３文目のレコードには、ＭＯＶＥ命令を示す文コードと、パラメータＷの型及び長さのそれぞれを示すパラメータ属性情報、及び、パラメータＤの型及び長さを示すパラメータ属性情報が含まれる。
【００４２】
また、ここでは、１文目と４文目、２文目と５文目、３文目と６文目がそれぞれ類似する文であるものとする。すなわち、１文目のパラメータＡの型及び長さは、４文目のパラメータＥの型及び長さと一致し、１文目のパラメータＢの型及び長さは、４文目のパラメータＦの型及び長さと一致し、１文目のパラメータＸの型及び長さは、４文目のパラメータＶの型及び長さと一致するものとする。なお、１文目の命令と４文目の命令は、共にＭＵＬＴＩＰＬＹであり、一致する。また、２文目のパラメータＣの型及び長さは、５文目のパラメータＤの型及び長さと一致し、２文目のパラメータＸの型及び長さは、５文目のパラメータＶの型及び長さと一致し、２文目のパラメータＹの型及び長さは、５文目のパラメータＷの型及び長さと一致するものとする。なお、２文目の命令と５文目の命令は、共にＡＤＤであり、一致する。また、３文目のパラメータＹの型及び長さは、６文目のパラメータＷの型及び長さと一致し、３文目のパラメータＡの型及び長さは、６文目のパラメータＤの型及び長さと一致するものとする。なお、３文目の命令と６文目の命令は、共にＭＯＶＥであり、一致する。
【００４３】
続いて、図５を参照して、上述した条件における最適化部１０２の処理について説明する。最適化部１０２は、中間コード情報テーブルから、１文目のレコードを読み込む（Ｓ１）。最適化部１０２は、類似コードテーブルを検索して、１文目と類似する文があるか否かを判定する（Ｓ２）。
【００４４】
ここでは、まだ、類似コードテーブルに、１文目と類似する文についてのレコードが存在しないため（Ｓ３：Ｎｏ）、最適化部１０２は、中間コード情報テーブルを検索して、１文目と類似する文があるか否かを判定する（Ｓ５）。
【００４５】
中間コード情報テーブルには、１文目と類似する文が４文目に存在する（Ｓ６：Ｙｅｓ）。すなわち、中間コード情報テーブルの１文目のレコードが示す命令、パラメータの型及び長さが、中間コード情報テーブルの４文目のレコードが示す命令、パラメータの型及び長さと一致する。
【００４６】
そのため、最適化部１０２は、類似コードテーブルに、その文についてのレコードを追加する（Ｓ７）。具体的には、図７に示すように、追加するレコードにおいて、１文目（４文目）の文の種類（命令、型及び長さ）を一意に特定する類似コード番号ＳＩＭ１、１文目（４文目）のＭＵＬＴＩＰＬＹ命令を示す文コード、パラメータＡ（Ｅ）の型及び長さを示す情報、パラメータＢ（Ｆ）の型及び長さを示す情報、及び、パラメータＸ（Ｖ）の型及び長さを示す情報を設定する。
【００４７】
そして、最適化部１０２は、図８に示すように、オブジェクト生成用中間コード２の１文目の文の文コードを、類似コードテーブルに追加したレコードの類似コード番号ＳＩＭ１に置き換えた最適化済中間コードを生成する（Ｓ４）。
【００４８】
最適化部１０２は、中間コード情報テーブルのレコードの終端になったか否かを判定する（Ｓ９）。ここでは、レコードの終端にはなっていないため（Ｓ９：Ｎｏ）、ステップＳ１に戻る。
【００４９】
続いて、２文目、３文目についても、上述したように、５文目、６文目と類似するため、同様にして、類似コードテーブルへのレコードの追加（Ｓ１、Ｓ２、Ｓ３：Ｎｏ、Ｓ５、Ｓ６；Ｙｅｓ、Ｓ７）と、文コードを類似コード番号（ＳＩＭ２又はＳＩＭ３）に置き換えた最適化済中間コードの生成（Ｓ４）が行われる。
【００５０】
これによって、図７に示すように、２文目（５文目）の文の種類（命令、型及び長さ）を一意に特定する類似コード番号ＳＩＭ２、２文目（５文目）のＡＤＤ命令を示す文コード、パラメータＣ（Ｄ）の型及び長さを示す情報、パラメータＸ（Ｖ）の型及び長さを示す情報、及び、パラメータＹ（Ｗ）の型及び長さを示す情報が設定されたレコードと、３文目（６文目）の文の種類（命令、型及び長さ）を一意に特定する類似コード番号ＳＩＭ３、３文目（６文目）のＭＯＶＥ命令を示す文コード、パラメータＹ（Ｗ）の型及び長さを示す情報、及び、パラメータＡ（Ｄ）の型及び長さを示す情報が設定されたレコードが追加される。
【００５１】
また、図８に示すように、オブジェクト生成用中間コード２の２文目の文の文コードを、類似コードテーブルに追加したレコードの類似コード番号ＳＩＭ２に置き換えた最適化済中間コードと、オブジェクト生成用中間コード２の３文目の文の文コードを、類似コードテーブルに追加したレコードの類似コード番号ＳＩＭ３に置き換えた最適化済中間コードとが生成される。
【００５２】
続いて、最適化部１０２は、中間コード情報テーブルから、３文目のレコードを読み込む（Ｓ１）。最適化部１０２は、類似コードテーブルを検索して、３文目と類似する文があるか否かを判定する（Ｓ２）。
【００５３】
類似コードテーブルには、図７に示すように、３文目と類似する文についてのレコード（類似コード番号ＳＩＭ１）が存在する（Ｓ３：Ｙｅｓ）。すなわち、中間コード情報テーブルの３文目のレコードが示す命令、パラメータの型及び長さが、類似コードテーブルの１つ目のレコードが示す命令、パラメータの型及び長さと一致する。
【００５４】
そのため、最適化部１０２は、最適化部１０２は、オブジェクト生成用中間コード２において、３文目の文の文コードを、類似コードテーブルの１つ目のレコードの類似コード番号ＳＩＭ１に置き換えた最適化済中間コードを生成する（Ｓ４）。
【００５５】
最適化部１０２は、中間コード情報テーブルのレコードの終端になったか否かを判定する（Ｓ９）。ここでは、レコードの終端にはなっていないため（Ｓ９：Ｎｏ）、ステップＳ１に戻る。
【００５６】
続いて、５文目、６文目についても、上述したように、類似コードテーブルに対応するレコードが追加された２文目、３文目と類似するため、同様にして、文コードを類似コード番号（ＳＩＭ２又はＳＩＭ３）に置き換えた最適化済中間コードの生成（Ｓ１、Ｓ２、Ｓ３：Ｙｅｓ、Ｓ４）が行われる。
【００５７】
これによって、図８に示すように、オブジェクト生成用中間コード２の５文目の文の文コードを、類似コードテーブルに追加したレコードの類似コード番号ＳＩＭ２に置き換えた最適化済中間コードと、オブジェクト生成用中間コード２の６文目の文の文コードを、類似コードテーブルに追加したレコードの類似コード番号ＳＩＭ３に置き換えた最適化済中間コードとが生成される。
【００５８】
そして、レコードの終端に達するため（Ｓ９：Ｙｅｓ）、最適化部１０２は、処理を終了する。
【００５９】
なお、ここでは、ステップＳ６でＮｏとなるケースが存在しなかったが、そのようなケースとなった場合は、上述したように、文コードを類似コード番号に置き換えずに、最適化済中間コードが生成される（Ｓ８）。
【００６０】
続いて、図９を参照して、発明の実施の形態にかかる効果について説明する。図９は、発明の実施の形態にかかる効果を説明するための図である。
【００６１】
最適化済中間コードの各文におけるコードは、アドレッシング部１０３によって、文に含まれる類似コード番号で特定される文の処理を実行する共通関数を呼び出すコードに変換される。また、共通関数のコードは、アドレッシング部１０３によって、元の文のコードに基づいて、そのコードの処理を実行するように生成される。また、共通関数のコードは、アドレッシング部１０３によって、元の文のコードのパラメータの形式で、パラメータを引数とするように生成される。したがって、共通関数には、型及び長さが必ず同一となるパラメータ（値）が引数として指定されるため、関数内の処理で齟齬が生じることはない。
【００６２】
例えば、図８の１文目で示すコードは、類似コード番号ＳＩＭ１に対応するＭＵＬＴＩＰＬＹの処理を実行する共通関数の呼び出しに置き換えられる。この共通関数は、パラメータＡ及びＥで共通する型及び長さのパラメータと、パラメータＢ及びＦで共通する型及び長さのパラメータと、パラメータＸ及びＶで共通する型及び長さのパラメータとを引数とする共通関数として生成される。
【００６３】
ここで、コンパイラは、元々、類似しないコード毎に、中間コードからアセンブラコードのテンプレートを内在している。例えば、中間コードにおいて、ＡＤＤ命令の文が存在する場合、そのテンプレートに中間コードにおけるパラメータを設定することで、元の中間コードの文のパラメータに対してＡＤＤ命令の処理を実行するアセンブラコードを生成することができる。このように、中間コードにおける各文を対応するテンプレートに置き換えることで、アセンブラコードへの変換が可能である。
【００６４】
そのため、共通関数を生成する場合には、このテンプレートを利用して生成するようにしてもよい。すなわち、コンパイラ１２０に、文の種類毎（類似コード番号毎）のアセンブラコードのテンプレートを含めるようにして、共通関数内の処理としてテンプレートのコードを配置することで、簡易に、アセンブラコードを生成することができる。
【００６５】
このように、類似する文を共通関数の呼び出しに置き換えることで、図９の右図に示すように、アセンブラコードにおいて、文単位でコードをまとめて、コード量を小さくすることができる。そのため、この後のフェーズとして、アセンブラ及びリンカによってコードを最適化するときに、最適化対象とするコードサイズを低減することができるため、最適化にかかる時間を低減することができる。
【００６６】
それに対して、図９の左図に示すように、本発明を適用しない場合には、アセンブラコードにおいて、文単位でコードをまとめることをしていないため、その文が記述されていた関数全体のコード量が大きくなってしまう。そのため、アセンブラ及びリンカによってコードを最適化するときに、最適化対象とするコードサイズが大きくなってしまい、最適化にかかる時間が増大してしまう。
【００６７】
＜本発明の実施の形態の概要＞
続いて、図１０を参照して、発明の実施の形態にかかるコンパイル装置１の概要構成について説明する。図１０は、発明の実施の形態にかかるコンパイル装置１の概要構成となるコンパイル装置９の構成を示すブロック図である。
【００６８】
コンパイル装置９は、類似文検出部９０及びコード変換部９１を有する。コンパイル装置９は、それぞれに命令とオペランドとが記述された複数の文を含む第１のソースコードを、中間コードに変換し、さらに第１のソースコードよりも低級な言語の第２のソースコードに変換することでコンパイルする。
【００６９】
類似文検出部９０は、中間コードにおいて、命令及びオペランドの形式が相互に同一となる文である類似文を検出する。コード変換部９１は、中間コードを第２のソースコードに変換するときに、中間コードにおいて、類似文検出部９０が検出した類似文に対応するコードを、類似文のオペランドを引数として、類似文の命令を実行する共通関数を呼び出すコードとして変換する。
【００７０】
以上に説明したように、本実施の形態によれば、中間コードをアセンブラコードに変換するときに、類似文に対応するコードを、類似文のオペランドを引数として、類似文の命令を実行する共通関数を呼び出すコードとして変換するようにしている。これによれば、その後のフェーズで、最適化対象とするコードサイズを低減することができるため、最適化にかかる時間を低減することができる。
【００７１】
なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。
【００７２】
また、上述の実施の形態の機能を実現するコンパイラ（プログラム）は、様々なタイプの非一時的なコンピュータ可読媒体（non-transitory computer readable medium）を用いて格納され、コンピュータ（コンパイラ装置）に供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体（tangible storage medium）を含む。非一時的なコンピュータ可読媒体の例は、磁気記録媒体（例えばフレキシブルディスク、磁気テープ、ハードディスクドライブ）、光磁気記録媒体（例えば光磁気ディスク）、ＣＤ−ＲＯＭ（Read Only Memory）、ＣＤ−Ｒ、ＣＤ−Ｒ／Ｗ、半導体メモリ（例えば、マスクＲＯＭ、ＰＲＯＭ（Programmable ROM）、ＥＰＲＯＭ（Erasable PROM）、フラッシュＲＯＭ、ＲＡＭ（Random Access Memory））を含む。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体（transitory computer readable medium）によってコンピュータに供給されてもよい。一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバ等の有線通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。
【００７３】
また、コンピュータが上述の実施の形態の機能を実現するプログラムを実行することにより、上述の実施の形態の機能が実現される場合だけでなく、このプログラムが、コンピュータ上で稼動しているＯＳ（Operating System）もしくはアプリケーションソフトウェアと共同して、上述の実施の形態の機能を実現する場合も、本発明の実施の形態に含まれる。さらに、このプログラムの処理の全てもしくは一部がコンピュータに挿入された機能拡張ボードやコンピュータに接続された機能拡張ユニットによって行われて、上述の実施の形態の機能が実現される場合も、本発明の実施の形態に含まれる。
【符号の説明】
【００７４】
１、９  コンパイル装置
１０  ＣＰＵ
１１  メモリ
１２  記憶部
９０  類似文検出部
９１  コード変換部
１００  展開部
１０１  コード生成部
１０２  最適化部
１０３  アドレッシング部
１２０  コンパイラ
１２１  アセンブラ
１２２  リンカ
１２３  ソースコード
【図１】
2013210920.tif 000003
【図２】
2013210920.tif 000004
【図３】
2013210920.tif 000005
【図４】
2013210920.tif 000006
【図５】
2013210920.tif 000007
【図６】
2013210920.tif 000008
【図７】
2013210920.tif 000009
【図８】
2013210920.tif 000010
【図９】
2013210920.tif 000011
【図１０】
2013210920.tif 000012