説明

プログラムコード生成装置、プログラムコード生成方法及びプログラム

【課題】 ソフトウェアの設計図面における関連について最適な実装方法を自動で出力することを可能とすることを目的とする。
【解決手段】 プラットフォーム非依存であり、実行可能であり、かつオブジェクト指向である設計図面を解析する設計図面解析工程と、前記設計図面情報に基づいて1対多の関連に対してプログラムコード生成規則を定めるインスタンス配置工程と、データアクセスが何回発生したかを示すインスタンスアクセス情報を更新するインスタンス配置情報更新工程と、前記インスタンス配置情報に基づいてプログラムコードを生成するプログラムコード生成工程とを備えることを特徴とするプログラムコード生成方法等、を提供する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ソフトウェアの設計図面からプログラムコードを自動生成することを特徴とするプログラムコード生成装置等に関する。
【背景技術】
【0002】
近年のソフトウェア設計技術として、モデル駆動型アーキテクチャー(Model Driven Architecture技術(以降、MDA技術と称す)が広まり、採用されるようになってきている。一般的にMDA技術とは、オペレータが入力したソフトウェアの設計図面情報から各種プラットフォームのプログラムコードを自動的に生成し、且つ、入力したソフトウェアの設計図面情報をMDA専用ツール上で動作および検証することが可能な技術である。これらソフトウェアの設計図面情報の代表的な例としては、オブジェクト指向技術のモデル表記言語であるUML(Unified Modeling Language)やSDL(Specification & Description Language)などが挙げられる。
【0003】
しかしながら、既存のプログラム生成装置から生成されるプログラムコードは、設計図面からプログラムコードに変換するルールによっては、生成されるコードのサイズが大きく、実行のために多くのRAMを必要とするという問題がある。このため、組み込みシステムなどのメモリ容量の制限が厳しい領域では、MDA技術の導入に躊躇するケースが少なくない。
【0004】
設計図面の段階での最適化を行う技術が、特許文献1(特開平11−237980号公報)及び特許文献2(特開2004−118865号公報)に開示されている。これらの技術は、オブジェクト指向機能排除手段を用いて仮想関数の機能を排除、もしくはインスタンスの動的生成の機能を排除することで必要なメモリ容量を増加させることなく組み込み制御システムに適用可能なコードの最適化を行うことを可能にしている。更に、組み込みシステムのソフトウェア開発におけるRAM容量を削減する技術が特許文献3(特開2000−40005号公報)及び特許文献4(特開2001−184214号公報)に開示されている。これらの技術は、プログラムコード中のconst指定されたインスタンス変数やオブジェクトをROM上に配置することにより、RAM容量の削減を図っている。また、特許文献5(特開2002−91762号公報)に記載の技術は、ROMのデータへのアドレスをRAMへ再配置する際のアドレス変換に関するもので、設計図面のデータを解析するが、RAM上のどこに配置するかについては触れられていない。これらの提案で述べられている最適化は、プログラムコードの生成時に限定された工夫であり、MDA技術の実行可能モデルを考慮したものではない。
【0005】
オブジェクト指向型プログラムでは、クラスの実体であるインスタンス同士が互いに協調動作することによって1つの機能を実現している。あるインスタンスが生成されるとそのインスタンスに働きかける別のインスタンスは、関連を保持するための領域についてメモリ領域を確保し、インスタンス同士で協調動作を実現する。インスタンス同士の関連が1対1の関連であれば、インスタンス自体を参照する領域が1つ存在すれば十分である。しかしながら、インスタンス同士の関連が1対多の場合や多対多の場合では、複数のインスタンスを保持するためのコンテナをメモリ領域に確保することが必要となる。複数のインスタンスを保持するコンテナは、配列型やLIST型やMAP型などで実現される。
【0006】
1対多の関連の場合は、インスタンス同士の関連が動的に変化するために、コンテナ領域を動的に確保する必要がある。コンテナ領域は、インスタンスと関連がある別のインスタンスへの参照と次のコンテナへの参照を連続で持つことによって複数インスタンスとの関連を保持することができる。例えば、クラスXとクラスYの間に1対多の関連が存在し、クラスXのインスタンス(x1)がクラスYのインスタンス(y1,y2,y3)をLIST型のコンテナで実現すると、インスタンスx1は、y1からy3まで辿ることが可能なリスト形式のコンテナとして関連を持つことになる。そして、クラスXとクラスYにおいてデータのやり取りが発生する場合は、インスタンスx1が持つLIST型のコンテナからクラスYのインスタンスをキー検索することで、関連付けられている複数のインスタンスから特定のインスタンスと協調動作することが可能となる。
【0007】
【特許文献1】特開平11−237980号公報
【特許文献2】特開2004−118865号公報
【特許文献3】特開2000−40005号公報
【特許文献4】特開2001−184214号公報
【特許文献5】特開2002−91762号公報
【発明の開示】
【発明が解決しようとする課題】
【0008】
コンテナの実装方法にはメモリ使用量や検索にかかるコストなどから様々な方法が存在する。一般に検索にかかるコストを抑えた実装方法を選択すると、メモリ使用量が大となる。つまり、コンテナの実装方法は検索にかかるコストとメモリの消費量はトレードオフの関係となっている。そのため、メモリ消費量や検索コストの面から最適な実装方法でプログラムコードを生成する必要がある。しかしながら、MDA技術を利用した場合は、プログラムの特性に応じてコンテナの実装方法を変更しておらず、メモリ消費量やインスタンスの検索にかかるコストについて何ら考慮がなされていない状況となっている。
【課題を解決するための手段】
【0009】
本発明は、実際に実行した結果であるインスタンスへのアクセス状況と、設計図面であるモデル情報から、インスタンスの保持方法であるコンテナを実装するプログラムコードについて、インスタンスへのアクセス頻度やアクセスパターンから最適なプログラムコードを選択する。これにより、設計者はソフトウェアの設計図面における関連について最適な実装方法を自動で出力することが可能となる。
【0010】
上記の目的を達成するために本発明は、プラットフォーム非依存であり、実行可能であり、かつオブジェクト指向である設計図面を解析する設計図面解析工程と、前記設計図面情報に基づいて1対多の関連に対してプログラムコード生成規則を定めるインスタンス配置工程と、データアクセスが何回発生したかを示すインスタンスアクセス情報を更新するインスタンス配置情報更新工程と、前記インスタンス配置情報に基づいてプログラムコードを生成するプログラムコード生成工程とを備えることを特徴とするプログラムコード生成方法等、を提供する。
【発明の効果】
【0011】
本発明によれば、ソフトウェアの設計図面からプログラムコードを自動生成する際、1対多及び多対多の関連のクラスについてはインスタンス配置情報に従ったプログラムコードを生成するプログラムコード生成装置を提供することができる。
【発明を実施するための最良の形態】
【0012】
以下、添付の図面に沿って本発明の実施形態について説明する。
【0013】
(第1の実施形態)
図1は、本発明の第1の実施形態を示す全体構成図である。1はCPUであり、以下に説明する3〜10の装置を2で示すバスを介してアクセスし制御を行う。3はバス2を介してCPU1からアクセス可能な読み出し専用メモリ(ROM)であり、本実施形態ではその動作を詳細に説明する処理プログラム3a及び処理プログラムにより使用されるパラメータ3bが格納されている。4は読み書き可能なメモリ(RAM)である。RAM4上には、領域4a、4b、4c、4d、4e、4f、4g及び4hが確保されている。これらの領域4a〜4hには、設計図面情報、プラットフォーム依存情報、プログラムコード、インスタンス配置情報、ライブラリ、プログラム実行形式、インスタンスアクセス情報及びインスタンス配置情報が夫々格納される。これらの設計図面情報、プラットフォーム依存情報、プログラムコード、インスタンス配置情報、ライブラリ、プログラム実行形式、インスタンスアクセス情報及びインスタンス配置情報は、上記処理プログラム3により作成/変更がなされる。5は入力インターフェイスであり、6で示したキーボード、マウス、ボタン、ダイアル等の入力装置を介してなされる入力を受け取る。7は出力インターフェイスであり、8で示したCRT,LCD等の表示媒体、更にはプリンタ、プロッタ等の出力装置に対し、データの表示/出力を行なう。また、9は外部記憶装置インターフェイスであり、10で示したHD、FD、CD−ROM、MD、CF等の外部記憶装置に対するデータの入出力を行うものである。
【0014】
本実施形態では、処理プログラム3aやパラメータ3bがROM3上にあるものとして、また、処理対象となる各データの格納領域(4a〜4h)がRAM上にあるものとして説明を行う。但し、これらはすべて、外部記憶装置上に配置することも可能であり、必要に応じて外部記憶装置からRAM上にロードして使用することもできる。また、CPUのキャッシュメモリ上に配置することも同様に可能である。
【0015】
図2は、図1において3aで示した処理プログラムの構成要件とそれら構成要件が図1の4a〜4fで示した格納領域に格納されるデータとどのような関係にあるかを示すデータフロー図である。
【0016】
201は、図1における入力インターフェイス5を介して入力されるデータを扱うGUI入力処理部であり、ユーザはこのGUI入力処理部201によりデータの入力や編集と、各処理部へ指示できるようになっている。本実施形態に係るプログラムコード生成装置においては、自動生成装置起動部202として利用する。
【0017】
203は、外部記憶装置10に格納されている、プラットフォーム非依存であり、実行可能であり、かつオブジェクト指向であることを特徴とする設計図面を読み込み、設計図面情報206を生成する設計図面情報入力部である。
【0018】
204は、プラットフォーム依存情報入力部である。プラットフォーム依存情報入力部204は、外部記憶装置10に格納されている、実行ファイルの動作するOSやCPUやメモリ量やプログラミング言語や利用フレームワークを含む情報を読み込み、プラットフォーム依存情報207を生成する。
【0019】
205は、インスタンスの実装コードにおけるコレクションの型を決定するためのインスタンス配置情報208を更新するインスタンス配置情報更新部である。
【0020】
209は、設計図面情報206やプラットフォーム依存情報207やインスタンス配置情報208からプログラムコード210を生成するプログラム生成部である。プログラム生成部209はインスタンス配置情報入力部によって選択されたインスタンス配置情報208を使って、プログラムコードを生成する。プログラム生成部209が生成可能なプログラムコードとして、インスタンスのコレクション型を決定したプログラムコードや、インスタンスへのアクセスログを出力することが可能なコードを付加したプログラムコード等が挙げられる。
【0021】
211は、プログラムコード210から参照されるライブラリである。
【0022】
212は、プログラムコード210とライブラリ211をコンパイル・リンクするコードコンパイラ・リンカである。
【0023】
213は、コードコンパイラ・リンカ212が生成したプログラム実行形式である。
【0024】
214は、プログラム実行形式213を実行する実行部である。プログラム実行形式213がインスタンスへのアクセスログを出力することが可能なコードを付加したプログラム実行形式213であった場合、ここでのプログラム動作時にプログラム実行ログ215を出力する。
【0025】
215は、プログラム実行部214でプログラム実行時に出力されたプログラム実行ログであり、いつ、どのクラスのインスタンスへのアクセスがあったかどうかをログ出力する。
【0026】
216は、プログラム実行ログ215を使って、インスタンスへのアクセスログを解析する実行ログ解析部である。
【0027】
217は、実行ログ解析部216より算出されたインスタンスアクセス情報である。
【0028】
これ以降の説明におけるフローチャートによる処理手順は、例に限定されることはなく、本発明の結果を満たす限りいかなる手順の組み合わせも、複数処理をまとめることも、処理を細分化することも可能である。また、各処理を個々に切り出してひとつの機能要素として単体として機能し、示している処理以外の処理と組み合わせて使用することも可能である。
【0029】
以下、本発明の実施形態の動作について図面及びフローチャートを参照して説明する。
【0030】
図3は、本実施形態のシステム全体の処理手順を示したフローチャート図である。本システムの起動は(ステップS101)、GUI入力処理部201などの入力部からオペレータが指示する。
【0031】
ステップS102で、設計図面情報入力部203が設計図面を読込み、プログラム生成部209が処理できるデータ形式に変換した設計図面情報206を生成する。
【0032】
ステップS103で、プラットフォーム依存情報入力部204が、プログラム生成部209が処理できるデータ形式に変換したプラットフォーム依存情報207を生成する。
【0033】
ステップS104で、プログラム生成部209は、設計図面情報206とプラットフォーム依存情報207を用いてプログラムコード210を生成する。ここで、オペレータからの指示がある場合だけ、インスタンス配置情報208を使って、インスタンスの保持方法を特定したプログラムコードを生成する。更に、オペレータからの指示があれば、生成するプログラムコード210に対し、いつ、どのインスタンスにアクセスしたかを出力するプログラム実行ログ215を生成するプログラムコードを付加する。プログラムコード生成ルーチンに関しては、次に詳しく説明する。
【0034】
ステップS105で、コンパイラ・リンカ212はプログラムコード210とライブラリ211をコンパイル・リンクし、プログラム実行形式213を生成する。
【0035】
ステップS106で、プログラム実行部214はプログラム実行形式213を実行する。ここでプログラム実行形式214が、ログ出力機能を付加したプログラムコード210の実行形式だった場合、このステップ時にプログラム実行ログ215が出力される。
【0036】
ステップS107で、実行ログ解析部216は、プログラム実行ログを生成するプログラムコードが付加されていて、かつプログラム実行ログ215があるかどうかを判断する。プログラム実行ログがあった場合は、ステップS108へ進む。ステップS107で、プログラム実行ログがなかった場合は、ステップS109へ進む。
【0037】
ステップS108で、実行ログ解析部216はプログラム実行ログ215を解析する処理を行い、インスタンスアクセス情報217を生成する処理を行う。
【0038】
ステップS109で、インスタンス配置情報更新部208は、インスタンスアクセス情報が存在して、かつインスタンス配置情報を更新するかどうかを判断する。インスタンス配置情報を更新する場合は、ステップS110へ進む。ステップS109でインスタンス配置情報を更新しない場合は、ステップS111へ進み、本シーケンスを終了する。
【0039】
ステップS110で、インスタンス配置情報更新部208は、インスタンス配置情報を更新する処理を行う。インスタンス配置情報更新ルーチンに関しては、次に詳しく説明する。
【0040】
本実施形態においては、GUI入力処理部201から、オペレータによって、プログラム生成部209とコンパイラ・リンカ212、プログラム実行部214、実行ログ解析部216を起動しているが、この方法によらない。
【0041】
図4は、図3のプログラムコード生成ルーチンS104の流れを説明したフローチャート図である。プログラムコード生成ルーチンが呼び出されると、ステップS202で、全てのクラスについて、プログラムコード生成が完了するまでステップS203からステップS211を繰り返す処理を行う。全てのクラスについてプログラムコード生成が完了していなかったら、ステップS203へ進む。
【0042】
ステップS203で、クラスに存在する全ての関連についてのプログラムコード生成について、プログラムコード生成が完了するまでステップS204からステップS210を繰り返す処理を行う。全ての関連についてプログラムコード生成が完了していなかったら、ステップS204へ進む。
【0043】
ステップS204で、設計図面情報206の中で関連が1対多の関連か1対1の関連かを判断する処理を行う。
【0044】
ステップS204で、1対1の関連の場合は、ステップS208へ進む。1対多の関連の場合は、ステップS205へ進む。
【0045】
ステップS205で、インスタンス配置情報208に基づいてコレクションについてプログラムコードを自動生成するかどうかを判断する処理を行う。ステップS205で、インスタンス配置情報208を用いてプログラムコード生成をする場合は、ステップS206へ進む。インスタンス配置情報208を用いない場合は、ステップS207へ進む。
【0046】
ステップS206で、インスタンス配置情報に記載の型でインスタンス同士の関連についてプログラムコードを生成する処理を行う。
【0047】
ステップS207で、リスト構造でインスタンス同士の関連についてプログラムコード生成する処理を行う。
【0048】
ステップS208で、インスタンス同士の関連は1対1であるので、直接参照するプログラムコードを生成する処理を行う。
【0049】
ステップS209で、プログラムコードに対して、ログを付加するかどうかを判断する処理を行う。ステップS209でログを付加する場合は、ステップS210へ進む。ステップS209で、ログを付加しない場合は、ステップS211へ進む。
【0050】
ステップS210で、プログラムコードに対してログ出力を行うプログラムコードを付加する処理を行う。
【0051】
ステップS211で、全ての関連についてプログラムコード生成が完了すると、ステップS212へ進む。
【0052】
ステップS212で、全てのクラスについてプログラムコード生成が完了すると、ステップS213へ進み本シーケンスを終了する。
【0053】
図5Aは、ある設計図面の一部を示したイメージ図である。図5Aにおいて、301は、クラス名がAAAであるクラスを示している。302は、クラス名がBBBであるクラスを示している。303は、クラスAAAとクラスBBBが1対多の関連であることを示しており、クラスAAAからクラスBBBへの関連がA1であることを示している。
【0054】
図5Bは、クラス間の連携を実装するコンテナに関する特徴を示した表である。キー検索とは、あるインスタンスと関連のある複数のインスタンスの中から、特定のインスタンスをキーをもとに検索してからアクセスする形式である。Enumとは、あるインスタンスと関連のある複数のインスタンス全てに対してアクセスする形式である。MAP型は、インスタンスとそのキーを登録しておくのでキー検索にかかるコストは少なくい構造となる。LIST型や配列型の場合は、コンテナの構造が簡素であるか複雑であるかの違いはあるが、対象のインスタンスが見つかるまで全インスタンスを走査するため、キー検索にかかるコストは高くなる構造となる。また、Enum形式の場合では、コンテナの構造が簡素であるか複雑であるかの違いによりメモリ消費量に違いはあるが、EnumにかかるコストはMAP型、配列型、LIST型に違いはない。
【0055】
図6は、図3のインスタンス配置情報の更新ルーチンS110の流れを詳細に説明したフローチャート図である。図5Bの表で示しているようにアクセス形式にキー検索がある場合は、キー検索にかかるコスト(処理のオーダー)の低いHASH型が有効である。そのため、ある一定以上のインスタンスを関連として持つ(コレクション)場合は、キー検索のコストを考えHASH型を選択する。LIST型と配列型では、キー検索にかかるコストは同じであるが、構造の複雑さからEnum形式のアクセス頻度の違いによって、配列型かLIST型を選択する。
【0056】
インスタンス配置情報の更新ルーチンが呼び出されると、ステップS302で、全てのクラスについて、インスタンスアクセス情報217からインスタンス配置情報208の更新が完了するまでステップS303からステップS315を繰り返す処理を行う。全てのクラスについてインスタンス配置情報208の更新が完了していなかったら、ステップS303へ進む。
【0057】
ステップS303で、クラスに存在する1対多の関連に関するインスタンス配置情報208の更新について、更新が完了するまでステップS304からステップS314を繰り返す処理を行う。全てのインスタンス配置情報208の更新が完了していなかったら、ステップS304へ進む。
【0058】
ステップS304で、対象としている関連についてのインスタンスアクセス情報を読み取り、キー検索があるかどうかを判断する処理を行う。ステップS304でキー検索がある場合は、ステップS305へ進む。キー検索がない場合は、ステップS309へ進む。
【0059】
ステップS305で、対象としている関連についてのインスタンスアクセス情報を読み取り、コレクションの総インスタンス数を取得する処理を行う。
【0060】
ステップS306で、前もって設定している関連を実装するコンテナを決定するための閾値を取得する処理を行う。
【0061】
ステップS307で、ステップS305で取得したコレクションの総インスタンス数とステップS306で取得した閾値を比較する処理を行う。ステップS307でコレクションの総インスタンス数が閾値よりも大である場合は、ステップS308へ進む。ステップS307でコレクションの総インスタンス数が閾値よりも小である場合は、ステップS309へ進む。
【0062】
ステップS308で、対象としている関連についてのインスタンス配置情報をHASH型に設定する処理を行う。
【0063】
ステップS309で、対象としている関連についてインスタンスアクセス情報を読み取り、Enum形式があるどうかを判断する処理を行う。ステップS309で、Enum形式がある場合は、ステップS311へ進む。Enum形式がない場合は、ステップS310へ進む。
【0064】
ステップS310で、対象としている関連についてのインスタンス配置情報208をLIST型に設定する処理を行う。
【0065】
ステップS311で、対象としている関連についてのインスタンスアクセス情報を読み取り、Enum形式のアクセス頻度を取得する処理を行う。
【0066】
ステップS312で、前もって設定している関連を実装するコンテナを決定するための閾値を取得する処理を行う。
【0067】
ステップ313で、ステップS311で取得した総数とステップS312で取得した閾値を比較する処理を行う。ステップS313で総数が閾値よりも大である場合は、ステップS314へ進む。ステップS313で総数が閾値よりも小である場合は、ステップS310へ進む。
【0068】
ステップS314で、対象としている関連についてのインスタンス配置情報208を配列型に設定する処理を行う。
【0069】
ステップS315で、全ての関連についてインスタンス配置情報208の更新が完了すると、ステップS316へ進む。
【0070】
ステップS316で、全てのクラスについてインスタンス配置情報208が完了すると、ステップS317へ進み、本シーケンスを終了する。
【0071】
図7は、図5Aの設計図面を入力として、図4のフローチャート図によってプログラムコードが生成され、そのプログラムコードをコンパイル・リンクし、その結果生成されるプログラム実行形式を実際に実行した結果得られるログの一例を示したイメージ図である。図7において、401は、クラスAAAの関連A1において、関連A1が保持するインスタンスに対するアクセスが発生した時のログを示している。402から404は、特定のインスタンスを取得するためのログを示している。402は、関連A1に対して、キー“name”で検索されたことを示しており、関連によって保持されているインスタンスを4回にわたってチェックした結果、対象インスタンスを取得することが出来たことを示している。403及び404においても、402と同様である。405は、関連によって保持されている全インスタンスに対して処理が発生したことを示すログとなっている。
【0072】
図8は、図7のログを解析した結果得られるインスタンスアクセス情報217を示したイメージ図である。図8中の501は、次の事項を示している。即ち、クラスAAAにおいて関連A1が存在し、その関連A1に対してキーが“name”であるインスタンスが存在するかどうかを検索する処理が発生し、対象インスタンスを取得するのに4回のアクセスが関連A1に対して生じたことを示している。502は、関連が保持する全インスタンス4つに対して連続アクセスが発生したことを示している。また、特定インスタンスに対するアクセスが3回、全インスタンスに対する連続アクセスが1回それぞれ発生したことを示している。
【0073】
図4で示したフローチャートを実行すると、図8のインスタンスアクセス情報を解析し、インスタンス配置情報を更新する。キー検索に関する閾値が3である場合は、インスタンスアクセス情報217において総インスタンス数が4個であることからインスタンス配置情報208はMAP型に設定される。キー検索に関する閾値が4で、Enum形式のアクセス頻度が1である場合は、LIST型に設定される。キー検索に関する閾値が4で、Enum形式のアクセス頻度が0である場合は、配列型に設定される。以上説明したように、図4で示したフローチャートを実行することによって、インスタンスアクセス情報217からインスタンス配置情報208を更新する。
【0074】
図9は、“MAP”を用いて生成されたプログラムコードの一例である。図9において、601は、クラスのコンストラクタであり、例えばコンストラクタの中でクラス間の関連(MAP)を生成するプログラムコードが生成される。602は、クラス間の関連において保持されているインスタンスについて、特定のインスタンスを取得するプログラムコードであり、例えばMAPを使用している場合は、引数にキーを与えることで特定のインスタンスをMAPから取得することが出来る。603は、クラス間の関連に新たにインスタンスを追加するプログラムコードであり、例えばMAPに登録するときは、インスタンスとそのインスタンスを検索するキーを同時に登録する。MAPは、メモリ消費量が大であるかわりに検索スピードが高速であることが知られており、MAPを関連に対するプログラムコードとして生成することによって、特定のインスタンスを検索するのにかかるコストを抑えることが可能となる。
【0075】
図10は、“LIST”を用いて生成されたプログラムコードの一例である。図10において、701は、クラスのコンストラクタであり、例えばコンストラクタの中でクラス間の関連(LIST)を生成するプログラムコードが生成される。702は、クラス間の関連において保持されているインスタンスについて、特定のインスタンスを取得するプログラムコードである。例えばLISTを使用している場合は、while文などによりすべてのインスタンスに対して、キーと一致するインスタンスが現れるまでループを実行することで実現する。703は、クラス間の関連に新たにインスタンスを追加するプログラムコードであり、例えばLISTに登録するときは、インスタンスを登録する。LIST型は、MAP型よりもメモリ消費量が小であるかわりに検索にかかるコストがMAPよりも大であることが知られており、LIST型を関連に対するプログラムコードとして生成することによって、メモリ消費量を抑えることができる。
【0076】
本実施形態では、あるインスタンスと関連のある別のインスタンスのコンテナに関わるプログラムコード生成について、閾値としてインスタンスの総数やアクセスした総数をもとに変更しているが、閾値として数ではなく割合であっても同様の作用・効果が得られる。
【0077】
(第2の実施形態)
次に、本発明の第2の実施形態について説明する。第2の実施形態では、第1の実施形態に加え、インスタンス配置情報の更新(図3のステップS110)において、インスタンスアクセス情報のアクセス情報に優先度を考慮して、インスタンス配置情報更新部205でインスタンス配置情報208を更新する。インスタンス配置情報を更新する場合のフローチャートを、図11に示す。
【0078】
図11は、第2の実施形態におけるインスタンス配置情報208を更新する場合のフローチャート図である。図5Bの表で示しているようにアクセス形式にキー検索がある場合は、キー検索にかかるコスト(処理のオーダー)の低いHASH型が有効である。しかしながら、キー検索にかかるコストが低いかわりメモリ消費量が高いため、キー検索がそれほど実行されない場合では、HASH型を選択してもそれほど効果が得られない場合も存在する。このような場合は、HASH型ではなくLIST型の方がいいかどうかをキー検索形式の頻度やEnum形式の頻度をもとに計算する。
【0079】
ステップS402で、各型を使用する優先度に応じて割り振られたポイントを取得する処理を行う。例えば、関連を実装するプログラムコードをLIST型かMAP型とする場合において、検索スピードよりもメモリ消費量を抑えたい場合には、LIST型のポイントをMAP型よりも高く設定する。
【0080】
ステップS403で、全てのクラスについて、インスタンスアクセス情報217からインスタンス配置情報208の更新が完了するまでステップS404からステップS410を繰り返す処理を行う。全てのクラスについてインスタンス配置情報208の更新が完了していなかったら、ステップS404へ進む。
【0081】
ステップS404で、クラスに存在する1対多の関連に関するインスタンス配置情報208の更新について、更新が完了するまでステップS405からステップS409を繰り返す処理を行う。全てのインスタンス配置情報208の更新が完了していなかったら、ステップS405へ進む。
【0082】
ステップS405で、Enum形式のアクセス回数をインスタンスアクセス情報217から取得し、そのアクセス数とステップS402で取得したポイント数から各型のポイント数を計算する処理を行う。
【0083】
ステップS406で、キー検索形式について、全てのキーが完了するまでステップS407を繰り返す処理を行う。全てのキーが完了していなかったら、ステップS407へ進む。
【0084】
ステップS407で、特定インスタンスのアクセスの回数をインスタンスアクセス情報217から取得し、そのアクセス数とステップS402で取得したポイント数から各型のポイント数を計算する処理を行う。
【0085】
ステップS408で、全てのキーについて完了すると、ステップS409へ進む。
【0086】
ステップS409で、ステップS405とステップS407から得られた各型のポイント数から、インスタンス配置情報を設定する処理を行う。
【0087】
ステップS410で、全ての関連についてプログラムコード生成が完了すると、ステップS411へ進む。
【0088】
ステップS411で、全てのクラスについてプログラムコード生成が完了すると、ステップS412へ進み本シーケンスを終了する。
【0089】
図12は、第1の実施形態と同様のインスタンスアクセス情報217を示したイメージ図である。図12中の801は、次の事項を示している。即ち、クラスAAAにおいて関連A1が存在し、その関連A1に対してキーが“name”であるインスタンスが存在するかどうかを検索する処理が発生し、対象インスタンスを取得するのに4回のアクセスが関連A1に対して生じたことを示している。802は、クラスAAAにおいて関連A1が存在し、その関連A1に対してキーが“name”であるインスタンスが存在するかどうかを検索する処理が発生し、対象インスタンスを取得するのに2回のアクセスが関連A1に対して生じたことを示している。803は、クラスAAAにおいて関連A1が存在し、その関連A1に対してキーが“type”であるインスタンスが存在するかどうかを検索する処理が発生し、対象インスタンスを取得するのに50回のアクセスが関連A1に対して生じたことを示している。804は、関連が保持する全インスタンス数100に対して連続アクセスが発生したことを示している。また、同様のアクセスが、この他にも合計10回発生していることを示している。
【0090】
図11で示したフローチャートを実行すると、図12のインスタンスアクセス情報を解析し、インスタンス配置情報を更新する。例えば、検索にかかるコストよりもメモリ消費量を抑えたい場合には、LIST型のポイントを2、MAP型のポイントを1のようにLIST型のポイントを高く設定する。図12の場合において、全インスタンスへの連続アクセスについて、全インスタンスへのアクセスが10回発生するため、LIST型のポイントは20ポイントとなる。同様にMAP型のポイントは10ポイントとなる。図12の場合において、特定インスタンスへのアクセスについて、nameをキーとしてアクセスする場合は、2回存在しているため、LIST型のポイントは0、MAP型のポイントは2となる。また、特定インスタンスへのアクセスについて、typeをキーとしてアクセスする場合は、1回存在しているため、LIST型のポイントは0、MAP型のポイントは1となる。この結果、図12のようなインスタンスアクセス情報において、メモリ消費量を抑える方針の場合には、次のようになる。即ち、LIST型のポイントが2、MAP型のポイントが1に設定されているので、LIST型20ポイント、MAP型12ポイント(キーがname)及び11ポイント(キーがtype)となる。従って、最終的なインスタンス配置情報はLISTとして設定することとなり、最終的にプログラムコードを生成するとLIST型を生成する。
【0091】
また、メモリ消費量検索よりも検索にかかるコストを抑えたい場合には、LIST型のポイントを1、MAP型のポイントを2のようにMAP型のポイントを高く設定する。図12の場合において、全インスタンスへの連続アクセスについて、全インスタンスへのアクセスが10回発生するため、LIST型のポイントは10ポイントとなる。同様にMAP型のポイントは20ポイントとなる。図12の場合において、特定インスタンスへのアクセスについて、nameをキーとしてアクセスする場合は、2回存在しているため、LIST型のポイントは0、MAP型のポイントは4となる。また、特定インスタンスへのアクセスについて、typeをキーとしてアクセスする場合は、1回存在しているため、LIST型のポイントは0、MAP型のポイントは2となる。この結果、図12のようなインスタンスアクセス情報において、検索コストを抑える方針の場合には、次のようになる。即ち、LIST型のポイントが1、MAP型のポイントが2に設定されているので、LIST型10ポイント、MAP型22ポイント(キーがname)及び21ポイント(キーがtype)となる。従って、最終的なインスタンス配置情報はキーをnameとするMAP型として設定することとなり、最終的にプログラムコードを生成するとキーをnameとするMAP型を生成する。
【0092】
本実施形態においては、ポイントを設定しているがポイントではなく別の優先度の設定方法を用いても同様の作用・効果が得られる。
【0093】
以上説明してきたように、インスタンス配置情報を更新する場合に、インスタンスアクセス情報に対してポイントを適用することによって、メモリ消費量と検索にかかるコストのトレードオフを図りながら、関連を表すプログラムコードの実装方法を決定することが可能となる。
【0094】
このように、これらの実施形態によれば、ソフトウェアの設計図面からプログラムコードを自動生成する際、1対多及び多対多の関連のクラスについてはインスタンス配置情報に従ったプログラムコードを生成するプログラムコード生成装置を提供することができる。
【0095】
また、これらのプログラムコード生成装置は、インスタンス配置情報を更新するために、あるインスタンスが保持しているインスタンスのアクセス状況をログ出力可能なプログラムコードを生成することができる。そして、そのログからコンテナの実装方法を決めるためのインスタンスアクセス情報217を抽出することが可能である。さらに、インスタンスアクセス情報をもとにインスタンスを保持するコンテナについて最適なプログラムコードをインスタンス配置情報として更新することができる。更に、これらのプログラムコード生成装置は、コンテナ実装について、インスタンスアクセス情報からインスタンス配置情報を更新することで、インスタンスの検索コストを考慮しメモリ消費量を抑えたプログラムコードを生成できる。
【0096】
なお、本発明の実施形態は、例えばコンピュータがプログラムを実行することによって実現することができる。また、プログラムをコンピュータに供給するための手段、例えばかかるプログラムを記録したCD−ROM等のコンピュータ読み取り可能な記録媒体又はかかるプログラムを伝送するインターネット等の伝送媒体も本発明の実施形態として適用することができる。また、上記のプログラムも本発明の実施形態として適用することができる。上記のプログラム、記録媒体、伝送媒体及びプログラムプロダクトは、本発明の範疇に含まれる。
【図面の簡単な説明】
【0097】
【図1】本発明の第1の実施形態に係るプログラムコード生成装置の構成ブロック図である。
【図2】本発明の第1の実施形態に係るプログラムコード生成装置のデータフロー図である。
【図3】本発明の第1の実施形態におけるシステム全体のフローチャート図である。
【図4】本発明の第1の実施形態におけるプログラムコード生成ルーチンに関するフローチャート図である。
【図5A】ある設計図面の一部を示したイメージ図である。
【図5B】クラス間の連携を実装するコンテナに関する特徴を表す表を示す図である。
【図6】本発明の第1の実施形態におけるインスタンス配置情報の更新ルーチンに関するフローチャート図である。
【図7】本発明の第1の実施形態におけるログ出力プログラムコードによって出力されたログを示すイメージ図である。
【図8】本発明の第1の実施形態におけるログを解析した結果得られるインスタンスアクセス情報を示すイメージ図である。
【図9】本発明の第1の実施形態におけるプログラムコード生成装置によって生成されるプログラムコードのなかでコンテナをMAP型で実装した例を示したイメージ図である。
【図10】本発明の第1の実施形態におけるプログラムコード生成装置によって生成されるプログラムコードのなかでコンテナをLIST型で実装した例を示したイメージ図である。
【図11】本発明の第2の実施形態におけるインスタンス配置情報の更新ルーチンに関するフローチャート図である。
【図12】本発明の第2の実施形態におけるログを解析した結果得られるインスタンスアクセス情報を示すイメージ図である。
【符号の説明】
【0098】
1:CPU
2:バス
3:ROM
4:RAM
4a:設計図面情報
4b:プラットフォーム依存情報
4c:プログラムコード
4d:インスタンス配置情報
4e:ライブラリ
4f:プログラム実行形式
5:入力インターフェイス
6:キーボード、ボタン、マウス、ダイアル
7:出力インターフェイス
8a:CRT、LCD
8b:プリンタ、プロッタ
9:外部記憶装置インターフェイス
10:HD、FD、CD−ROM、MD、CF、・・・(ファイル)
201:GUI入力処理部
202:自動生成装置起動部
203:設計図面情報入力部
204:プラットフォーム依存情報入力部
205:インスタンス配置情報更新部
206:設計図面情報
207:プラットフォーム依存情報
208:インスタンス配置情報
209:プログラム生成部
210:プログラムコード
211:ライブラリ
212:コンパイラ・リンカ
213:プログラム実行形式
214:プログラム実行部
215:プログラム実行ログ
216:実行ログ解析部
217:インスタンスアクセス情報
301:クラス名がAAAであるクラス
302:クラス名がBBBであるクラス
303:クラスAAAとクラスBBBの関連

【特許請求の範囲】
【請求項1】
プラットフォーム非依存であり、実行可能であり、かつオブジェクト指向である設計図面を解析する設計図面解析手段と、
前記設計図面情報に基づいて1対多の関連に対してプログラムコード生成規則を定めるインスタンス配置情報と、
データアクセスが何回発生したかを示すインスタンスアクセス情報を更新するインスタンス配置情報更新手段と、
前記インスタンス配置情報に基づいてプログラムコードを生成するプログラムコード生成手段と、
を備えることを特徴とするプログラムコード生成装置。
【請求項2】
前記インスタンス配置情報更新手段は、前記インスタンスアクセス情報と前もって設定される閾値に基づいて更新することを特徴とする請求項1に記載のプログラムコード生成装置。
【請求項3】
前記インスタンスアクセス情報は、
前記設計図面に記載の第1のクラスと、
前記設計図面に記載の前記第1のクラスとは異なる第2のクラスと、
前記第1のクラスと前記第2のクラスとの関連と、
前記設計図面の第1のクラスの実体である第1のインスタンスと、
前記設計図面の第2のクラスの実体である第2のインスタンスと、
前記第1のインスンタンス及び前記第2のインスタンスへのアクセス形式と、
を有することを特徴とする請求項2に記載のプログラムコード生成装置。
【請求項4】
前記アクセス形式は、前記第2のインスタンスの特定インスタンスにのみアクセスするキー検索形式であることを特徴とする請求項3に記載のプログラムコード生成装置。
【請求項5】
前記アクセス形式は、前記第1のインスタンスと関連のある前記第2のインスタンスに全アクセスをするEnum形式であることを特徴とする請求項3に記載のプログラムコード生成装置。
【請求項6】
前記閾値は、インスタンスの総数を規定していることを特徴とする請求項3に記載のプログラムコード生成装置。
【請求項7】
前記閾値は、インスタンスへのアクセスする頻度を規定していることを特徴とする請求項3に記載のプログラムコード生成装置。
【請求項8】
プラットフォーム非依存であり、実行可能であり、かつオブジェクト指向である設計図面を解析する設計図面解析工程と、
前記設計図面情報に基づいて1対多の関連に対してプログラムコード生成規則を定めるインスタンス配置工程と、
データアクセスが何回発生したかを示すインスタンスアクセス情報を更新するインスタンス配置情報更新工程と、
前記インスタンス配置情報に基づいてプログラムコードを生成するプログラムコード生成工程と、
を備えることを特徴とするプログラムコード生成方法。
【請求項9】
コンピュータに、
プラットフォーム非依存であり、実行可能であり、かつオブジェクト指向である設計図面を解析する設計図面解析手順と、
前記設計図面情報に基づいて1対多の関連に対してプログラムコード生成規則を定めるインスタンス配置手順と、
データアクセスが何回発生したかを示すインスタンスアクセス情報を更新するインスタンス配置情報更新手順と、
前記インスタンス配置情報に基づいてプログラムコードを生成するプログラムコード生成手順と、
を実行させることを特徴とするプログラム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5A】
image rotate

【図5B】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate


【公開番号】特開2007−79838(P2007−79838A)
【公開日】平成19年3月29日(2007.3.29)
【国際特許分類】
【出願番号】特願2005−265795(P2005−265795)
【出願日】平成17年9月13日(2005.9.13)
【出願人】(000001007)キヤノン株式会社 (59,756)
【Fターム(参考)】