(57)【特許請求の範囲】
【請求項１】
ソースプログラムを記憶装置から入力し、オブジェクトプログラムを記憶装置に出力するコンパイル装置であって、
動的構造体変数を構成する要素のなかで、初期値が指定されている要素の割合が所定値以上である場合に、動的変数に設定する初期値を記憶するための初期値設定領域を出力されるオブジェクトプログラム内に静的に獲得する初期値設定領域獲得手段と、
獲得した前記初期値設定領域に対して初期値を設定する初期値設定領域初期化手段と、
プログラムの実行時に動的変数の領域を動的に獲得した際に、動的構造体変数を構成する要素のなかで、初期値が指定されている要素の割合が所定値以上である場合に、前記初期値設定領域の内容を前記動的に獲得した領域に複写するコードを前記オブジェクトプログラム内に生成し、そうでない場合には、初期値が指定されている要素に対してのみ値を設定するコードを前記オブジェクトプログラム内に生成する変数初期化用オブジェクトコード生成手段と
を有するコンパイル装置。
【請求項２】
前記初期値設定領域獲得手段は動的構造体変数の一つの型に対して初期値設定領域を一つだけ獲得する、請求項１記載のコンパイル装置。
【請求項３】
未定義値を検出するための所定の値を動的構造体変数の各要素に初期値として設定する手段を有する請求項１又は２記載のコンパイル装置。
【請求項４】
コンピュータに、
ソースプログラムを記憶装置から読み込ませ、
動的構造体変数を構成する要素のなかで、初期値が指定されている要素の割合が所定値以上である場合に、動的変数に設定する初期値を記憶するための初期値設定領域を出力するオブジェクトプログラム内に静的に獲得させ、
獲得した前記初期値設定領域に対して初期値を設定させ、
プログラムの実行時に動的変数の領域を動的に獲得した際に、動的構造体変数を構成する要素のなかで、初期値が指定されている要素の割合が所定値以上である場合に、前記初期値設定領域の内容を前記動的に獲得した領域に複写するコードを前記オブジェクトプログラム内に生成させ、そうでない場合には、初期値が指定されている要素に対してのみ値を設定するコードを前記オブジェクトプログラム内に生成させ、
生成されたオブジェクトプログラムを記憶装置に出力させる
プログラムを記録したコンピュータ読取可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、入力されたソースプログラムをコンパイルしてオブジェクトプログラムを生成するコンパイラに関し、特に動的な構造体変数の初期化に関する。
【０００２】
【従来の技術】
コンピュータプログラムは、通常何らかのプログラミング言語で記述したソースプログラム（ソースコード）を作成し、それをコンパイラでオブジェクトコードに変換し、一つまたは複数のオブジェクトコードをリンクすることで実行形式のプログラムとなる。
【０００３】
多くのプログラミング言語はその文法規約として構造体変数をサーポートしている。また、変数は実行形式のプログラムを作成した時点でその変数のための記憶領域が獲得される静的変数と、プログラムを実行する際に動的に記憶領域が獲得される動的変数とがある。
従来のコンパイラでは静的変数に対しては初期値の設定（変数の宣言の際に初期値を指定すること）が可能であったが、動的な構造体変数への初期値の設定は不可能であった。これは、静的変数はコンパイルの際にデータ領域が獲得されるので、コンパイルの際に値を設定することが可能であるのに対し、動的変数はコンパイルの際にはデータ領域が存在していないので、コンパイルの際に値を設定することができないためである。
【０００４】
【発明が解決しようとする問題点】
このため、プログラム開発者はソースプログラム作成時に変数の宣言とは別に変数に対する値の設定を記述する必要があった。また、値の設定は構造体変数を構成する個々の要素に対する値の設定として記述されるため、実行形式プログラムのサイズが肥大してしまっていた。
【０００５】
また、構造体の各要素毎に要素の参照の際に値が設定済みかどうかをチェックすることはできなかった。
本発明は、動的構造体変数に対して初期値が設定できないという問題点および、この問題点から関連して発生するその他の問題点を解決するものである。
【０００６】
【問題を解決するための手段】
そこで、本願発明では、ソースプログラムを入力し、オブジェクトプログラムを出力するコンパイル装置であって、動的変数に設定する初期値を記憶するための初期値設定領域を出力されるオブジェクトプログラム内に静的に獲得する初期値設定領域獲得手段と、獲得した前記初期値設定領域に対して初期値を設定する初期値設定領域初期化手段と、プログラムの実行時に動的変数の領域を動的に獲得した際に、前記初期値設定領域の内容を前記動的に獲得した領域に複写するコードを生成する変数初期化用オブジェクトコード生成手段とを有するコンパイル装置によって上記問題を解決する。
【０００７】
【発明の実施の形態】
図１は、プログラムがコンピュータ上でどのように実行されるかを模式的に示す図である。コンピュータ４は図示しないＣＰＵ、主記憶装置（メモリ）、外部記憶装置、表示装置、キーボード等で構成される。外部記憶装置にはプログラムやデータがファイルとして格納される。外部記憶装置のファイルに格納されている実行形式プログラム１はメモリ上にロードされ、ＣＰＵによって、実行される。ＯＳ３はコンピュータのハードウェア資源と実行形式プログラムを制御するものである。ライブラリ２は一種の実行形式プログラムであって、複数の実行形式プログラムから共通に呼び出されるものである。
【０００８】
実行形式プログラム１を作成するには、図２に示すエディタ５やコンパイラ６やリンカ７を利用する。エディタ５、コンパイラ６、リンカ７はいずれも実行形式のプログラムである。エディタ５は実行形式プログラムのもととなるソースプログラム８を作成するために利用される。作成したソースプログラムはソースファイルとしてファイルに格納される。
【０００９】
コンパイラ６はソースプログラム８をオブジェクトプログラム１２に変換するプログラムであって、図３に示すように、構文解析部９、最適化処理部１０、コード生成部１１によって構成される。
構文解析部９はファイルに格納されているソースプログラム８を読み込んで、所定の文法規則に応じた構文解析を行い、対応する中間言語を生成する。最適化処理部１０は構文解析部９によって生成された中間言語を、より実行効率がよくなるように変換する。コード生成部１１は最適化処理部１０によって変換して得られた中間言語をプログラムが実行されるコンピュータに適したオブジェクトプログラム１２に変換する。
【００１０】
図４に示すとおり、コンパイラ６によって生成された複数のオブジェクトプログラム（１２−１、１２−２、１２−３等）はリンカ７によって結合され、実行形式プログラム１が生成される。
コンパイラ６はコンパイラ６を実行するためのコマンドをキーボードから入力する等して起動される。コンパイラ６を起動する際には、コマンドと共に、ソースプログラムを格納したソースファイル名やコンパイラに対する各種の指示をオプションとして指示する。オプションの一例として実行時の未定義値検出指示オプションがある。
【００１１】
未定義値検出指示オプションはプログラムの実行中に、プログラム中で利用される変数を参照する際に、その変数に対してすでに値が代入されているか否かをチェックし、もしも値が代入されていなかった場合にはその旨のエラー表示を行なうような実行形式のプログラムを作成するためのオプションである。このオプションが指示された場合には変数の参照に先立って何らかの特定の処理を行なう必要があるため、プログラムの実行効率は低下するが、プログラムのデバッグには非常に有用である。
【００１２】
構文解析部９はソースプログラムの構文解析中に動的構造体変数の定義を認識すると、図５に示す処理を行なう。
まず、ステップＳ２１において、未定義値検出オプションが指示されているか否かをチェックする。オプションが指示されている場合にはステップＳ２２にすすみ、指示されていない場合にはステップＳ２７に進む。
【００１３】
オプションが指示されていた場合、ステップＳ２２において動的構造対変数を初期化するために利用するテンプレート領域を確保する。ここで、同じ型の動的構造体変数のためのテンプレートが既に確保されている場合には、新たにテンプレート領域を確保することはしない。また、テンプレート領域は最終的には実行形式プログラム１に含まれる静的データ領域に確保される。
【００１４】
次にステップＳ２３、Ｓ２４、Ｓ２５、Ｓ２６において、確保したテンプレート領域に値を設定する。ソースプログラム中で動的構造体変数の要素に初期値が指定されている場合には、ステップＳ２５で指定されている初期値をその要素に対応するテンプレート中の領域に設定する。初期値が指定されていない場合は、同じ領域に１６進数の８ｂ８ｂ８ｂ８ｂを設定する。この値は生成された実行形式プログラム１を実行中にプログラム中の動的構造体変数の要素をアクセスする際に、その要素に対して既に値が設定されているか否かをチェックするために利用される。
【００１５】
即ち、動的構造体変数の要素をアクセスする際に、８ｂ８ｂ８ｂ８ｂが設定されていれば、その要素には値が設定されていなかった（未定義であって）と判定し、そうでなければ値が設定されていた( 定義済みであった）と判定すればよい。なお、定義済みであるか否かを判定するための値として、ここでは８ｂ８ｂ８ｂ８ｂを使用したが、プログラム中で使用されない値または、非常に低い確率でしか使用されず、実用上問題の無い値であればどのような値であってもよい。
【００１６】
また、ステップＳ２１の判定において、未定義値検出オプションが指定されていない場合には、ステップＳ２７において、動的構造体変数の複数の要素の内の１／５以上の要素に対してソースプログラム８中で初期値が指定されているか否かをチェックする。１／５以上の要素に対して初期値が指定されていればステップＳ２８に進み、１／５未満であれば処理を終了する。なお、ここで判定の基準とする値は必ずしも１／５である必要はなく、生成されるプログラムの実行効率が最善となる値を選択すればよい。
【００１７】
ステップＳ２８においては、ステップＳ２２と同様に動的構造体変数を初期化するために利用するテンプレート領域を確保する。同じ型の動的構造体変数のためのテンプレートが既に確保されている場合には、新たにテンプレート領域を確保することはしない。また、テンプレート領域は実行形式プログラム１の静的データ領域に確保される。
【００１８】
テンプレート領域を確保した後に、ステップＳ２９、Ｓ３０、Ｓ３１において、確保したテンプレート領域の、初期値が指定されている要素に対応する箇所に指定されている初期値を設定する。初期値が指定されていない要素に対しては何も値を設定しない。従って、そのような要素は値が不定値となる。
図７及び図８はソースプログラムの一部を示す例である。ともに、サブルーチンの定義部分の先頭を示していて、要素に初期値が設定されているか否かが部分的に相違する以外は同じである。
【００１９】
図７において、第１行目はサブルーチンの定義の開始を示す行である。文字列ｓｕｂｒｏｕｔｉｎｅが定義の開始を意味し、ｓｕｂはサブルーチンの名前がｓｕｂであることを示す。括弧で括られたｖａｒはサブルーチンｓｕｂにはパラメータが一つあって、その名前がｖａｒであることを示している。
サブルーチン内で定義される変数は全て動的変数である。即ちサブルーチン内で定義される構造体変数は動的構造体変数である。動的構造体変数を含む動的変数は実行形式プログラム１を実行中にプログラムの動的データ領域内に動的に確保される。サブルーチンのパラメタも同様である。
【００２０】
２行目から９行目は動的構造体変数の型を定義している。２行目のｔｙｐｅが型の定義の開始を示し、９行目のｅｎｄ  ｔｙｐｅが動的構造体変数の型の定義の終了を示す。また、２行目のａは定義する型の型名がａであることを示す。
３行目から８行目はそれぞれ動的構造体変数を構成する要素を定義している。各行のｉｎｔｅｇｅｒは要素が整数型であることを意味し、二つのコロン（：：）に続く文字列（ａ１、ａ２、ａ３、ａ４、ａ５、ａ６）はそれぞれ要素名を示し、要素名に続く等号（＝）に続く数値（１、２、３、４、５、６）はそれそれの要素に対する初期値を示している。
【００２１】
１０行目は１行目のｖａｒが型ａの構造体変数を要素とする３要素の配列変数であることを示している。
図８に示したソースプログラムも基本的には図７に示したものと同様の定義をするものである。ただし、図８に示したソースプログラムは要素ａ５のみに対して初期値を指定している。
【００２２】
構文解析部９のにおいて動的構造体変数を検出した場合には、図７に示したソースプログラムでは図５中のステップＳ２７においてＹの判定となり、図８に示したソースプログラムでは図５中のステップＳ２７においてＮの判定となる。
構文解析部９で中間言語を作成する際には、図６に示すフローチャートに従って中間言語が生成される。
【００２３】
まず、ステップＳ４１において、未定義値検出オプションが指示されているか否かをチェックする。オプションが指示されている場合にはステップＳ４２にすすみ、指示されていない場合にはステップＳ４３に進む。ステップＳ４３に進んだ場合、さらに、初期値が指定されている要素が動的構造体変数を構成する要素の１／５以上であるかどうか判定し、１／５以上の場合にはステップＳ４２に進み、１／５未満の場合にはステップＳ４４に進む。
【００２４】
なお、判定の基準は必ずしも１／５である必要はなく、図５のステップＳ２７の判定と一致していればよい。
ステップＳ４２では、図５のステップＳ２２またはＳ２８において領域を確保したテンプレートを用いて動的構造対変数を初期化するための中間言語を生成する。ここでは、テンプレート領域のデータを変数領域に一括して転送するための中間言語を生成する。
【００２５】
図９にステップＳ４２で生成される中間言語の一例を示す。図９に示した中間言語は、図７に示したソースプログラムをコンパイルする場合や、図８に示したソースプログラムを未定義値検出オプションを指示してコンパイルする場合に生成される。
１行目と３行目は、変数ｉを１から３まで変化させながら２行目を繰り返し実行することを意味している。２行目のＣＭＯＶＥは指定された二つの領域の間で指定されたバイト数のデータ転送を一括して行なうことを意味している。ＣＭＯＶＥの第一パラメータはデータの転送先を、第二パラメータは転送元を、第三パラメータは転送データのバイト数を示している。
【００２６】
一般にコンピュータのＣＰＵは連続するデータをある領域から別の領域に一括して転送する命令を備えており、ＣＭＯＶＥ中間言語はコード生成部１１においてそのような命令に変換される。
図１０にステップＳ４４で生成される中間言語の一例を示す。図１０に示した中間言語は、図８に示したソースコードを未定義値検出オプションを指定せずにコンパイルする場合に生成される。
【００２７】
１行目と４行目は、変数ｉを１から３まで変化させながら、２行目から３行目を繰り返し実行することを意味している。２行目はレジスタｒに数値５をロードすることを意味している。３行目はレジスタｒに格納されている値（この場合は５）を動的構造体変数の配列であるｖａｒのｉ番目の配列要素の構造体要素ａ５にストアすることを意味している。
【００２８】
一般にコンピュータのＣＰＵはレジスタに値を設定するためのロード命令およびメモリに値を格納するためのストア命令、またはこれらの命令に相当する命令を備えており、図１０に示した中間言語はコード生成部１１において、これらの命令に変換される。
また、一般にＣＰＵの一括データ転送命令によるデータ転送と、ロード／ストア命令によるデータ転送とを比較した場合、転送対象のデータ量が少量の場合はロード／ストア命令による転送の方がより高速に実行されるが、連続する多量のデータを転送する場合には一括データ転送命令の方が高速に実行される。
【００２９】
以上説明したようなコンパイラ６の仕組み、特に構文解析部９の仕組みによって、動的構造体変数の高速な初期化の設定、未定義値の検出が可能となる。
また、プログラムの動的データ領域はプログラムの実行時にライブラリ２を呼び出すことで実現される場合、ライブラリの領域確保ルーチンの中で、領域確保とともに動的構造体変数の領域にテンプレート領域の内容をコピーするようにしてもよい。実行形式プログラム１がライブラリを呼び出す際には、獲得すべき領域のサイズを決定するために必要な情報（サイズそのものまたは構造体のサイズと構造体を要素とする配列の配列要素数）とテンプレートのアドレスとをライブラリにパラメタとして渡す。これらのパラメタを受け取ったライブラリは領域を獲得するとともに、指定されたアドレスに存在するテンプレートの内容を獲得した領域に繰り返し複写することで初期化を行なう。こうすると、実行形式プログラム１のサイズを小さくすることが可能となる。
【００３０】
【発明の効果】
本願発明によれば、動的構造体変数の型定義と共に初期値を設定することがかのうとなり、ソースプログラムの作成者は構造体変数を獲得する度に値を設定するように記述する必要がなくなる。
また、テンプレートは一つの型に対して一つしか作成しないので、実行形式プログラムのサイズを小さくすることが可能となる。
【００３１】
また、動的変数領域へのテンプレートの内容の複写は一括データ転送命令で実行されるようなコードが生成されるので、効率の良い動的構造体変数の初期化が可能となる。
また、常にテンプレートを使用するのではなく、動的構造体変数を構成する要素の中で初期値が指定されている要素が少ない場合には、テンプレートを使わずに初期値を設定するようなコードを生成するので、実行効率のよい実行形式プログラムを作成することが可能となる。
【００３２】
また、テンプレートの内容を獲得した領域にコピーする処理を、複数の実行形式プログラムで共用されるライブラリの動的領域獲得ルーチン内で、動的領域の獲得と共に行なうことで、実行形式プログラムのサイズを小さくすることが可能となる。
さらに、動的構造体変数のいずれの要素についても、初期値が設定されているか否かのチェックが可能となり、未定義値の検出をもれなく行なうことが可能となる。
【図面の簡単な説明】
【図１】  コンピュータ上でのプログラムの実行を示す図。
【図２】  コンピュータ上でのプログラム開発環境を示す図。
【図３】  コンパイラの構造及び作用を示す図。
【図４】  リンカの作用を示す図。
【図５】  構造解析部における処理の一部を示す第一の図。
【図６】  構造解析部における処理の一部を示す第二の図。
【図７】  ソースプログラムの一例を示す第一の図。
【図８】  ソースプログラムの一例を示す第二の図。
【図９】  中間言語の一例を示す第一の図。
【図１０】  中間言語の一例を示す第二の図。
【符号の説明】
１．．．実行形式プログラム
２．．．ライブラリ
３．．．ＯＳ（オペレーティングシステム）
４．．．コンピュータ
５．．．エディタ
６．．．コンパイラ
７．．．リンカ
８．．．ソースプログラム
１２．．．オブジェクトプログラム
【図１】
0003915208.tif 000002
【図２】
0003915208.tif 000003
【図３】
0003915208.tif 000004
【図４】
0003915208.tif 000005
【図５】
0003915208.tif 000006
【図６】
0003915208.tif 000007
【図７】
0003915208.tif 000008
【図８】
0003915208.tif 000009
【図９】
0003915208.tif 000010
【図１０】
0003915208.tif 000011