(57)【要約】【課題】  アドレス値による初期化が宣言されている外部変数又は静的変数が定義されたソースプログラムを修正することなく、ＰＩＣ方式に対応したオブジェクトプログラムを生成するプログラム変換プログラムを提供する。【解決手段】  初期化関数テーブルに登録されている関数を動的初期化処理において実行する言語仕様のオブジェクトプログラムを生成するプログラム変換プログラムであって、変数配置領域内のアドレス値による初期化が宣言されている外部変数又は静的変数をソースプログラムから検出する検出ステップと、検出された変数に実アドレス値を代入する初期化関数を生成する関数生成ステップと、生成した初期化関数を初期化関数テーブルに登録する登録ステップとを含む。【選択図】    図９
2006024154.tif 000002
【特許請求の範囲】
【請求項１】
静的に領域が確保され、初期値が変数配置領域内のアドレス値であるアドレス初期化変数の定義を含むソースプログラムを変換し、main関数の前に実行される関数が登録されている初期化関数テーブルを含むオブジェクトプログラムを生成するプログラム変換プログラムであって、
前記アドレス初期化変数の定義を、ソースプログラムから検出する検出ステップと、
定義が検出されたアドレス初期化変数に、前記初期値を代入する初期化関数を生成する関数生成ステップと、
生成された初期化関数を、初期化関数テーブルに登録する登録ステップと
をコンピュータに実行させることを特徴とするプログラム変換プログラム。
【請求項２】
静的に領域が確保され、初期値が変数配置領域内のアドレス値であるアドレス初期化変数の定義を含むソースプログラムを変換し、オブジェクトプログラムを生成するプログラム変換プログラムであって、
前記アドレス初期化変数の定義を、ソースプログラムから検出する検出ステップと、
定義が検出されたアドレス初期化変数を、任意の領域に配置する変数配置ステップと、
変数配置ステップにおいてアドレス初期化変数が配置された配置先のアドレス値のみを格納するための専用領域に、当該配置先のアドレス値を格納するアドレス格納ステップと
をコンピュータに実行させることを特徴とするプログラム変換プログラム。
【請求項３】
前記プログラム変換プログラムは、更に、
前記専用領域に格納されているアドレス値により指し示される変数の全てに、前記変数配置領域の先頭アドレスを加算する命令コードを生成する生成ステップをコンピュータに実行させること
を特徴とする請求項２に記載のプログラム変換プログラム。
【請求項４】
前記プログラム変換プログラムは、更に、
生成したオブジェクトプログラムと、スタートアッププログラムとを連結編集し、実行形式プログラムを生成する連結編集ステップを含み、
前記スタートアッププログラムは、前記専用領域に格納されているアドレス値により指し示される変数の全てに、前記変数配置領域の先頭アドレスを加算する命令コードを含むこと
を特徴とする請求項２に記載のプログラム変換プログラム。
【請求項５】
静的に領域が確保され、初期値が変数配置領域内のアドレス値であるアドレス初期化変数の定義を含むソースプログラムを変換し、オブジェクトプログラムを生成するプログラム変換プログラムであって、
前記アドレス初期化変数の定義を、ソースプログラムから検出する検出ステップと、
アドレス初期化変数のみを配置するための専用領域に、定義が検出されたアドレス初期化変数を配置する変数配置ステップと
をコンピュータに実行させることを特徴とするプログラム変換プログラム。
【請求項６】
前記プログラム変換プログラムは、更に、
前記専用領域に配置されているアドレス初期化変数の全てに、前記変数配置領域の先頭アドレスを加算する命令コードを生成する生成ステップをコンピュータに実行させること
を特徴とする請求項５に記載のプログラム変換プログラム。
【請求項７】
前記プログラム変換プログラムは、更に、
生成したオブジェクトプログラムと、スタートアッププログラムとを連結編集し、実行形式プログラムを生成する連結編集ステップを含み、
前記スタートアッププログラムは、前記専用領域に配置されているアドレス初期化変数の全てに、前記変数配置領域の先頭アドレスを加算する命令コードを含むこと
を特徴とする請求項５に記載のプログラム変換プログラム。
【請求項８】
静的に領域が確保される変数のうち、初期値が変数配置領域内のアドレス値であるアドレス初期化変数が、任意の領域に配置され、前記アドレス初期化変数が配置されている配置先のアドレス値のみが専用領域に格納されたオブジェクトプログラムにリンクされるスタートアッププログラムであって、
オブジェクトプログラムのmain関数の呼び出し前に、前記専用領域に格納されているアドレス値により指し示される変数の全てに、前記変数配置領域の先頭アドレスを加算する加算ステップを、コンピュータに実行させること
を特徴とするスタートアッププログラム。
【請求項９】
前記加算ステップは、前記専用領域に格納されているアドレス値により指し示される変数に前記変数配置領域の先頭アドレスを加算する処理を、前記専用領域の先頭から末尾までループ処理により繰り返すことによりなされること
を特徴とする請求項８に記載のスタートアッププログラム。
【請求項１０】
静的に領域が確保される変数のうち、初期値が変数配置領域内のアドレス値であるアドレス初期化変数のみが、専用領域に配置されたオブジェクトプログラムにリンクされるスタートアッププログラムであって、
前記オブジェクトプログラムのmain関数の呼び出し前に、前記専用領域に配置されている変数の全てに、前記変数配置領域の先頭アドレスを加算する加算ステップを、コンピュータに実行させること
を特徴とするスタートアッププログラム。
【請求項１１】
前記加算ステップは、前記専用領域に配置されている変数に前記変数配置領域の先頭アドレスを加算する処理を、前記専用領域の先頭から末尾までループ処理により繰り返すことによりなされること
を特徴とする請求項１０に記載のスタートアッププログラム。
【請求項１２】
静的に領域が確保され、初期値が変数配置領域内のアドレス値であるアドレス初期化変数の定義を含むソースプログラムを変換し、main関数の前に実行される関数が登録されている初期化関数テーブルを含むオブジェクトプログラムを生成するプログラム変換装置であって、
前記アドレス初期化変数の定義を、ソースプログラムから検出する検出手段と、
定義が検出されたアドレス初期化変数に、前記初期値を代入する初期化関数を生成する関数生成手段と、
生成された初期化関数を、初期化関数テーブルに登録する登録手段と
を備えることを特徴とするプログラム変換装置。
【請求項１３】
静的に領域が確保され、初期値が変数配置領域内のアドレス値であるアドレス初期化変数の定義を含むソースプログラムを変換し、オブジェクトプログラムを生成するプログラム変換装置であって、
前記アドレス初期化変数の定義を、ソースプログラムから検出する検出手段と、
定義が検出されたアドレス初期化変数を、任意の領域に配置する変数配置手段と、
変数配置ステップにおいてアドレス初期化変数が配置された配置先のアドレス値のみを格納するための専用領域に、当該配置先のアドレス値を格納するアドレス格納手段と
を備えることを特徴とするプログラム変換装置。
【請求項１４】
静的に領域が確保され、初期値が変数配置領域内のアドレス値であるアドレス初期化変数の定義を含むソースプログラムを変換し、オブジェクトプログラムを生成するプログラム変換装置であって、
前記アドレス初期化変数の定義を、ソースプログラムから検出する検出手段と、
アドレス初期化変数のみを配置するための専用領域に、定義が検出されたアドレス初期化変数を配置する変数配置手段と
を備えることを特徴とするプログラム変換装置。
【請求項１５】
静的に領域が確保され、初期値が変数配置領域内のアドレス値であるアドレス初期化変数の定義を含むソースプログラムを変換し、main関数の前に実行される関数が登録されている初期化関数テーブルを含むオブジェクトプログラムを生成するプログラム変換方法であって、
前記アドレス初期化変数の定義を、ソースプログラムから検出する検出ステップと、
定義が検出されたアドレス初期化変数に、前記初期値を代入する初期化関数を生成する関数生成ステップと、
生成された初期化関数を、初期化関数テーブルに登録する登録ステップと
を含むことを特徴とするプログラム変換方法。
【請求項１６】
静的に領域が確保され、初期値が変数配置領域内のアドレス値であるアドレス初期化変数の定義を含むソースプログラムを変換し、オブジェクトプログラムを生成するプログラム変換方法であって、
前記アドレス初期化変数の定義を、ソースプログラムから検出する検出ステップと、
定義が検出されたアドレス初期化変数を、任意の領域に配置する変数配置ステップと、
変数配置ステップにおいてアドレス初期化変数が配置された配置先のアドレス値のみを格納するための専用領域に、当該配置先のアドレス値を格納するアドレス格納ステップと
を含むことを特徴とするプログラム変換方法。
【請求項１７】
静的に領域が確保され、初期値が変数配置領域内のアドレス値であるアドレス初期化変数の定義を含むソースプログラムを変換し、オブジェクトプログラムを生成するプログラム変換方法であって、
前記アドレス初期化変数の定義を、ソースプログラムから検出する検出ステップと、
アドレス初期化変数のみを配置するための専用領域に、定義が検出されたアドレス初期化変数を配置する変数配置ステップと
を含むことを特徴とするプログラム変換方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースプログラムを変換して、位置独立コード方式のオブジェクトプログラム、又は、実行形式プログラムを生成する技術に関し、特に、位置独立コード方式において、外部変数、静的変数等の変数を、実アドレス値で初期化する技術に関する。
【背景技術】
【０００２】
近年、機器組み込み用途においてもプログラムの機能追加や修正を行なう場面が増えているが、その度に配置先のアドレスを固定した新たな実行形式プログラム全体を機器にダウンロードすることは非効率である。そこで、機能追加や修正をモジュール単位で行うために、実行形式プログラムをメモリ上の任意のアドレスで動作させる必要が生じている。
このような要求に応える方法として、プログラムのコード配置領域や変数配置領域の先頭が設定された実アドレスを、ベースレジスタに保持し、プログラム中の関数や変数を参照する際に、ベースレジスタからの相対アクセスを行う機械語コードを生成することで、プログラムを任意のアドレスで動作可能とする位置独立コード（以下「ＰＩＣ」という）方式がある。
【０００３】
ＰＩＣ方式では、関数や変数がロードされる実アドレスを、コンパイル又はリンク時に計算することなく、関数や変数の配置先をベースアドレス値からの相対アドレス値（オフセット値）でプログラム中に保持する。そのため、Ｃ言語等で記述された従来のソースプログラムにおいて、プログラム生成時に静的に領域が確保され、プログラム実行前に初期化される外部変数や静的変数等の変数が、初期値としてアドレス値が明示されて定義されている場合、ＰＩＣ方式では、このような変数をプログラムがロードされた後の実アドレスで初期化するために何らかの工夫が必要となる。
【０００４】
以下、本明細書では、（１）プログラム実行開始時に初期化を要する変数、（２）初期値が明示されている変数、（３）初期値がアドレス値である変数、の３つの条件の全てに適合する変数を、「アドレス初期化変数」という。
特許文献１には、このようなアドレス初期化変数を関数において実アドレスで初期化するコードを、プログラムに追加することにより、過去に作成された従来のソースプログラムから、ＰＩＣ方式に対応しつつ、アドレス初期化変数を実アドレスで初期化できるオブジェクトプログラムを生成する技術が開示されている。これによって過去に作成されたソースプログラムを有効に再利用することができる。
【特許文献１】特開２００１−０１４１７２号公報
【非特許文献１】Ｊｏｈｎ  Ｒ．Ｌｅｖｉｎｅ著、榊原一矢監訳、ポジティブエッジ訳「Ｌｉｎｋｅｒｓ＆Ｌｏａｄｅｒｓ」オーム社開発局  第２章（ｐ．４２−ｐ．４３）  第８章（ｐ．１５７−ｐ．１６３）
【発明の開示】
【発明が解決しようとする課題】
【０００５】
しかしながら、特許文献１のプログラム変換装置により生成されたオブジェクトプログラムを、スタートアッププログラムとリンクし実行形式プログラムとするためには、アドレス初期化変数を初期化する関数を個々に呼び出す機械語コードをスタートアッププログラムに追加する必要がある。
ソースプログラム毎にスタートアッププログラムをカスタマイズすることは煩わしく、また、定義されているアドレス初期化変数の数が多いほど、スタートアッププログラムのコード量が増加するという問題がある。
【０００６】
本発明は係る問題に鑑み、従来の言語仕様で作成されたソースプログラムに基づいてＰＩＣ方式に対応した機械語コードを生成でき、且つ、アドレス初期化変数を初期化するために、スタートアッププログラムをソースプログラム毎に修正する必要がないプログラム変換プログラム、プログラム変換装置、及び、プログラム変換方法を提供することを第１の目的とする。
【０００７】
また、機器組み込み用途では、実行形式プログラムのコードサイズの増大を抑えることが重要である。
そこで、本発明は係る問題に鑑み、従来の言語仕様で作成されたソースプログラムに基づいてＰＩＣ方式に対応した機械語コードを生成でき、且つ、アドレス初期化変数を初期化するためのコード量の増大を抑えることができるプログラム変換プログラム、プログラム変換装置、及び、プログラム変換方法を提供することを第２の目的とする。
【０００８】
さらに、上記プログラム変換装置により生成されるオブジェクトプログラムと連結編集されるスタートアッププログラムであって、連結されるオブジェクトプログラムに応じて修正することなくアドレス初期化変数を初期化することができるスタートアッププログラムを提供することを第３の目的とする。
【課題を解決するための手段】
【０００９】
上記第１目的を達成するために、本発明に係るプログラム変換プログラムは、静的に領域が確保され、初期値が変数配置領域内のアドレス値であるアドレス初期化変数の定義を含むソースプログラムを変換し、main関数の前に実行される関数が登録されている初期化関数テーブルを含むオブジェクトプログラムを生成するプログラム変換プログラムであって、前記アドレス初期化変数の定義を、ソースプログラムから検出する検出ステップと、定義が検出されたアドレス初期化変数に、前記初期値を代入する初期化関数を生成する関数生成ステップと、生成された初期化関数を、初期化関数テーブルに登録する登録ステップとをコンピュータに実行させることを特徴としている。
【発明の効果】
【００１０】
上記の構成により、プログラム変換プログラムにより生成されるオブジェクトプログラムは、初期化関数テーブルに登録されている関数をmain関数の前に実行する動的初期化機能に対応したスタートアッププログラムと連結編集されることにより、アドレス初期化変数を実アドレス値で初期化できる。
従って、従来の言語仕様で作成されたソースプログラム、及び、スタートアッププログラムの何れも修正することなく、Ｃ＋＋言語等で標準的に備える動的初期化機能の枠組内で、アドレス初期化変数を実アドレス値で初期化でき、ＰＩＣ方式を用いて任意のアドレスで動作可能なオブジェクトプログラムを生成することができる。
【００１１】
また、上記第２の目的を達成するために、本発明に係るプログラム変換プログラムは、静的に領域が確保され、初期値が変数配置領域内のアドレス値であるアドレス初期化変数の定義を含むソースプログラムを変換し、オブジェクトプログラムを生成するプログラム変換プログラムであって、前記アドレス初期化変数の定義を、ソースプログラムから検出する検出ステップと、定義が検出されたアドレス初期化変数を、任意の領域に配置する変数配置ステップと、変数配置ステップにおいてアドレス初期化変数が配置された配置先のアドレス値のみを格納するための専用領域に、当該配置先のアドレス値を格納するアドレス格納ステップとをコンピュータに実行させることによって、ソースプログラムを修正することなく、アドレス初期化変数が配置される配置先のアドレス値を、プログラム中に纏めて保持するオブジェクトプログラムを生成することができる。このようなプログラム中に纏めて保持されたアドレス値は、ループ処理で容易に参照することができる。
【００１２】
従って、プログラム中に纏めて保持されたアドレス値をループ処理で参照するスタートアッププログラムにより、アドレス初期化変数の初期値を容易に修正することが可能なＰＩＣ方式のオブジェクトプログラムを生成できる。
更に、アドレス初期化変数の初期値を修正する処理はループ処理により実現でき、スタートアッププログラムのコード量は、ソースプログラム中に定義されているアドレス初期化変数の数に係らず一定であるので、コード量の増加を抑え、メモリ使用量を抑える効果もある。また、アドレス初期化変数自体を連続した領域に配置する必要がないため、変数の配置をメモリの使用状況に合せて柔軟に対応できる。
【００１３】
また、前記プログラム変換プログラムは、更に、前記専用領域に格納されているアドレス値により指し示される変数の全てに、前記変数配置領域の先頭アドレスを加算する命令コードを生成する生成ステップをコンピュータに実行させるとしてもよい。
あるいは、前記プログラム変換プログラムは、更に、生成したオブジェクトプログラムと、スタートアッププログラムとを連結編集し、実行形式プログラムを生成する連結編集ステップを含み、前記スタートアッププログラムは、前記専用領域に格納されているアドレス値により指し示される変数の全てに、前記変数配置領域の先頭アドレスを加算する命令コードを含むことを特徴としてもよい。
【００１４】
これによって、プログラム変換プログラムは、ソースプログラムを修正することなく、任意領域へのプログラム配置が可能で、アドレス初期化変数を実アドレス値で初期化できるＰＩＣ方式の実行形式プログラムを生成できる。
また、前記プログラム変換プログラムは、静的に領域が確保され、初期値が変数配置領域内のアドレス値であるアドレス初期化変数の定義を含むソースプログラムを変換し、オブジェクトプログラムを生成するプログラム変換プログラムであって、前記アドレス初期化変数の定義を、ソースプログラムから検出する検出ステップと、アドレス初期化変数のみを配置するための専用領域に、定義が検出されたアドレス初期化変数を配置する変数配置ステップとをコンピュータに実行させることによって、ソースプログラムを修正することなく、アドレス初期化変数をプログラム中に纏めて保持するオブジェクトプログラムを生成することができる。このようなプログラム中に纏めて保持されたアドレス初期化変数は、ループ処理で容易に参照することができる。
【００１５】
従って、プログラム中に纏めて保持されたアドレス初期化変数をループ処理で参照するスタートアッププログラムにより、アドレス初期化変数の初期値を容易に修正することが可能なＰＩＣ方式のオブジェクトプログラムを生成できる。
更に、アドレス初期化変数の初期値を修正する処理はループ処理により実現でき、スタートアッププログラムのコード量は、ソースプログラム中に定義されているアドレス初期化変数の数に係らず一定であるので、コード量の増加を抑え、メモリ使用量を抑える効果もある。
【００１６】
また、プログラム変換プログラムは、更に、前記専用領域に配置されているアドレス初期化変数の全てに、前記変数配置領域の先頭アドレスを加算する命令コードを生成する生成ステップをコンピュータに実行させるとしてもよい。
また、前記プログラム変換プログラムは、更に、生成したオブジェクトプログラムと、スタートアッププログラムとを連結編集し、実行形式プログラムを生成する連結編集ステップを含み、前記スタートアッププログラムは、前記専用領域に配置されているアドレス初期化変数の全てに、前記変数配置領域の先頭アドレスを加算する命令コードを含むことを特徴としてもよい。
【００１７】
これによって、プログラム変換プログラムは、ソースプログラムを修正することなく、任意領域へのプログラム配置が可能で、アドレス初期化変数を実アドレス値で初期化できるＰＩＣ方式の実行形式プログラムを生成できる。
また、上記第３の目的を達成するために、本発明に係るスタートアッププログラムは、静的に領域が確保される変数のうち、初期値が変数配置領域内のアドレス値であるアドレス初期化変数が、任意の領域に配置され、前記アドレス初期化変数が配置されている配置先のアドレス値のみが専用領域に格納されたオブジェクトプログラムにリンクされるスタートアッププログラムであって、オブジェクトプログラムのmain関数の呼び出し前に、前記専用領域に格納されているアドレス値により指し示される変数の全てに、前記変数配置領域の先頭アドレスを加算する加算ステップを、コンピュータに実行させることを特徴としている。
【００１８】
また、静的に領域が確保される変数のうち、初期値が変数配置領域内のアドレス値であるアドレス初期化変数のみが、専用領域に配置されたオブジェクトプログラムにリンクされるスタートアッププログラムであって、前記オブジェクトプログラムのmain関数の呼び出し前に、前記専用領域に配置されている変数の全てに、前記変数配置領域の先頭アドレスを加算する加算ステップを、コンピュータに実行させることを特徴としてもよい。
【００１９】
これによって、スタートアッププログラムは、連結されるオブジェクトプログラムに含まれるアドレス初期化変数の数に係らず、一定のコード量で全てのアドレス初期化変数を初期化することができる。
従って、本発明に係るスタートアッププログラムは、連結されるオブジェクトプログラムに応じて修正する必要がない。
【発明を実施するための最良の形態】
【００２０】
以下、本発明に係るプログラム変換装置の実施の形態について、図面を用いて説明する。
＜ソースプログラムについて＞
まず、プログラム変換装置において変換されるソースプログラムについて説明する。
図１は、Ｃ言語によって記述されたソースプログラムの一例を示す。ソースプログラム１０は、外部変数の定義部分１１と、関数の定義部分１２とからなる。
【００２１】
外部変数の定義部分１１で定義される変数は外部変数であり、プログラムの実行開始時にメモリ上の領域の確保と初期化を要する。
図の例では、初期値が明示されていない整数型変数ａ、初期値として「１０」が明示されている整数型変数ｂ、及び、初期値として「＆ａ」が明示されているポインタ型変数ｐａが定義されている。「＆ａ」とは、変数ａの配置先のアドレスを示す。
【００２２】
一方、関数の定義部分１２には、ｍａｉｎ関数等の関数が定義される。関数内で定義される変数のうち、static宣言された変数は静的変数であり、プログラムの実行開始時に領域の確保と初期化を要するが、それ以外の変数は自動変数であり、関数の実行時にスタック領域に動的に確保され、プログラムの実行開始時には初期化を要さない。
図の例では、ｍａｉｎ関数のみが定義され、ｍａｉｎ関数内では、初期値として「＆ｂ」が明示されているポインタ型変数ｐｂ、及び、初期値として「＆ａ」が明示されているポインタ型変数ｐｃが定義されている。変数ｐｂは静的関数であり、変数ｐｃ自動変数である。
【００２３】
以上、プログラム変換装置に入力されるソースプログラム１０について説明したが、実行開始までに初期化が必要な変数は、ここで説明した変数に限定されるものではない。プログラム実行に際してメモリ上に静的に領域が確保される変数であれば、実行開始時に初期化を要する。
また、ソースプログラム１０に定義されている変数のうち、変数ｐａ及び変数ｐｂがアドレス初期化変数である。
＜実施の形態１＞
C++言語等には、main関数の呼び出しによるプログラムの実行開始以前に、初期化関数テーブルに登録されている関数を実行する「動的初期化」という言語仕様がある。
【００２４】
本実施の形態は、C++言語等の言語仕様である動的初期化を利用して、アドレス初期化変数を初期化する方法に関する。
（構成）
本実施の形態１に係るプログラム変換装置１００は、具体的にはプロセッサ、ＲＡＭ、変換プログラムを記録したＲＯＭ、ハードディスク等からなるコンピュータシステムであって、当該プロセッサがＲＯＭに記録された変換プログラムを実行することでその機能を実現する。
【００２５】
図２は、実施の形態１に係るプログラム変換装置１００の機能構成を示す図である。また、図にはプログラム変換装置１００に入力されるソースプログラム１０、プログラム変換装置から出力されるオブジェクトプログラム２０、オブジェクトプログラム２０と共に連結編集されるスタートアッププログラム３０、及び、実行形式プログラム４０も併せて示している。これらソースプログラム１０、オブジェクトプログラム２０、スタートアッププログラム３０、実行形式プログラム４０は、ハードディスク等の記録媒体に記録される。
【００２６】
プログラム変換装置１００は、翻訳部１１０と、連結編集部１２０とで構成される。翻訳部１１０は構文解析部１１１、変数定義検出部１１２、動的初期化判定部１１３、動的初期化関数生成部１１４、テーブル登録部１１５、及び、コード生成部１１６を内部に含む。
構文解析部１１１は、入力されたソースプログラムの字句解析、及び構文解析を行い、ソースプログラムに対応する中間コード群を生成する。
【００２７】
変数定義検出部１１２は、構文解析部１１１が生成した中間コード群から変数の定義に係る中間コードを検出し、さらに、当該中間コードにおいて定義される変数が外部変数もしくは静的変数である場合に、検出した中間コードを動的初期化判定部１１３に通知する。
図３は、外部変数及び静的変数の定義に係る中間コードの一例を模式的に示す図である。変数定義検出部１１２は、図１に示すソースプログラム１０に基づく中間コードから、図３に示す中間コードを検出し動的初期化判定部１１３に通知する。図３において「INIT」は、変数の定義を表す中間コードである。各中間コードにおいて、斜線付きの丸で囲まれた文字列は変数名を示し、丸で囲まれた値は初期値を示す。具体的には、中間コードi1は変数ａを初期値不定で定義する中間コードであり、中間コードi2は変数ｂを初期値１０で定義する中間コードである。
【００２８】
動的初期化判定部１１３は、変数定義検出部１１２から通知された変数定義の中間コードを参照して、定義されている各変数の種類に応じて配置領域を決定し、各変数定義の中間コードに決定した配置先を示す配置領域情報を付加すると共に、中間コードがアドレス初期化変数の定義に係る中間コードである場合に、当該変数を動的初期化により初期化すると判定し、動的初期化関数生成部１１４へ通知する。
【００２９】
具体的には、動的初期化判定部１１３は、外部変数及び静的変数のうち初期値が明示されているものを、ＤＡＴＡ領域に配置すると決定し、外部変数及び静的変数のうち初期値が明示されておらず実行形式プログラムの起動時に０で初期化されるものを、ＢＳＳ領域に配置すると決定する。ただし、定義される変数が初期値としてアドレス値を持つポインタ変数である場合、即ち、アドレス初期化変数である場合、当該変数をＤＡＴＡ領域ではなくＢＳＳ領域に配置すると決定し、さらに、当該変数を動的初期化の対象と判定して動的初期化関数生成部１１４へ通知する。
【００３０】
図４は、本実施の形態１に係るプログラム変換装置１００が、ソースプログラム１０で定義されている外部変数及び静的変数を配置する領域を示す。動的初期化判定部１１３は、図３に示す中間コードに基づいて、図４に示すように変数ａ、ｐａ、及びｐｂをＢＳＳ領域に、変数ｂをＤＡＴＡ領域に配置すると決定し、さらに、変数ｐａ及びｐｂを、動的初期化の対象として動的初期化関数生成部１１４へ通知する。
【００３１】
動的初期化関数生成部１１４は、動的初期化判定部１１３により動的初期化の対象と判定された変数を定義する中間コードを、（１）当該変数を初期値不定で定義する中間コード、及び（２）当該変数をアドレス値で初期化する初期化関数を表す中間コード、に変換する。
図５は、動的初期化関数生成部１１４により変換された後の中間コードの一例を模式的に示す図である。ここで斜線付き丸囲みの文字列に付加されている四角囲みの文字列は、動的初期化判定部１１３により付加された配置領域情報を表す。動的初期化関数生成部１１４は、図３の中間コードi3を、図５の中間コードi23、及びi24の組に変換し、図３の中間コードi4を、図５の中間コードi25、及びi26の組に変換する。中間コードi24は、変数ｐａに変数ａのアドレスを代入する初期化関数の中間コードであり、中間コードi26は、変数ｐｂに変数ｂのアドレスを代入する初期化関数の中間コードである。
【００３２】
テーブル登録部１１５は、動的初期化関数生成部１１４において中間コードが生成された初期化関数の呼び出しアドレスを保持する領域を、初期化関数テーブルであるＩＮＩＴＦＴ領域内に配置する中間コードを生成する。初期化関数テーブルは、C++言語等の言語仕様により定められた形式でオブジェクトコード中に保持されるテーブルであり、ここに登録された関数は、main関数の呼び出しによるメインルーチンの開始以前に実行される。
【００３３】
コード生成部１１６は、中間コードを参照し、対応する機械語コードのオブジェクトプログラム２０を生成する。このときコード生成部１１６は、外部変数、及び静的変数を動的初期化判定部１１３により決定された変数の配置領域に従ってＤＡＴＡ領域及びＢＳＳ領域からなる変数配置領域に配置するとともに、プログラム中の実行命令、及び数値（ＤＡＴＡ領域に配置した変数の初期値、初期化関数テーブルに登録された呼び出しアドレス値等）をコード配置領域に配置する。
【００３４】
数値の一例としては、ＤＡＴＡ領域に配置される変数の初期値が、コード配置領域の一部であるＲＯＭＤＡＴＡ領域に配置される。ＲＯＭＤＡＴＡ領域は、ＤＡＴＡ領域と対になって生成され、変数がＤＡＴＡ領域に配置される順番と同じ順番で、それぞれの変数の初期値がＲＯＭＤＡＴＡ領域内に配置される。
図６は、実施の形態１に係るオブジェクトプログラム２０と、プログラムの配置アドレスの関係を示す図である。図の左側の列は、ニーモニックで表現したオブジェクトプログラム２０の一例である。図の中央の列は、オブジェクトプログラム２０における変数、数値、及び実行命令の配置アドレスを示す。オブジェクトプログラム２０は、ＰＩＣ方式に対応した機械語コードであるため、オブジェクトプログラム２０中では、変数、数値、及び実行命令の配置アドレスは、変数配置領域、若しくはコード配置領域の先頭からのオフセット値を用いて取り扱われる。具体的には、ＢＳＳ領域、及びＤＡＴＡ領域に配置された変数の配置アドレスは、図の中央の列に示すように、変数配置領域の先頭からのオフセット値を用いて取り扱われる。また、ＲＯＭＤＡＴＡ領域、及びＩＮＩＴＦＴ領域に配置された数値の配置アドレスと、ＴＥＸＴ領域に配置された実行命令の配置アドレスは、コード配置領域の先頭からのオフセット値を用いて取り扱われる。
【００３５】
図２に示す連結編集部１２０は、所謂リンカであって、オブジェクトプログラム２０及びスタートアッププログラム３０を連結編集し、実行形式プログラム４０を生成する。
図７は、実施の形態１に係るスタートアッププログラム３０の一例を示す。実行形式プログラム４０が格納されるマイクロコンピュータ組み込み機器は、電源投入あるいはリセットされたとき、レジスタやＲＡＭの状態が不定でありプログラムのmain関数の実行前にハードウェアを初期化するスタートアップルーチンを実行する必要がある。スタートアッププログラム３０は、スタートアップルーチンを記述した機械語コードであって、C++言語の言語仕様に準拠し動的初期化を実行する機械語コード（ｓｔ４）を含む。
【００３６】
図７においては、データベースレジスタ（ＤＢＲ）を、変数配置領域（ＢＳＳ領域及びＤＡＴＡ領域）の先頭アドレス（ＴＯＰ＿ＯＦ＿ＤＡＴＡ）がロードされたメモリ上の実アドレスで初期化する機械語コードをｓｔ１に示しているが、スタートアッププログラムには他の制御レジスタ、例えばスタックポインタ（ＳＰ）等を初期化する機械語コードを含むとしてもよい。
【００３７】
最終的にプログラム変換装置１００から出力される実行形式プログラム４０は、図６のオブジェクトプログラムに図７のスタートアッププログラムが連結編集され、スタートアッププログラム３０の機械語コードがＴＥＸＴ領域に配置されたものである。
以上の構成により、プログラム変換装置１００は、スタートアッププログラム３０を修正することなく、アドレス初期化変数を実アドレスで初期化できるＰＩＣ方式に対応した実行形式プログラムを生成することができる。
【００３８】
尚、図２においては、１のオブジェクトプログラムと１のスタートアッププログラムとから実行形式プログラムを生成する例をしめしたが、連結編集部１２０による連結動作は一般的なリンカの動作であり、連結編集されるオブジェクトプログラムの数は、２以上であってもよい。
（オブジェクトプログラム２０の詳細）
次に、図６を用いてプログラム変換装置１００が生成するオブジェクトプログラムの詳細について説明する。
【００３９】
オブジェクトプログラム２０中の「．ｓｅｃｔｉｏｎ」は領域を切り替える擬似命令である。「ＤＳ」は左項の名称で右項のサイズ分のメモリを確保することを表す。「ＤＤ」は左項の名称で右項の値を持ったメモリを確保することを表す。
オブジェクトプログラム２０のｈ１には、ＢＳＳ領域の先頭及び末尾の区切りと、動的初期化判定部１１３によりＢＳＳ領域に配置するとされたそれぞれの変数のために、変数型に応じたサイズ（変数ａ、ｐａ、ｐｂでは４バイト）のメモリをＢＳＳ領域に確保する機械語コードが含まれる。
【００４０】
ｈ２には、ＤＡＴＡ領域の先頭及び末尾の区切りと、動的初期化判定部１１３によりＤＡＴＡ領域に配置するとされたそれぞれの変数のために、変数型に応じたサイズ（変数ｂでは４バイト）のメモリをＤＡＴＡ領域に確保する機械語コードが含まれる。
ｈ３には、ＤＡＴＡ領域に配置された変数の初期値を保持する領域であるＲＯＭＤＴＡ領域の先頭及び末尾の区切りと、各変数の初期値を格納したメモリをＲＯＭＤＴＡ領域に確保する機械語コードが含まれる。図６の例では、ＲＯＭＤＴＡ領域にＬ００００４という名称で値１０（変数ｂの初期値）を持つメモリのみが確保される。
【００４１】
ｈ４には、初期化関数テーブルであるＩＮＩＴＦＴ領域の先頭及び末尾の区切りと、初期化関数テーブルに登録された各関数の呼び出しアドレスを保持するメモリを確保する機械語コードが含まれる。
ｈ５には、プログラム中の実行命令を格納する領域であるＴＥＸＴ領域の先頭及び末尾の区切りと、各実行命令の機械語コードが含まれる。ここには、ソースプログラム１０において定義されている関数に対応する機械語コードに加え、動的初期化関数生成部１１４により中間コードが生成された初期化関数の機械語コードも含まれる。
【００４２】
上述のオブジェクトプログラム２０では、（１）アドレス初期化変数（変数ｐａ、ｐｂ）がＤＡＴＡ領域ではなくＢＳＳ領域に配置されており、（２）アドレス初期化変数を初期化する初期化関数の機械語コードがＴＥＸＴ領域に追加されており、（３）係る初期化関数の呼び出しアドレスがＩＮＩＴＦＴ領域に配置されている。
これにより、ＰＩＣ方式の機械語コードを任意のアドレスに配置し、Ｃ＋＋言語の動的初期化処理でアドレス初期化変数を実アドレスで初期化できる。また、アドレス初期化変数をＤＡＴＡ領域に配置しないので、アドレス初期化変数の初期値を、プログラム中（ＲＯＭＤＡＴＡ領域）に保持する必要がなく、コード量を抑えることができる。
（動作）
次に、上述のように構成されたプログラム変換装置１００の動作について説明する。
【００４３】
図８は、本実施の形態１に係るプログラム変換装置１００において、オブジェクトプログラムを生成する動作の流れを示す図である。
先ず、プログラム変換装置１００の構文解析部１１１は、ソースプログラム１０を読込み、字句解析、構文解析によりソースプログラム１０に対応する中間コード群を生成する（Ｓ１）。
【００４４】
構文解析部１１１により生成された中間コード群中に未処理の中間コードがあれば（Ｓ２：Ｙｅｓ）、各未処理の中間コードを順に処理対象として、アドレス初期化変数の初期化のための中間コード修正処理を行う（Ｓ３）。
構文解析部１１１により生成された中間コード群中の全ての中間コードについて修正処理が終了した場合（Ｓ２：Ｎｏ）、コード生成部１１６は、修正後の中間コードを含む中間コード群を参照し、対応する機械語コードのオブジェクトプログラム２０を生成する（Ｓ４）。
【００４５】
以上の動作により図６に示すオブジェクトプログラム２０を生成するこができる。
以下に、中間コード修正処理について詳細に説明する。
図９は、本実施の形態１に係るプログラム変換装置１００における中間コード修正処理の動作の流れを示す図である。
先ず、変数定義検出部１１２は、処理対処の中間コードが変数定義の中間コードであるか否かを判定する（Ｓ１１）。処理対処の中間コードが変数定義である場合（Ｓ１１：Ｙｅｓ）、変数定義検出部１１２はさらに、定義されている変数が外部変数もしくは静的変数であるか否かを判定し（Ｓ１２）、定義されている変数が外部変数もしくは静的変数である場合には（Ｓ１２：Ｙｅｓ）、動的初期化判定部１１３に通知する。上記のＳ１１、Ｓ１２の判定結果が否定的である場合、中間コード修正処理を終了する。
【００４６】
変数定義検出部１１２から通知を受けた動的初期化判定部１１３は、処理対象の中間コードにおいて初期値が明示されているか否かを判定する（Ｓ１３）。初期値が明示されていない場合（Ｓ１３：Ｎｏ）、動的初期化判定部１１３は、変数をＢＳＳ領域に配置することを示す配置領域情報を、中間コードに付加する（Ｓ１４）。初期値が明示されている場合（Ｓ１３：Ｙｅｓ）、動的初期化判定部１１３はさらに、初期値がアドレス値であるか否かを判定し（Ｓ１５）、初期値がアドレス値ではない場合（Ｓ１５：Ｎｏ）、動的初期化判定部１１３は、変数をＤＡＴＡ領域に配置することを示す配置領域情報を、中間コードに付加する（Ｓ１６）。
【００４７】
初期値がアドレス値である場合（Ｓ１５：Ｙｅｓ）、動的初期化判定部１１３は、変数をＢＳＳ領域に配置することを示す配置領域情報を、中間コードに付加し（Ｓ１７）、さらに、動的初期化関数生成部１１４へ通知する。
通知を受けた動的初期化関数生成部１１４は、処理対象の中間コードを、変数の領域のみをＢＳＳ領域に確保し初期値を明示しない中間コードと、変数に実アドレスを代入する初期化関数を定義する中間コードとに変換する（Ｓ１８）。続いてテーブル登録部１１５は、動的初期化関数生成部１１４において中間コードが生成された初期化関数の呼び出しアドレスを保持する領域を、初期化関数テーブルであるＩＮＩＴＦＴ領域内に配置する中間コードを生成する（Ｓ１９）。
【００４８】
以上の動作により、動的初期化を利用してアドレス初期化変数を実アドレスで初期化する中間コード群を生成するこができる。
（実行形式プログラム４０の動作）
次に、プログラム変換装置１００が生成する実行形式プログラム４０の動作について説明する。
【００４９】
実際に実行される機械語コードは、実行形式プログラム４０の機械語コードであるが、ここでは図７のスタートアッププログラム３０中の機械語コードに付した符号を用いて説明する。
先ず、実行プログラム４０がマイクロコンピュータ組み込み機器にロードされたメモリレイアウトについて説明する。図６の右側の列は、実行プログラム４０が、マイクロコンピュータ組み込み機器にロードされたメモリレイアウトを示す。
【００５０】
実行形式プログラム４０は、領域毎にマイクロコンピュータ組み込み機器のＲＯＭ及びＲＡＭのメモリ上に配置される。ＲＯＭＤＡＴＡ領域、ＩＮＩＴＦＴ領域、及びＴＥＸＴ領域からなるコード配置領域はＲＯＭに配置され、ＢＳＳ領域、及びＤＡＴＡ領域からなる変数配置領域はマイクロコンピュータ組み込み機器の起動時にＲＡＭに配置される。ここでＲＡＭに配置された領域が、実行形式プログラム４０に含まれるスタートアップルーチンの実行により初期化される。
【００５１】
図１０は、実行形式プログラム４０の動作の流れを示す図である。
前記マイクロコンピュータ組み込み機器は、電源投入時あるいはリセット時に、ＴＥＸＴ領域に含まれるスタートアップルーチンの機械語コードを読み出し実行する。
先ず、マイクロコンピュータ組み込み機器は機械語コードｓｔ１に従い、ＤＢＲの値を設定する（ｓ２１）。ＤＢＲには、実行形式プログラム４０がメモリ上にロードされた際に決定される変数配置領域の基準アドレスが設定される。ここで言う基準アドレスとは、ＲＡＭ上にロードされた変数配置領域の先頭アドレス（ＴＯＰ＿ＯＦ＿ＤＡＴＡ）の実アドレスである。
【００５２】
次に、マイクロコンピュータ組み込み機器は機械語コードｓｔ２に従い、ＢＳＳ領域を０で初期化する（Ｓ２２）。この動作はＲＡＭ上のＢＳＳ領域の先頭アドレスから末尾のアドレスまでの領域をループ処理により、０でクリアすることにより実行される。
続いて、マイクロコンピュータ組み込み機器は機械語コードｓｔ３に従い、ＤＡＴＡ領域を初期化する（Ｓ２３）。この動作はＲＯＭ上のＲＯＭＤＡＴＡ領域に保持されている値を、ＲＡＭ上のＤＡＴＡ領域へ、ループ処理によりコピーすることにより実行される。
【００５３】
続いて、マイクロコンピュータ組み込み機器は機械語コードｓｔ４に従い、動的初期化処理を実行する（Ｓ２４）。この動作はＲＯＭ上のＩＮＩＴＦＴ領域に呼び出しアドレスが保持されている初期化関数を、ループ処理により呼び出すことにより実行される。
この動作により、アドレス初期化変数には、変数配置領域の先頭アドレスからのオフセット値にＤＢＲの値が加算された値が設定される。例えば、変数ｐａ、ｐｂは、それぞれ変数ａ、ｂの変数配置領域の先頭からのオフセット値にＤＢＲの値が加算された値で初期化され、正しく変数ａ、変数ｂの配置領域の実アドレスで初期化される。
【００５４】
その後、マイクロコンピュータ組み込み機器は機械語コードｓｔ５に従い、ｍａｉｎ関数を呼び出す（Ｓ２５）。
以上の動作により、ｍａｉｎ関数が呼び出される時点で、実行形式プログラム４０がＲＡＭ上にロードされた実アドレスが、全てのアドレス初期化変数に設定されているため、ｍａｉｎ関数の呼び出しにより、実行形式プログラム４０は正しく動作する。
【００５５】
尚、一般にスタートアップルーチンでは、これ以外に制御レジスタも初期化されるが、これらの処理は、本発明の主題とかかわりのない処理であるため、本明細書では説明を省略している。
（まとめ）
以上のように、本実施の形態１に係るプログラム変換装置１００は、ソースプログラムで定義されているアドレス初期化変数を実アドレスで初期化する初期化関数を生成し、生成した初期化関数の呼び出しアドレスを、初期化関数テーブルであるＩＮＩＴＦＴ領域に保持させるので、動的初期化処理により各アドレス初期化変数を実アドレスで初期化することが可能なＰＩＣ方式の実行形式プログラムを生成できる。
＜実施の形態２＞
実施の形態２は、アドレス初期化変数の配置先のアドレスを保持する専用領域（以下、ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域とするを新たに設け、アドレス初期化変数を簡便に実アドレスで初期化する方法に関する。
（構成）
本実施の形態２に係るプログラム変換装置２００は、具体的にはプロセッサ、ＲＡＭ、変換プログラムを記録したＲＯＭ、ハードディスク等からなるコンピュータシステムであって、当該プロセッサがＲＯＭに記録された変換プログラムを実行することでその機能を実現する。
【００５６】
図１１は、実施の形態２に係るプログラム変換装置２００の機能構成を示す図である。また、図にはプログラム変換装置２００に入力されるソースプログラム１０、プログラム変換装置から出力されるオブジェクトプログラム２１、オブジェクトプログラム２１と共に連結編集されるスタートアッププログラム３１、及び、実行形式プログラム４１も併せて示している。これらソースプログラム１０、オブジェクトプログラム２１、スタートアッププログラム３１、実行形式プログラム４１は、ハードディスク等の記録媒体に記録される。
【００５７】
図１１に示すプログラム変換装置２００の構成は実施の形態１で説明したプログラム変換装置１００の翻訳部１１０を翻訳部２１０に置き換えたものである。
なお、プログラム変換装置１００と同様の構成要素には同一の符号を付し、それらの説明を省略する。
翻訳部２１０は、プログラム変換装置１００の翻訳部１１０から動的初期化判定部１１３、動的初期化関数生成部１１４、及びテーブル登録部１１５を取り除き、変数配置部２１１及び変数アドレス配置部２１２を加えたものである。
【００５８】
変数配置部２１１は、変数定義検出部１１２から、外部変数及び静的変数を定義する中間コードの通知を受け付け、通知された変数定義の中間コードを参照して、定義される各変数の種類に応じて配置領域を決定し、各変数定義の中間コードに決定した配置先を示す配置領域情報を付加する。
具体的には、変数配置部２１１は、外部変数及び静的変数のうち初期値が明示されているものを、ＤＡＴＡ領域に配置すると決定し、外部変数及び静的変数のうち初期値が明示されておらず実行形式プログラムの起動時に０で初期化されるものを、ＢＳＳ領域に配置すると決定する。
【００５９】
図１２は、本実施の形態２に係るプログラム変換装置２００が、ソースプログラム１０で定義されている外部変数及び静的変数を配置する領域を示す。変数配置部２１１は、変数定義検出部１１２から、外部変数及び静的変数を定義する中間コードとて図３に示す中間コードが通知された場合、図１２に示すように変数ａをＢＳＳ領域に、変数ｂ、ｐａ、及びｐｂをＤＡＴＡ領域に配置すると決定する。
【００６０】
変数アドレス配置部２１２は、アドレス初期化変数の配置先のアドレス値を、専用領域であるＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域に保持させる中間コードを生成する。ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域は、本実施の形態において新規に定義される領域であり、当該領域には、アドレス初期化変数の配置先のアドレス値のみが格納される。
図１３は、変数アドレス配置部２１２により追加された中間コードの一例を模式的に示す図である。図中の中間コードi35、i36は、変数アドレス配置部２１２により生成された中間コードであり、それぞれ変数ｐａ、ｐｂの配置先のアドレスをＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域に保持させる中間コードである。
【００６１】
コード生成部１１６は、実施の形態１と同様に、中間コードを参照し、外部変数及び静的変数を、変数配置部２１１により決定された変数の配置領域に従って、ＤＡＴＡ領域及びＢＳＳ領域からなる変数配置領域に配置すると共に、プログラム中の実行命令及び数値（ＤＡＴＡ領域に配置した変数の初期値、アドレス初期化変数の配置先のアドレス値等）を、ＲＯＭＤＡＴＡ領域、ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域、及びＴＥＸＴ領域からなるコード配置領域に配置し、中間コードに対応する機械語コードのオブジェクトプログラム２１を生成する。
【００６２】
図１４は、実施の形態２に係るオブジェクトプログラム２１と、プログラムの配置アドレスの関係を示す図である。図の左側の列は、ニーモニックで表現したオブジェクトプログラム２１の一例である。図の中央の列は、オブジェクトプログラム２１における変数、数値、及び実行命令の配置アドレスを示す。
プログラム変換装置２００が生成するオブジェクトプログラム２１は、マイクロコンピュータ組み込み機器において任意のアドレス上でプログラムを動作させるＰＩＣ方式に対応したものであるため、プログラム中の各変数がマイクロコンピュータ組み込み機器のＲＡＭ上に配置される実アドレスは、プログラムがロードされるまで決定しない。そのため、これらの配置アドレスは、実施の形態１に係るオブジェクトプログラム２０と同様に、オブジェクトプログラム２１中では変数配置領域の先頭からのオフセット値を用いて取り扱われる。また、ＲＯＭＤＡＴＡ領域に保持される数値のうちのアドレス初期化変数の初期値（アドレス値）、及び、ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域に保持されるアドレス初期化変数の配置先のアドレス値は、変数配置領域の先頭アドレスからのオフセット値で表現される。
【００６３】
連結編集部１２０は、オブジェクトプログラム２１及び実施の形態２に特有な処理を含むスタートアッププログラム３１を連結編集し、実行形式プログラム４１を生成する。
最終的にプログラム変換装置２００から出力される実行形式プログラム４１は、図１４のオブジェクトプログラム２１に図１５のスタートアッププログラム３１が連結編集され、スタートアッププログラム３１の機械語コードがＴＥＸＴ領域に配置されたものである。
【００６４】
以上の構成により、プログラム変換装置２００は、外部変数及び静的変数が従来のＰＩＣ方式と同様にＤＡＴＡ領域またはＢＳＳ領域に配置され、ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域に、アドレス初期化変数の配置先のオフセット値のみが保持された実行形式プログラム４１を生成することができる。
（スタートアッププログラム３１の詳細）
次に、本実施の形態２のプログラム変換装置２００において、オブジェクトプログラム２１と連結編集されるスタートアッププログラム３１について説明する。
【００６５】
スタートアッププログラム３１は、プログラム変換装置２００の機能を実現する変換プログラムと共に提供され、ハードディスク等の記録媒体に記録されている。
図１５は、実施の形態２に係るスタートアッププログラム３１の一例を示す。
スタートアッププログラム３１は、従来のＰＩＣ方式に対応したスタートアッププログラムと同様に、データ領域の先頭アドレスがロードされたメモリ上の実アドレスを、ＤＢＲに設定する機械語コード（ｓｔ２１）、ＢＳＳ領域を０で初期化する機械語コード（ｓｔ２２）、ＤＡＴＡ領域にＲＯＭＤＡＴＡ領域の値を転送する機械語コード（ｓｔ２３）、及びｍａｉｎ関数を呼び出す機械語コード（ｓｔ２５）を含む。
【００６６】
スタートアッププログラム３１は、さらに、本発明に特有な機械語コードとして、ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域に保持されている値からアドレス初期化変数の配置先のアドレス値を算出し、各アドレス初期化変数にＤＢＲの値を加算する機械語コード（ｓｔ２４）を含む。当該機械語コード（ｓｔ２４）は、ＤＢＲの設定、及び、ＤＡＴＡ領域へのＲＯＭＤＡＴＡ領域の値の転送の後から、ｍａｉｎ関数の呼び出しの前までの間に実行される。
（オブジェクトプログラム２１の詳細）
次に、図１４を用いてプログラム変換装置２００が生成するオブジェクトプログラム２１の詳細について説明する。
【００６７】
オブジェクトプログラム２１には、ｈ２１及びｈ２２において、ＢＳＳ領域及びＤＡＴＡ領域のそれぞれの領域の先頭及び末尾の区切りと、変数配置部２１１によりそれぞれの領域に配置するとされた変数のために、変数型に応じたサイズのメモリを確保する機械語コードが含まれ、ｈ２３には、ＲＯＭＤＴＡ領域の先頭及び末尾の区切りと、ＤＡＴＡ領域に配置された変数の初期値を格納したメモリをＲＯＭＤＴＡ領域に確保する機械語コードが含まれる。
【００６８】
ＢＳＳ領域及びＤＡＴＡ領域における変数配置は、従来のプログラム変換装置による変数配置と同様である。ただし、ＲＯＭＤＴＡ領域に保持されているアドレス初期化変数の初期値は、変数配置領域の先頭アドレスからのオフセット値で表現される。
また、ｈ２４には、ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域の先頭及び末尾の区切りと、アドレス初期化変数の配置先のアドレス値を保持するメモリを確保する機械語コードが含まれるが、ここで保持されるアドレス値も、変数配置領域の先頭アドレスからのオフセット値で表現される。
【００６９】
ｈ２５には、ＴＥＸＴ領域の先頭及び末尾の区切りと、各実行命令の機械語コードが示される。
上述のオブジェクトプログラム２１では、ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域が新たに設けられ、当該ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域に、アドレス初期化変数の配置先を示す変数配置領域の先頭からのオフセット値のみが保持される点に特徴がある。
【００７０】
これにより、オブジェクトプログラム２１と図１５に示すスタートアッププログラム３１とが連結編集された実行形式プログラム４１は、任意のアドレスに配置可能なＰＩＣ方式の機械語コードでありながら、スタートアップルーチンの機械語コードｓｔ２４のループ処理により、アドレス初期化変数を容易に実アドレスで初期化できる。
（動作）
次に、上述のように構成されたプログラム変換装置２００の動作について説明する。
【００７１】
ここでは、特に実施の形態１において説明したプログラム変換装置１００と動作が異なる、中間コード修正処理について詳細に説明する。
図１６は、本実施の形態２に係るプログラム変換装置２００における中間コード修正処理の動作の流れを示す図である。
変数定義検出部１１２における動作（Ｓ３１及びＳ３２）は、プログラム変換装置１００での動作（図９のＳ１１とＳ１２）と同様である。
【００７２】
変数配置部２１１は、変数定義検出部１１２から、処理対象の中間コードにより定義される変数が、外部変数もしくは静的変数であると通知されると、処理対象の中間コードにおいて初期値が明示されているか否かを判定する（Ｓ３３）。初期値が明示されていない場合（Ｓ１３：Ｎｏ）、変数配置部２１１は、変数をＢＳＳ領域に配置することを示す配置領域情報を、中間コードに付加する（Ｓ３４）。
【００７３】
初期値が明示されている場合（Ｓ３３：Ｙｅｓ）、変数配置部２１１はさらに、初期値がアドレス値であるか否かを判定し（Ｓ３５）、初期値がアドレス値ではない場合（Ｓ３５：Ｎｏ）、変数配置部２１１は、変数をＤＡＴＡ領域に配置することを示す配置領域情報を、中間コードに付加する（Ｓ３６）。
初期値がアドレス値である場合（Ｓ３５：Ｙｅｓ）、変数配置部２１１は、変数をＤＡＴＡ領域に配置することを示す配置領域情報を、中間コードに付加し（Ｓ３７）、さらに、変数アドレス配置部２１２へ通知する。続いて変数アドレス配置部２１２は、処理対象の中間コードにより定義される変数の配置先アドレスを保持する領域を、専用領域であるＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域内に確保する中間コードを生成する（Ｓ３８）。
【００７４】
以上の動作により、外部変数及び静的変数の変数配置は、従来と同様であるが、アドレス初期化変数の配置アドレスのみを、ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域に保持するように中間コード群を生成することができる。
（実行形式プログラム４１の動作）
次に、プログラム変換装置２００が生成する実行形式プログラム４１の動作について説明する。
【００７５】
ただし、実際に実行される機械語コードは、実行形式プログラム４１の機械語コードであるが、ここでは図１５のスタートアッププログラム３１中の機械語コードに付した符号を用いて説明する。
先ず、実行プログラム４１がマイクロコンピュータ組み込み機器にロードされたメモリレイアウトについて説明する。図１４の右側の列は、実行プログラム４１が、マイクロコンピュータ組み込み機器にロードされたメモリレイアウトを示す。
【００７６】
実行形式プログラム４１は、領域毎にマイクロコンピュータ組み込み機器のＲＯＭ及びＲＡＭのメモリ上に配置される。ＲＯＭＤＡＴＡ領域、ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域、及びＴＥＸＴ領域からなるコード配置領域はＲＯＭに配置され、ＢＳＳ領域、及びＤＡＴＡ領域からなる変数配置領域はマイクロコンピュータ組み込み機器の起動時にＲＡＭに配置される。
【００７７】
図１７は、実行形式プログラム４１の動作の流れを示す図である。電源投入時あるいはリセット時に、前記マイクロコンピュータ組み込み機器は、ＴＥＸＴ領域に含まれるスタートアップルーチンの機械語コードを読み出し実行する。
スタートアップルーチンにおけるＤＢＲを設定する動作（Ｓ４１）、ＢＳＳ領域を０に初期化する動作（Ｓ４２）、及び、ＤＡＴＡ領域へＲＯＭＤＡＴＡ領域の値を転送する動作（Ｓ４３）は、実施の形態１の実行形式プログラム４０での動作（図１０のＳ２１からＳ２３）と同様である。
【００７８】
続いて、マイクロコンピュータ組み込み機器は、機械語コードｓｔ２４に従い、各アドレス初期化変数の値にＤＢＲの値を加算する（Ｓ４４）。この動作は、ループ処理によって、ＲＯＭ上のＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域の先頭アドレスから末尾のアドレスまでに保持されている値（即ち、各アドレス初期化変数の配置先のオフセット値）とＤＢＲの値とを加算して、各アドレス初期化変数の配置先の実アドレスを取得し、取得した実アドレス値が指し示す領域の値にＤＢＲの値を加算することにより実行される
Ｓ４３の動作でオフセット値が設定された各アドレス初期化変数に、Ｓ４４の動作でＤＢＲの値が加算され、各アドレス初期化変数は、実アドレスで初期化される。例えば、変数ｐａ、ｐｂには、Ｓ４３の動作によってそれぞれ変数ａ、ｂの変数配置領域の先頭からのオフセット値が設定され、Ｓ４４の動作によって共にＤＢＲの値が加算される。これによって変数ｐａ、ｐｂは、それぞれ正しく変数ａ、ｂの配置領域の実アドレスで初期化される。
【００７９】
その後、マイクロコンピュータ組み込み機器は機械語コードｓｔ２５に従い、ｍａｉｎ関数を呼び出す（Ｓ４５）。
以上の動作により、ｍａｉｎ関数が呼び出される時点で、全てのアドレス初期化変数には、実行形式プログラム４１がＲＡＭ上にロードされた実アドレスに応じた初期値が設定されているため、ｍａｉｎ関数の呼び出しにより、実行形式プログラム４１は正しく動作する。
（まとめ）
以上のように、本実施の形態２に係るプログラム変換装置２００は、ソースプログラムで定義されているアドレス初期化変数を、ＤＡＴＡ領域に配置し、アドレス初期化変数の配置先のみを、ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域に保持させるので、ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域に保持される値で参照される変数に、ループ処理でＤＢＲの値を加算することにより、各アドレス初期化変数を容易に実アドレスで初期化することが可能なＰＩＣ方式の実行形式プログラムを生成できる。
【００８０】
さらに、配置先アドレスがまとめて保持されているアドレス初期化変数には、ＤＢＲの値をループ処理の機械語コードで加算することが可能であり、プログラム中にアドレス初期化変数が幾つ定義されていても、コード量が増減することがない。
（変形例）
尚、実施の形態２では、本発明に特有な処理を含むスタートアッププログラム３１が、プログラム変換装置２００の機能を実現する変換プログラムと共に提供される場合について説明したが、本発明に係るプログラム変換装置は、Ｃ言語の仕様に対応した一般的なスタートアッププログラムに、本発明に特有な処理の機械語コードを追加することにより、スタートアッププログラム３１を生成する構成としてもよい。
【００８１】
以下に、プログラム変換装置においてスタートアッププログラム３１を生成する変形例について説明する。
図１８は、本発明の変形例に係るプログラム変換装置３００の機能構成を示す図である。
図１８に示すプログラム変換装置３００の構成はプログラム変換装置２００に初期化コード生成部３１１を加えたものである。なお、プログラム変換装置２００と同様の構成要素には同一の符号を付し、それらの説明を省略する。
【００８２】
初期化コード生成部３１１は、変数アドレス配置部２１２により生成された中間コード、即ち、アドレス初期化変数の配置先アドレス値を特定の領域に保持させる中間コードを参照し、アドレス初期化変数にＤＢＲの値を加算する関数の中間コードを生成する。本実施の形態においては、アドレス初期化変数の配置先アドレス値は、ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域に保持される。
【００８３】
図２０は、初期化コード生成部３１１により追加された中間コードの一例を模式的に示す図である。中間コードi４７は、ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域に保持されるアドレス値が指す領域にＤＢＲの値を加算する関数を表す中間コードである。
コード生成部１１６は、初期化コード生成部３１１により生成された中間コード以外の中間コードを参照して、オブジェクトプログラム２１を生成すると共に、初期化コード生成部３１１により生成された中間コードを参照して、ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域に保持されるアドレス値が指す領域にＤＢＲの値を加算する機械語コードを生成し、生成した機械語コードを、Ｃ言語の言語仕様に対応した一般的なスタートアッププログラムに追加することにより、スタートアッププログラム３１を生成する。
【００８４】
このとき生成された機械語コードは、元のスタートアッププログラム中のＲＯＭＤＡＴＡ領域の値をＤＡＴＡ領域へ転送する機械語コードと、main関数を呼び出す機械語コードとの間に挿入される。
以上の構成により、プログラム変換装置３００は、ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域にアドレス初期化変数の配置先のアドレス値を保持したオブジェクトプログラム２１と共に、ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域に保持されているアドレス値が指すアドレス初期値にＤＢＲの値を加算する命令を含むスタートアッププログラム３１を生成することができる。
【００８５】
次に、上述のように構成されたプログラム変換装置３００の動作について説明する。
ここでは、図８に示した動作と異なる動作について詳細に説明する。
図１９は、本発明の変形例に係るプログラム変換装置３００において、オブジェクトプログラム２１、及びスタートアッププログラム３１を生成する動作の流れを示す図である。
【００８６】
構文解析部１１１における動作（Ｓ５１）と、未処理の中間コードを処理対象とし中間コード修正処理を施す動作（Ｓ５２、Ｓ５３）とは、それぞれ実施の形態１において図８で示したＳ１、Ｓ２、及びＳ３の動作と同様である。
初期化コード生成部３１１は、Ｓ５３の中間コード修正処理において、アドレス初期化変数の配置先のアドレス値をＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域に保持させる中間コードが生成された場合、ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域の先頭から末尾までに保持される各アドレス値が指すアドレス初期化変数に、ＤＢＲの値を加算する関数の中間コードが既に生成されているか否かを判定する（Ｓ５４）。アドレス初期化変数にＤＢＲの値を加算する関数の中間コードが未だ生成されていない場合（Ｓ５４：Ｎｏ）、係る中間コードを生成する（Ｓ５５）。
【００８７】
図２０の中間コードを用いてい具体的に説明すると、例えば、処理対象が中間コードi43でありＳ５３の中間コード修正処理において中間コードi45が生成された場合、初期化コード生成部３１１は、Ｓ５５の動作において、中間コードi45で指定されているＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域に保持される値を用いて、アドレス初期化変数にＤＢＲの値を加算する中間コードi47を生成する。その後中間コードi44が処理対象となると、Ｓ５３の中間コード修正処理において中間コードi46が生成されるが、中間コードi47が既に生成されているため、初期化コード生成部３１１は、新たな中間コードを生成しない。
【００８８】
構文解析部１１１により生成された全ての中間コードの修正処理が終了した場合（Ｓ５２：Ｎｏ）、コード生成部１１６は、初期化コード生成部３１１が生成した中間コード以外の中間コードを参照してオブジェクトプログラム２１を生成すると共に、初期化コード生成部３１１が生成した中間コードを参照して、アドレス初期化変数にＤＢＲの値を加算する機械語コードを生成し、生成した機械語コードを、Ｃ言語の仕様に対応した一般的なスタートアッププログラムに追加することにより、スタートアッププログラム３１を生成する（Ｓ５６）。
【００８９】
以上の動作により、プログラム変換装置３００は、本実施の形態２に係るスタートアッププログラム３１を生成することができる。
尚、本変形例では、ソースプログラム由来のオブジェクトプログラムとは別に、ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域に保持されたアドレス値を用いてアドレス初期化変数にＤＢＲの値を加算する機械語コードを含むスタートアッププログラムを生成しているが、ＡＩ＿ＤＡＴＡ＿ＡＤＤＲ領域に保持された値を用いてアドレス初期化変数にＤＢＲの値を加算する関数の機械語コードを生成し、ソースコード由来の機械語コードと合せて１つのオブジェクトプログラムを生成するとしてもよい。
＜実施の形態３＞
実施の形態３は、アドレス初期化変数のみを配置する専用領域（以下、ＡＩ＿ＤＡＴＡ領域とする）を新たに設け、当該領域に配置されたアドレス初期化変数を、ループ処理により簡便に実アドレスで初期化する方法に関する。
（構成）
本実施の形態３に係るプログラム変換装置４００は、具体的にはプロセッサ、ＲＡＭ、変換プログラムを記録したＲＯＭ、ハードディスク等からなるコンピュータシステムであって、当該プロセッサがＲＯＭに記録された変換プログラムを実行することでその機能を実現する。
【００９０】
図２１は、実施の形態３に係るプログラム変換装置４００の機能構成を示す図である。また、図にはプログラム変換装置４００に入力されるソースプログラム１０、プログラム変換装置４００から出力されるオブジェクトプログラム２２、オブジェクトプログラム２２と共に連結編集されるスタートアッププログラム３２、及び、実行形式プログラム４２も併せて示している。これらソースプログラム１０、オブジェクトプログラム２２、スタートアッププログラム３２、実行形式プログラム４２は、ハードディスク等の記録媒体に記録される。
【００９１】
図２１に示すプログラム変換装置４００の構成は実施の形態２で説明したプログラム変換装置２００の翻訳部２１０を翻訳部４１０に置き換えたものである。
なお、プログラム変換装置２００と同様の構成要素には同一の符号を付し、それらの説明を省略する。
翻訳部４１０は、プログラム変換装置２００の翻訳部２１０
から変数アドレス配置部２１２を取り除き、変数配置部２１１を変数配置部４１１に置き換えたものである。
【００９２】
変数配置部４１１は、変数定義検出部１１２から、外部変数及び静的変数を定義する中間コードの通知を受け付け、通知された変数定義の中間コードを参照して、定義される各変数の種類に応じて配置領域を決定し、各変数定義の中間コードに決定した配置先を示す配置領域情報を付加する。
具体的には、変数配置部４１１は、外部変数及び静的変数のうち初期値が明示されており且つ初期値がアドレス値であるもの、即ちアドレス初期化変数を、専用領域であるＡＩ＿ＤＡＴＡ領域に配置すると決定し、外部変数及び静的変数のうち初期値が明示されており且つアドレス初期化変数以外のものを、ＤＡＴＡ領域に配置すると決定し、外部変数及び静的変数のうち初期値が明示されておらず実行形式プログラムの起動時に０で初期化されるものを、ＢＳＳ領域に配置すると決定する。ＡＩ＿ＤＡＴＡ領域は、本実施の形態において新規に定義される領域であり、当該領域には、アドレス初期化変数のみが配置される。
【００９３】
図２２は、本実施の形態３に係るプログラム変換装置４００が、ソースプログラム１０で定義されている外部変数及び静的変数を配置する領域を示す。変数配置部４１１は、変数定義検出部１１２から、外部変数及び静的変数を定義する中間コードとて図３に示す中間コードが通知された場合、図２２に示すように変数ａをＢＳＳ領域に、変数ｂをＤＡＴＡ領域に、変数ｐａ及びｐｂをＡＩ＿ＤＡＴＡ領域に配置すると決定する。
【００９４】
図２３は、変数配置部４１１により配置領域情報が付加された中間コードの一例を模式的に示す図である。
コード生成部１１６は、実施の形態２と同様に、プログラム中の外部変数、及び静的変数を変数配置部４１１により決定された変数の配置領域に従って、ＤＡＴＡ領域、ＢＳＳ領域、及びＡＩ＿ＤＡＴＡからなる変数配置領域に配置すると共に、実行命令、及び数値（ＤＡＴＡ領域に配置した変数の初期値、ＡＩ＿ＤＡＴＡ領域に配置した変数の初期値等）をＲＯＭＤＡＴＡ領域、ＡＩ＿ＲＯＭＤＡＴＡ領域、及びＴＥＸＴ領域からなるコード配置領域に配置し、中間コード対応する機械語コードのオブジェクトプログラム２２を生成する。
【００９５】
このとき、ＲＯＭＤＡＴＡ領域が、ＤＡＴＡ領域と対になって生成されるのと同様に、ＡＩ＿ＤＡＴＡ領域の初期値を格納するためのＡＩ＿ＲＯＭＤＡＴＡ領域が、ＡＩ＿ＤＡＴＡ領域と対になって生成される。ＡＩ＿ＲＯＭＤＡＴＡ領域には、ＡＩ＿ＤＡＴＡ領域に変数が配置される順番と同じ順番で、それぞれの変数の初期値が配置される。
図２４は、実施の形態３に係るオブジェクトプログラム２２と、プログラムの配置アドレスの関係を示す図である。図の左側の列は、ニーモニックで表現したオブジェクトプログラム２２の一例である。図の中央の列は、オブジェクトプログラム２２における変数、数値、及び実行命令の配置アドレスを示す。
【００９６】
ここで、ＡＩ＿ＲＯＭＤＡＴＡ領域に保持されるアドレス初期化変数の初期値（アドレス値）は、実施の形態２においてＲＯＭＤＡＴＡ領域に保持されるアドレス初期化変数の初期値と同様に、変数配置領域の先頭からのオフセット値で表現される。
連結編集部１２０は、オブジェクトプログラム２２及び実施の形態３に特有な処理を含むスタートアッププログラム３２を連結編集し、実行形式プログラム４０を生成する。
【００９７】
最終的にプログラム変換装置４００から出力される実行形式プログラム４２は、図２４のオブジェクトプログラム２２に図２５のスタートアッププログラム３２が連結編集され、スタートアッププログラム３２の機械語コードがＴＥＸＴ領域に配置されたものである。
以上の構成により、プログラム変換装置４００は、ＡＩ＿ＤＡＴＡ領域に、アドレス初期化変数のみを配置した実行形式プログラム４２を生成することができる。
（スタートアッププログラム３２の詳細）
次に、本実施の形態３のプログラム変換装置４００において、オブジェクトプログラム２２と連結編集されるスタートアッププログラム３２について説明する。
【００９８】
スタートアッププログラム３２は、プログラム変換装置４００の機能を実現する変換プログラムと共に提供され、ハードディスク等の記録媒体に記録されている。
図２５は、実施の形態３に係るスタートアッププログラム３２の一例を示す。
スタートアッププログラム３２は、従来のＰＩＣ方式に対応したスタートアッププログラムに含まれる機械語コード（ｓｔ３１、ｓｔ３２、ｓｔ３３、ｓｔ３６に加えて、さらに、本発明に特有な機械語コードとして、ＡＩ＿ＤＡＴＡ領域の変数にＡＩ＿ＲＯＭＤＡＴＡ領域に保持されている値を転送する機械語コード（ｓｔ３４）、及び、ＡＩ＿ＤＡＴＡ領域の変数にＤＢＲの値を加算する機械語コード（ｓｔ３５）を含む。これらの機械語コードのうち、ｓｔ３５は、ＤＢＲの設定、及び、ｓｔ３４の実行後から、ｍａｉｎ関数の呼び出しの前までの間に実行される。
（オブジェクトプログラム２２の詳細）
次に、図２４を用いてプログラム変換装置４００が生成するオブジェクトプログラム２２の詳細について説明する。
【００９９】
オブジェクトプログラム２２には、ＢＳＳ領域、ＤＡＴＡ領域、ＲＯＭＤＴＡ領域、及びＴＥＸＴ領域に関して、実施の形態２のオブジェクトプログラム２１と同様の機械語コード（ｈ３１、ｈ３２、ｈ３４、及びｈ３６）が含まれる。
オブジェクトプログラム２２には、さらに、ｈ３３にＡＩ＿ＤＡＴＡ領域の先頭及び末尾の区切りと、アドレス初期化変数のために変数型に応じたサイズのメモリを確保する機械語コードが含まれ、ｈ３５には、ＡＩ＿ＲＯＭＤＴＡ領域の先頭及び末尾の区切りと、アドレス初期化変数の初期値を格納したメモリを当該ＡＩ＿ＲＯＭＤＴＡ領域に確保する機械語コードが含まれる。ただし、ＡＩ＿ＲＯＭＤＴＡ領域に保持されるアドレス初期化変数の初期値は、変数配置領域の先頭からのオフセット値で表現される。
【０１００】
上述のオブジェクトプログラム２２では、ＡＩ＿ＤＡＴＡ領域、及びＡＩ＿ＲＯＭＤＡＴＡ領域が新たに設けられ、ＡＩ＿ＤＡＴＡ領域に、アドレス初期化変数のみが配置され、ＡＩ＿ＲＯＭＤＡＴＡ領域に、アドレス初期化変数の初期値のみが保持される点に特徴がある。
これにより、オブジェクトプログラム２２と図２５に示すスタートアッププログラム３２とが連結編集された実行形式プログラム４２は、任意のアドレスに配置可能なＰＩＣ方式の機械語コードでありながら、スタートアップルーチンの機械語コードｓｔ３４、及びｓｔ３５のループ処理により、アドレス初期化変数を容易に実アドレスで初期化できる。
（動作）
次に、上述のように構成されたプログラム変換装置４００の動作について説明する。
【０１０１】
ここでは、特に実施の形態２において説明したプログラム変換装置２００と動作が異なる、中間コード修正処理について詳細に説明する。
図２６は、本実施の形態３に係るプログラム変換装置４００における中間コード修正処理の動作の流れを示す図である。
変数定義検出部１１２におけるＳ６１及びＳ６２の動作と、変数配置部４１１におけるＳ６３からＳ６６までの動作とは、それぞれ実施の形態２において図１６で示したＳ３１からＳ３６の各動作と同様に動作する。
【０１０２】
変数配置部４１１は、処理対象の中間コードにおいて明示されている初期値が、アドレス値であるか場合（Ｓ６５：Ｙｅｓ）に、変数をＡＩ＿ＤＡＴＡ領域に配置することを示す配置領域情報を、中間コードに付加する（Ｓ６７）。
以上の動作により、アドレス初期化変数のみを、ＡＩ＿ＤＡＴＡ領域に配置し、それ以外の外部変数及び静的変数の変数配置は、従来と同様な中間コード群を生成することができる。
（実行形式プログラム４２の動作）
次に、プログラム変換装置４００が生成する実行形式プログラム４２の動作について説明する。
【０１０３】
ただし、実際に実行される機械語コードは、実行形式プログラム４２の機械語コードであるが、ここでは図２５のスタートアッププログラム３２中の機械語コードに付した符号を用いて説明する。
先ず、実行プログラム４２がマイクロコンピュータ組み込み機器にロードされたメモリレイアウトについて説明する。図２４の右側の列は、実行形式プログラム４２が、マイクロコンピュータ組み込み機器にロードされたメモリレイアウトを示す。
【０１０４】
ＲＯＭＤＡＴＡ領域、ＡＩ＿ＲＯＭＤＡＴＡ領域、及び、ＴＥＸＴ領域からなるコード配置領域は、マイクロコンピュータ組み込み機器のＲＯＭに配置され、ＢＳＳ領域、ＤＡＴＡ領域、及び、ＡＩ＿ＤＡＴＡ領域からなる変数配置領域はマイクロコンピュータ組み込み機器の起動時にＲＡＭに配置される。
図２７は、実行形式プログラム４２の動作の流れを示す図である。電源投入時あるいはリセット時に、前記マイクロコンピュータ組み込み機器は、ＴＥＸＴ領域に含まれるスタートアップルーチンの機械語コードを読み出し実行する。
【０１０５】
変数定義検出部１１２におけるＳ６１及びＳ６２の動作と、変数配置部４１１におけるＳ６３からＳ６６までの動作とは、それぞれ実施の形態２において図１６で示したＳ３１からＳ３６の各動作と同様である。
スタートアップルーチンにおけるＤＢＲを設定する動作（Ｓ７１）、ＢＳＳ領域を０に初期化する動作（Ｓ７２）、及び、ＤＡＴＡ領域へＲＯＭＤＡＴＡ領域の値を転送する動作（Ｓ７３）は、実施の形態２の実行形式プログラム４１での動作（図１７のＳ４１からＳ４３）と同様である。
【０１０６】
次に、マイクロコンピュータ組み込み機器は、機械語コードｓｔ３４に従い、ＡＩ＿ＤＡＴＡ領域へＡＩ＿ＲＯＭＤＡＴＡ領域の値を転送する（Ｓ７４）。この動作は、ＲＯＭ上のＡＩ＿ＲＯＭＤＡＴＡ領域に保持されている値を、ＲＡＭ上のＡＩ＿ＤＡＴＡ領域へ、ループ処理によりコピーすることにより実行される。
続いて、マイクロコンピュータ組み込み機器は、機械語コードｓｔ３５に従い、ＡＩ＿ＤＡＴＡ領域の各アドレス初期化変数の値にＤＢＲの値を加算する（Ｓ７５）。この動作は、ＲＡＭ上のＡＩ＿ＤＡＴＡ領域の先頭アドレスから末尾のアドレスまでに格納されてい各アドレス初期化変数に、ループ処理によって、ＤＢＲの値を加算することにより実行される。
【０１０７】
Ｓ７４の動作でオフセット値が設定された各アドレス初期化変数に、Ｓ７５の動作でＤＢＲの値が加算され、各アドレス初期化変数は、実アドレスで初期化される。
その後、マイクロコンピュータ組み込み機器は機械語コードｓｔ２５に従い、ｍａｉｎ関数を呼び出す（Ｓ７６）。
以上の動作により、ｍａｉｎ関数が呼び出される時点で、実行形式プログラム４２がＲＡＭ上にロードされた実アドレスに応じた初期値が、全てのアドレス初期化変数に設定されているため、ｍａｉｎ関数の呼び出しにより、実行形式プログラム４２は正しく動作する。
（まとめ）
以上のように、本実施の形態３に係るプログラム変換装置４００は、ソースプログラムで定義されているアドレス初期化変数のみを、ＡＩ＿ＤＡＴＡ領域に配置し、アドレス初期化変数の初期値のみを、ＡＩ＿ＲＯＭＤＡＴＡ領域に保持させるので、ＡＩ＿ＤＡＴＡ領域にＡＩ＿ＲＯＭＤＡＴＡ領域の値を転送した後、ＡＩ＿ＤＡＴＡ領域にＤＢＲの値を加算することにより、各アドレス初期化変数を容易に実アドレスで初期化することが可能なＰＩＣ方式の実行形式プログラムを生成できる。
【０１０８】
さらに、ＡＩ＿ＲＯＭＤＡＴＡ領域に保持された値をＡＩ＿ＤＡＴＡ領域へ転送する処理は、ＲＯＭＤＡＴＡ領域に値保持された値をＤＡＴＡ領域へ転送する従来の処理と同様に、ループ処理の機械語コードで実現可能であり、ＡＩ＿ＤＡＴＡ領域へＤＢＲの値を加算する処理も、ループ処理の機械語コードで実現可能であるため、プログラム中にアドレス初期化変数が幾つ定義されていても、スタートアッププログラムのコード量が増減することがない。
（変形例）
尚、実施の形態２の変形例と同様に、プログラム変換装置がＣ言語の仕様に対応した一般的なスタートアッププログラムに、本発明に特有な処理の機械語コードを追加することにより、スタートアッププログラム３２を生成する構成としてもよい。
【０１０９】
以下に、プログラム変換装置においてスタートアッププログラム３２を生成する変形例について説明する。
図２８は、本発明の変形例に係るプログラム変換装置５００の機能構成を示す図である。
図２８に示すプログラム変換装置５００の構成はプログラム変換装置４００に初期化コード生成部５１１を加えたものである。
【０１１０】
初期化コード生成部５１１は、変数配置部４１１により配置領域情報が付加された中間コードのうち、アドレス初期化変数を定義する中間コードを参照し、当該中間コードに付加された配置領域情報が示す領域に、初期値を保持する領域から値を転送する関数の中間コードと、配置領域情報が示す領域に配置される変数にＤＢＲの値を加算する関数の中間コードを生成する。
【０１１１】
図２９は、初期化コード生成部５１１により追加された中間コードの一例を模式的に示す図である。中間コードi65は、ＡＩ＿ＤＡＴＡ領域にＡＩ＿ＲＯＭＤＡＴＡ領域の値を転送する関数を表す中間コードであり、中間コードi66は、ＡＩ＿ＤＡＴＡ領域に配置される変数にＤＢＲの値を加算する関数を表す中間コードである。
コード生成部１１６は、初期化コード生成部５１１により生成された中間コード以外の中間コードを参照して、オブジェクトプログラム２２を生成すると共に、初期化コード生成部５１１により生成された中間コードに対応する機械語コードを生成し、Ｃ言語の言語仕様に対応した一般的なスタートアッププログラムに追加することにより、スタートアッププログラム３２を生成する。
【０１１２】
このとき生成された機械語コードは、元のスタートアッププログラム中のmain関数を呼び出す機械語コードの間に挿入される。
以上の構成により、プログラム変換装置５００は、ＡＩ＿ＤＡＴＡ領域にアドレス初期化変数を配置したオブジェクトプログラム２２と共に、ＡＩ＿ＤＡＴＡ領域にＡＩ＿ＲＯＭＤＡＴＡ領域の値を転送する命令及びＡＩ＿ＤＡＴＡ領域に配置した変数にＤＢＲの値を加算する命令を含むスタートアッププログラム３２を生成することができる。
【０１１３】
次に、上述のように構成されたプログラム変換装置５００の動作について説明する。
ここでは、図１９に示したプログラム変換装置３００の動作と異なる動作について説明する。
図３０は、本発明の変形例に係るプログラム変換装置５００において、オブジェクトプログラム２２、及びスタートアッププログラム３２を生成する動作の流れを示す図である。
【０１１４】
Ｓ８１からＳ８３までの動作は、図１９のＳ５１からＳ５３までの動作と同様である。
初期化コード生成部５１１は、処理対象の中間コードがアドレス初期化変数を定義する中間コードである場合に、Ｓ８３で付加された配置領域情報に着目し、当該配置領域情報が示す領域を初期化する中間コードが、未だ生成されていないならば（Ｓ８４：Ｙｅｓ）、配置領域情報が示す領域に初期値を転送する中間コードを生成し（Ｓ８５）、さらに、配置領域情報が示す領域の変数にＤＢＲの値を加算する中間コードを生成する（Ｓ８６）。
【０１１５】
図２９の中間コードを用いてい具体的に説明すると、例えば、処理対象が中間コードi62である場合に、初期化コード生成部５１１は、中間コードi63に付加された配置領域情報により示されるＡＩ＿ＤＡＴＡ領域に、ＡＩ＿ＲＯＭＤＡＴＡ領域の値を転送する中間コードi65と、配置領域情報により示されるＡＩ＿ＤＡＴＡ領域の変数にＤＢＲの値を加算する中間コードi66とを生成する。
【０１１６】
その後中間コードi64が処理対象となるが、中間コードi64に付加された配置領域情報が示す領域もＡＩ＿ＤＡＴＡ領域であるので、初期化コード生成部５１１は、新たな中間コードを生成しない。
構文解析部１１１により生成された全ての中間コードの修正処理が終了した場合（Ｓ８２：Ｎｏ）、コード生成部１１６は、初期化コード生成部５１１が生成した中間コード以外の中間コードを参照してオブジェクトプログラム２２を生成すると共に、初期化コード生成部５１１が生成した中間コードに対応する機械語コードを生成し、生成した機械語コードを、一般的なスタートアッププログラムに追加することにより、スタートアッププログラム３２を生成する（Ｓ８７）。
【０１１７】
以上の動作により、プログラム変換装置５００は、本実施の形態３に係るスタートアッププログラム３２を生成することができる。
尚、本変形例では、ソースプログラム由来のオブジェクトプログラムとは別に、ＡＩ＿ＤＡＴＡ領域を初期化する機械語コード（ｓｔ３４、ｓｔ３５）を含むスタートアッププログラムを生成しているが、配置領域情報が示す領域に初期値を転送する関数の機械語コードと、配置領域情報が示す領域の変数にＤＢＲの値を加算する関数の機械語コードとを生成し、ソースコード由来の機械語コードと合せて１つのオブジェクトプログラムを生成するとしてもよい。
【０１１８】
また、プログラム変換装置５００は、配置領域情報が示す領域に初期値を転送する機械語コード（ｓｔ３４）と、配置領域情報が示す領域の変数にＤＢＲの値を加算する機械語コード（ｓｔ３５）とを生成し、元となるスタートアッププログラムに追加するとしたが、本発明は、ｓｔ３４、及びｓｔ３５の何れか一方の機械語コードを生成し、他方の機械語コードが既に含まれているスタートアッププログラムに追加するとしてもよい。
【０１１９】
また、複数のオブジェクトプログラムにおいて、アドレス初期化変数を配置する異なる領域が定義されている場合、連結編集部１２０において連結編集する際に、これら複数の領域ごとに、初期値を転送する機械語コードと領域内の変数にＤＢＲの値を加算する機械語コードとを生成するとしてもよいし、これら複数の領域を連続する１の領域に再配置し、当該１の領域に初期値を転送する機械語コードと、当該１の領域内の変数にＤＢＲの値を加算する機械語コードとを生成するとしてもよい。
＜その他の変形例＞
尚、本発明を上記の実施の形態に基づいて説明してきたが、本発明は、上記の実施の形態に限定されないのはもちろんである。以下のような場合も本発明に含まれる。
【０１２０】
（１）本発明は、上記に示す方法であるとしてもよい。また、これらの方法をコンピュータにより実現するコンピュータプログラムであるとしてもよいし、前記コンピュータプログラムからなるデジタル信号であるとしてもよい。
また、本発明は、前記コンピュータプログラム又は前記デジタル信号をコンピュータ読み取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ、ＤＶＤ−ＲＯＭ、ＤＶＤ−ＲＡＭ、ＢＤ（Ｂｌｕ−ｒａｙ  Ｄｉｓｃ）、半導体メモリなどに記録したものとしてもよい。また、これらの記録媒体に記録されている前記コンピュータプログラム又は前記デジタル信号であるとしてもよい。
【０１２１】
また、本発明は、前記コンピュータプログラム又は前記デジタル信号を、電気通信回線、無線又は有線通信回線、インターネットを代表とするネットワーク等を経由して伝送するものとしてもよい。
また、本発明は、マイクロプロセッサとメモリとを備えたコンピュータシステムであって、前記メモリは、上記コンピュータプログラムを記憶しており、前記マイクロプロセッサは、前記コンピュータプログラムに従って動作するとしてもよい。
【０１２２】
また、前記プログラム又は前記デジタル信号を前記記録媒体に記録して移送することにより、又は前記プログラム又は前記デジタル信号を前記ネットワーク等を経由して移送することにより、独立した他のコンピュータシステムにより実施するとしてもよい。
（２）実施形態１乃至３では変数の配置領域を示す配置領域情報が中間コードに付加されるとしたが、変数の配置領域を決定した際に、配置領域情報を一括した変数配置表を生成し、中間コードとは別にコード生成部１１６へ出力するとしてもよい。
【０１２３】
（３）スタートアッププログラムは、プログラム変換装置の機能を実現する変換プログラムとともに提供されるとしたが、スタートアッププログラムと、変換プログラムとは個別に提供されるとしてもよい。
（４）実施形態１乃至３ではオブジェクトプログラムやスタートアッププログラムを文字（ニーモニック）で表現しているが、バイナリデータで表現されるものであってもよい。
【０１２４】
（５）上記実施の形態及び上記変形例をそれぞれ組み合わせるとしてもよい。
【産業上の利用可能性】
【０１２５】
本発明の活用例としては、アドレス初期化変数の定義を含むソースプログラムから、ＰＩＣ方式の実行形式プログラムを生成するプログラム変換装置等である。ＰＩＣ方式の実行形式プログラムを生成することにより、製品出荷後のプログラム入れ替えや機能追加、不具合修正などの用途にも応用できる。
【図面の簡単な説明】
【０１２６】
【図１】Ｃ言語によって記述されたソースプログラムの一例を示す。
【図２】実施の形態１に係るプログラム変換装置１００の機能構成を示す図である。
【図３】外部変数及び静的変数の定義に係る中間コードの一例を模式的に示す図である。
【図４】本実施の形態１に係るプログラム変換装置１００が、ソースプログラム１０で定義されている外部変数及び静的変数を配置する領域を示す図である。
【図５】動的初期化関数生成部１１４により変換された後の中間コードの一例を示す図である。
【図６】実施の形態１に係るオブジェクトプログラム２０と、プログラムの配置アドレスの関係を示す図である。
【図７】実施の形態１に係るスタートアッププログラム３０の一例を示す。
【図８】本実施の形態１に係るプログラム変換装置１００において、オブジェクトプログラムを生成する動作の流れを示す図である。
【図９】本実施の形態１に係るプログラム変換装置１００における中間コード修正処理の動作の流れを示す図である。
【図１０】実行形式プログラム４０の動作の流れを示す図である。
【図１１】実施の形態２に係るプログラム変換装置２００の機能構成を示す図である。
【図１２】本実施の形態２に係るプログラム変換装置２００が、ソースプログラム１０で定義されている外部変数及び静的変数を配置する領域を示す。
【図１３】変数アドレス配置部により追加された中間コードの一例を示す図である。
【図１４】実施の形態２に係るオブジェクトプログラム２１と、プログラムの配置アドレスの関係を示す図である。
【図１５】実施の形態１に係るスタートアッププログラム３１の一例を示す。
【図１６】本実施の形態２に係るプログラム変換装置２００における中間コード修正処理の動作の流れを示す図である。
【図１７】実行形式プログラム４１の動作の流れを示す図である。
【図１８】本発明の変形例に係るプログラム変換装置３００の機能構成を示す図である。
【図１９】本発明の変形例に係るプログラム変換装置３００において、オブジェクトプログラム、及びスタートアッププログラムを生成する動作の流れを示す図である。
【図２０】初期化コード生成部３１１により追加された中間コードの一例を示す図である。
【図２１】実施の形態３に係るプログラム変換装置４００の機能構成を示す図である。
【図２２】本実施の形態３に係るプログラム変換装置４００が、ソースプログラム１０で定義されている外部変数及び静的変数を配置する領域を示す。
【図２３】変数配置部４１１により配置領域情報が付加された中間コードの一例を模式的に示す図である。
【図２４】実施の形態３に係るオブジェクトプログラム２２と、プログラムの配置アドレスの関係を示す図である。
【図２５】実施の形態３に係るスタートアッププログラム３２の一例を示す。
【図２６】本実施の形態３に係るプログラム変換装置４００における中間コード修正処理の動作の流れを示す図である。
【図２７】実行形式プログラム４２の動作の流れを示す図である。
【図２８】本発明の変形例に係るプログラム変換装置５００の機能構成を示す図である。
【図２９】初期化コード生成部５１１により追加された中間コードの一例を模式的に示す図である。
【図３０】本発明の変形例に係るプログラム変換装置５００において、オブジェクトプログラム２２、及びスタートアッププログラム３２を生成する動作の流れを示す図である。
【符号の説明】
【０１２７】
１０    ソースプログラム
１１    定義部分
１２    定義部分
２０、２１、２２
オブジェクトプログラム
３０、３１、３２
スタートアッププログラム
４０、４１、４２
実行形式プログラム
１００、２００、３００、４００、５００
プログラム変換装置
１１０、２１０、３１０、４１０、５１０
翻訳部
１１１    構文解析部
１１２    変数定義検出部
１１３    動的初期化判定部
１１４    動的初期化関数生成部
１１５    テーブル登録部
１１６    コード生成部
１２０    連結編集部
２１１、４１１
変数配置部
２１２    変数アドレス配置部
３１１、５１１
初期化コード生成部
【図１】
2006024154.tif 000003
【図２】
2006024154.tif 000004
【図３】
2006024154.tif 000005
【図４】
2006024154.tif 000006
【図５】
2006024154.tif 000007
【図６】
2006024154.tif 000008
【図７】
2006024154.tif 000009
【図８】
2006024154.tif 000010
【図９】
2006024154.tif 000011
【図１０】
2006024154.tif 000012
【図１１】
2006024154.tif 000013
【図１２】
2006024154.tif 000014
【図１３】
2006024154.tif 000015
【図１４】
2006024154.tif 000016
【図１５】
2006024154.tif 000017
【図１６】
2006024154.tif 000018
【図１７】
2006024154.tif 000019
【図１８】
2006024154.tif 000020
【図１９】
2006024154.tif 000021
【図２０】
2006024154.tif 000022
【図２１】
2006024154.tif 000023
【図２２】
2006024154.tif 000024
【図２３】
2006024154.tif 000025
【図２４】
2006024154.tif 000026
【図２５】
2006024154.tif 000027
【図２６】
2006024154.tif 000028
【図２７】
2006024154.tif 000029
【図２８】
2006024154.tif 000030
【図２９】
2006024154.tif 000031
【図３０】
2006024154.tif 000032