JP2007122187A - プログラム・コード生成装置 - Google Patents
プログラム・コード生成装置 Download PDFInfo
- Publication number
- JP2007122187A JP2007122187A JP2005310475A JP2005310475A JP2007122187A JP 2007122187 A JP2007122187 A JP 2007122187A JP 2005310475 A JP2005310475 A JP 2005310475A JP 2005310475 A JP2005310475 A JP 2005310475A JP 2007122187 A JP2007122187 A JP 2007122187A
- Authority
- JP
- Japan
- Prior art keywords
- product
- component
- syntax
- class
- multiplicity
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Stored Programmes (AREA)
Abstract
【課題】製品内に利用しない機能を実現するためのコードが混入することを防止して、製品の使用リソースを削減し、かつ、デバッグ容易性を向上させる。
【解決手段】特定のソフトウェア部品構成に応じて、汎用的なソフトウェア部品の集まりを、特定製品向けのソフトウェア部品の集まりに変換することで、多製品対応のために汎用的なソフトウェア部品を組み合わせるという手法を用いて開発を行なった際に、製品内に利用しない機能を実現するためのコードが混入することを防止する。
【選択図】図1
【解決手段】特定のソフトウェア部品構成に応じて、汎用的なソフトウェア部品の集まりを、特定製品向けのソフトウェア部品の集まりに変換することで、多製品対応のために汎用的なソフトウェア部品を組み合わせるという手法を用いて開発を行なった際に、製品内に利用しない機能を実現するためのコードが混入することを防止する。
【選択図】図1
Description
複数の汎用的なソフトウェア部品を組み合わせて製品プログラムを構築する開発手法であるソフトウェア・プロダクトラインによる開発を行なった際に、構築した製品プログラムに製品に不要な機能を実現するためのコードが混入することを防止するプログラム・コード生成装置に関する。但し、ここでいう汎用的なソフトウェア部品とは、モデル駆動型アーキテクチャ(Model Driven Architecture技術(以降、MDA技術と称す))におけるプラットフォーム非依存な実行可能設計図面(Plathome Independed Model: PIM)のような、プラットフォームに非依存なソフトウェア部品を対象としている。
近年、組み込みソフトウェア開発の規模の増大が進んでおり、加えて、製品サイクルの短縮により、多製品の組み込みソフトウェア開発を効率的に行うための手法が必要とされており、ソフトウェア部品を組み合わせて複数の類似のソフトウェアを作りこんでいく開発手法であるソフトウェア・プロダクトライン(Software Product Line: SPL)を用いた開発や、実行可能な設計図面を作り込んでゆくことでソフトウェアを作りこんでいく開発手法であるモデル駆動型アーキテクチャ(Model Driven Architecture技術(以降、MDA技術と称す))を用いた開発が採用されるようになってきている。
ソフトウェア・プロダクトラインとは、汎用的に作りこまれたソフトウェア部品を組み合わせてプログラムを構築する手法で、多人数並行開発を可能にし、また、多くのソフトウェア部品の再利用を可能にする技術である。
MDA技術とは、オペレータが入力したソフトウェアの設計図面情報から各種プラットフォームのプログラム・コードを自動的に生成し、且つ、入力したソフトウェアの設計図面情報をMDA専用ツール上で動作および検証することが可能な技術である。これらソフトウェアの設計図面情報の代表的な例としては、オブジェクト指向技術のモデル表記言語であるUML(Unified Modeling Language)やSDL(Specification & Description Language)などが挙げられる。
しかしながら、複数の製品プログラムで利用するために汎用的に作りこまれたソフトウェア部品は、特定の製品に対してカスタマイズされておらず特定製品において利用しない機能に関するプログラム・コードが混入してしまうという問題がある。加えて、既存のプログラム生成装置から生成されるプログラム・コードは、設計図面からプログラム・コードに変換するルールによっては、生成されるコードのサイズが大きく、実行のために多くのROM、RAM、CPUリソースを必要とするという問題がある。このため、組み込みシステムなどのメモリ容量の制限が厳しい領域では、MDA技術の導入やSPL技術の導入に躊躇するケースが少なくない。
特開平5−46374号公報(特許文献1)は、設計図面とソースコードの対応関係を持たせてソフトウェア部品として扱う技術で、設計図面とソースコードの食い違いを防止する技術である。この技術によれば、図面レベルで矛盾無くソースコードを結合することが可能であるが、設計図面の組み合わせの際に、最適化は考えられていない。
特開平6−119156号公報(特許文献2)は、部品プログラムを組み合わせてプログラムを自動生成する方法に関し、特に、プログラムの特性を基準として選択した部品同士の結合プログラムを自動生成する技術である。この技術では、様々なパターンのプログラム・コードを予め用意する必要があり、汎用的な部品を作るのに手間がかかるという問題があった。
設計図面の段階での最適化を行う技術については、特開平11−237980号公報(特許文献3)掲載の「オブジェクト指向最適化コード生成装置および方法」、特開2004−118865号公報(特許文献4)掲載の「最適化ソフトウェア生成方法」で、オブジェクト指向機能排除手段を用いて仮想関数の機能を排除、もしくはインスタンスの動的生成の機能を排除することで必要なメモリ容量を増加させることなく組み込み制御システムに適用可能なコードの最適化を行うことを可能にしている。
さらに、組み込みシステムのソフトウェア開発におけるRAM容量を削減する技術については、特開2000−40005号公報(特許文献5)掲載の「プログラム変換装置」や特開2001−184214号公報(特許文献6)掲載の「メモリ配置方法、及びオブジェクトクラス設計方法」で、プログラム・コード中のconst指定されたインスタンス変数やオブジェクトをROM上に配置することにより、RAM容量の削減を図っている。
また、特開2002−91762号公報(特許文献7)掲載の「プログラム生成装置」は、ROMのデータへのアドレスをRAMへ再配置する際のアドレス変換に関するもので、設計図面のデータを解析して、RAMに再配置をする。これらの技術は、設計図面やアクションをC言語に変換する際に最適化を加える技術であり、設計図面そのものを最適化するという観点の最適化ではない。また、製品の構成情報を元に、汎用的なソフトウェア部品を最適化するという視点はない。
汎用的なソフトウェア部品を構築し、その汎用的なソフトウェア部品を組み合わせることにより多製品に対応するという手法を用いた際に生じる課題を解決する。
汎用的なソフトウェア部品は、各製品で利用することが可能であるが、その反面、製品によっては利用しない機能を実現するためのコードが含まれてしまうなど、1つ1つの製品にとって最適な構成となっておらず、ROMやRAMやCPUリソースの限られた組み込み環境において、これを最適な構成にすることが課題となっている。また、汎用的に構築されたソフトウェア部品は、通常のソフトウェアに比べて複雑な構造となるため、デバッグが容易ではないという問題もあり、デバッグを簡単に行う仕掛けを作ることも課題となっている。
本発明は、多製品対応のために汎用的なソフトウェア部品を組み合わせるという手法を用いて開発を行った際に、製品内に利用しない機能を実現するためのコードが混入することを防止して、製品の使用リソースを削減し、かつ、デバッグ容易性を向上させるプログラム・コード生成装置を提供することを目的とする。
本発明のプログラム・コード生成装置は、インスタンスの配置やインスタンスの値やインスタンス間の関連といった製品の構成を解析する製品構成情報解析手段と、汎用的なクラス定義などといった製品を構成する部品の基本的な型定義を解析する汎用部品群情報解析手段と、前記製品構成情報解析手段より得られた製品の構成から、製品を構成する部品間の関連を抽出する構成部品関連抽出手段と、前記構成部品関連抽出手段より得られた部品間の関連と、前記汎用部品群情報解析手段より得られた部品の基本的な型の定義から、製品に特化した部品を生成する部品特化手段と、前記部品特化手段より得られた製品に特化した部品を、前記製品構成情報解析手段より得られた製品の構成にしたがって組み合わせたものから、製品としてのプログラム・コードを自動生成するプログラム・コード生成手段と、前記プログラム・コード生成手段より得られたプログラム・コードをコンパイル・リンクすることを特徴とするコンパイル・リンク手段とを有する。
本発明によれば、多製品対応のために汎用的なソフトウェア部品を組み合わせるという手法を用いて開発を行なった際に、製品内に利用しない機能を実現するためのコードが混入することを防止して、製品の使用リソースを削減し、かつ、デバッグ容易性を向上させる。
即ち、請求項1に記載のプログラム・コード生成装置を用いることで、汎用的なソフトウェア部品を製品に応じて組み合わせて、製品に特化したソフトウェア部品やプログラム・コードを自動生成することが可能となる。すなわち、汎用的なソフトウェア部品群を組み合わせることで多製品対応することが可能となり、また、製品の特性に応じて省メモリ、実行速度高速化といった最適化されたプログラム・コードの自動生成が可能となり、それに加えて、製品にあわせてスリム化されたソフトウェア部品を用いて用意にデバッグすることも可能になる。請求項3、請求項4、請求項5、請求項6で提案した手法を取り入れることにより、これらの効果はより顕著になる。
また、請求項2で示した部品変換ルールを外部から取り込む方法を採用することにより、ユーザが望む任意の変換をすることが可能になるため、より洗練されたソフトウェア部品やプログラム・コードの生成が可能になる。
図1は本発明の実施形態を示す全体構成図である。
図1において、1はCPUであり、以下に説明する2〜10の装置を2で示したバスを会してアクセスし制御を行う。
3はバス2を会してCPU1からアクセス可能な読み出し専用メモリ(ROM)であり、本実施形態ではその動作を詳細に説明する処理プログラム3a及び処理プログラムにより使用されるパラメータ3bが格納されている。
図1において、1はCPUであり、以下に説明する2〜10の装置を2で示したバスを会してアクセスし制御を行う。
3はバス2を会してCPU1からアクセス可能な読み出し専用メモリ(ROM)であり、本実施形態ではその動作を詳細に説明する処理プログラム3a及び処理プログラムにより使用されるパラメータ3bが格納されている。
4は読み書き可能なメモリ(RAM)であり、RAM4上には、上記処理プログラム3により作成/変更がなされる、製品構成情報、汎用部品群情報、部品変換ルール情報、部品関連情報、特定製品向け部品群情報、製品用コード、製品プログラムをそれぞれ格納するための領域(順に4a、4b、4c、4d、4e、4f、4g)が確保されている。
5は入力インターフェイスであり、6で示したキーボード、マウス、タブレット等の入力装置を介してなされる入力を受け取る。
7は出力インターフェイスであり、8で示したCRT,LCD等の表示媒体、更にはプリンタ、プロッタ等の出力装置に対し、データの表示/出力を行う。
また、9は外部記憶装置インターフェイスであり、10でしめしたHD、FD、CD−ROM、MODなどの外部記憶装置に対するデータの入出力を行うものである。
7は出力インターフェイスであり、8で示したCRT,LCD等の表示媒体、更にはプリンタ、プロッタ等の出力装置に対し、データの表示/出力を行う。
また、9は外部記憶装置インターフェイスであり、10でしめしたHD、FD、CD−ROM、MODなどの外部記憶装置に対するデータの入出力を行うものである。
本実施形態では、動作の詳細な説明と行う処理プログラム3aやパラメータ3bがROM3上にあるものとして、また、処理対象となる各データの格納領域(4a〜4g)がRAM上にあるものとして説明を行うが、これらはすべて、外部記憶装置上に配置することも可能であり、更に、必要に応じて、外部記憶装置からRAM上にロードし、使用することもできる。また、CPUのキャッシュメモリ上に配置することも同様に可能である。
図2は、図1において3aで示した処理プログラムの構成要件とそれら構成要件が第1図4a〜4gで示した格納領域に格納されるデータとどのような関係にあるかを示すものである。
図2において、200は入力インターフェイス5を介して入力されるデータを扱うGUI入力処理部であり、ユーザはこのGUI入力処理部200によりデータの入力、編集ができるようになっている。
図2において、200は入力インターフェイス5を介して入力されるデータを扱うGUI入力処理部であり、ユーザはこのGUI入力処理部200によりデータの入力、編集ができるようになっている。
201は、インスタンス配置やインスタンス値やインスタンス同士のリンクといった製品構成を外部記憶装置内から読み込み、構文解析を行う製品構成情報解析部であり、処理プログラムが読む込むことが可能な製品構成を解釈し、製品構成情報を生成することを可能にする。
202は、製品構成情報解析部201より生成された、処理プログラムが解釈することが可能な製品構成情報である。
203は、汎用的なクラス定義群やそれらの動作記述といった汎用部品群の内、製品構成情報202に利用されることが明記されている汎用部品群を外部記憶装置内から読み込み、構文解析を行う汎用部品群情報解析部であり、汎用部品群情報を生成することを可能にする。
202は、製品構成情報解析部201より生成された、処理プログラムが解釈することが可能な製品構成情報である。
203は、汎用的なクラス定義群やそれらの動作記述といった汎用部品群の内、製品構成情報202に利用されることが明記されている汎用部品群を外部記憶装置内から読み込み、構文解析を行う汎用部品群情報解析部であり、汎用部品群情報を生成することを可能にする。
204は、汎用部品群情報解析部203より生成された、処理プログラムが解釈することが可能な汎用部品群情報である。
205は、多重度や関連の有無に依存しない汎用的な記述を多重度や関連の有無に依存する記述に変換する部品変換ルールを外部記憶装置内から読み込み、構文解析を行う部品変換ルール情報解析部であり、処理プログラムが読む込むことが可能な部品変換ルール情報を生成することを可能にする。
205は、多重度や関連の有無に依存しない汎用的な記述を多重度や関連の有無に依存する記述に変換する部品変換ルールを外部記憶装置内から読み込み、構文解析を行う部品変換ルール情報解析部であり、処理プログラムが読む込むことが可能な部品変換ルール情報を生成することを可能にする。
206は、部品変換ルール情報解析部205より生成された、処理プログラムが解釈することが可能な部品変換ルール情報である。
207は、製品構成情報202を解析し、製品構成情報202内で利用されているクラスについて、リンクより必要とされる最小限の多重度や関連線の有無といった部品関連情報を抽出する構成部品関連抽出部であり、目的とする製品における最小限の多重度や関連線に関する部品関連情報を生成することを可能にする。
208は、構成部品関連抽出部208より生成された、処理プログラムが解釈することが可能な部品関連情報である。
207は、製品構成情報202を解析し、製品構成情報202内で利用されているクラスについて、リンクより必要とされる最小限の多重度や関連線の有無といった部品関連情報を抽出する構成部品関連抽出部であり、目的とする製品における最小限の多重度や関連線に関する部品関連情報を生成することを可能にする。
208は、構成部品関連抽出部208より生成された、処理プログラムが解釈することが可能な部品関連情報である。
次に、汎用部品群情報や特定製品向け部品群情報の一実施形態について説明する。これらの部品群の実施形態としてMDA(Model Driven Archetcture)の実行可能な設計図面を用いた場合について説明する。
実行可能な設計図面の全体構成を規定する図面は、一般にドメイン図と呼ばれている。実際の例を図3に示す。図3は、オペレータからの入力を受け、オペレータに指定されたスケジュールでハードを制御するシステムを表したドメイン図の一例である。301はハードの制御を指定されたスケジュールで行うControllerドメイン、302はオペレータからの操作を受け取るUIドメイン、303はハードを直接的に制御するDeviceドメイン、304はタイムサービスを提供するTimerドメインを示している。さらに、ドメイン同士の結びつきは、関連と呼ばれ、図3においては矢印付きの点線で表現される。図3では、ドメイン間の通信であるイベントの送受信を行う場合に点線で結ぶ例を示している。305は、関連の一例で、Controllerドメイン301とTimerドメイン304の間で、双方向のイベント通信を行うため、両方向に矢印のついた点線で示している。306も関連の一例で、Controllerドメイン301とDeviceドメイン303の間で、片方向のイベント通信を行うため、Deviceドメイン303側だけに矢印のついた点線で示す。
実行可能な設計図面において、処理を行うオブジェクトの静的な構造を示す設計図は、クラス図と呼ばれている。実際の例を図4に示す。図4は、図3で示したオペレータからの入力を受け、オペレータに指定されたスケジュールでハードを制御するドメイン図の一例における、指定されたスケジュールでハードを制御するControllerドメイン301のクラス図の一例である。
図4において、401の四角形はDeviceクラスを表し、402の四角形はControllerクラスを表す。403は、2項関連線と呼ばれ、Deviceクラス401とControllerクラス402が関連を持ち、Deviceクラス401からみてControllerクラス402が1個、Controllerクラス402からみてDeviceクラス401が0個から複数個の関連を持っていることを表している。404はクラスの名称を示し、図4の例では「Controller」がクラスの名称である。405はControllerクラスが「name」というString型のインスタンス変数を持つことを表現している。406はControllerクラスが「getName」、「on」、「off」、「offAll」という4つのメソッドをもつことを示している。メソッドは処理の内容が書かれており、イベントはクラス間での通信オブジェクトの一例である。
実行可能な設計図面において、クラスの動的な振る舞いは状態の遷移を表現する図や表などで表現する。実際の例を図5に示す。図5は状態遷移図を使ったクラスの動的な振る舞いを表現した例で、図4におけるControllerクラスの状態遷移図の例である。
図5において、501は初期状態を示し、Controllerクラスのインスタンスが生成されたときに入る状態を表す。初期状態501はその状態に留まることはなく、すぐに次の状態502に遷移する。502は「Off」と名づけた状態を表し、Controllerクラスのインスタンスが生成された後、この状態に留まる。503は状態から状態への遷移を示し、Off状態502のときにevOnイベントが発行されると特定のアクションevOn()を実行して、状態504に遷移する。505は、On状態504のときにevOff()イベントが発行されると特定のアクションevOff()を実行して、再度、On状態504に遷移する。508は、「Cleaning」と名づけた状態を表す。506は、On状態504のときにevClean()イベントが発行されると特定のアクションevClean()を実行して、Cleaning状態508に遷移する。507は、Off状態のときにevClean()イベントが発行されると特定のアクションevClean()を実行して、Cleaning状態508に遷移する。509は、終了状態で、Cleaning状態に遷移した後、終了することを表す。なお、一般に、状態遷移図にはアクションを記述することも可能であるが、図5に示した状態遷移図の例では別のファイルに定義して利用する例を示している。
プラットフォーム非依存であり、実行可能であり、かつオブジェクト指向である、設計図面において、各クラスの状態における処理手順の記述を一般にはアクションと呼ぶ。本発明においてはアクションの記述を別ファイルにて提供する場合を例に説明するが、状態遷移図などに記入する場合も問わない。
プラットフォーム非依存であり、実行可能であり、かつオブジェクト指向である、設計図面におけるアクション記述の例を図6に示す。
601は、Controllerクラスのon()メソッドが呼ばれた時に、リンクしている処理であり、引数より入力したデバイス識別子deviceIDと一致するリンク先デバイス・インスタンス1つに対してイベントevOn()が投入されることを表している。ここで用いられているFind構文は、条件に合ったリンク先の要素を1つだけ探索することを表している。また、Generate〜To構文は指定した宛先のインスタンスに対してイベントを投入する処理を表している。
プラットフォーム非依存であり、実行可能であり、かつオブジェクト指向である、設計図面において、各クラスの状態における処理手順の記述を一般にはアクションと呼ぶ。本発明においてはアクションの記述を別ファイルにて提供する場合を例に説明するが、状態遷移図などに記入する場合も問わない。
プラットフォーム非依存であり、実行可能であり、かつオブジェクト指向である、設計図面におけるアクション記述の例を図6に示す。
601は、Controllerクラスのon()メソッドが呼ばれた時に、リンクしている処理であり、引数より入力したデバイス識別子deviceIDと一致するリンク先デバイス・インスタンス1つに対してイベントevOn()が投入されることを表している。ここで用いられているFind構文は、条件に合ったリンク先の要素を1つだけ探索することを表している。また、Generate〜To構文は指定した宛先のインスタンスに対してイベントを投入する処理を表している。
602は、Controllerクラスのoff()メソッドが呼ばれた時に、リンクしている処理であり、引数より入力したデバイス識別子deviceIDと一致するリンク先デバイス・インスタンス1つに対してイベントevOff()が投入されることを表している。
603は、ControllerクラスのoffAll()メソッドが呼ばれた時に、リンク先デバイス・インスタンス全てに対してevOff()が投入されることを表している。ここで用いられているForeach構文は、条件に合ったリンク先インスタンス全てに対して、ループ処理を実行することを表している。
603は、ControllerクラスのoffAll()メソッドが呼ばれた時に、リンク先デバイス・インスタンス全てに対してevOff()が投入されることを表している。ここで用いられているForeach構文は、条件に合ったリンク先インスタンス全てに対して、ループ処理を実行することを表している。
本実施形態で示したアクション言語において記述可能な構文には、探索を表すFind構文、ループ処理を表すForeach構文/While構文(Continue構文、Return構文を併用可)、ソート処理を表すSort構文、リンクの動的な接続や切断を表すLink構文/Unlink構文、イベントの投入やキャンセルを表すGenerate構文/Cancel構文、条件分岐を表すIf〜Else構文、変数定義構文、代入構文、メンバ関数実行構文などがある。
これらのうち多重度によって、実装形態が大きく変化するものは、クラス間のリンクを操作する構文である、Find構文、Foreach構文、Sort構文、Link構文、Unlink構文、条件によって処理されるブロックや回数が異なるIf構文、While構文である。また、製品構成を表すリンクは静的に決定するため、製品構成を表すリンクの構築の際に、Link構文やUnlink構文が呼ばれることがない。
なお、利用するアクション言語によってこれら構文は異なるが、各アクション言語が目的とする機能は同等の機能であり、本特許で述べる発明の形態は、アクション言語の構文によらず有効である。
C言語などのプログラミング言語で多重度や実装形態の異なる対象の動作記述をする際には、プログラミングを書き直さなければならないが、アクション言語の場合には、多重度に依存しない書き方が可能なので、書き直さないで動作させることが可能である。
次に、製品構成情報202の実施形態としてUML(Unified Modeling Language)の設計図面の一つであるオブジェクト図を用いた場合について説明する。但し、本実施形態において、製品構成は静的に決定するということを前提としている。
図7は、製品構成情報202をオブジェクト図で表したものである。
701はControllerクラスのインスタンス ctrl、705はDeviceクラスのインスタンスdevX、706はDeviceクラスのインスタンス devY、707はDeviceクラスのインスタンス devZを表している。これらのインスタンスの記述では属性値の初期値の設定も可能であるという特徴がある。702は、オブジェクトctrl 701とオブジェクトdevX 705を結ぶA1クラス関連線403に属するリンクである。703は、オブジェクトctrl 701とオブジェクトdevY 706を結ぶA1クラス関連線403に属するリンクである。704は、オブジェクトctrl 701とオブジェクトdevZ 706を結ぶA1クラス関連線403に属するリンクである。
701はControllerクラスのインスタンス ctrl、705はDeviceクラスのインスタンスdevX、706はDeviceクラスのインスタンス devY、707はDeviceクラスのインスタンス devZを表している。これらのインスタンスの記述では属性値の初期値の設定も可能であるという特徴がある。702は、オブジェクトctrl 701とオブジェクトdevX 705を結ぶA1クラス関連線403に属するリンクである。703は、オブジェクトctrl 701とオブジェクトdevY 706を結ぶA1クラス関連線403に属するリンクである。704は、オブジェクトctrl 701とオブジェクトdevZ 706を結ぶA1クラス関連線403に属するリンクである。
オブジェクト図では、ソフトウェア部品の配置情報や、ソフトウェア部品の関連情報や、ソフトウェア部品の内部パラメータといった情報の設定が可能で、この情報を製品構成情報202として用いる。
これ以降の説明においてのフローチャートによる処理手順は、例に限定されることはなく、本発明の結果を満たす限りいかなる手順の組み合わせも、複数処理をまとめることも、処理を細分化することも可能であり、また、各処理を個々に切り出してひとつの機能要素として単体として機能し、示している処理以外の処理と組み合わせて使用することも可能である。
実施形態1では、システム全体のフローについて説明する。なお、実施形態1で説明する内容は、請求項1と請求項3に相当する。
実施形態2では、本システムで扱う汎用部品群情報204の詳細な説明をする。
実施形態3では、本システムで扱う汎用部品群情報204内の動作記述であるアクションの変換手順について説明する。なお、実施形態3で説明する内容は、請求項2、請求項4、請求項5に相当する。
実施形態4では、本システムで扱う汎用部品群情報204内の全体的な動作記述である状態遷移図の変換手順について説明する。なお、実施形態4で説明する内容は、請求項6に相当する。
実施形態2では、本システムで扱う汎用部品群情報204の詳細な説明をする。
実施形態3では、本システムで扱う汎用部品群情報204内の動作記述であるアクションの変換手順について説明する。なお、実施形態3で説明する内容は、請求項2、請求項4、請求項5に相当する。
実施形態4では、本システムで扱う汎用部品群情報204内の全体的な動作記述である状態遷移図の変換手順について説明する。なお、実施形態4で説明する内容は、請求項6に相当する。
(実施形態1)
以下、本発明の実施形態を図面およびフローチャートを参照して説明する。
図8は、本実施形態のシステム全体の処理手順を示したフローチャートである。
ステップ801において、製品構成情報解析部201を起動して、ユーザが設定した製品構成を構文解析し、製品構成情報202を生成する。
ステップ802において、構成部品関連抽出部207を起動して、ステップ801で得られた製品構成情報202を解析して、部品関連情報208を抽出する。
ステップ803において、汎用部品群情報解析部203を起動して、製品構成情報202内に製品で利用されていることが記述されている汎用部品群を構文解析して、汎用部品群情報204を抽出する。
以下、本発明の実施形態を図面およびフローチャートを参照して説明する。
図8は、本実施形態のシステム全体の処理手順を示したフローチャートである。
ステップ801において、製品構成情報解析部201を起動して、ユーザが設定した製品構成を構文解析し、製品構成情報202を生成する。
ステップ802において、構成部品関連抽出部207を起動して、ステップ801で得られた製品構成情報202を解析して、部品関連情報208を抽出する。
ステップ803において、汎用部品群情報解析部203を起動して、製品構成情報202内に製品で利用されていることが記述されている汎用部品群を構文解析して、汎用部品群情報204を抽出する。
ステップ804において、部品変換ルール情報解析部205を起動して、汎用部品から特化部品に変換する手順が記述された部品変換ルールを構文解析して、部品変換ルール情報206を抽出する。
ステップ805において、部品特化部209を起動して、ステップ802において得られた部品関連情報208と、ステップ803において得られた汎用部品群情報204を、ステップ804で得られた部品変換ルール情報206に基づき合成して、特定製品向け部品群情報210を生成する。
ステップ805において、部品特化部209を起動して、ステップ802において得られた部品関連情報208と、ステップ803において得られた汎用部品群情報204を、ステップ804で得られた部品変換ルール情報206に基づき合成して、特定製品向け部品群情報210を生成する。
ステップ806において、プログラム・コード生成部211を起動して、ステップ801で得られた製品構成情報202と、ステップ805で得られた特定製品向け部品群情報210を用いて、製品用コード212を生成する。
ステップ807において、コンパイル・リンク部213を起動して、ステップ806で得られた製品用コードをコンパイル・リンクして、製品プログラムを生成する。
ステップ807において、コンパイル・リンク部213を起動して、ステップ806で得られた製品用コードをコンパイル・リンクして、製品プログラムを生成する。
図9は、図2における本実施形態の構成部品関連抽出部207に関するフローチャートである。構成部品関連抽出部207は、製品構成情報202を解析することで、部品関連情報208を抽出する。製品構成情報202からクラス間の関連線の有無や多重度の範囲を限定する部品関連情報208を抽出することで、汎用部品群情報204に対して実施可能な最適化を特定することを可能にする。
ステップ901からステップ903のループは、製品構成情報202に記述された全てのインスタンスに対して実行するループであり、全インスタンスに対して関連線ごとにリンク数を集計する処理を行う。ステップ903において、指定インスタンスのリンク数を関連線ごとに集計する。
ステップ901からステップ903のループ処理が終えた後、ステップ904からステップ907で、製品構成情報202に記述された全ての関連に対してループ処理をする。該ループでは製品構成情報内の各関連線に対して、ステップ905、ステップ906の処理をする。
ステップ905において、各クラス関連線ごとに、ステップ902で得られたリンク数の最大値と最小値を取得する。ただし、リンクが存在しない場合は、最小値を0、最大値を0とする。
ステップ906において、各クラス関連線ごとに、有無や多重度を設定する。なお、ここで設定した情報が部品関連情報208である。
ステップ906において、各クラス関連線ごとに、有無や多重度を設定する。なお、ここで設定した情報が部品関連情報208である。
図10に汎用部品群情報204の一実施形態を示す。レールの上にいくつかのモータやセンサやソレノイドが乗っている汎用部品群の例を示す。
1001はレールクラス、1002はモータクラス、1003はセンサクラス、1004はソレノイドクラスである。
1001はレールクラス、1002はモータクラス、1003はセンサクラス、1004はソレノイドクラスである。
1005は、レールクラス1001とレールクラス1001を結ぶクラス関連線で、0から複数個のレールクラス1001同士が関連を持っていることを表している。
1006は、レールクラス1001とモータクラス1002を結ぶクラス関連線で、レールクラス1001が0から複数個のモータクラス1002と、モータクラス1002が0から複数個のレールクラス1001とリンク可能であることを表している。
1007は、レールクラス1001とソレノイドクラス1004を結ぶクラス関連線で、レールクラス1001が0から複数個のソレノイドクラス1004と、ソレノイドクラス1004が0から複数個のレールクラス1001とリンク可能であることを表している。
1006は、レールクラス1001とモータクラス1002を結ぶクラス関連線で、レールクラス1001が0から複数個のモータクラス1002と、モータクラス1002が0から複数個のレールクラス1001とリンク可能であることを表している。
1007は、レールクラス1001とソレノイドクラス1004を結ぶクラス関連線で、レールクラス1001が0から複数個のソレノイドクラス1004と、ソレノイドクラス1004が0から複数個のレールクラス1001とリンク可能であることを表している。
1008は、レールクラス1001とセンサクラス1003を結ぶクラス関連線で、レールクラス1001が0から複数個のセンサクラス1003と、センサクラス1003が0から複数個のレールクラス1001とリンク可能であることを表している。
クラス関連線1005、1006、1007、1008上に記載されているアスタリスクは、0から複数個あることを表しており、製品ごとに、アスタリスクを、リンクしないことを表す"0"や、リンクが1つしかないことを表す"1"や、リンクが1つあるか無いかということを表す"0..1"に置き換えることが可能という特徴がある。
クラス関連線1005、1006、1007、1008上に記載されているアスタリスクは、0から複数個あることを表しており、製品ごとに、アスタリスクを、リンクしないことを表す"0"や、リンクが1つしかないことを表す"1"や、リンクが1つあるか無いかということを表す"0..1"に置き換えることが可能という特徴がある。
図11に製品構成情報202の一実施形態を示す。ここで、図11の製品構成情報202を製品Aの製品構成とする。
レールA 1101、レールB 1102、レールC 1103、レールD 1104は、レールクラス1001のインスタンスを表している。モータE 1105、モータF 1106は、モータクラス1002のインスタンスを表している。ソレノイドG1107は、ソレノイドクラス1004のインスタンスを表している。
レールA1101は、モータEへのA2リンク1111と、レールBへのA1リンク(右)1108を保持している。
レールA 1101、レールB 1102、レールC 1103、レールD 1104は、レールクラス1001のインスタンスを表している。モータE 1105、モータF 1106は、モータクラス1002のインスタンスを表している。ソレノイドG1107は、ソレノイドクラス1004のインスタンスを表している。
レールA1101は、モータEへのA2リンク1111と、レールBへのA1リンク(右)1108を保持している。
レールB1102は、レールA1101へのA1リンク(左)1108と、レールC1103へのA1リンク(右)1109を保持している。
レールC1103は、レールB1102へのA1リンク(左)1109と、レールDへのA1リンク(右)と、モータF1106へのA2リンク1112を保持している。
レールD1104は、レールC1103へのA1リンク(左)1110と、ソレノイドGへのA4リンクを保持している。
レールC1103は、レールB1102へのA1リンク(左)1109と、レールDへのA1リンク(右)と、モータF1106へのA2リンク1112を保持している。
レールD1104は、レールC1103へのA1リンク(左)1110と、ソレノイドGへのA4リンクを保持している。
モータE1105は、レールA1101へのA2リンク1111を保持している。
モータF1106は、レールC1103へのA2リンク1112を保持している。
ソレノイドG1107は、レールD1104へのA4リンク1113を保持している。
各インスタンスの保持しているリンク数を、各クラスごとに、リンク数の最小数、最大数という観点でまとめなおしたものを下記に示す。
モータF1106は、レールC1103へのA2リンク1112を保持している。
ソレノイドG1107は、レールD1104へのA4リンク1113を保持している。
各インスタンスの保持しているリンク数を、各クラスごとに、リンク数の最小数、最大数という観点でまとめなおしたものを下記に示す。
レールクラス1001のインスタンスであるレールA1101、レールB1102、レールC1103、レールD1104について、A1リンク(右)、A1リンク(左)、A2リンク、A4リンクが0か1つ保持している。
モータクラス1002のインスタンスであるモータE1105、モータF1106について、A2リンクは1つ保持している。
ソレノイドクラス1004のインスタンスであるソレノイドG1107について、A4リンクは1つ保持している。
モータクラス1002のインスタンスであるモータE1105、モータF1106について、A2リンクは1つ保持している。
ソレノイドクラス1004のインスタンスであるソレノイドG1107について、A4リンクは1つ保持している。
図12に、図11より得られた各関連線ごとのリンクの最大値、最小値を図10の汎用部品群情報に反映させた図を示す。
1201は、レールクラス、1202はモータクラス、1203はソレノイドクラスである。
1204は、レールクラス1204とレールクラス1204とを結ぶ関連線A1で、両端の多重度が"0..1"である。
1201は、レールクラス、1202はモータクラス、1203はソレノイドクラスである。
1204は、レールクラス1204とレールクラス1204とを結ぶ関連線A1で、両端の多重度が"0..1"である。
1205は、レールクラス1201とモータクラス1202とを結ぶ関連線A2で、レールクラス1201側の多重度が"1"、モータクラス1202側の多重度が"0..1"である。
1206は、レールクラス1201とソレノイドクラス1203とを結ぶ関連線A4で、レールクラス1201側の多重度が"1"、ソレノイドクラス1203側の多重度が"0..1"である。
1206は、レールクラス1201とソレノイドクラス1203とを結ぶ関連線A4で、レールクラス1201側の多重度が"1"、ソレノイドクラス1203側の多重度が"0..1"である。
図13は、図10の汎用部品群情報204を使用した製品構成情報202であり、図13の製品構成情報202を、構成部品関連抽出部207で解析し、そこで得られた部品関連情報208を汎用部品群情報204に反映させることで得られる特定製品向け部品群情報210が図14である。ここで、図13の製品構成情報202を製品B用の構成情報とする。
図11の製品A用製品構成情報202を用いた場合に得られるのが図12の特定製品向け部品群情報210であり、図13の製品B用製品構成情報202を用いた場合に得られるのが図14の特定製品向け部品群情報210である。図12と図14を比較すると、センサクラス1403が無くなっているという違いがある。製品構成によって、特定製品向け部品が異なったものになることが分かる。
(実施形態2)
MDAで用いるアクション言語には、プラットフォームに依存しない記述が可能という特徴があり、通常のプログラミング言語よりも抽象度の高い記述が可能で、関連の多重度の値とは独立した記述や、VectorやListや単一要素といったリンクの実装形態とは独立した記述が可能である。
MDAで用いるアクション言語には、プラットフォームに依存しない記述が可能という特徴があり、通常のプログラミング言語よりも抽象度の高い記述が可能で、関連の多重度の値とは独立した記述や、VectorやListや単一要素といったリンクの実装形態とは独立した記述が可能である。
アクション言語で用意されている配列操作に関する構文には、リンク先の要素走査の際に用いるForeach構文、リンク先の要素を探索するFind構文、リンク先の要素を指定の降順でソートするSort構文、リンク先の要素数を取得するためのCount構文、リンク先に要素を追加するLink構文、リンク先の要素を取り除くUnlink構文といったものがある。
Foreach構文による記述は、リンク先の全てのインスタンスに対して指定の処理をすることを表す記述であるが、この記述は、リンク先がない場合は何も処理をせず、リンク先が1つの場合は1つのインスタンスに対して処理を行うというように、多重度とは独立した記述が可能である。
Foreach <要素への参照名> = <リンク> {<全ての要素に対してする処理>}
Foreach <要素への参照名> = <リンク> Where(<走査条件>){
<全ての要素に対してする処理>}
Foreach <要素への参照名> = <リンク> {<全ての要素に対してする処理>}
Foreach <要素への参照名> = <リンク> Where(<走査条件>){
<全ての要素に対してする処理>}
Find構文による記述は、リンク先の全てのインスタンスの中から、配列の先頭インスタンスだとか、指定の条件式に一致するインスタンスだとかいった特定条件に一致するインスタンスを1つだけ探索することを表す記述であるが、この記述は、リンク先がない場合は何も処理をせず、リンク先が1つの場合はそのリンク先のインスタンスの参照を返すといった処理というように、多重度とは独立した記述が可能である。
<要素への参照名> = Find <リンク>;
<要素への参照名> = Find <リンク> Where(<探索条件>);
<要素への参照名> = Find <リンク>;
<要素への参照名> = Find <リンク> Where(<探索条件>);
Sort構文による記述は、リンク先の全てのインスタンスを指定の降順に入れ替えることを表す記述であるが、これはリンク先に複数の要素があるときにのみ可能な処理であり、要素数が0や1のときは実行する必要の無い処理である。この記述は、リンク先の数が0もしくは1の場合には、何もしないというように、多重度とは独立した記述が可能である。
Count構文による記述は、リンク先の全てのインスタンスの数を数える記述であるが、関連線が無い場合には常に0を返し、多重度が1の場合には常に1を返す。ケースによって入力される値が定数になったり、限定された値になるため、通らない条件節の除去といった最適化が可能である。
<サイズ> = Count(<リンク>);
<サイズ> = Count(<リンク>);
Link構文による記述は、インスタンス間のリンク線を動的に追加することを表す記述である。仮に2回Link構文が呼び出されているクラス関連線に対して、多重度を1と設定すると、多重度1のクラス関連線において、リンクの数が2つになってしまうので、不正な動作をしてしまうが、製品構成は静的に決定するものであるという前提条件下では製品構成を表すインスタンス間の関連に対してLink構文を使う必要は無いので、これを使っていない箇所について、最適化の範疇としない。
Link <インスタンスA> <関連名> <インスタンスB>
Link <インスタンスA> <関連名> <インスタンスB>
Unlink構文による記述は、インスタンス間のリンク線を動的に削除することを表す記述である。Unlink構文についても、Link構文と同様、使う必要がないため、最適化の範疇としない。
Unlink <インスタンスA> <関連名> <インスタンスB>
Unlink <インスタンスA> <関連名> <インスタンスB>
(実施形態3)
実施形態3では、汎用部品群情報204内のアクション記述から特定製品向け部品群情報210内のアクション記述に変換する実施形態を示す。
特定製品向け部品群情報210の作成は、汎用部品群情報204のアクション内をパターン検索して、パターンに一致した箇所を変換するといった手順で実施する。変換手順が記述されている部品変換ルール情報206には、パターン検索する情報の型と、検索した情報をどのように変換するかという手順が記述されている。
実施形態3では、汎用部品群情報204内のアクション記述から特定製品向け部品群情報210内のアクション記述に変換する実施形態を示す。
特定製品向け部品群情報210の作成は、汎用部品群情報204のアクション内をパターン検索して、パターンに一致した箇所を変換するといった手順で実施する。変換手順が記述されている部品変換ルール情報206には、パターン検索する情報の型と、検索した情報をどのように変換するかという手順が記述されている。
図15に、部品変換ルール情報206の実施形態を示す。
1501は、変換するアクション構文を表しており、例ではリンクに対するForeach構文を表している。$と$で囲まれた領域にはユーザ入力形式を指定している。ここで、instance:Instanceとあるのは、インスタンスを表すプログラム記述を表しており、また、link:Linkとあるのは、リンクを表すプログラム記述を表している。body:StatementBlockとあるのは、複数構文から構成されるアクション記述を表している。
1501は、変換するアクション構文を表しており、例ではリンクに対するForeach構文を表している。$と$で囲まれた領域にはユーザ入力形式を指定している。ここで、instance:Instanceとあるのは、インスタンスを表すプログラム記述を表しており、また、link:Linkとあるのは、リンクを表すプログラム記述を表している。body:StatementBlockとあるのは、複数構文から構成されるアクション記述を表している。
1502は、リンクの多重度が"0"、すなわち、リンク先がない場合に、変換対象のアクションを"//none"という文字列に置き換えることを表している。target.transform()は、パターン検索で見つかった構文targetを、他の文字列に置き換える処理を表している。link.multiplyは得られたリンクを表す構文linkを解析して得られる多重度を表現したものである。
1503は、リンクの多重度が"1"の場合に、変換対象のアクションを、Find構文に置き換えることを表している。
1504は、リンクの多重度が"0..1"の場合に、変換対象のアクションを、Find構文と、NULLチェックの構文に置き換えることを表している。
1504は、リンクの多重度が"0..1"の場合に、変換対象のアクションを、Find構文と、NULLチェックの構文に置き換えることを表している。
図16に、図15で行なっている処理のフローチャートを示す。
ステップ1601からステップ1608では、リンクに対するForeach構文全てについて処理をする。
ステップ1602において、クラス関連線の多重度が"0"の場合、ステップ1603に、そうでない場合、ステップ1604に進む。
ステップ1603において、指定のForeach構文を除去する。
ステップ1601からステップ1608では、リンクに対するForeach構文全てについて処理をする。
ステップ1602において、クラス関連線の多重度が"0"の場合、ステップ1603に、そうでない場合、ステップ1604に進む。
ステップ1603において、指定のForeach構文を除去する。
ステップ1604において、クラス関連線の多重度が"0..1"の場合、ステップ1605に、そうでない場合、ステップ1606に進む。
ステップ1605において、指定のForeach構文をFind構文とNULLチェック構文に置き換える。
ステップ1606において、多重度が1の場合、ステップ1607に、そうでない場合、ステップ1608に進む。
ステップ1607において、指定のForeach構文をFind構文に置き換える。
ステップ1605において、指定のForeach構文をFind構文とNULLチェック構文に置き換える。
ステップ1606において、多重度が1の場合、ステップ1607に、そうでない場合、ステップ1608に進む。
ステップ1607において、指定のForeach構文をFind構文に置き換える。
図17に、図16のフローチャートにしたがってForeach構文に対する変換処理を実行した場合に得られるアクション言語を示す。
1701は、多重度が不定の場合に得られるアクション記述である。元のアクション記述と同じ記述である。
1702は、多重度が1の場合に得られるアクション記述である。Foreach構文がFind構文に置き換えられている。
1703は、多重度が0..1の場合に得られるアクション記述である。Foreach構文が、Find構文とNULLチェック構文で置き換えられている。
1704は、多重度が0の場合に得られるアクション記述である。Foreach構文が除去されている。
1701は、多重度が不定の場合に得られるアクション記述である。元のアクション記述と同じ記述である。
1702は、多重度が1の場合に得られるアクション記述である。Foreach構文がFind構文に置き換えられている。
1703は、多重度が0..1の場合に得られるアクション記述である。Foreach構文が、Find構文とNULLチェック構文で置き換えられている。
1704は、多重度が0の場合に得られるアクション記述である。Foreach構文が除去されている。
Foreach構文の最適化と同様、下記に、Find構文を多重度に応じて最適化する手法を示す。
図18に、Find構文の変換のフローチャートを示す。
ステップ1801からステップ1804では、リンクに対するFind構文全てについて処理をする。
ステップ1802において、関連の多重度が0の場合、ステップ1803に、そうでない場合、ステップ1804に進む。
ステップ1803において、Find構文を、定数NULLに置き換える。
ステップ1804において、関連の多重度が0..1の場合、ステップ1805に、そうでない場合、ステップ1806に進む。
図18に、Find構文の変換のフローチャートを示す。
ステップ1801からステップ1804では、リンクに対するFind構文全てについて処理をする。
ステップ1802において、関連の多重度が0の場合、ステップ1803に、そうでない場合、ステップ1804に進む。
ステップ1803において、Find構文を、定数NULLに置き換える。
ステップ1804において、関連の多重度が0..1の場合、ステップ1805に、そうでない場合、ステップ1806に進む。
図19に、図18のフローチャートにしたがってFind構文に対する変換処理を実行した場合に得られるアクション言語を示す。
1901は、多重度が不定の場合のアクション言語記述で、元のFind構文のままである。
1902は、多重度が1の場合のアクション言語記述で、元のFind構文のままである。
1903は、多重度が0..1の場合のアクション言語記述で、元のFind構文のままである。
1904は、多重度が0の場合のアクション言語記述で、コードが除去されている。
1901は、多重度が不定の場合のアクション言語記述で、元のFind構文のままである。
1902は、多重度が1の場合のアクション言語記述で、元のFind構文のままである。
1903は、多重度が0..1の場合のアクション言語記述で、元のFind構文のままである。
1904は、多重度が0の場合のアクション言語記述で、コードが除去されている。
本実施形態で示したアクション言語では、複数の要素からなる配列の先頭要素を取り出す処理も、単一の要素をアクセスする処理もFind構文で記述するため、アクション言語記述からアクション言語記述への最適化では、これ以上の最適化が出来ない。言語形態によっては、参照型や実体型の区別などが可能であるため、これらを考慮に入れた最適化も可能である。
下記に、Sort構文を、多重度に応じて最適化する方法を示す。
図20に、Sort構文最適化のフローチャートを示す。
ステップ2001からステップ2004では、リンクに対するSort構文全てに対して処理をする。
ステップ2002において、Sortするリンク先の多重度が0か0..1か1のいずれかである場合は、ステップ2003に、そうでなければ、ステップ2004に進む。
ステップ2003において、Sort構文を除去する。
図20に、Sort構文最適化のフローチャートを示す。
ステップ2001からステップ2004では、リンクに対するSort構文全てに対して処理をする。
ステップ2002において、Sortするリンク先の多重度が0か0..1か1のいずれかである場合は、ステップ2003に、そうでなければ、ステップ2004に進む。
ステップ2003において、Sort構文を除去する。
図21に、図20のフローチャートにしたがってSort構文に対する変換処理を実行した場合に得られるアクション言語を示す。
2101は多重度が不定の場合で、元のSort構文のままである。
2102は多重度が1の場合で、Sort構文が除去されている。
2103は多重度が0..1の場合で、Sort構文が除去されている。
2104は多重度が0の場合で、Sort構文が除去されている。
2101は多重度が不定の場合で、元のSort構文のままである。
2102は多重度が1の場合で、Sort構文が除去されている。
2103は多重度が0..1の場合で、Sort構文が除去されている。
2104は多重度が0の場合で、Sort構文が除去されている。
Sort構文でソート処理をするのは、リンク先の要素数が2以上のときであり、要素数が2未満であることが保証される、多重度0、1、0..1のいずれかの場合は、Sort構文自体を除去することが可能である。
図22に、多重度に依存するIf構文の変換のフローチャートを示す。
ステップ2201からステップ2203は、アクション内の多重度に依存する全If構文に対する処理である。
ステップ2202において、If構文内の条件節を解析し、常にFalseとなるIfブロックを発見し、条件節ブロックと条件一致時に実行されるブロックを除去する。
ステップ2204からステップ2206も、アクション内の多重度に依存する全If構文に対する処理である。
ステップ2205において、If構文内の条件節を解析し、常にTrueのIfブロックを発見し、条件節ブロックを除去する。
ステップ2201からステップ2203は、アクション内の多重度に依存する全If構文に対する処理である。
ステップ2202において、If構文内の条件節を解析し、常にFalseとなるIfブロックを発見し、条件節ブロックと条件一致時に実行されるブロックを除去する。
ステップ2204からステップ2206も、アクション内の多重度に依存する全If構文に対する処理である。
ステップ2205において、If構文内の条件節を解析し、常にTrueのIfブロックを発見し、条件節ブロックを除去する。
図23に、図22のフローチャートにしたがって多重度に依存するIf構文に対する変換処理を実行した際に得られるアクション言語を示す。
2301は、多重度が不定の場合のアクション言語記述である。
2302は、多重度が1の場合のアクション言語記述であり、2301内のリンク先の個数が1個の時に実行される(2)ブロックのみの処理に置き換えられる。
2303は、多重度が0..1の場合のアクション言語記述であり、(1)、(2)のブロックのみの処理に置き換えられる。
2304は、多重度が0の場合のアクション言語記述であり、(1)のブロックのみの処理に置き換えられる。
2301は、多重度が不定の場合のアクション言語記述である。
2302は、多重度が1の場合のアクション言語記述であり、2301内のリンク先の個数が1個の時に実行される(2)ブロックのみの処理に置き換えられる。
2303は、多重度が0..1の場合のアクション言語記述であり、(1)、(2)のブロックのみの処理に置き換えられる。
2304は、多重度が0の場合のアクション言語記述であり、(1)のブロックのみの処理に置き換えられる。
図26にElif(言語によってはelse if)構文を含むIf文への対応方法を示す。
2601はElif構文を用いた記述であり、2602は等価な記述をIF〜ELSE構文を階層化することで表現したものである。このように、Elif構文はIf〜Else構文に置き換えることが可能であるため、If〜Else構文の階層化により、構造化言語で利用される条件分岐節は全て表現可能である。
2601はElif構文を用いた記述であり、2602は等価な記述をIF〜ELSE構文を階層化することで表現したものである。このように、Elif構文はIf〜Else構文に置き換えることが可能であるため、If〜Else構文の階層化により、構造化言語で利用される条件分岐節は全て表現可能である。
なお、図23のステップ2202とステップ2205を分離したのは、階層化されたIf〜Else構文に対応するためである。
(実施形態4)
実行されないIfブロックを除去したことにより、不要になる状態遷移図内のブロックを抽出する方法を示したフローチャートを図24に示す。
ステップ2401において、Ifブロックを除去したことで実行されなくなったイベントを探索し、除去する。
ステップ2402において、除去したイベントによって遷移する遷移線を除去する。
ステップ2403において、入場する遷移線を持たない状態が見つかった場合、該状態を除去する。また、該状態から外部に遷移する遷移線も除去する。
以上のステップを実行することにより、特定製品において不要な、イベント定義、状態、遷移線を除去することが可能となる。
実行されないIfブロックを除去したことにより、不要になる状態遷移図内のブロックを抽出する方法を示したフローチャートを図24に示す。
ステップ2401において、Ifブロックを除去したことで実行されなくなったイベントを探索し、除去する。
ステップ2402において、除去したイベントによって遷移する遷移線を除去する。
ステップ2403において、入場する遷移線を持たない状態が見つかった場合、該状態を除去する。また、該状態から外部に遷移する遷移線も除去する。
以上のステップを実行することにより、特定製品において不要な、イベント定義、状態、遷移線を除去することが可能となる。
図5の状態遷移図を例に、図24のフローチャートの説明をする。
Ifブロックを除去したことにより、イベントevClean()を投入するGenerate構文が、システム内から無くなった場合を考える。ステップ2401により、evClean()が発見され、evClean()が除去される。次に、ステップ2402により、図5の遷移線506と遷移線507が除去される。ステップ2403により、状態Cleaning508は入場する遷移線を持たないため除去される。
図25に、以上の処理をした後に得られる状態遷移図を示す。
Ifブロックを除去したことにより、イベントevClean()を投入するGenerate構文が、システム内から無くなった場合を考える。ステップ2401により、evClean()が発見され、evClean()が除去される。次に、ステップ2402により、図5の遷移線506と遷移線507が除去される。ステップ2403により、状態Cleaning508は入場する遷移線を持たないため除去される。
図25に、以上の処理をした後に得られる状態遷移図を示す。
1:CPU
2:バス
3:ROM
4:RAM
4a:製品構成情報
4b:汎用部品群情報
4c:部品変換ルール情報
4d:部品関連情報
4e:特定製品向け部品群情報
4f:製品用コード
4g:製品プログラム
5:入力インターフェース
6:キーボード、ボタン、マウス、ダイアル
7:出力インターフェース
8a:CRT、LCD
8b:プリンタ、プロッタ
9:外部記憶装置インターフェース
10:HD、FD、CD−ROM、MD、CF、・・・(ファイル)
201:製品構成情報解析部
202:製品構成情報
203:汎用部品群情報解析部
204:汎用部品群情報
205:部品変換ルール情報解析部
206:部品変換ルール情報
207:構成部品関連抽出部
208:部品関連情報
209:部品特化部
210: 特定製品向け部品群情報
211:プログラム・コード生成部
212:製品用コード
213:コンパイル・リンク部
214:製品プログラム
2:バス
3:ROM
4:RAM
4a:製品構成情報
4b:汎用部品群情報
4c:部品変換ルール情報
4d:部品関連情報
4e:特定製品向け部品群情報
4f:製品用コード
4g:製品プログラム
5:入力インターフェース
6:キーボード、ボタン、マウス、ダイアル
7:出力インターフェース
8a:CRT、LCD
8b:プリンタ、プロッタ
9:外部記憶装置インターフェース
10:HD、FD、CD−ROM、MD、CF、・・・(ファイル)
201:製品構成情報解析部
202:製品構成情報
203:汎用部品群情報解析部
204:汎用部品群情報
205:部品変換ルール情報解析部
206:部品変換ルール情報
207:構成部品関連抽出部
208:部品関連情報
209:部品特化部
210: 特定製品向け部品群情報
211:プログラム・コード生成部
212:製品用コード
213:コンパイル・リンク部
214:製品プログラム
Claims (6)
- インスタンスの配置、インスタンスの値及びインスタンス間の関連する製品の構成を解析する製品構成情報解析手段と、
汎用的なクラス定義の製品を構成する部品の基本的な型定義を解析する汎用部品群情報解析手段と、
前記製品構成情報解析手段より得られた製品の構成から、製品を構成する部品間の関連を抽出する構成部品関連抽出手段と、
前記構成部品関連抽出手段より得られた部品間の関連と、前記汎用部品群情報解析手段より得られた部品の基本的な型の定義とから、製品に特化した部品を生成する部品特化手段と、
前記部品特化手段より得られた製品に特化した部品を、前記製品構成情報解析手段より得られた製品の構成にしたがって組み合わせたものから、製品としてのプログラム・コードを自動生成するプログラム・コード生成手段と、
前記プログラム・コード生成手段より得られたプログラム・コードをコンパイル・リンクすることを特徴とするコンパイル・リンク手段と
を有することを特徴とするプログラム・コード生成装置。 - 前記汎用部品群情報解析手段より得られた部品の基本的な型の定義を製品に特化した部品に変換する手順が記述された部品変換ルールを解析する部品変換ルール情報解析手段を有し、
前記部品特化手段が、前記部品変換ルール情報解析手段より得られた部品変換ルールにしたがって製品に特化した部品を生成することを特徴とする請求項1に記載のプログラム・コード生成装置。 - 部品関連抽出手段は、クラス関連線の多重度及びクラス関連線の有無を抽出するものであり、
前記部品特化手段は、前記部品関連抽出手段より得られたクラス関連線の情報を、クラス図に設定することを特徴とする請求項1に記載のプログラム・コード生成装置。 - 部品特化手段は、多重度に応じて探索処理、ループ処理及びソート処理の実装形態を変換することを特徴とする請求項3に記載のプログラム・コード生成装置。
- 前記部品特化手段は、多重度に応じて不要な条件節ブロックを除去することを特徴とする請求項1に記載のプログラム・コード生成装置。
- プログラム・コード生成手段は、前記部品特化手段により不要な条件節ブロックを除去されたことにより、利用されなくなったイベント、遷移線状態、及びこれらに付随するアクションを除去することを特徴とする請求項5に記載のプログラム・コード生成装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2005310475A JP2007122187A (ja) | 2005-10-25 | 2005-10-25 | プログラム・コード生成装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2005310475A JP2007122187A (ja) | 2005-10-25 | 2005-10-25 | プログラム・コード生成装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2007122187A true JP2007122187A (ja) | 2007-05-17 |
Family
ID=38146002
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2005310475A Pending JP2007122187A (ja) | 2005-10-25 | 2005-10-25 | プログラム・コード生成装置 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2007122187A (ja) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2009181437A (ja) * | 2008-01-31 | 2009-08-13 | Casio Comput Co Ltd | データ処理装置及びプログラム |
JP2013137838A (ja) * | 2013-04-11 | 2013-07-11 | Casio Comput Co Ltd | データ処理装置及びプログラム |
US9092234B2 (en) | 2011-02-18 | 2015-07-28 | Nec Corporation | Refactoring device, refactoring method and program |
CN109189376A (zh) * | 2018-07-20 | 2019-01-11 | 北京航空航天大学 | 数字飞行器集群源代码的人工智能书写方法 |
-
2005
- 2005-10-25 JP JP2005310475A patent/JP2007122187A/ja active Pending
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2009181437A (ja) * | 2008-01-31 | 2009-08-13 | Casio Comput Co Ltd | データ処理装置及びプログラム |
US9092234B2 (en) | 2011-02-18 | 2015-07-28 | Nec Corporation | Refactoring device, refactoring method and program |
JP2013137838A (ja) * | 2013-04-11 | 2013-07-11 | Casio Comput Co Ltd | データ処理装置及びプログラム |
CN109189376A (zh) * | 2018-07-20 | 2019-01-11 | 北京航空航天大学 | 数字飞行器集群源代码的人工智能书写方法 |
CN109189376B (zh) * | 2018-07-20 | 2021-06-04 | 北京航空航天大学 | 数字飞行器集群源代码的人工智能书写方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8918769B2 (en) | Application of optimization techniques to intermediate representations for code generation | |
US10853060B2 (en) | Software refactoring systems and methods | |
CN110149800B (zh) | 一种用于处理与源程序的源代码相关联的抽象语法树的装置 | |
CN106648662B (zh) | 基于工程造价计算描述语言bcl的报表生成装置及生成方法 | |
Combemale et al. | Concern-oriented language development (COLD): Fostering reuse in language engineering | |
JP2007521568A (ja) | 複数の例外処理モデルの中間表現 | |
CN101777004A (zh) | 面向服务环境中基于模板实现bpel子流程复用的方法及系统 | |
JP5147240B2 (ja) | リバーシブルなデザイン・ツリーの変換のための方法とシステム | |
CN110673854A (zh) | Sas语言编译方法、装置、设备及可读存储介质 | |
US10216501B2 (en) | Generating code in statically typed programming languages for dynamically typed array-based language | |
CN115639980A (zh) | 一种低代码平台可拖拽的前端逻辑编排方法及装置 | |
JP2005141380A (ja) | テンプレートコンパイル方法 | |
JP2007122187A (ja) | プログラム・コード生成装置 | |
US20030233640A1 (en) | Structuring program code | |
Schreiner et al. | A new approach for generating view generators | |
JP2009169864A (ja) | コンパイル方法およびコンパイルプログラム | |
Jin et al. | A method for describing the syntax and semantics of UML statecharts | |
Vinju | Analysis and transformation of source code by parsing and rewriting | |
CN115268918A (zh) | 一种基于规则模板的c++代码向c代码的自动转化方法 | |
Akers et al. | Case study: Re-engineering C++ component models via automatic program transformation | |
Basit et al. | Tool support for managing method clones | |
KR100287061B1 (ko) | 로토스 자료 명세로부터 객체지향 프로그램의 자동 생성 방법및 이를 위한 코드 생성기 | |
Dausend et al. | Towards a comprehensive extension of abstract state machines for aspect-oriented specification | |
KR100276086B1 (ko) | 로토스 명세로부터 씨 플러스 플러스 코드 생성방법 | |
McRitchie et al. | Managing component variability within embedded software product lines via transformational code generation |