(57)【要約】【課題】従来の方法でＣ言語とＣ＋＋言語のプログラムを結合させるためには、リンケージ指定をするか、Ｃ＋＋言語としてコンパイルする必要がある。リンケージ指定はユーザにプログラム修正の負担を強いる。また、Ｃ＋＋言語でコンパイルする場合は、コードが冗長に生成されてしまう。【解決手段】入力プログラムの特定の範囲に対する言語仕様を解析し中間コードに記録しておく。特定の範囲間で言語仕様に相違がある場合にサブセット側の言語仕様をスーパーセット側の言語仕様に合わせた名前解決を行う。また、多重定義外部関数、名前空間に所属する外部関数、テンプレートから生成される外部関数は、プログラム中唯一の名前を持つ外部関数に変更する。この結果、リンケージ指定をする必要なくプログラムの結合が可能となり、かつ部分的に最適な言語仕様でコンパイルが可能となり、コードの冗長性を防ぐことができる。【選択図】図１
2007304840.tif 000002
【特許請求の範囲】
【請求項１】
入力プログラムを目的プログラムに変換するコンパイル方法であって、前記入力プログラムの特定の範囲に対する言語仕様を決定する部分言語仕様決定ステップと、特定の範囲間で言語仕様に相違がある場合に前記特定の範囲の一方において少なくとも一部のコードを補正する部分コード補正ステップとを含むことを特徴とするコンパイル方法。
【請求項２】
前記部分言語仕様決定ステップは、前記入力プログラムの特定の範囲内で使用されているプログラミング言語の機能に基づいて言語仕様を決定する請求項１に記載のコンパイル方法。
【請求項３】
前記部分言語仕様決定ステップは、前記入力プログラム中に言語仕様制御文が存在する場合、前記言語仕様制御文に基づいて言語仕様を決定する請求項１に記載のコンパイル方法。
【請求項４】
前記部分言語仕様決定ステップは、前記入力プログラムをコンパイルするコンパイルシステムに言語仕様制御命令が与えられている場合、前記言語仕様制御命令に基づいて言語仕様を決定する請求項１に記載のコンパイル方法。
【請求項５】
前記部分コード補正ステップは、すべての関数に対して、定義と参照で言語仕様に相違がある場合は、サブセットの言語仕様を持つ関数符号化名を、スーパーセットの言語仕様を持つ関数符号化名に変更する請求項１に記載のコンパイル方法。
【請求項６】
前記部分コード補正ステップは、多重定義されているすべての外部関数を、プログラム中唯一の関数名を持つ多重定義されていない外部関数に変更して、再度前記部分言語仕様決定ステップを行う請求項１に記載のコンパイル方法。
【請求項７】
前記部分コード補正ステップは、名前空間に所属するすべての外部関数を、プログラム中唯一の関数名を持つ名前空間に所属しない外部関数に変更して、再度前記部分言語仕様決定ステップを行う請求項１に記載のコンパイル方法。
【請求項８】
前記部分コード補正ステップは、テンプレートから生成されるすべての外部関数を、プログラム中唯一の関数名を持つテンプレートから生成されない外部関数に変更して、再度前記部分言語仕様決定ステップを行う請求項１に記載のコンパイル方法。
【請求項９】
入力プログラムをデバッグするデバッグ方法であって、前記入力プログラムの特定の範囲に対する言語仕様を認識する部分言語仕様認識ステップと、各範囲の言語仕様をプログラムソースとともに表示する部分言語仕様表示ステップとを含むことを特徴とするデバッグ方法。
【請求項１０】
さらに、解析対象がテンプレートから生成されたインスタンスの場合に、テンプレートを展開したソースプログラムを表示するテンプレート展開表示ステップを含む請求項９に記載のデバッグ方法。
【請求項１１】
さらに、認識した言語仕様に対してサブセットの言語仕様が定義されている場合に、サブセットの言語仕様から逸脱しているプログラム部分の内容を明記するサブセット言語仕様違反部分の表示ステップを含む請求項９に記載のデバッグ方法。
【請求項１２】
入力プログラムを目的プログラムに変換するコンパイルプログラムであって、前記入力プログラムの特定の範囲に対する言語仕様を決定する部分言語仕様決定機能と、特定の範囲間で言語仕様に相違がある場合に前記特定の範囲の一方において少なくとも一部のコードを補正する部分コード補正機能とを含むことを特徴とするコンパイルプログラム。
【請求項１３】
前記部分言語仕様決定機能は、前記入力プログラムの特定の範囲内で使用されているプログラミング言語の機能に基づいて言語仕様を決定する請求項１２に記載のコンパイルプログラム。
【請求項１４】
前記部分言語仕様決定機能は、前記入力プログラム中に言語仕様制御文が存在する場合、前記言語仕様制御文に基づいて言語仕様を決定する請求項１２に記載のコンパイルプログラム。
【請求項１５】
前記部分言語仕様決定機能は、前記入力プログラムをコンパイルするコンパイルシステムに言語仕様制御命令が与えられている場合、前記言語仕様制御命令に基づいて言語仕様を決定する請求項１２に記載のコンパイルプログラム。
【請求項１６】
前記部分コード補正機能は、すべての関数に対して、定義と参照で言語仕様に相違がある場合は、サブセットの言語仕様を持つ関数符号化名を、スーパーセットの言語仕様を持つ関数符号化名に変更する請求項１２に記載のコンパイルプログラム。
【請求項１７】
前記部分コード補正機能は、多重定義されているすべての外部関数を、プログラム中唯一の関数名を持つ多重定義されていない外部関数に変更して、再度前記部分言語仕様決定機能を行う請求項１２に記載のコンパイルプログラム。
【請求項１８】
前記部分コード補正機能は、名前空間に所属するすべての外部関数を、プログラム中唯一の関数名を持つ名前空間に所属しない外部関数に変更して、再度前記部分言語仕様決定機能を行う請求項１２に記載のコンパイルプログラム。
【請求項１９】
前記部分コード補正機能は、テンプレートから生成されるすべての外部関数を、プログラム中唯一の関数名を持つテンプレートから生成されない外部関数に変更して、再度前記部分言語仕様決定機能を行う請求項１２に記載のコンパイルプログラム。
【請求項２０】
入力プログラムをデバッグするデバッグプログラムであって、前記入力プログラムの特定の範囲に対する言語仕様を認識する部分言語仕様認識機能と、各範囲の言語仕様をプログラムソースとともに表示する部分言語仕様表示機能を行うことを特徴とするデバッグプログラム。
【請求項２１】
さらに、解析対象がテンプレートから生成されたインスタンスの場合に、テンプレートを展開したソースプログラムを表示するテンプレート展開表示機能を行う請求項２０に記載のデバッグプログラム。
【請求項２２】
さらに、認識した言語仕様に対してサブセットの言語仕様が定義されている場合に、サブセットの言語仕様から逸脱しているプログラム部分の内容を明記するサブセット言語仕様違反部分の表示機能を行う請求項２０に記載のデバッグプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、高級言語により記述されたプログラムを目的プログラムに変換するコンパイル方法、そのデバッグ方法、コンパイルプログラムおよびデバッグプログラムに関する。
【背景技術】
【０００２】
近年のソフトウェア開発においては、プログラムの規模が大規模化してきており、それに伴って保守性、再利用性の高いオブジェクト指向言語が注目されている。オブジェクト指向言語の代表例に、例えばＣ＋＋言語が挙げられる。Ｃ＋＋言語は、長年プログラミングに広く使用されているＣ言語に代わるものとして注目されており、Ｃ言語からＣ＋＋言語へのプログラミング移行が各所で行われている。移行においては、Ｃ＋＋言語はＣ言語の上位互換であるため、通常は単にＣ言語コンパイラをＣ＋＋言語コンパイラに置き換えるだけで問題なく動作する目的コードを生成することができる。しかし、Ｃ言語で記載されたプログラムをＣ＋＋言語としてコンパイルすると、コードサイズ、実行時間が増加するという問題が発生する。
【０００３】
この問題に対する従来の解決方法は、プログラムに対してリンケージ指定を使用するものがある（例えば、非特許文献１参照）。また、プログラム内の言語仕様の範囲を解析し、自動的にできるだけサブセットの仕様を適用してコンパイルしているものもある（例えば、特許文献１参照、図２１）。
【特許文献１】特開２００３−５０７００号公報（第５−６頁、第１−３図）“プログラム変換方法”
【非特許文献１】Ｍ・Ａ・エリス、Ｂ・ストラウストラップ  著  足立高徳、小山裕司  訳“注解 Ｃ＋＋ リファレンスマニュアル”“The Annotated C++ Reference Manual”７．４章  リンケージ指定
【発明の開示】
【発明が解決しようとする課題】
【０００４】
しかし、非特許文献１で説明しているリンケージ指定を使用する方法では、プログラマに対してリンケージ指定を考慮したプログラミングを強制させることになり、容易なＣ＋＋言語への移行の妨げとなる。また、特許文献１で説明しているプログラム変換方法では、Ｃ＋＋言語から組み込み向けのＣ＋＋サブセット仕様であるＥＣ＋＋としてのコンパイルは可能であるものの、プログラム中のシンボル（関数名や変数名など）符号化の整合性を考慮していないため、Ｃ言語としてのコンパイルまでは対応していない。その結果、言語仕様の縮退による十分なコードサイズ削減、実行時間短縮の最適化が見込めない。
【０００５】
本発明は、かかる課題に鑑みてなされたものであり、プログラマがリンケージ指定を意識することなく容易に上位互換プログラムへの移行が可能であり、かつ最大限の言語仕様縮退によるコードサイズ削減、実行時間短縮を実現するコンパイル方法ならびに容易にチューニングが可能なデバッグ方法を提供することを目的とする。
【課題を解決するための手段】
【０００６】
本発明のコンパイル方法は、入力プログラムを目的プログラムに変換するコンパイル方法であって、前記入力プログラムの特定の範囲に対する言語仕様を決定する部分言語仕様決定ステップと、特定の範囲間で言語仕様に相違がある場合に前記特定の範囲の一方において少なくとも一部のコードを補正する部分コード補正ステップとを含むものである。すなわち、コードを結合可能とするようにコードを補正する。
【０００７】
この方法によれば、部分的に異なる言語仕様を含むプログラムを結合でき、最適な言語仕様でコンパイルが可能となるため、コード生成効率が向上する。
【０００８】
好ましくは、前記部分言語仕様決定ステップは、前記入力プログラムの特定の範囲内で使用されているプログラミング言語の機能に基づいて言語仕様を決定するものとする。
【０００９】
この方法によれば、プログラマが特にソースプログラムを修正することなく、部分的に異なる言語仕様を含むプログラムを結合でき、最適な言語仕様でコンパイルが可能となるため、コード生成効率が向上する。
【００１０】
さらに好ましくは、前記部分言語仕様決定ステップは、前記入力プログラム中に言語仕様制御文が存在する場合、前記言語仕様制御文に基づいて言語仕様を決定するものとする。
【００１１】
この方法によれば、例えばプログラマがソースプログラムに＃ｐｒａｇｍａ指令による言語仕様制御文を記述することで、もともとソースプログラムに記述されている機能に影響されず、自由に言語仕様を選択することができる。
【００１２】
さらに好ましくは、前記部分言語仕様決定ステップは、前記入力プログラムをコンパイルするコンパイルシステムに言語仕様制御命令が与えられている場合、前記言語仕様制御命令に基づいて言語仕様を決定するものとする。
【００１３】
この方法によれば、例えばプログラマがコンパイラシステムのオプションによって言語仕様制御命令を与えることで、ソースプログラムに修正を加えることなく、かつもともとソースプログラムに記述されている機能に影響されず、自由に言語仕様を選択することができる。
【００１４】
さらに好ましくは、前記部分コード補正ステップは、すべての関数に対して、定義と参照で言語仕様に相違がある場合は、サブセットの言語仕様を持つ関数符号化名を、スーパーセットの言語仕様を持つ関数符号化名に変更するものとする。
【００１５】
この方法によれば、定義と参照の言語仕様に相違がある場合でも正しくプログラムを結合することができる。
【００１６】
さらに好ましくは、前記部分コード補正ステップは、多重定義されているすべての外部関数を、プログラム中唯一の関数名を持つ多重定義されていない外部関数に変更して、再度前記部分言語仕様決定ステップを行うものとする。
【００１７】
この方法によれば、多重定義関数を使用しているＣ＋＋プログラムをＣプログラムとしてコンパイルすることができ、コード生成効率が向上する。
【００１８】
さらに好ましくは、前記部分コード補正ステップは、名前空間に所属するすべての外部関数を、プログラム中唯一の関数名を持つ名前空間に所属しない外部関数に変更して、再度前記部分言語仕様決定ステップを行うものとする。
【００１９】
この方法によれば、名前空間を使用しているＣ＋＋プログラムをＣプログラムとしてコンパイルすることができ、コード生成効率が向上する。
【００２０】
さらに好ましくは、前記部分コード補正ステップは、テンプレートから生成されるすべての外部関数を、プログラム中唯一の関数名を持つテンプレートから生成されない外部関数に変更して、再度前記部分言語仕様決定ステップを行うものとする。
【００２１】
この方法によれば、テンプレートを使用しているＣ＋＋プログラムをＣプログラムとしてコンパイルすることができ、コード生成効率が向上する。
【００２２】
本発明のデバッグ方法は、入力プログラムをデバッグするデバッグ方法であって、前記入力プログラムの特定の範囲に対する言語仕様を認識する部分言語仕様認識ステップと、各範囲の言語仕様をプログラムソースとともに表示する部分言語仕様表示ステップとを含むものである。
【００２３】
この方法によれば、プログラマは各プログラム部分がどの言語仕様でコンパイルされたかを容易に確認でき、デバッグならびにチューニング作業を効率良く行うことができる。
【００２４】
さらに好ましくは、解析対象がテンプレートから生成されたインスタンスの場合に、テンプレートを展開したソースプログラムを表示するテンプレート展開表示ステップを含むものとする。
【００２５】
この方法によれば、プログラマがテンプレート展開後のソースプログラムを容易に把握でき、さらにデバッグならびにチューニング作業を効率良く行うことができる。
【００２６】
さらに好ましくは、認識した言語仕様に対してサブセットの言語仕様が定義されている場合に、サブセットの言語仕様から逸脱しているプログラム部分の内容を明記するサブセット言語仕様違反部分の表示ステップを含むものとする。
【００２７】
この方法によれば、プログラマがサブセットから逸脱しているプログラム部分を容易に把握でき、さらにチューニング作業を効率良く行うことができる。
【００２８】
なお、本発明は、このような特徴的なステップを有するコンパイル方法ならびにデバッグ方法として実現することができるだけでなく、当該コンパイル方法ならびにデバッグ方法に含まれる特徴的なステップをコンピュータに実行させるコンパイルプログラム、デバッグプログラムとして実現したり、当該コンパイル方法ならびにデバッグ方法に含まれる特徴的なステップを手段とするコンパイラ装置、デバッガ装置として実現したりすることもできる。そして、そのようなコンパイラ、デバッガは、ＣＤ−ＲＯＭ（Compact Disc-Read Only Memory）などの記憶媒体やインターネット等の伝送媒体を介して流通させることができるのは言うまでもない。
【００２９】
コンパイルプログラムについては、入力プログラムを目的プログラムに変換するコンパイルプログラムであって、前記入力プログラムの特定の範囲に対する言語仕様を決定する部分言語仕様決定機能と、特定の範囲間で言語仕様に相違がある場合に前記特定の範囲の一方において少なくとも一部のコードを補正する部分コード補正機能とを含むものとする。
【００３０】
好ましくは、前記部分言語仕様決定機能は、前記入力プログラムの特定の範囲内で使用されているプログラミング言語の機能に基づいて言語仕様を決定するものとする。
【００３１】
さらに好ましくは、前記部分言語仕様決定機能は、前記入力プログラム中に言語仕様制御文が存在する場合、前記言語仕様制御文に基づいて言語仕様を決定するものとする。
【００３２】
さらに好ましくは、前記部分言語仕様決定機能は、前記入力プログラムをコンパイルするコンパイルシステムに言語仕様制御命令が与えられている場合、前記言語仕様制御命令に基づいて言語仕様を決定するものとする。
【００３３】
さらに好ましくは、前記部分コード補正機能は、すべての関数に対して、定義と参照で言語仕様に相違がある場合は、サブセットの言語仕様を持つ関数符号化名を、スーパーセットの言語仕様を持つ関数符号化名に変更するものとする。
【００３４】
さらに好ましくは、前記部分コード補正機能は、多重定義されているすべての外部関数を、プログラム中唯一の関数名を持つ多重定義されていない外部関数に変更して、再度前記部分言語仕様決定機能を行うものとする。
【００３５】
さらに好ましくは、前記部分コード補正機能は、名前空間に所属するすべての外部関数を、プログラム中唯一の関数名を持つ名前空間に所属しない外部関数に変更して、再度前記部分言語仕様決定機能を行うものとする。
【００３６】
さらに好ましくは、前記部分コード補正機能は、テンプレートから生成されるすべての外部関数を、プログラム中唯一の関数名を持つテンプレートから生成されない外部関数に変更して、再度前記部分言語仕様決定機能を行うものとする。
【００３７】
また、デバッグプログラムについては、入力プログラムをデバッグするデバッグプログラムであって、前記入力プログラムの特定の範囲に対する言語仕様を認識する部分言語仕様認識機能と、各範囲の言語仕様をプログラムソースとともに表示する部分言語仕様表示機能を行うことを特徴とする。
【００３８】
好ましくは、さらに、解析対象がテンプレートから生成されたインスタンスの場合に、テンプレートを展開したソースプログラムを表示するテンプレート展開表示機能を行うものとする。
【００３９】
さらに好ましくは、認識した言語仕様に対してサブセットの言語仕様が定義されている場合に、サブセットの言語仕様から逸脱しているプログラム部分の内容を明記するサブセット言語仕様違反部分の表示機能を行うものとする。
【発明の効果】
【００４０】
本発明のコンパイル方法によれば、部分的に異なる言語仕様を含むプログラムを容易に結合でき、より最適な言語仕様でコンパイルが可能となるため、コード生成効率が向上する。また、本発明のデバッグ方法によれば、プログラマは各プログラム部分がどの言語仕様でコンパイルされたか、サブセットの言語仕様に落とし込む場合にどのソース部分を修正すればよいかが容易に把握でき、デバッグならびにチューニング作業を効率良く行うことができる。
【発明を実施するための最良の形態】
【００４１】
以下、本発明の実施の形態におけるコンパイル方法について図面を参照しながら説明する。図１は、コンパイラにより実行される処理のフローチャートである。
【００４２】
コンパイラは、プログラム記憶部Ｄ１に記憶されているヘッダファイルおよびソースプログラムを読み込む（ステップＳ１）。コンパイラは、読み込んだソースプログラムの構文を解析し、シンボルテーブルの生成や構文木の生成を行う（ステップＳ２）。次に、コンパイラは、生成された構文木を基に、中間コードを生成する（ステップＳ３）。その後、コンパイラは、生成された中間コードに対して各種最適化を施す（ステップＳ４）。また、コンパイラは、最適化された中間コードに含まれるすべての変数に対して、レジスタやメモリなどのハードウェア資源を割り付け（ステップＳ５）、資源割付された中間コードをオブジェクトコードに変換して、オブジェクトプログラムを生成コード記憶部Ｄ２に出力する（ステップＳ６）。
【００４３】
最適化ステップＳ４は、部分言語仕様決定ステップＳ１０と、部分コード補正ステップＳ１１と、その他の最適化ステップＳ１２とを含む。
【００４４】
部分言語仕様決定ステップＳ１０は、中間コードを解析し、各プログラムの部分的な範囲における言語仕様を決定する。部分コード補正ステップＳ１１は、部分言語仕様決定ステップＳ１０で決定した各プログラムの部分的な範囲における言語仕様を解析し、各範囲間での言語仕様の相違に応じて、各範囲のコードを結合可能とするようにコードを補正する。部分言語仕様決定ステップＳ１０ならびに部分コード補正ステップＳ１１の詳細については後述する。その他の最適化ステップＳ１２は、一般的な最適化ステップであり、本発明の要旨ではないため、その説明は省略する。
【００４５】
なお、ソースプログラム入力ステップＳ１、構文解析ステップＳ２、中間コード生成ステップＳ３、その他の最適化ステップＳ１２、資源割付ステップＳ５、およびオブジェクト出力ステップＳ６については、既存の処理と同様の処理であり、本発明の主眼ではない。よって詳細な説明は省略する。
【００４６】
以下、本発明の主眼である部分言語仕様決定ステップＳ１０ならびに部分コード補正ステップＳ１１について説明する。
【００４７】
図２は、部分言語仕様決定ステップＳ１０の詳細を示すフローチャートである。
【００４８】
ループ処理Ｌ１として、入力プログラムの特定の範囲に対応する中間コード毎に対して、ステップＳ２１からステップＳ２５を実施する。解析対象が存在するときは、ステップＳ２１へ進み、解析対象が存在しないときは、ステップＳ１１へ進む。
【００４９】
ステップＳ２１においては、解析対象範囲内で使用されているプログラミング言語の機能に基づいて言語仕様を決定し、中間言語に言語仕様情報を記録し、次いでステップＳ２２へ進む。ここでの言語仕様情報とは、少なくともどの言語仕様に準拠しているかどうかが判別できる情報（例えば、Ｃ＋＋言語であれば、“Ｃ＋＋”という文字列など）である。
【００５０】
ステップＳ２２においては、解析対象範囲内で、言語仕様制御文が存在するかどうかを判定する。ここでの言語仕様制御文とは、例えば、＃ｐｒａｇｍａ指令のように、ソースプログラムに記述することでコンパイラに対して特定の動作を指定するものである。判定結果が真であればステップＳ２３へ進み、判定結果が偽であればステップＳ２４へ進む。
【００５１】
ステップＳ２３においては、言語仕様制御文に基づいて言語仕様を決定し、中間言語に言語仕様情報を記録し、次いでステップＳ２４へ進む。
【００５２】
ステップＳ２４においては、コンパイルシステムに言語仕様制御命令が与えられているかどうかを判定する。ここでの言語仕様制御命令とは、例えばコマンドラインオプションのように、コンパイラシステムに直接渡して、コンパイラに対して特定の動作を指定するものである。判定結果が真であればステップＳ２５へ進み、判定結果が偽であれば、ループ処理Ｌ１へ進む。
【００５３】
図３は、部分コード補正ステップＳ１１の詳細を示すフローチャートである。
【００５４】
ループ処理Ｌ２においては、すべての関数に対する中間コード毎に対して、ステップＳ３１からステップＳ３８を実施する。解析対象が存在するときは、ステップＳ３１へ進み、解析対象が存在しないときは、ステップＳ３９へ進む。
【００５５】
ステップＳ３１においては、定義と参照で言語仕様に相違が存在するかどうかを判定する。ここでの言語仕様の相違とは、例えば関数定義部分における言語仕様は“Ｃ＋＋”と中間コードに記録されており、関数参照部分における言語仕様は“Ｃ”と中間コードに記録されているような場合である。判定結果が真であればステップＳ３２へ進み、判定結果が偽であればステップＳ３３へ進む。
【００５６】
ステップＳ３２においては、サブセットの言語仕様を持つ関数符号化名を、スーパーセットの言語仕様を持つ関数符号化名に変更し、次いでステップＳ３３へ進む。
【００５７】
ステップＳ３３においては、多重定義されている外部関数であるかどうかを判定する。ここでの多重定義とは、ｆ（ｖｏｉｄ）とｆ（ｉｎｔ）のように関数名が同じで引数が異なるように定義されているような場合である。判定結果が真であればステップＳ３４へ進み、判定結果が偽であればステップＳ３５へ進む。
【００５８】
ステップＳ３４においては、プログラム中唯一の関数名を持つ、多重定義されていない外部関数に変更し、次いでステップＳ３５へ進む。
【００５９】
ステップＳ３５においては、名前空間に所属する外部関数であるかどうかを判定する。ここでの名前空間に所属する外部関数とは、ｎａｍｅｓｐａｃｅ  Ｓ｛  ｉｎｔ  ｆ（ｖｏｉｄ）  ｝のように名前空間（ｎａｍｅｓｐａｃｅ）スコープ内で宣言されている関数である。判定結果が真であればステップＳ３６へ進み、判定結果が偽であればステップＳ３７へ進む。
【００６０】
ステップＳ３６においては、プログラム中唯一の関数名を持つ、名前空間に所属しない外部関数に変更し、次いでステップＳ３７へ進む。
【００６１】
ステップＳ３７においては、テンプレートから生成される外部関数であるかどうかを判定する。ここでのテンプレートから生成される外部関数とは、ｔｅｍｐｌａｔｅ  ＜ｃｌａｓｓ  Ｔ＞  Ｔ  ｆ（Ｔ  ａ）  のように定義されている関数テンプレート（ｆｕｎｃｔｉｏｎ  ｔｅｍｐｌａｔｅ）からインスタンス化される外部関数である。判定結果が真であればステップＳ３８へ進み、判定結果が偽であれば、ループ処理Ｌ２へ進む。
【００６２】
ステップＳ３８においては、プログラム中唯一の関数名を持つ、テンプレートから生成されない外部関数に変更し、次いでＬ２へ進む。
【００６３】
ステップＳ３９においては、ステップＳ３３、ステップＳ３５、ステップＳ３７のいずれかが真であったかどうかを判定する。判定結果が真であればステップＳ１０へ進み、判定結果が偽であればステップＳ１２へ進む。
【００６４】
以上のような部分言語仕様決定ステップＳ１０と部分コード補正ステップＳ１１を含む最適化ステップＳ４を施した中間コードに対して、資源割付処理（ステップＳ５）およびオブジェクトプログラム出力処理（ステップＳ６）を行うことにより、プログラマがリンケージ指定を意識することなく容易に上位互換プログラムへの移行が可能となり、かつ最大限の言語仕様縮退によるコードサイズ削減、実行時間短縮を実現することができる。
【００６５】
なお、本発明は中間コードに対しての解析に限定するものではなく、ソースプログラムの構文解析結果を表現しているデータであれば、どのような形態に対して解析を行ってもかまわない。
【００６６】
次に、本発明の実施の形態におけるデバッグ方法について図面を参照しながら説明する。図４は、デバッガにより実行される処理のフローチャートである。
【００６７】
デバッガは、プログラム記憶部Ｄ１に記憶されているプログラムを読み込む（ステップＮ１）。デバッガは、読み込んだプログラムを解析したのち、コマンド入力待ちステップＮ２に移行する。次に、デバッガは、部分言語仕様表示コマンドが入力されたかどうかを判定する（ステップＮ３）。真の場合、部分的に言語仕様を表示する部分言語仕様表示ステップＮ１０を行う。その後、その他のソース情報表示ステップＮ１１を実施し、コマンド入力待ちステップＮ２に移行する。偽の場合、その他のデバッグステップを実施し（ステップＮ４）、コマンド入力待ちステップＮ２に移行する。部分言語仕様表示ステップＮ１０の詳細については後述する。その他のソース情報表示ステップＮ１１は、一般的なソース情報表示ステップであり、本発明の要旨ではないため、その説明は省略する。
【００６８】
なお、プログラム入力ステップＮ１、コマンド入力待ちステップＮ２、その他のデバッグステップＮ４については、既存の処理と同様の処理であり本発明の主眼ではない。よって詳細な説明は省略する。
【００６９】
以下、本発明の主眼である部分言語表示ステップＮ１０について説明する。図５は、部分言語仕様表示ステップＮ１０の詳細を示すフローチャートである。
【００７０】
ループ処理Ｌ３においては、入力プログラムの特定の範囲に対応するデバッグ情報毎に対して、ステップＮ２１からステップＮ２６を実施する。解析対象が存在するときは、ステップＮ２１へ進む。解析対象が存在しないときは、ステップＮ１１へ進む。
【００７１】
ステップＮ２１においては、言語仕様情報が存在するかどうかを判定する。判定結果が真であればステップＮ２２へ進み、判定結果が偽であれば、ループ処理Ｌ３へ進む。
【００７２】
ステップＮ２２においては、デバッグ情報に記録されている言語仕様情報に基づいて、各範囲の言語仕様をプログラムソースとともに表示し、次いでステップＮ２３へ進む。
【００７３】
ステップＮ２３においては、解析対象がテンプレートから生成されたインスタンスであるかどうかを判定する。判定結果が真であればステップＮ２４へ進み、判定結果が偽であればステップＮ２５へ進む。
【００７４】
ステップＮ２４においては、テンプレートを展開したソースプログラムを表示し、次いでステップＮ２５へ進む。
【００７５】
ステップＮ２５においては、認識した言語仕様に対して、サブセットの言語仕様が定義されているかどうかを判定する。判定結果が真であればステップＮ２６へ進み、判定結果が偽であれば、ループ処理Ｌ３へ進む。
【００７６】
ステップＮ２６においては、サブセットの言語仕様から逸脱しているプログラム部分の内容を明記する。
【００７７】
以上のような部分言語仕様表示ステップＮ１０を施したデバッグステップを行うことにより、プログラマは各プログラム部分がどの言語仕様でコンパイルされたか、サブセットの言語仕様に落とし込む場合に、どのソース部分を修正すればよいかが容易に把握でき、デバッグならびにチューニング作業を効率良く行うことができる。
【００７８】
以下、スーパーセットの言語仕様をＣ＋＋言語とし、サブセットの言語仕様をＣ言語とした具体例を参照しながら、本発明のコンパイル方法ならびにデバッグ方法の詳細についてより詳細に説明する。
【００７９】
（具体例１）
図６は、プログラム記憶部Ｄ１に記憶されているソースプログラムの一例である。以下では、このソースプログラムを入力した場合のコンパイル方法を説明する。前提として、＜ｍａｉｎ．ｃｐｐ＞はＣ＋＋言語として、＜ｓｕｂ．ｃ＞はＣ言語としてコンパイルすることがユーザよりオプションで指定されているものとする。ソースプログラムに＃ｐｒａｇｍａを記述する方法で言語仕様を指定することも可能であるが、コマンドラインでのオプションで指定した場合と類似した処理になるので、ここでは省略する。図６に示すソースファイル＜ｍａｉｎ．ｃｐｐ＞は、外部関数ｆを参照している。ソースファイル＜ｓｕｂ．ｃ＞は、外部関数ｆを定義している。
【００８０】
ここで、図７を用いて問題点をあらかじめ指摘しておく。図７は、中間コード生成ステップＳ３により生成された外部関数ｆの参照側の中間コードと定義側の中間コードの一部の情報である。
【００８１】
従来の方法で具体例１をコンパイルする場合、解析対象の中間コードの言語仕様を考慮せずにリンクする。そのため、この具体例１では関数符号化名が一致せず（＿ｆ＿Ｆｖと＿ｆ）、リンク時エラーとなってしまう。よって図８に示すように、明示的にリンケージ指定をするようユーザがプログラムを修正することにより（“Ｃ”を参照）、関数符号化名を統一させる必要がある。一般的にＣ言語のソースをＣ＋＋言語で流用するためには、このような修正の工数がかかるため、開発効率が低下する。
【００８２】
次に、本実施の形態における具体例を示す。本具体例では、関数スコープの範囲に対して解析を実施することとする。
【００８３】
中間コード生成ステップにより生成された中間コードは、部分言語仕様決定ステップＳ１０において、各関数スコープの範囲に対応する中間コード毎に図２のＬ１のループ処理（ステップＳ２１〜Ｓ２５の処理）が実施される。本具体例では、＜ｍａｉｎ．ｃｐｐ＞がＣ＋＋言語、＜ｓｕｂ．ｃ＞がＣ言語でコンパイルすることをユーザより指定されていることを前提としているので、ステップＳ２４が真となり、ステップＳ２５が実施される。よって参照側の中間コードには、言語仕様がＣ＋＋言語であるという情報が記録され、定義側の中間コードでは言語仕様がＣ言語であるという情報が記録されることになる（図９）。
【００８４】
次に、部分コード補正ステップＳ１１が実施される。まず、図３のＬ２のループ処理（ステップＳ３１〜Ｓ３８の処理）が実施される。本具体例では、定義側の中間コードと参照側の中間コードの言語仕様情報に相違がある（Ｃ＋＋言語とＣ言語）ため、ステップＳ３１が真となる。よって、ステップＳ３２が実施される。ここで、Ｃ＋＋言語とＣ言語では、Ｃ＋＋言語がスーパーセット、Ｃ言語がサブセットの言語仕様であるので、サブセットの言語仕様を持つ定義側中間コードの関数符号化名が、スーパーセットの言語仕様を持つ参照側中間コードの関数符号化名に変更される（図１０。＿ｆ＿Ｆｖに統一）。以降、ステップＳ３３〜Ｓ３８については、すべて偽と判定される。
【００８５】
以上のように、解析対象の中間コードの言語仕様を考慮することで、関数符号化名を統一させ、明示的にリンケージ指定をすることなくリンクが可能となる。よってＣ言語のソースをＣ＋＋言語で流用するために必要であったソース修正の工数がなくなり、開発効率が向上する。
【００８６】
（具体例２）
図１１は、プログラム記憶部Ｄ１に記憶されている多重定義関数を使用したソースプログラムの一例である。名前空間、テンプレートを使用したソースプログラムは、多重定義関数の場合の具体例と類似した処理になるため、ここでは省略する。以下では、このソースプログラムを入力した場合のコンパイル方法を説明する。前提として、＜ｔｅｓｔ．ｃｐｐ＞は、特にユーザから言語仕様指定が与えられることなくコンパイルされるものとする。
【００８７】
ここで、図１２を用いて問題点をあらかじめ指摘しておく。従来の方法で本具体例のソースプログラム＜ｔｅｓｔ．ｃｐｐ＞をコンパイルする場合、ソースプログラム内にＣ＋＋言語の機能である多重定義関数を使用しているために、すべての関数をＣ＋＋言語の関数としてコンパイルすることになる。関数本体がＣ言語の機能のみを使用していたとしても、Ｃ＋＋言語の関数としてコンパイルされるため、冗長なコードが生成される可能性がある。図１２は、ｔｅｓｔ．ｃｐｐのｖｏｉｄ  ｆ（ｖｏｉｄ）をＣ＋＋言語の関数としてコンパイルした場合のコード生成結果と、Ｃ言語の関数としてコンパイルした場合のコード生成結果である。図１２から明らかなように、Ｃ＋＋言語の関数としてコンパイルしたコード生成結果が、Ｃ言語の関数としてコンパイルした場合のコード生成結果と比較して冗長にコードが生成されていることがわかる。
【００８８】
次に、本実施の形態における具体例を示す。本具体例も具体例１と同様、関数スコープの範囲に対して解析を実施することとする。
【００８９】
中間コード生成ステップにより生成された中間コードは、部分言語仕様決定ステップＳ１０において、各関数スコープの範囲に対応する中間コード毎に図２のＬ１のループ処理（ステップＳ２１〜Ｓ２５の処理）が実施される。本具体例では、ユーザより特に言語仕様の指定が行われていないので、ステップＳ２２、ステップＳ２４がともに偽となり、ステップＳ２３、ステップＳ２５は実施されない。よって解析対象範囲内で使用されているプログラミング言語の機能に基づいて決定した言語仕様情報が中間コードに記録される（ステップＳ２１）。本具体例では、関数ｖｏｉｄ  ｆ（ｖｏｉｄ）ならびにｖｏｉｄ  ｆ（ｉｎｔ）は同じ関数名を持つ多重定義関数であり、これはＣ＋＋言語の機能である。よってこの機能が使用されている範囲の中間コードは、言語仕様がＣ＋＋言語であるという情報が記録される（図１３。すべてＣ＋＋）。
【００９０】
次に、部分コード補正ステップＳ１１が実施される。まず、図３のＬ２のループ処理（ステップＳ３１〜Ｓ３８の処理）が実施される。本具体例では、定義側の中間コードと参照側の中間コードの言語仕様情報に相違がない（ともに、Ｃ＋＋言語）ので、ステップＳ３２は実施されない。一方、多重定義関数であるため、ステップＳ３４が実施される。本具体例では、図１４に示すようにプログラム中唯一の関数名を持つ多重定義されていない外部関数として、＿＿Ｌ１，＿＿Ｌ２という名前に変更され、各言語仕様、関数符号化名が保留状態になる。なお、本具体例は多重定義関数を例にしているが、名前空間やテンプレートを使用しているプログラムに対しても、多重定義関数の場合と同様にプログラム中唯一の関数名を持つ外部関数に変更すればよい（ステップＳ３６，Ｓ３８）。
【００９１】
ステップＳ３４が実施されたため、ステップＳ３９の判定結果が真となり、再度部分言語仕様決定ステップＳ１０が実行される。二度目のステップＳ１０の実行では、多重定義関数であった関数は関数名が＿＿Ｌ１，＿＿Ｌ２に変更されているため、多重定義関数とは認識されない。よってステップＳ２１では言語仕様がＣ言語であるという情報が記録され、Ｃ言語としての関数符号化名が与えられる（図１５）。二度目のステップＳ１１の実行では特に変更は加えられず、ステップＳ１２以降の処理に移る。
【００９２】
図１６は、本具体例に対して本発明を適用しなかった場合のコード生成結果と、適用した場合のコード生成結果である。図１６から明らかなように、本発明を適用しなかった場合と比較して、本発明を適用すれば冗長なコードが削除されていることがわかる。
【００９３】
（具体例３）
デバッグ方法についての具体例を示す。前提として、本発明のコンパイラ方法により中間コードに記録される言語仕様情報がデバッグ情報にも記録されているものとする。図１７は、デバッグプログラムを実行しているモニターである。部分言語仕様表示コマンドが入力されると、部分言語仕様表示ステップＮ１０が実施される。本具体例では、言語仕様情報がデバッグ情報に記録されていることを前提としているのでステップＮ２２が実施され、デバッグ情報に記録されている言語仕様情報に基づいて、各範囲の言語仕様をプログラムソースとともに表示する。図１８が言語仕様表示例の一例である。なお、この表示例はあくまで一例であり、言語仕様に関する情報が表示されていれば、どのような形態でもかまわない。
【００９４】
次に、解析対象がテンプレートから生成されたインスタンスであるかどうかの判定を行う（ステップＮ２３）。本具体例では、解析対象がＡ＜ｉｎｔ＞  ｏｂｊの場合、テンプレートインスタンスが生成されているため判定結果は真となり、図１９に示すとおりテンプレートを展開したソースプログラムが表示される。なお、この表示例はあくまで一例であり、テンプレートを展開したソースプログラムに関する情報が表示されていれば、どのような形態でもかまわない。
【００９５】
次に、認識した仕様に対して、サブセットの言語仕様が定義されているかどうかを判定する（ステップＮ２５）。本具体例では、Ｃ＋＋言語のサブセット仕様であるＣ言語が定義されているため、判定結果は真となり、図２０に示すとおりＣ＋＋言語と判定されている範囲において、Ｃ言語の言語仕様から逸脱している部分の内容（テンプレート機能）が明記される。なお、この表示例はあくまで一例であり、サブセットの言語仕様から逸脱している部分の内容に関する情報が表示されていれば、どのような形態でもかまわない。
【００９６】
図１８から図２０の例から明らかなように、本発明のデバッグ方法を用いれば、プログラマは各プログラム部分がどの言語仕様でコンパイルされたか、サブセットの言語仕様に落とし込む場合に、どのソース部分を修正すればよいかが容易に把握でき、デバッグならびにチューニング作業を効率良く行うことができる。
【産業上の利用可能性】
【００９７】
本発明にかかるコンパイル方法ならびにデバッグ方法は、携帯電話やＰＤＡ（Personal Digital Assistant）等のコードサイズの小さなオブジェクトコードを必要とする組み込み機器用のコンパイル方法ならびにデバッグ方法等に有用である。
【図面の簡単な説明】
【００９８】
【図１】本発明の実施の形態におけるコンパイラにより実行される処理のフローチャート
【図２】部分言語仕様決定ステップの詳細を示すフローチャート
【図３】部分コード補正ステップの詳細を示すフローチャート
【図４】本発明の実施の形態におけるデバッガにより実行される処理のフローチャート
【図５】部分言語仕様表示ステップの詳細を示すフローチャート
【図６】具体例１で用いられるプログラム記憶部に記憶されているソースプログラムの一例
【図７】従来例での中間コード情報の一例
【図８】従来方法で修正したソースプログラムの一例
【図９】具体例１で用いられるソースプログラムを部分言語仕様決定ステップに適用後の中間コード情報の一例
【図１０】具体例１で用いられるソースプログラムを部分コード補正ステップに適用後の中間コード情報の一例
【図１１】具体例２で用いられるプログラム記憶部に記憶されているソースプログラムの一例
【図１２】具体例２で用いられるソースプログラムをＣ＋＋言語でコンパイルしたアセンブリコードとＣ言語でコンパイルしたアセンブリコード
【図１３】具体例２で用いられるソースプログラムを１回目の部分言語仕様決定ステップに適用後の中間コード情報の一例
【図１４】具体例２で用いられるソースプログラムを１回目の部分コード補正ステップに適用後の中間コード情報の一例
【図１５】具体例２で用いられるソースプログラムを２回目の部分言語仕様決定ステップに適用後の中間コード情報の一例
【図１６】具体例２で用いられるソースプログラムに本発明方法を適用しなかった場合のアセンブリコードと、適用した場合のアセンブリコード
【図１７】具体例３で用いられるソースプログラムを表示しているデバッガモニタ
【図１８】具体例３で用いられるソースプログラムの言語仕様情報を表示しているデバッガモニタ
【図１９】具体例３で用いられるソースプログラムのテンプレートを展開したソースプログラムを表示しているデバッガモニタ
【図２０】具体例３で用いられるソースプログラムでＣ言語の言語仕様から逸脱しているプログラム部分の内容を表示しているデバッガモニタ
【図２１】従来技術（特許文献１）のプログラム変換方法のフローチャート
【符号の説明】
【００９９】
Ｓ１０  部分言語仕様決定ステップ
Ｓ１１  部分コード補正ステップ
Ｎ１０  部分言語仕様表示ステップ
【図１】
2007304840.tif 000003
【図２】
2007304840.tif 000004
【図３】
2007304840.tif 000005
【図４】
2007304840.tif 000006
【図５】
2007304840.tif 000007
【図６】
2007304840.tif 000008
【図７】
2007304840.tif 000009
【図８】
2007304840.tif 000010
【図９】
2007304840.tif 000011
【図１０】
2007304840.tif 000012
【図１１】
2007304840.tif 000013
【図１２】
2007304840.tif 000014
【図１３】
2007304840.tif 000015
【図１４】
2007304840.tif 000016
【図１５】
2007304840.tif 000017
【図１６】
2007304840.tif 000018
【図１７】
2007304840.tif 000019
【図１８】
2007304840.tif 000020
【図１９】
2007304840.tif 000021
【図２０】
2007304840.tif 000022
【図２１】
2007304840.tif 000023