(57)【要約】【課題】効果的に未使用データ項目の数を削減することを可能とする。【解決手段】プログラムを最適化する最適化処理装置１に、データ項目抽出部２、レイアウト部４、未使用データ項目抽出部５、集約判定部６及びデータ項目集約部９を備える。データ項目抽出部２は、プログラムからデータ項目を抽出する。レイアウト部４は、抽出されたデータ項目をメモリ上にレイアウトする。未使用データ項目抽出部５は、抽出されたデータ項目から、定義されたが使用されない未使用データ項目を抽出する。集約判定部６は、レイアウト結果に基づいて、未使用データ項目のうち、階層構造をもつデータ項目を構成する複数の未使用データ項目を、１つの新たなデータ項目に集約することが可能か否か判定する。データ項目集約部９は、判定結果に基づいて、複数のデータ項目を１つのデータ項目に集約する。【選択図】　　　図１
2004118789.tif 000002
【特許請求の範囲】
【請求項１】
プログラムを最適化する制御をコンピュータに行わせるコンピュータ・プログラムであって、
前記プログラムからデータ項目を抽出し、
前記データ項目を前記コンピュータに備えられたメモリ上にレイアウトし、
抽出された前記データ項目から、定義されたが使用されない未使用データ項目を抽出し、
前記レイアウト結果に基づいて、前記未使用データ項目のうち、階層構造をもつデータ項目の少なくとも一部を構成する複数の未使用データ項目を、１つの新たなデータ項目に集約することが可能か否か判定し、
前記判定結果に基づいて、前記複数のデータ項目を前記１つの新たなデータ項目に集約したプログラムを出力する、
ことを含む制御を前記コンピュータに行わせることを特徴とするコンピュータ・プログラム。
【請求項２】
集約される前記複数の未使用データ項目は、前記メモリ上において互いに隣接する領域にレイアウトされている、
ことを特徴とする付記１に記載のコンピュータ・プログラム。
【請求項３】
集約される前記複数の未使用データ項目は、共に階層構造をもつ他のデータ項目を構成するデータ項目であって、且つ、前記階層構造におけるレベルが互いに同じである、
ことを特徴とする請求項２に記載のコンピュータ・プログラム。
【請求項４】
集約される前記複数の未使用データ項目は、階層構造をもつデータ項目と当該データ項目を構成するデータ項目であり、且つ、前記階層構造をもつデータ項目は１つのデータ項目によって構成される、
ことを特徴とする請求項１に記載のコンピュータ・プログラム。
【請求項５】
プログラムを最適化する最適化処理装置であって、
前記プログラムからデータ項目を抽出するデータ項目抽出手段と、
抽出された前記データ項目をメモリ上にレイアウトするレイアウト手段と、
抽出された前記データ項目から、定義されたが使用されない未使用データ項目を抽出する未使用データ項目抽出手段と、
前記レイアウト結果に基づいて、前記未使用データ項目のうち、階層構造をもつデータ項目の少なくとも一部を構成する複数の未使用データ項目を、１つの新たなデータ項目に集約することが可能か否か判定する集約判定手段と、
前記判定結果に基づいて、前記複数のデータ項目を前記１つの新たなデータ項目に集約した前記プログラムを出力するデータ項目集約手段と、
を備えることを特徴とする最適化処理装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、プログラムを最適化するための技術に関し、特に、プログラム中の未使用データ項目を集約・削減する技術に関する。
【０００２】
【従来の技術】
プログラム中には、変数等のデータ項目が定義されることが多い。しかし、定義された全てのデータ項目が、プログラム中において使用（参照）されているとは限らない。以下において、定義されたが、プログラム中で使用されないデータ項目を未使用データ項目という。コンパイル時やプログラム解析時等において、データ項目辞書が作成されるが、データ項目辞書に未使用データ項目が含まれている場合、その分、処理に要するメモリ容量が余分に必要になる。未使用データ項目はプログラム中で使用されないため、そのデータ項目を定義するコードは必要ではない。そこで、コンパイラには、メモリ資源を有効に利用できるようにするために、未使用データ項目を定義するコードを削除する機能が与えられていることが多い。
【０００３】
以下、未使用データ項目を定義するコードを削除する機能について、コンパイラを例として説明する。なお、実際のコンパイラは、このような機能以外に、単純代入の除去、定数計算の最適化等の機能を有することが多いが、説明を簡単にするために、コンパイラは未使用データ項目を定義するコードの削除以外の最適化を行わないと仮定する。
【０００４】
図３４に、ＣＯＢＯＬ（ＣＯｍｍｏｎＢｕｓｉｎｅｓｓ　Ｏｒｉｅｎｔｅｄ　Ｌａｎｇｕａｇｅ）で記述されたソースプログラムの一例を示す。このソースプログラムでは、１３０行目から１７０行目までにおいて定義された変数であるＩＲＥＣ０１、ＩＤＡＴＡ１１、ＩＤＡＴＡ１２、ＩＤＡＴＡ１３及びＩＤＡＴＡ１４は、３００行以降の処理部（ＰＲＯＣＥＤＵＲＥ　ＤＩＶＩＳＩＯＮ）で参照されていないため、未使用データ項目である。同様に、２１０行目、２２０行目、及び２４０行目から２７０行目までにおいて定義された変数であるＷＤＡＴＡ１２、ＷＤＡＴＡ１３、ＷＲＥＣ０２、ＷＤＡＴＡ２１、ＷＤＡＴＡ２２、及びＷＤＡＴＡ７１も未使用データ項目である。
【０００５】
図３４に示すソースプログラムから従来技術を用いて未使用データ項目を定義するコード除去すると、図３５に示すようなソースプログラムが得られる。図３５において、２４０行目から２７０行目までのコードが除去されている。
【０００６】
図３６に、Ｃで記述されたソースプログラムの一例を示す。図３６に示すソースプログラムは、図３４に示すＣＯＢＯＬ　で記述されたソースプログラムとほぼ同じ内容をもつ。図３７に、従来技術を用いて図３６に示すソースプログラムから未使用データ項目を定義するコードを除去した結果を示す。
【０００７】
不要な変数の削除に関する技術として、プログラム中に型宣言している変数が処理記述で使用されたか否かを確認し、使用されていないことが分かった場合、エラーメッセージを出力装置に出力させる事により、プログラム中の無駄な型宣言をユーザに通知すると共に、無駄に型宣言された変数がオブジェクトファイル中に生成されないようにする機能を有するコンパイラがある。コンパイラにより、コンパイル後のプログラム中には無駄な型宣言が含まれないようになる（例えば、特許文献１参照）。
【０００８】
【特許文献１】
特開平７−２３９７８８号公報（段落００１０から段落００１５、図１）
【０００９】
【発明が解決しようとする課題】
しかし、上記の従来技術によれば、各データ項目に割り振られたメモリ上のアドレスがずれることを防ぐために、以下のような未使用データ項目を除去できないという問題があった。
【００１０】
・単純なデータ項目
・レコード（階層構造を有するデータ項目）の少なくとも一部を構成するデータ項目
図３４及び３５に示すＣＯＢＯＬ　で記述されたソースプログラムを用いて、上記問題についてより具体的に説明する。図３４に示すソースプログラム中の１３０行目から１７０行目まで、２１０行目、及び２２０行目において定義されたＩＲＥＣ０１、ＩＤＡＴＡ１１、ＩＤＡＴＡ１２、ＩＤＡＴＡ１３、ＩＤＡＴＡ１４、ＷＤＡＴＡ１２及びＷＤＡＴＡ１３は、未使用データ項目であるのにもかかわらず、図３５に示すソースプログラムにおいて、これらの未使用データ項目は除去されない。未使用データ項目ＩＲＥＣ０１は、７０行目のＳＥＬＥＣＴ文でＩＦＩＬＥ０１が使用されており、未使用データ項目ＩＤＡＴＡ１１、ＩＤＡＴＡ１２、ＩＤＡＴＡ１３及びＩＤＡＴＡ１４は、レコードＩＲＥＣ０１を構成するデータ項目であり、また、未使用データ項目ＷＤＡＴＡ１２及びＷＤＡＴＡ１３は、レコードＷＲＥＣ０１を構成するデータ項目であるためである。
【００１１】
図３６及び３７に示すＣで記述されたソースプログラムから、ＣＯＢＯＬ　だけなく他の言語であっても、同様の未使用データ項目を除去できないということが分かる。
【００１２】
しかしながら、コンピュータにおけるメモリ領域は無限にあるわけではない。ソースプログラムの除去できない未使用データ項目がそのまま処理されてしまうと、コンパイル時やデータ項目辞書の作成時にメモリ領域が不足して処理できないことがありえる。
【００１３】
上述のように、ソースプログラムをコンパイルしたり、ソースプログラムのデータ項目辞書を作成したりする場合に必要となるメモリ量を低減するためには、ソースプログラムに含まれる未使用データ項目の数が少ない事が望ましい。
【００１４】
以上の問題に鑑み、従来の技術よりも効果的に未使用データ項目の数を削減することを可能とし、これにより、コンパイル時やデータ項目辞書作成時に必要となるメモリ量を低減するようにプログラムを最適化することを可能とすることが、本発明の解決しようとする課題である。
【００１５】
【課題を解決するための手段】
上記問題を解決するために、本発明の１態様によれば、プログラムを最適化する最適化処理装置において、上記プログラムからデータ項目を抽出するデータ項目抽出手段と、抽出された上記データ項目をメモリ上にレイアウトするレイアウト手段と、抽出された上記データ項目から、定義されたが使用されない未使用データ項目を抽出する未使用データ項目抽出手段と、上記レイアウト結果に基づいて、上記未使用データ項目のうち、階層構造をもつデータ項目の少なくとも一部を構成する複数の未使用データ項目を、１つの新たなデータ項目に集約することが可能か否か判定する集約判定手段と、上記判定結果に基づいて、上記複数のデータ項目を前記新たなデータ項目に集約した上記プログラムを出力するデータ項目集約手段と、を備えるように構成する。
【００１６】
従来、階層構造をもつデータ項目の少なくとも一部を構成する未使用データ項目を削除する事はできなかった。しかし、上記構成によってメモリ上のレイアウトに基づいてこのような未使用データ項目のうちの複数の未使用データ項目を１つに集約することにより、従来技術よりも効果的に未使用データ項目の数を削減することが可能となる。延いては、コンパイル時やデータ項目辞書作成時に必要となるメモリ量を低減するようにプログラムを最適化することが可能となる。
【００１７】
ここで、集約される上記複数の未使用データ項目は、上記メモリ上において互いに隣接する領域にレイアウトされていることとしてもよい。
データ項目を集約可能であると判定する場合には、２つの場合がある。まず、複数の未使用データ項目が、共に階層構造をもつ他のデータ項目を構成するデータ項目であって、且つ、上記階層構造における階層レベルが互いに同じである場合、上記集約判定手段はその複数の未使用データ項目を集約可能であると判定する。また、複数の未使用データ項目が、階層構造をもつデータ項目と当該データ項目を構成するデータ項目であり、且つ、上記階層構造をもつデータ項目は１つのデータ項目によってのみ構成される場合も、上記集約判定手段はその複数の未使用データ項目を集約可能であると判定する。
【００１８】
また、上記データ項目集約手段は、複数の未使用データ項目を宣言するコードを前記プログラムから削除し、１つの新たなデータ項目を宣言するコードを追加することとしても良い。プログラムから不要な定義コードを削除することにより、プログラムを最適化することが可能となる。
【００１９】
さらに、また、上記データ項目集約手段は、集約される上記複数の未使用データ項目の項目長の和を算出し、算出された上記項目長の和に基づいて上記新たなデータ項目の項目長を設定することとしてもよい。これにより、集約によって、集約前後でデータ項目のメモリ上のアドレスが変更されることを防ぐことが可能となる。
【００２０】
上記データ項目の集約において、宣言される新たなデータ項目のデータ型の設定には、複数の考え方がありうる。まず、上記データ項目集約手段は、集約される上記複数の未使用データ項目のデータ型が全て同じである場合、集約される上記複数の未使用データ項目のデータ型と同じデータ型として、上記新たなデータ項目のデータ型を設定することとしてもよい。これにより、集約によって、集約されたデータ項目のデータ型が集約前のデータ項目のデータ型と異なるデータ型となることを防ぐことが可能となる。
【００２１】
また、上記データ項目集約手段は、上記新たなデータ項目のデータ型を、記憶域サイズが最小となるデータ型として設定することとしてもよい。記憶域サイズが最小となるデータ型を、新たな項目のデータ型として決定しておくことにより、データ型の設定を容易にすることが可能となる。データ型の設定に困難が生じる場合として、例えば、集約される複数の未使用データ項目のデータ型が互いに異なる場合が挙げられる。また、例えば、新たなデータ項目の項目長を集約前の複数の未使用データ項目の項目長の和と等しくするためには、集約前のデータ項目のデータ型と異なるデータ型を新たなデータ項目に設定する必要がある場合が挙げられる。後者の場合の具体例として、例えば、短精度整数データのような精度が指定された数値データとして宣言された未使用データ項目を集約する場合が挙げられる。
【００２２】
また、上記データ項目の集約において、宣言される新たなデータ項目の項目名の設定にも、複数の考え方がある。例えば、上記データ項目集約手段は、上記新たなデータ項目の項目名を無名として設定することとしてもよい。また、上記データ項目集約手段は、上記新たなデータ項目の項目名を、集約される上記複数の未使用データ項目のうちの何れか１つに基づいて設定することとしてもよい。また、上記データ項目集約手段は、最適化処理装置のユーザの指定に基づいて上記新たなデータ項目の項目名を設定することとしてもよい。
【００２３】
また、本発明の別の１態様によれば、コンピュータが、プログラムを最適化する最適化方法において、上記プログラムからデータ項目を抽出し、上記データ項目を上記コンピュータに備えられたメモリ上にレイアウトし、抽出された上記データ項目から、定義されたが使用されない未使用データ項目を抽出し、上記レイアウト結果に基づいて、上記未使用データ項目のうち、階層構造をもつデータ項目の少なくとも一部を構成する複数の未使用データ項目を、１つの新たなデータ項目に集約することが可能か否か判定し、上記判定結果に基づいて、上記複数のデータ項目を上記新たなデータ項目に集約したプログラムを出力する、ことを含むように構成する。このプログラム最適化方法によっても、上記の最適化処理装置と同様の作用・効果を得ることができるため、上記課題を解決することが可能である。
【００２４】
また、上記プログラム最適化方法において行われる手順をコンピュータに実行させるコンピュータ・プログラムも、上記コンピュータ・プログラムをコンピュータに備えられたメモリに一旦格納させ、そのコンピュータにそのメモリから上記コンピュータ・プログラムを読み出させて実行させることにより、上記課題を解決する事が可能である。
【００２５】
また、上記コンピュータ・プログラムを記録したコンピュータ読み取り可能な記録媒体から、そのプログラムをコンピュータに読み出させて、上記プログラムにロードさせ、その後、上記と同様ににしてそのコンピュータにそのコンピュータ・プログラムを実行させることによっても、上記課題を解決することができる。
【００２６】
【発明の実施の形態】
以下、本発明の実施の形態について図面を用いて説明する。なお、同じ装置等には同じ参照番号をつけ、説明を省略する。
【００２７】
図１に、本発明に係わる最適化処理装置１の構成を示す。最適化処理装置１は、ソースプログラムに含まれる未使用データ項目群を集約することによって、ソースプログラムに含まれるデータ項目数を削減するようにソースプログラムを最適化する。図１に示すように、最適化処理装置１は、データ項目抽出部２、データ項目辞書作成部３、レイアウト作成部４、未使用データ項目抽出部５、集約判定部６、判定結果通知部７、集約指示受付部８、データ項目集約部９、入出力部１０、プログラム格納部１１、データ項目辞書格納部１２及び未判定データ項目リスト格納部１３を備える。
【００２８】
データ項目抽出部２は、プログラム格納部１１からソースプログラムを取得し、そのソースプログラムからデータ項目を抽出する。データ項目辞書作成部３は、抽出されたデータ項目の内容及びデータ項目間の関係を示すデータ項目辞書を作成し、データ項目辞書格納部１２に書き込む。レイアウト部４は、抽出されたデータ項目をメモリ（不図示）上に配置（レイアウト）する。未使用データ項目抽出部５は、抽出されたデータ項目のうち、未使用データ項目を抽出する。集約判定部６は、メモリ上でのレイアウトに基づいて、抽出された未使用データ項目から、複数の未使用データ項目からなる組を１つのデータ項目に集約できるか否か判定する。判定結果通知部７は、入出力部１０を介して集約判定部６によって集約できると判定された複数の未使用データ項目を最適化処理装置１のユーザに通知する。集約指示受付部８は、入出力部１０を介してユーザからデータ項目を集約すべきか否かを示す指示を受け付ける。データ項目集約部９は、ユーザからの指示に基づいてデータ項目を集約し、入出力部１０を介して集約結果をユーザに通知する。入出力部１０は、ユーザと最適化装置１の間における情報のやり取りに用いられる。
【００２９】
プログラム格納部１１は、入出力部１０を介して入力されたソースプログラム、及び最適化後のソースプログラムを格納する。データ項目辞書格納部１２は、データ項目辞書作成部３によって作成されたデータ項目辞書を格納する。未判定データ項目リスト格納部１３は、未判定データ項目リストを格納する。未判定データ項目リストは、未使用データ項目の抽出結果及びレイアウト結果に基づいて集約判定部６によって作成され、データ項目を集約することができるか否か判定する際に、判定対象となるデータ項目及び判定結果を管理するために利用される。
【００３０】
次に、図２から図２７を用いて、最適化処理装置１によって行われる処理について説明する。まず、図２を用いて、プログラムの最適化処理の大まかな流れについて説明する。
【００３１】
図２に示すように、まず、最適化処理装置１は、プログラム格納部１１から最適化されるべきソースプログラムを取り出して、そのソースプログラムにおけるデータフローを解析し、データ項目の定義及び参照情報を収集する（Ｓ１）。なお、データフローの解析は、コンパイラ等における一般的なプログラムの最適化手法である。データフロー解析の手順は以下のとおりである。
【００３２】
１）データ項目抽出部２は、前処理実行後の翻訳テキストに対して、データ項目の宣言情報を収集する。翻訳テキストの例として、ＣＯＢＯＬのＣＯＰＹ文、Ｃ又はＣ＋＋のｉｎｃｌｕｄｅ文などを展開した後のソースプログラムが挙げられる。データ項目辞書について詳しくは後述する。
【００３３】
２）レイアウト部４は、階層構造をもつデータ項目について、いかなるデータ項目の構成要素となっていない項目（最外のデータ項目）を基準として、データ項目のレイアウト上の位置を示す相対変位を計算し、それらのデータ項目間の重なり情報を収集する。このとき、レイアウト部４は、ソースプログラムを記述するプログラム言語に応じたデータ項目間の間隔の補正を考慮する。データ項目間の間隔の補正として、例えば、ＣＯＢＯＬにおける遊びバイト又遊びビット、Ｃ又はＣ＋＋における語境界等が挙げられる。レイアウトについてより詳しくは後述する。
【００３４】
３）データ項目辞書作成部３は、宣言情報に基づいてデータ項目辞書を作成し、さらに、データ項目の定義・参照情報を収集して、データ項目辞書にその定義・参照情報を設定する。例えば、図３に示すソースプログラムにおいて、レコードＷＲＥＣ０１を構成するデータ項目の１つであるＷＤＡＴＡ１１が参照されていた場合、データ項目辞書作成部３は、データ項目ＷＤＡＴＡ１１とレコードＷＲＥＣ０１に対する定義・参照情報をデータ項目辞書に設定する。
【００３５】
次に、未使用データ項目抽出部５は、抽出されたデータ項目のうち、階層構造をもつデータ項目（レコード）を抽出する（Ｓ２）。例えば、図３に示すソースプログラムを最適化する場合、未使用データ項目抽出部５は、階層構造をもつデータ項目として、ＩＲＥＣ０１、ＷＲＥＣ０１及びＷＲＥＣ０２を抽出する。
【００３６】
未使用データ項目抽出部５が階層構造をもつデータ項目を抽出できなかった、つまり、最適化処理の対象となるソースプログラム中に階層構造をもつデータ項目が存在しない場合（Ｓ３：Ｎｏ）、処理を終了する。
【００３７】
階層構造をもつデータ項目を抽出できた場合（Ｓ３：Ｙｅｓ）、さらに、未使用データ項目抽出部５は、定義・参照情報に基づいて、抽出された階層構造をもつデータ項目及びそのデータ項目を構成するデータ項目（子項目）の中から、未使用データ項目を抽出する（不図示）。
【００３８】
集約判定部６は、未使用データ項目の抽出結果及びレイアウト結果に基づいて未判定データ項目リストを作成し、未判定データ項目リストを用いて、抽出された未使用データ項目のうちのいくつかをより少数のデータ項目に集約することができるか否か判定する（Ｓ４）。この判定について、詳しくは後述する。
【００３９】
続いて、判定結果通知部７は、判定結果を出力するように最適化処理装置１が設定されているか否か判定する（Ｓ５）。判定結果を出力するように設定されている場合（Ｓ５：Ｙｅｓ）、判定結果通知部７は、集約判定部６による判定結果をユーザに通知する（Ｓ６）。以下、ユーザに通知される判定結果の内容の一例を挙げる。
【００４０】
１）集約されるデータ項目の項目名、項目長、データ型
２）集約後のデータ項目の項目名、項目長、データ型
３）最適化後のプログラム
判定結果を出力するように設定されていない場合（Ｓ５：Ｎｏ）、Ｓ７に進む。
【００４１】
集約可能なデータ項目を集約するように集約指示が最適化処理装置１に予め設定されている場合、又は、判定結果通知部７が判定結果をユーザに通知した後に、集約指示受付部８がユーザから集約すべきデータ項目の指定を受け付けた場合（Ｓ７）、データ項目集約部９は、未使用データ項目を未判定データ項目リストに含まれる判定結果に基づいて集約し（Ｓ８）、処理を終了する。
【００４２】
以下、上記Ｓ１において作成されるデータ項目辞書及びレイアウトについて、説明する。説明において、図３に示すＣＯＢＯＬで記述されたソースプログラムの一例を適宜参照する。なお、以降の説明において用いられたプログラム記述言語は、本発明を適用することができるプログラム記述言語を限定する趣旨ではない。
【００４３】
まず、図４から図７を用いてデータ項目辞書について説明する。図４から図６は、図３に示すソースプログラムにおいて宣言されたデータ項目に関するデータ項目辞書である。データ項目辞書は、図４から図６に示すように、データ項目辞書は、ポインタを用いて、ソースプログラムにおいて宣言されたデータ項目間の関係を示す。
【００４４】
図７は、データ項目辞書を表記するために図４から図６において採用された表記方法を説明する図である。図７（ａ）に示すように、図４から図６に示すデータ項目辞書において、各データ項目には５つのポインタが与えられている。図７中のφは、該当する値が無いことを示す。ポインタの内訳は以下のとおりである。
【００４５】
１）メモリ上で、そのデータ項目の親項目が記録されている位置（アドレス）を示すポインタ
２）メモリ上でのアドレス割付において、そのデータ項目の前に位置するデータ項目が記録されている位置を示すポインタ
３）そのデータ項目の子項目となっているデータ項目の内、メモリ上で先頭となっているデータ項目が記録されている位置を示すポインタ
４）メモリ上でのアドレス割付において、そのデータ項目の次に位置するデータ項目が記録されている位置を示すポインタ
５）親項目を持たない他のデータ項目が記録されている位置を示すポインタ
なお、子項目とは、階層構造をもつデータ項目を構成するデータ項目をいい、親項目とは、１以上の他のデータ項目によって構成される階層構造をもつそのデータ項目をいう。例えば、図４から図６に示すデータ項目辞書において、データ項目ＩＲＥＣ０１を構成するデータ項目ＩＤＡＴＡ１１、ＩＤＡＴＡ１２、ＩＤＡＴＡ１３及びＩＤＡＴＡ１４は、データ項目ＩＲＥＣ０１の子項目である。逆に、データ項目ＩＲＥＣ０１は、データ項目ＩＤＡＴＡ１１、ＩＤＡＴＡ１２、ＩＤＡＴＡ１３及びＩＤＡＴＡ１４の親項目である。
【００４６】
また、５）の親項目を持たない他のデータ項目が記録されている位置を示すポインタは、全てのデータ項目について最適化処理を行うために必要である。しかし、このポインタを用いる方法以外の他の方法を採用することとしてもよい。例えば、図７（ｂ）に示すように、ポインタを用いて、データ項目間の階層関係に関係なく全てのデータ項目を直列に連結する事としても良い。
【００４７】
次に、図８から図１０を用いて、レイアウトについて説明する。まず、図８に、図３に示すＣＯＢＯＬで記述されたソースプログラムの１３０行目から１７０行目までに記述されたコードによって宣言されたデータ項目のレイアウトを示す。図８に示すレイアウトにおいて、データ項目間の間隔の補正は行われていない。
【００４８】
図９に、以下に示すＣＯＢＯＬのコードによって宣言されるデータ項目のレイアウトを示す。以下のコードに示すように、レコードＤＡＴＡ１１は、データ項目ＤＡＴＡ２１及びデータ項目ＤＡＴＡ２２によって構成される。さらに、データ項目ＤＡＴＡ２１は、データ項目ＤＡＴＡ３１、ＤＡＴＡ３２及びＤＡＴＡ３３によって構成され、データ項目ＤＡＴＡ２２は、データ項目ＤＡＴＡ３４によって構成される。図９に示すレイアウトにおいて、レイアウト部４によって、遊びビット又は遊びバイトがデータ項目ＤＡＴＡ３１とＤＡＴＡ３２の間及びＤＡＴＡ３４の後に挿入されている。
【００４９】
2004118789.tif 000003
図１０に、以下のＣのコードによって宣言されるデータ項目のレイアウトを示す。以下のコードに示すように、レコードｉｒｅｃ０１は、データ項目ｉｄａｔａ１１及びｉｄａｔａ１２によって構成される。　図１０に示すレイアウトにおいて、文字を格納する変数ｉｄａｔａ１１と、整数を格納する変数ｉｄａｔａ１２との間には、アラインメントのためにパディングといわれる空のバイトが備えられている。プログラム環境の中には、データ型に応じて、データ項目に割り当てられるメモリ上の先頭アドレスをある整数に割り切れるように要請するものがあり、これをアラインメントという。アラインメントの方式は、処理系に依存する。
【００５０】
2004118789.tif 000004
次に、図２におけるＳ４における集約判定処理の概略について説明する。上述の集約判定処理は、以下のようにして行われる。
【００５１】
１）まず、集約判定部６は、階層構造をもつデータ項目、つまりレコードをソースプログラムから抽出する。図３に示すソースプログラムの場合、以下のデータ項目が抽出される。
【００５２】
−ＩＲＥＣ０１、ＷＲＥＣ０１、ＷＲＥＣ０２
２）続いて、集約判定部６は、上記１）で抽出されたデータ項目に対して、データ項目の定義・参照情報に基づいて未使用データ項目を抽出する。図３に示すソースプログラムの場合、以下のデータ項目が抽出される。
【００５３】
−ＩＲＥＣ０１、ＩＤＡＴＡ１１、ＩＤＡＴＡ１２、ＩＤＡＴＡ１３、ＩＤＡＴＡ１４
−ＷＤＡＴＡ１２、ＷＤＡＴＡ１３
−ＷＲＥＣ０２、ＷＤＡＴＡ２１、ＷＤＡＴＡ２２
３）上記２）で抽出された未使用データ項目に対して、データ項目間の連続性を判定する。
【００５４】
３）の判定は、まだ判定されていない未使用データ項目の中（以下、未判定データ項目）から２つのデータ項目（以下、項目Ａ及び項目Ｂとする）を選択することによって行われる。ここで、データ項目の集約方法には以下の２種類がある。１つが前後方向の集約であり、もう１つが親子方向の集約である。集約方法に対応して判定条件も２種類存在する。以下、２種類の集約について説明する。
【００５５】
ａ）前後方向の集約
前後方向の集約とは、データ項目の階層構造において階層レベルが等しい複数のデータ項目を集約することをいう。集約するための条件は以下の通りである。
【００５６】
−親項目が同じである。
−子項目を持たない。
−「項目Ａのレイアウト上の相対変位＋項目Ａの項目長」と「項目Ｂのレイアウト上の相対変位」が一致する。一致する場合、項目Ａ及びＢは、レイアウト中で隣接する（連続する）。なお、遊びバイト又は遊びビット等の補正が行われている場合、「『項目Ａのレイアウト上の相対変位＋項目Ａの項目長＋補正値』と『項目Ｂのレイアウト上の相対変位』が一致する」ことが条件となる。
【００５７】
前後方向の集約において、集約後のデータ項目は以下のようになる。
−集約後のデータ項目は、無名（データ項目名なし）、又はデータ項目集約部９によって生成されたデータ項目名を持つ。
【００５８】
−集約後のデータ項目の項目長が集約前のデータ項目の項目長と変わらないように、集約対象となる複数のデータ項目の項目長の合計した値を、集約後のデータ項目のデータ項目長とする。なお、プログラム言語に応じて、遊びバイト又は遊びビット、或いはパティングのように、最適化処理装置１におけるレイアウトの補正が行われている場合、この補正も考慮する。
【００５９】
−集約後のデータ項目のデータ型は、集約前と同じとするか、又は最小の記憶域サイズを持つデータ型とする。後者の場合、集約対象となる複数のデータ項目のデータ型が互いに同じでない場合にも、集約処理が可能となる。
【００６０】
前後方向の集約について図１１を用いて説明する。
以下のコードによって宣言されるデータ項目のレイアウト及びデータ項目辞書は、図１１の（ａ）及び（ｂ）に示すようになる。
【００６１】
2004118789.tif 000005
データ項目Ｂ１とＢ２のいずれも未使用データ項目である場合、データ項目Ｂ１及びＢ２について前後方向の集約を行うことにより、上記のコードは以下のようになる。また、図１１（ａ）及び（ｂ）に示すレイアウト及びデータ項目辞書は、それぞれ図１１（ｃ）及び（ｄ）に示すようになる。図１１（ｃ）及び（ｄ）から、前後方向の集約によって、データ項目の数が低減されたことがわかる。
【００６２】
2004118789.tif 000006
ｂ）親子方向の集約
親子方向の集約とは、階層構造が異なる（包含関係にある）複数のデータ項目を集約することである。
【００６３】
集約するための条件は以下の通りである。
−項目Ａが、項目Ｂの親項目である。
−「項目Ａの大きさ」と、「項目Ｂの大きさ」が一致する。
【００６４】
親子方向の集約において、集約後のデータ項目は以下のようになる。
−集約後のデータ項目は、無名（データ項目名なし）、又はデータ項目集約部９によって生成されたデータ項目名を持つ。
【００６５】
−集約後のデータ項目の項目長は、項目Ｂの項目長と同じである。
−集約後のデータ項目のデータ型は、項目Ｂのデータ型とする。
親子方向の集約について図１２を用いて説明する。
【００６６】
以下のコードによって宣言されるデータ項目のレイアウト及びデータ項目辞書は、図１２の（ａ）及び（ｂ）に示すようになる。
2004118789.tif 000007
データ項目Ａ１とＦＩＬＬＥＲのいずれも未使用データ項目である場合、データ項目Ａ１及びＦＩＬＬＥＲについて親子方向の集約を行うことにより、上記のコードは以下のようになる。また、図１２（ａ）及び（ｂ）に示すレイアウト及びデータ項目辞書は、それぞれ図１２（ｃ）及び（ｄ）に示すようになる。図１２（ｃ）及び（ｄ）から、親子方向の集約によって、データ項目の数が低減されたことがわかる。
【００６７】
０１　　ＦＩＬＬＥＲ　　　ＰＩＣ　Ｘ（２０）．
なお、未使用データ項目が２層以上の階層構造を持つ場合がある。この場合、１回の最適化処理では、処理が不十分になってしまう可能性ある。従って、上記の判定処理は繰り返して行なわれる必要がある。繰り返して処理を行う場合、抽出された未使用データ項目すべてに対して、以下の考え方に基づいて最適化処理を行う。
【００６８】
−階層の深いデータ項目を優先させて集約させる。
−親子方向の集約判定を行ってから前後方向の集約判定を行うという順序で再帰的に判定する。
【００６９】
以下、実際にコードを参照しながら、判定処理を繰り返すことにより２層以上の階層構造をもつデータ項目がどのように処理されるのかについて説明する。
まず、以下のような初期コードを仮定する。説明のために、このコードにおいて宣言されるすべてのデータ項目は未使用データ項目であると仮定する。
【００７０】
2004118789.tif 000008
１回目の最適化処理において、最も階層が深いデータ項目Ｃ１及びＣ２が集約される。従って、上記の初期コードは以下のようになる。
【００７１】
2004118789.tif 000009
さらに、１回目の最適化処理後のコードについて、２回目の最適化処理を行うと、データ項目Ｂ２及びＦＩＬＬＥＲ項目が集約される。その結果、以下に示す２回目の最適化処理後のコードが得られる。
【００７２】
2004118789.tif 000010
さらに、２回目の最適化処理後のコードについて、３回目の最適化処理を行うと、データ項目Ｂ１及びＦＩＬＬＥＲ項目が集約される。その結果、以下に示す３回目の最適化処理後のコードが得られる。
【００７３】
2004118789.tif 000011
さらに、３回目の最適化処理後のコードについて、４回目の最適化処理を行うと、ＦＩＬＬＥＲ項目及びデータ項目Ｂ３が集約される。その結果、以下に示す４回目の最適化処理後のコードが得られる。
【００７４】
2004118789.tif 000012
最後に、４回目の最適化処理後のコードについて、５回目の最適化処理を行うと、データ項目Ａ１及びＦＩＬＬＥＲ項目が集約される。その結果、以下に示す５回目の最適化処理後のコードが得られる。
【００７５】
０１　　ＦＩＬＬＥＲ　　　　　　ＰＩＣ　Ｘ（６０）．　＊＞５回目：親子方向の集約
５回目の最適化処理後のコードをこれ以上集約することはできないため、処理は終了する。
【００７６】
以下、集約判定部６による集約判定についてより詳しく説明する。集約判定は、図２のＳ４の直前において未使用データ項目抽出部５によって抽出された未使用データ項目について行われる。集約判定において、集約判定部６は、未判定データ項目及び判定結果を管理するための未判定データ項目リストを利用する。未判定データ項目リストは、未判定データ項目及び判定結果を示す情報と、データ項目辞書へのポインタと、次に判定対象とするべきデータ項目へのポインタを含む。
【００７７】
図１３及び１４に、図３に示すソースプログラムグラムに係わる未判定データ項目リストのポインタを示す。図１３及び１４において、φは該当する値がないことを示す。図１５に、図１３および１４において用いられたポインタの表記法及び、未使用データ項目リストに含まれるポインタ以外の情報の内訳を示す。図１５に示すように、未使用データ項目リストに含まれる情報として、以下が挙げられる。
【００７８】
１）未判定であるか否かを示す情報（以下、状態情報という）
２）判定の結果、集約可能であるのか、削除可能であるのかを示す情報（以下、判定結果情報という）
３）集約後のデータ項目の項目長（以下、項目長情報という）
４）集約後のデータ項目のデータ型（以下、型情報という）
５）項目Ａ及び項目Ｂとして設定されたデータ項目の項目名
図１７及び１８において、判定対象とするべきデータ項目としてポイントされているデータ項目は、図２に示すＳ４の直前において、未使用データ項目抽出部５によって未使用データ項目として抽出されたデータ項目である。集約判定の対象となるデータ項目は、未判定データ項目リストに含まれるポインタに基づいて選定される。また、未判定データ項目リストに含まれる判定結果は、データ項目を集約する際にデータ項目集約部９によって参照される。
【００７９】
以下、図１６から図１９に示すフローチャートを用いて、集約判定において行われる処理の流れについて説明する。
集約判定において、まず、集約判定部６は、未判定データ項目リスト内のデータ項目についての状態情報を「未判定」とすることにより、判定処理の対象となる項目Ａ及びＢが設定されていない状態にする（Ｓ１１及びＳ１２）。続いて、集約判定部６は、未判定データ項目リスト内の状態情報を参照する事により、未判定データ項目があるか否か判定する（Ｓ１３）。全てのデータ項目について集約判定を行った場合（Ｓ１３：Ｎｏ）、図１９のＳ４２に進む（後述）。未判定データ項目がある場合、集約判定部６は、未判定データ項目リストに含まれるポインタに基づいて、未判定データ項目の中から１つのデータ項目を取り出す（Ｓ１４）。例えば、図３に示すソースプログラムを最適化する場合、最初は、データ項目ＩＲＥＣ０１が取出されることになる。
【００８０】
続いて、集約判定部６は、未判定データ項目リスト内の状態情報に基づいて項目Ａが既に設定されているか否か判定する（Ｓ１５）。まだ項目Ａが設定されていない場合（Ｓ１５：Ｙｅｓ）、集約判定部６は、未判定データ項目リスト内の取り出されたデータ項目についての状態情報を「判定済み」に設定することにより、そのデータ項目を項目Ａとして設定する（Ｓ１６）。Ｓ１６の設定後、処理はＳ１３に戻る。項目Ａが既に設定されている場合、集約判定部６は、取出されたデータ項目を項目Ｂとして設定する（Ｓ１７）。Ｓ１７の設定は、Ｓ１６の設定と同様であるため説明を省略する。
【００８１】
項目Ａ及び項目Ｂを設定した後、集約判定部６は、データ項目辞書に基づいて、項目Ａは項目Ｂの親項目であるか否か判定する（Ｓ１８）。項目Ａが項目Ｂの親項目である場合（Ｓ１８：Ｙｅｓ）、集約判定部６は、未判定データ項目リスト内の項目Ｂとして設定されているデータ項目についての状態情報を「未判定」に戻すことにより、項目Ｂを未設定の状態に戻す。さらに、集約判定部６は、未判定データ項目リスト内の、次の判定対象とすべき項目へのポインタを引数として再帰呼出しを行う。そして、再帰呼出しから復帰後、図１７に示すＳ２０に進む。項目Ａが項目Ｂの親項目でない場合（Ｓ１８：Ｎｏ）、集約判定部６は、図１８に示すＳ２７に進む。
【００８２】
Ｓ２０において、再帰呼出しから復帰後、集約判定部６は、未判定データ項目リスト及びデータ項目辞書に基づいて、項目Ａが項目Ｂ以外の子項目を持たないか否か判定する。ここで、集約判定部６は、データ項目辞書に含まれる子項目であっても、未判定データ項目リスト内の判定結果情報が「削除可」に設定されている子項目を、存在しない子項目として扱う。
【００８３】
項目Ａが項目Ｂ以外の子項目を持たない場合（Ｓ２０：Ｙｅｓ）、Ｓ２１に進み、項目Ａと項目Ｂについて親子方向の集約を行う。
Ｓ２１において、集約判定部６は、未判定データ項目リスト内の項目Ａの型情報に、項目Ｂのデータ型を設定する。さらに、集約判定部６は、未判定データ項目リスト内の項目Ａの判定結果情報に「集約可」を設定し（Ｓ２２）、項目Ｂの判定結果情報に「削除可」を設定する（Ｓ２３）。また、集約判定部６は、項目Ａの項目長情報に項目Ｂの項目長を設定する。続いて、集約判定部６は、項目Ｂを未設定として（Ｓ２４）、図１６のＳ１３に戻る。
【００８４】
項目Ａが項目Ｂ以外の子項目を持つ場合（Ｓ２０：Ｎｏ）、集約判定部６は、項目Ａ及び項目Ｂを未設定として（Ｓ２５及びＳ２６）、図１６のＳ１３に戻る。
【００８５】
上述のＳ１８において、項目Ａが項目Ｂの親項目でない場合（Ｓ１８：Ｎｏ）、Ｓ２７において、集約判定部６は、項目Ａと項目Ｂの親項目が同じであるか否か判定する。項目Ａと項目Ｂの親項目が同じである場合（Ｓ２７：Ｙｅｓ）、Ｓ２８に進み、そうでない場合（Ｓ２７：Ｎｏ）、図１９のＳ３８に進む。
【００８６】
Ｓ２８において、集約判定部６は、未判定データ項目リスト及びデータ項目辞書に基づいて、項目Ｂは子項目を持つか否か判定する（Ｓ２８）。なお、Ｓ２８の判定は、Ｓ２０の判定と同様である。
【００８７】
項目Ｂが子項目を持つ場合（Ｓ２８：Ｙｅｓ）、未判定データ項目リスト内の、次の判定対象とすべきデータ項目へのポインタを引数として再帰呼出しを行った後（Ｓ２９）、Ｓ３０に進む。項目Ｂが子項目を持たない場合（Ｓ２８：Ｎｏ）、Ｓ２９を行わないでＳ３０に進む。項目Ｂが子項目を持つ場合（Ｓ３０：Ｎｏ）、Ｓ３７に進む。
【００８８】
Ｓ３０において、集約判定部６は、項目Ｂが子項目を持たないか否か判定する。項目Ｂが子項目を持たない場合（Ｓ３０：Ｙｅｓ）、集約判定部６は、さらに、レイアウト部４によって作成されたレイアウトに基づいて、項目Ａを格納する領域と項目Ｂを格納する領域とが、連続する領域であるか否か判定する（Ｓ３１）。項目Ａを格納する領域と項目Ｂを格納する領域とが、連続する領域である場合、Ｓ３２に進み、項目Ａ及び項目Ｂについて前後方向の集約を行う。そうでない場合、Ｓ３７に進む。
【００８９】
Ｓ３２において、集約判定部６は、レイアウトに示されるデータ項目のデータ項目長に基づいて、項目Ａの項目長に項目Ｂの項目長を加算することにより、集約後のデータ項目の項目長を算出する。そして、集約判定部６は、項目Ａの項目長情報に、算出した項目長を設定する。なお、レイアウト時に遊びビット又は遊びバイト、パディング等の補正がされている場合、項目Ａの項目長と項目Ｂの項目長の和に、その補正値を更に加算して集約後の項目長を算出する。
【００９０】
続いて、集約判定部６は、未判定データ項目リスト内の項目Ａの型情報を最小の記憶域サイズを持つデータ型に設定する（Ｓ３３）。これにより、集約後のデータ項目のデータ型が決定される。なお、項目Ａと項目Ｂのデータ型が同じである場合、データ型を変更しないこととしても良い。
【００９１】
さらに、集約判定部６は、未判定データ項目リスト内の項目Ａの判定結果情報に「集約可」を設定し（Ｓ３４）、項目Ｂの判定結果情報に「削除可」を設定する（Ｓ３５）。その後、集約判定部６は、項目Ｂを未設定として（Ｓ２４）、図１６のＳ１３に戻る。
【００９２】
一方、Ｓ３０又はＳ３１の判定でＮｏであった場合、Ｓ３７において、集約判定部６は、項目Ａとして、現在項目Ｂとして設定されているデータ項目を設定しなおし、項目Ｂを未設定とする。その後、図１６のＳ１３に戻る。
【００９３】
上述のＳ２７の判定でＮｏである場合、集約判定部６は、再帰呼出しをされていないか否か判定する（Ｓ３８）。再帰呼出しをされていない場合（Ｓ３８：Ｙｅｓ）、集約判定部６は、項目Ｂとして設定されているデータ項目を項目Ａとして設定しなおし（Ｓ３９）、さらに、項目Ｂを未設定として設定する（Ｓ４０）。その後、図１６のＳ１３に戻る。再帰呼出しをしている場合（Ｓ３８：Ｎｏ）、集約判定部６は、項目Ｂに設定されているデータ項目の状態情報を「未判定」に設定し、処理は再帰呼出しの呼び出し元に戻る（Ｓ４１）。さらに、処理は呼び出し元、つまり再帰呼出しの呼び出し元又はメインフローに戻り（Ｓ４２）、判定処理を終了する。
【００９４】
図２０から２７に、図３に示すソースプログラムについて集約判定処理を行う場合の各段階における、項目Ａ及び項目Ｂの設定内容並びに未判定データ項目リストの内容を示す。図２０から２７において、段階を識別する段階番号、判定処理中の手順を識別するステップ番号、そのステップを行う際に集約判定部６によって取出されて一次格納域に格納されているデータ項目の項目名、項目Ａとして設定されているデータ項目の項目名、項目Ｂとして設定されているデータ項目の項目名、未判定データ項目リスト内の状態情報及び判定結果情報を示す。図２０から２７において、φは「該当無し」を示す。また、ステップ番号の後に記された括弧内の数字は、再帰しているのか否かを示す。括弧内の数字が「０」である場合は、再帰していないことを示し、「１」である場合は、再帰している（後で呼び出し元のステップに戻る必要がある）ことを示す。
【００９５】
図２０から２７における未判定データ項目リストの表記法は以下のとおりである。状態情報及び判定結果情報以外の情報については、記載を省略する。
2004118789.tif 000013
例えば、ＩＲＥＣ０１（済，集）と表記されている場合、データ項目ＩＲＥＣ０１は、「判定済み」であり、判定結果は「集約可」であることを示す。
【００９６】
以下、図２０から２７を参照して具体的に集約判定について説明する。
例えば、段階１のＳ００において（判定処理を行う前）、未判定データ項目の内訳は以下のとおりである。
【００９７】
ＩＲＥＣ０１、ＩＤＡＴＡ１１、ＩＤＡＴＡ１２、ＩＤＡＴＡ１３、ＩＤＡＴＡ１４、ＷＤＡＴＡ１２、ＷＤＡＴＡ１３、ＷＲＥＣ０２、ＷＤＡＴＡ２１、ＷＤＡＴＡ２２
続いて、段階２及び段階３において、それぞれステップＳ１１及びＳ１２を実行することにより項目Ａ及び項目Ｂが未設定となり、段階４においてＳ１４を実行することによりデータ項目ＩＲＥＣ０１が取出され、メモリ上の一時格納域に格納される。段階５においてＳ１５を実行することにより、ＩＲＥＣ０１の状態情報は「未」から「済」に設定される。その後、さらに段階６から７において、未判定データ項目リストからデータ項目ＩＤＡＴＡ１１が取出されて項目Ｂとして設定された後、再帰呼出しが行われ、処理はＳ０（再帰中）に移行する。
【００９８】
段階８から１４にかけて、項目Ａ及び項目Ｂが設定される。図２１の段階１４において示されるように、項目Ａ及び項目Ｂとして設定されたデータ項目はそれぞれＩＤＡＴＡ１１及びＩＤＡＴＡ１２である。図１３に示すデータ項目辞書から明らかなように、ＩＤＡＴＡ１１及びＩＤＡＴＡ１２は親子関係ではなく、且つ、ＩＤＡＴＡ１２は子項目を持たないため、段階１５から１７にかけてＳ２７からＳ３６が行われる。その結果、図２２に示すように、段階１７では、ＩＤＡＴＡ１１の状態情報及び判定結果情報はそれぞれ「済」及び「集」として設定され、ＩＤＡＴＡ１２の状態情報及び判定結果情報はそれぞれ「済」及び「削」として設定される。つまり、ＩＤＡＴＡ１１とＩＤＡＴＡ１２について前後方向の集約が可能であると設定される。さらに、項目Ｂは未設定の状態にされる。
【００９９】
図２２の段階１７の後、図２２の段階１８から段階２１にかけて、上記と同様にしてＳ１３からＳ３６が実行されることにより、ＩＤＡＴＡ１１とＩＤＡＴＡ１３について前後方向の集約が可能であると設定される。さらに、図２３の段階２２から２５にかけて、上記と同様にしてＩＤＡＴＡ１１とＩＤＡＴＡ１４について前後方向の集約が可能であると設定される。図２３の段階２５の後、図２３の段階２６及び２７にかけてＳ１３からＳ１７が実行されることにより、ＷＤＡＴＡ１２が項目Ｂとして設定される。ＩＤＡＴＡ１１はＷＤＡＴＡ１２の親項目ではなく（Ｓ１８の判定でＮｏ）、かつ、ＩＤＡＴＡ１１とＷＤＡＴＡ１２の親項目は同じではないため（Ｓ２７の判定でＮｏ）、図２３の段階２８においてＳ４１を実行することにより、呼出し元であるＳ１９に復帰する。その時の項目Ａ及び項目Ｂは、再帰呼出し時に設定されたＩＲＥＣ０１及びＩＤＡＴＡ１１である。
【０１００】
ＩＲＥＣ０１はＩＤＡＴＡ１１の親項目であり、且つ、上記において前後関係の集約を行った結果、ＩＤＡＴＡ１１以外の子項目を持たない。従って、図２４の段階２９から段階３１において、Ｓ２２からＳ２４が実行される。その結果、図２４に示すように、段階３１では、ＩＲＥＣ０１の状態情報及び判定結果情報はそれぞれ「済」及び「集」として設定され、ＩＤＡＴＡ１１の状態情報及び判定結果情報はそれぞれ「済」及び「削」として設定される。つまり、ＩＲＥＣ０１とＩＤＡＴＡ１１について親子方向の集約が可能であると判定される。さらに、項目Ｂは未設定の状態にされる。ここまでの集約判定によって、データ項目ＩＲＥＣ０１、ＩＤＡＴＡ１１、ＩＤＡＴＡ１２、ＩＤＡＴＡ１３及びＩＤＡＴＡ１４は、１つのデータ項目に集約可能であると判定される。
【０１０１】
図２４の段階３１の後、図２４の段階３２及び段落３３においてＳ１３からＳ１７を実行することにより、項目ＡとしてＩＲＥＣ０１を設定し、項目ＢとしてＷＤＡＴＡ１２を設定する。しかし、ＩＲＥＣ０１はＷＤＡＴＡ１２の親項目ではなく、且つ、ＩＲＥＣ０１とＷＤＡＴＡ１２の親項目は同じではないため、これらの項目を集約する事はできないと判定される。その結果、図２４の段階３４及び段階３５において、Ｓ３９及びＳ４０を実行することにより、ＷＤＡＴＡ１２を項目Ａとして設定しなおし、さらに項目Ｂを未設定として、Ｓ１３に戻る。これ以降、同様にして、図２５の段階３６から図２６の段階４０にかけて、データ項目ＷＲＥＣ０１を構成する４つのデータ項目のうちＷＤＡＴＡ１２とＷＤＡＴＡ１３について前後方向の集約を行う事が可能であると判定される。さらに、図２６の段階４１から図２７の段階５９かけて、データ項目ＷＲＥＣ０２と、そのデータ項目を構成する２つのデータ項目について前後方向及び親子方向の集約を行う事が可能であると判定される。
【０１０２】
未判定データ項目リストに格納された判定結果は、判定結果通知部７によってユーザに通知される。集約指示受付部８がユーザから集約指示を受け付けた場合、データ項目集約部９によって、判定結果に基づいてデータ項目を集約することによりソースプログラムの最適化が行われる。
【０１０３】
図２８に、図３に示すソースプログラムを最適化した結果得られたプログラムを示す。図３に示すソースプログラムの１３０行目から１７０行目において以下の５つのデータ項目が宣言されている。図３に示すソースプログラムの処理部の記述から明らかなように、これらのデータ項目は未使用データ項目である。
【０１０４】
−ＩＲＥＣ０１
−ＤＡＴＡ１１　（データ型：文字データ、項目長：２０）
−ＤＡＴＡ１２　（データ型：文字データ、項目長：２０）
−ＤＡＴＡ１３　（データ型：文字データ、項目長：２０）
−ＤＡＴＡ１４　（データ型：文字データ、項目長：２０）
図２８の１３０行目に示すように、集約の結果、これらのデータ項目は、データ型が文字データであり、項目長が８０である１つのＦＩＬＬＥＲ項目に置き換えられている。つまり、５つのデータ項目が１つのデータ項目になったため、項目数が削減されていることが分かる。
【０１０５】
同様に、図３に示すソースプログラムの２１０行目及び２２０行目において宣言された、データ型が数値データであり、それぞれ項目長が２である２つのデータ項目ＷＤＡＴＡ１２及びＷＤＡＴＡ１３は、最適化処理の結果、データ型が数値データであり、項目長が４である１つのＦＩＬＬＥＲ項目に集約されている。また、同様に、図３に示すソースプログラムの２４０行目から２６０行目ににおいて宣言された３つのデータ項目は、１つのＦＩＬＬＥＲ項目に集約されている。
【０１０６】
なお、この例では、集約される複数のデータ項目のデータ型が同じである場合、集約後のデータ項目のデータ型も集約前と同じデータ型となるとしているが、集約前のデータ項目のデータ型に関係なく、集約後のデータ項目のデータ型を記憶域サイズが最も小さなデータ型とすることとしてもよい。いずれの場合であっても、集約後のＦＩＬＬＥＲ項目の項目長は、集約されたデータ項目の項目長の合計に等しい長さに設定されるため、集約によってデータ項目のメモリ上のアドレスが変化することは無い。従って、レコードの一部となっている複数のデータ項目を１つのデータ項目に集約しても、データ項目のメモリ上のアドレスがずれるという問題は生じない。
【０１０７】
上記の最適化処理装置１は、未使用データ項目を定義するコードを削除する機能を実現する未使用データ項目削除部（不図示）を更に備えることとしてもよい。この未使用データ項目定義するコードを削除する機能は、従来からコンパイラ等に与えられているため、詳しい説明を省略する。
【０１０８】
この未使用データ項目削除部を備える最適化処理装置１において、最適化処理を行う対象となるソースプログラムに対して、データ項目の集約判定を行う前に、未使用データ項目削除部は、未使用データ項目を宣言するコードをソースプログラムから削除することにより、集約判定のための前処理を行い、前処理が行われたソースプログラムをプログラム格納部１１に格納する。この前処理を行うことにより、集約判定の対象となる未使用データ項目の数を低減させておく。
【０１０９】
続いて、上記と同様にして、データ項目抽出部２、データ項目辞書作成部３、レイアウト部４、未使用データ項目抽出部５、集約判定部６及びデータ項目集約部９は、プログラム格納部１１から取出された前処理のすんだソースプログラム中の未使用データ項目を集約する。さらに、未使用データ項目削除部によって、その未使用データ項目が集約されたソースプログラムから、再度、未使用データ項目を宣言するコードをソースプログラムから削除する。
【０１１０】
図２９に、図３に示すソースプログラムに未使用データ項目の集約を行った後に不要な定義コードを削除した結果を示す。図２９から、図３４に示す従来の技術による不要な定義コードの削除結果と比べて、最適化処理装置１の方が、ソースプログラム中に残る未使用データ項目の数が少ないことが分かる。
【０１１１】
図３０に、Ｃ言語で記述されたソースプログラムの一例を示す。図３０に示すソースプログラムは、図３に示すＣＯＢＯＬで記述されたソースプログラムに対応する内容をもつ。ＣＯＢＯＬで記述されたソースプログラムと同様に、最適化処理装置１によってＣ言語で記述されたソースプログラム中の未使用データ項目を集約することができる。未使用データ項目を集約することによって図３０に示すソースプログラムを最適化すると、図３１に示すようなソースプログラムが得られる。なお、Ｃ言語には、ＣＯＢＯＬのＦＩＬＬＥＲ項目に相当するデータ項目が無いため、図３０及び図３１において、集約後のデータ項目の項目名は、集約されるデータ項目のなかで、レイアウト上で最先のアドレスを持つデータ項目の項目名と同じすることとした。また、データ型ｓｈｏｒｔ（短精度整数データ）は、２バイトであると仮定している。
【０１１２】
図３０及び図３１に示すように、Ｃ言語で記述されたソースプログラムであっても、ＣＯＢＯＬ言語で記述されたソースプログラムと同様に未使用データ項目の数を低減することができる。つまり、最適化処理装置１は、言語に依存しないで最適化処理を行う事が可能である。
【０１１３】
上記において説明した最適化処理装置１は、コンピュータを用いて構成することができる。以下、コンピュータの構成について、図３２を用いて説明する。
図３２に示すようにコンピュータ２０は、ＣＰＵ２１、メモリ２２、入力装置２３、出力装置２４、外部記憶装置２５、媒体駆動装置２６、及びネットワーク接続装置２７を備え、それらはバス２８により互いに接続されている。
【０１１４】
メモリ２２は、例えば、ＲＯＭ（Ｒｅａｄ　Ｏｎｌｙ　Ｍｅｍｏｒｙ）、ＲＡＭ（Ｒａｎｄｏｍ　Ａｃｃｅｓｓ　Ｍｅｍｏｒｙ）等を含み、処理に用いられるプログラムとデータを格納する。各格納部１５、１６及び１７から読み出されたソースプログラムやデータは、一時的にメモリ２２に格納される。また、データ項目抽出部２によって抽出されたデータ項目は、レイアウト部４によってこのメモリ２２にレイアウトされる。最適化処理装置１を構成するデータ項目抽出部２、データ項目辞書作成部３、レイアウト部４、未使用データ項目抽出部５、集約判定部６、判定結果通知部７、集約指示受付部８及びデータ項目集約部９は、コンピュータ２０のメモリ２２の特定のプログラムコードセグメントにプログラムとして格納される。なお、場合によっては、さらに未使用データ項目削除部が、コンピュータ２０のメモリ２３のプログラムコードセグメントにプログラムとして格納されることとしてもよい。　ＣＰＵ２１は、メモリ２２を利用して上述のプログラムを実行することにより、必要な処理を行う。
【０１１５】
入力装置２３は、例えば、キーボード、ポインティングデバイス、タッチパネル等であり、ユーザからの指示や情報の入力に用いられる。出力装置２４は、例えば、ディスプレイやプリンタ等であり、コンピュータのユーザへの問い合わせ、処理結果等の出力に用いられる。入力装置２３及び出力装置２４は、図１の入出力装置１０に対応する。
【０１１６】
外部記憶装置２５は、例えば、磁気ディスク装置、光ディスク装置、光磁気ディスク装置等である。外部記憶装置２５は、プログラム格納部１１、データ項目辞書格納部１２及び未判定データ項目リスト格納部１３を実現する。さらに、上述のプログラムをコンピュータ２０の外部記憶装置２５に保存しておき、必要に応じて、それらをメモリ２２にロードして使用することもできる。
【０１１７】
媒体駆動装置２６は、可搬記録媒体２９を駆動し、その記録内容にアクセスする。可搬記録媒体２９としては、メモリカード、メモリスティック、フレキシブルディスク、ＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ　Ｄｉｓｃ　Ｒｅａｄ　Ｏｎｌｙ　Ｍｅｍｏｒｙ）、光ディスク、光磁気ディスク、ＤＶＤ（Ｄｉｇｉｔａｌ　ＶｅｒｓａｔｉｌｅＤｉｓｋ）等、任意のコンピュータ読み取り可能な記録媒体が用いられる。この可搬記録媒体２９に上述のプログラムを格納しておき、必要に応じて、それをコンピュータ２０のメモリ２２にロードして使用することもできる。
【０１１８】
ネットワーク接続装置２７は、ＬＡＮ、ＷＡＮ等の任意のネットワーク（回線）を介して外部の装置を通信し、通信に伴うデータ変換を行う。また、必要に応じて、上述のプログラムを外部の装置から受け取り、それをコンピュータ２０のメモリ２２にロードして使用することもできる。
【０１１９】
図３３は、図３２のコンピュータへのプログラムのローディングを説明している。
上記最適化処理装置１に相当する機能をコンピュータに実現させるためのプログラムを、直接コンピュータの入力装置２３から入力することとしてもよいが、以下のようにしてコンピュータにロードする事もできる。例えば、コンピュータで読み取り可能な記録媒体２９に上記プログラムを予め記憶させておく。そして、図３３に示すようにしてその記録媒体２９からプログラムをコンピュータに読み出させて、そのコンピュータのメモリ２２や外部記憶装置２５に一旦格納させる。コンピュータに最適化処理を行わせるためには、この格納されたプログラムをそのコンピュータの有するＣＰＵ２１に読み出させて、そのコンピュータに実行させるように構成すればよい。
【０１２０】
また、プログラム（データ）提供者３０が有するＤＢから、通信回線（ネットワーク）３１を介して、プログラムをコンピュータにダウンロードすることとしてもよい。この場合、例えば、プログラム（データ）提供者３０が有する送信側コンピュータでは、プログラムを表現するプログラム・データをプログラム・データ・シグナルに変換し、モデムを用いて変換されたプログラム・データ・シグナルを変調することにより伝送信号を得て、得られた伝送信号を通信回線３１（伝送媒体）に出力する。プログラムを受信するコンピュータでは、モデムを用いて受信した伝送信号を復調することにより、プログラム・データ・シグナルを得て、得られたプログラム・データ・シグナルを変換することにより、プログラム・データを得る。なお、送信側のコンピュータと受信側のコンピュータの間を接続する通信回線３１（伝送媒体）がデジタル回線の場合、プログラム・データ・シグナルを通信することも可能である。
【０１２１】
以上、本発明の実施形態について説明したが、本発明は上述した実施形態及び変形例に限定されるものではなく、その他の様々な変更が可能である。例えば、最適化処理装置１をコンパイラ等に適用することとしてもよい。これにより、コンパイルに必要なメモリ容量を低減させ、効率的にコンパイルを行う事が可能となる。また、本最適化処理装置１を、データ項目辞書を作成するために使用することとしてもよい。
【０１２２】
（付記１）　プログラムを最適化する制御をコンピュータに行わせるコンピュータ・プログラムであって、
前記プログラムからデータ項目を抽出し、
前記データ項目を前記コンピュータに備えられたメモリ上にレイアウトし、
抽出された前記データ項目から、定義されたが使用されない未使用データ項目を抽出し、
前記レイアウト結果に基づいて、前記未使用データ項目のうち、階層構造をもつデータ項目の少なくとも一部を構成する複数の未使用データ項目を、１つの新たなデータ項目に集約することが可能か否か判定し、
前記判定結果に基づいて、前記複数のデータ項目を前記１つの新たなデータ項目に集約したプログラムを出力する、
ことを含む制御を前記コンピュータに行わせることを特徴とするコンピュータ・プログラム。
【０１２３】
（付記２）　集約される前記複数の未使用データ項目は、前記メモリ上において互いに隣接する領域にレイアウトされている、
ことを特徴とする付記１に記載のコンピュータ・プログラム。
【０１２４】
（付記３）　集約される前記複数の未使用データ項目は、共に階層構造をもつ他のデータ項目を構成するデータ項目であって、且つ、前記階層構造における階層レベルが互いに同じである、
ことを特徴とする付記２に記載のコンピュータ・プログラム。
【０１２５】
（付記４）　集約される前記複数の未使用データ項目は、階層構造をもつデータ項目と当該データ項目を構成するデータ項目であり、且つ、前記階層構造をもつデータ項目は１つのデータ項目によって構成される、
ことを特徴とする付記１に記載のコンピュータ・プログラム。
（付記５）　前記集約において、複数の未使用データ項目を宣言するコードを前記プログラムから削除し、１つの新たなデータ項目を宣言するコードを追加する、
ことを更に含む制御を前記コンピュータに行わせることを特徴とする付記１に記載のコンピュータ・プログラム。
【０１２６】
（付記６）　集約される前記複数の未使用データ項目の項目長に基づいて前記新たなデータ項目の項目長を設定する、
ことを更に含む制御を前記コンピュータに行わせることを特徴とする付記５に記載のコンピュータ・プログラム。
【０１２７】
（付記７）　集約される前記複数の未使用データ項目のデータ型が全て同じである場合、集約される前記複数の未使用データ項目のデータ型と同じデータ型として、前記新たなデータ項目のデータ型を設定する、
ことを更に含む制御を前記コンピュータに行わせることを特徴とする付記５に記載のコンピュータ・プログラム。
【０１２８】
（付記８）　前記新たなデータ項目のデータ型を、記憶域サイズが最小となるデータ型として設定する、
ことを更に含む制御を前記コンピュータに行わせることを特徴とする付記５に記載のコンピュータ・プログラム。
【０１２９】
（付記９）　前記新たなデータ項目の項目名を無名として設定する、
ことを更に含む制御を前記コンピュータに行わせることを特徴とする付記５に記載のコンピュータ・プログラム。
【０１３０】
（付記１０）　前記新たなデータ項目の項目名を、集約される前記複数の未使用データ項目のうちの何れか１つに基づいて設定する、
ことを更に含む制御を前記コンピュータに行わせることを特徴とする付記５に記載のコンピュータ・プログラム。
【０１３１】
（付記１１）　変更された前記プログラムに基づいて、前記メモリ上の前記データ項目のレイアウトを変更する、
ことを更に含む制御を前記コンピュータに行わせることを特徴とする付記１　に記載のコンピュータ・プログラム。
【０１３２】
（付記１２）　変更された前記プログラムから、未使用データ項目を定義するコードを削除する、
ことを更に含む制御を前記コンピュータに行わせることを特徴とする付記１　に記載のコンピュータ・プログラム。
【０１３３】
（付記１３）　プログラムを最適化する制御をコンピュータに行わせるプログラムを記録した記録媒体であって、
前記プログラムからデータ項目を抽出し、
前記データ項目を前記コンピュータに備えられたメモリ上にレイアウトし、
抽出された前記データ項目から、定義されたが使用されない未使用データ項目を抽出し、
前記レイアウト結果に基づいて、前記未使用データ項目のうち、階層構造をもつデータ項目の少なくとも一部を構成する複数の未使用データ項目を、１つの新たなデータ項目に集約することが可能か否か判定し、
前記判定結果に基づいて、前記複数のデータ項目を前記１つの新たなデータ項目に集約したプログラムを出力する、
ことを含む制御を前記コンピュータに行わせるプログラムを記録した記録媒体。
【０１３４】
（付記１４）　コンピュータが、プログラムを最適化するプログラム最適化方法であって、
前記プログラムからデータ項目を抽出し、
前記データ項目を前記コンピュータに備えられたメモリ上にレイアウトし、
抽出された前記データ項目から、定義されたが使用されない未使用データ項目を抽出し、
前記レイアウト結果に基づいて、前記未使用データ項目のうち、階層構造をもつデータ項目の少なくとも一部を構成する複数の未使用データ項目を、１つの新たなデータ項目に集約することが可能か否か判定し、
前記判定結果に基づいて、前記複数のデータ項目を前記新たなデータ項目に集約するように前記プログラムを変更する、
ことを含むことを特徴とするプログラム最適化方法。
【０１３５】
（付記１５）　プログラムを最適化する最適化処理装置であって、
前記プログラムからデータ項目を抽出するデータ項目抽出手段と、
抽出された前記データ項目をメモリ上にレイアウトするレイアウト手段と、
抽出された前記データ項目から、定義されたが使用されない未使用データ項目を抽出する未使用データ項目抽出手段と、
前記レイアウト結果に基づいて、前記未使用データ項目のうち、階層構造をもつデータ項目の少なくとも一部を構成する複数の未使用データ項目を、１つの新たなデータ項目に集約することが可能か否か判定する集約判定手段と、
前記判定結果に基づいて、前記複数のデータ項目を前記１つの新たなデータ項目に集約したプログラムを出力するデータ項目集約手段と、
を備えることを特徴とする最適化処理装置。
【０１３６】
【発明の効果】
以上詳細に説明したように、本発明によれば、階層構造における階層レベル及びメモリ上でのデータ項目の配置に基づいて、階層構造を有するデータ項目を構成する複数の未使用データ項目を１つのデータ項目に集約することにより、未使用データ項目の数を低減することが可能となる。延いては、コンパイル時やデータ項目辞書作成時に必要となるメモリ量を低減するようにプログラムを最適化することが可能となる。
【図面の簡単な説明】
【図１】最適化処理装置の構成図である。
【図２】プログラムの最適化処理の大まかな流れを示すフローチャートである。
【図３】ＣＯＢＯＬ　で記述されたソースプログラムの一例を示す図である。
【図４】図３に示すソースプログラムのデータ項目辞書を示す図（その１）である。
【図５】図３に示すソースプログラムのデータ項目辞書を示す図（その２）である。
【図６】図３に示すソースプログラムのデータ項目辞書を示す図（その３）である。
【図７】データ項目辞書の表記方法を説明する図である。
【図８】データ項目のレイアウトの一例を示す図（その１）である。
【図９】データ項目のレイアウトの一例を示す図（その２）である。
【図１０】データ項目のレイアウトの一例を示す図（その３）である。
【図１１】前後方向の集約を説明する図である。
【図１２】親子方向の集約を説明する図である。
【図１３】未判定データ項目リストに含まれるポインタを説明する図（その１）である。
【図１４】未判定データ項目リストに含まれるポインタを説明する図（その２）である。
【図１５】図１３及び図１４に示す未判定データ項目リストに含まれるポインタの表記方法及び未判定データ項目リストに含まれる情報を説明する図である。
【図１６】集約判定の手順を示すフローチャート（その１）である。
【図１７】集約判定の手順を示すフローチャート（その２）である。
【図１８】集約判定の手順を示すフローチャート（その３）である。
【図１９】集約判定の手順を示すフローチャート（その４）である。
【図２０】図３に示すソースプログラムについて集約判定を行う場合の各段階における項目Ａ及び項目Ｂの設定内容並びに未判定データ項目リストの内容を示す図（その１）である。
【図２１】図３に示すソースプログラムについて集約判定を行う場合の各段階における項目Ａ及び項目Ｂの設定内容並びに未判定データ項目リストの内容を示す図（その２）である。
【図２２】図３に示すソースプログラムについて集約判定を行う場合の各段階における項目Ａ及び項目Ｂの設定内容並びに未判定データ項目リストの内容を示す図（その３）である。
【図２３】図３に示すソースプログラムについて集約判定を行う場合の各段階における項目Ａ及び項目Ｂの設定内容並びに未判定データ項目リストの内容を示す図（その４）である。
【図２４】図３に示すソースプログラムについて集約判定を行う場合の各段階における項目Ａ及び項目Ｂの設定内容並びに未判定データ項目リストの内容を示す図（その５）である。
【図２５】図３に示すソースプログラムについて集約判定を行う場合の各段階における項目Ａ及び項目Ｂの設定内容並びに未判定データ項目リストの内容を示す図（その６）である。
【図２６】図３に示すソースプログラムについて集約判定を行う場合の各段階における項目Ａ及び項目Ｂの設定内容並びに未判定データ項目リストの内容を示す図（その７）である。
【図２７】図３に示すソースプログラムについて集約判定を行う場合の各段階における項目Ａ及び項目Ｂの設定内容並びに未判定データ項目リストの内容を示す図（その８）である。
【図２８】図３に示すソースプログラムを最適化した結果を示す図である。
【図２９】図２８に示す最適化されたソースプログラムから付与運当て意義コードを削除した結果を示す図である。
【図３０】Ｃで記述されたソースプログラムの一例を示す図である。
【図３１】図３０に示すソースプログラムを最適化した結果を示す図である。
【図３２】コンピュータの構成図である。
【図３３】データやプログラムのコンピュータへのローディングを説明する図である。
【図３４】ＣＯＢＯＬ　で記述されたソースプログラムの一例を示す図である。
【図３５】従来技術を用いて図３４に示すソースプログラムから未使用データ項目を定義するコードを削除した結果を示す図である。
【図３６】Ｃで記述されたソースプログラムの一例を示す図である。
【図３７】従来技術を用いて図３９に示すソースプログラムから未使用データ項目を定義するコードを削除した結果を示す図である。
【符号の説明】
１　最適化処理装置
２　データ項目抽出部
３　データ項目辞書作成部
４　レイアウト部
５　未使用データ項目抽出部
６　集約判定部
７　判定結果通知部
８　集約指示受付部
９　データ項目集約部
１０　入出力部
１１　プログラム格納部
１２　データ項目辞書格納部
１３　未判定データ項目リスト格納部
２０　コンピュータ
２１　ＣＰＵ
２２　メモリ
２３　入力装置
２４　出力装置
２５　外部記憶装置
２６　媒体駆動装置
２７　ネットワーク接続装置
２８　バス
２９　可搬記録媒体
３０　プログラム（データ）提供者
３１　回線
Ｓ　ステップ
【図１】
2004118789.tif 000014
【図２】
2004118789.tif 000015
【図３】
2004118789.tif 000016
【図４】
2004118789.tif 000017
【図５】
2004118789.tif 000018
【図６】
2004118789.tif 000019
【図７】
2004118789.tif 000020
【図８】
2004118789.tif 000021
【図９】
2004118789.tif 000022
【図１０】
2004118789.tif 000023
【図１１】
2004118789.tif 000024
【図１２】
2004118789.tif 000025
【図１３】
2004118789.tif 000026
【図１４】
2004118789.tif 000027
【図１５】
2004118789.tif 000028
【図１６】
2004118789.tif 000029
【図１７】
2004118789.tif 000030
【図１８】
2004118789.tif 000031
【図１９】
2004118789.tif 000032
【図２０】
2004118789.tif 000033
【図２１】
2004118789.tif 000034
【図２２】
2004118789.tif 000035
【図２３】
2004118789.tif 000036
【図２４】
2004118789.tif 000037
【図２５】
2004118789.tif 000038
【図２６】
2004118789.tif 000039
【図２７】
2004118789.tif 000040
【図２８】
2004118789.tif 000041
【図２９】
2004118789.tif 000042
【図３０】
2004118789.tif 000043
【図３１】
2004118789.tif 000044
【図３２】
2004118789.tif 000045
【図３３】
2004118789.tif 000046
【図３４】
2004118789.tif 000047
【図３５】
2004118789.tif 000048
【図３６】
2004118789.tif 000049
【図３７】
2004118789.tif 000050