本発明の実施の形態について説明する前に、まず、実施の形態の概要について説明する。
現在のシステム開発におけるソースプログラムは大規模化・複雑化の一途をたどっている。ソースプログラムをコーディングするユーザは、コーディング作業を効率化させるため、IDEのコーディング支援機能を利用してコーディングを行うのが一般的である。代表的なIDEとして、「Eclipse(登録商標)」がある。Eclipse(登録商標)は、ソースプログラムが公開されたIDEであり、標準でJAVA(登録商標)のコーディングに対する多数の支援機能を備える多機能IDEである。
一方で、規格外プログラミング言語によるコーディング作業の効率化は困難な状況がある。この課題を解決するために、規格外プログラミング言語用の多機能IDEを開発することも考えられる。しかし、新規に多機能IDEを開発することは、多大な開発コストを要し現実的ではない。本発明者は、多機能IDEが備える既存のコーディング支援機能を規格外プログラミング言語のコーディングに利用することにより、少ない開発コストで、規格外プログラミング言語のコーディングを効率化できると考えた。以下の説明では、多機能IDEとしてJAVA(登録商標)用IDEを、規格外プログラミング言語としてCOBOLを具体的に示して説明する。次に、JAVA(登録商標)用IDEの機能構成を示しつつ、上述した本発明者の知見をさらに説明する。
図1(a)は、JAVA(登録商標)のコーディングを支援するIDE100の機能構成を模式的に示す。データモデル処理機能804は、JAVA(登録商標)ソースプログラム802を取得し、メモリ上にデータモデル806として展開する。データモデルは、JAVA(登録商標)ソースプログラム802の構造を示すJAVA(登録商標)オブジェクトである。編集機能808、検索機能810および整形機能812はそれぞれ、JAVA(登録商標)ソースプログラムを編集し、検索し、自動整形するための機能であり、データモデル806にアクセスすることでコーディング支援機能をユーザに提供する。
図1(b)は、COBOL用のコーディング支援機能を新規作成した場合のIDE100の機能構成を模式的に示す。新規データモデル処理機能824は、COBOLソースプログラム822を取得し、メモリ上に新規データモデル826として展開する。新規編集機能828、新規検索機能830および新規整形機能832はそれぞれ、新規データモデル826にアクセスすることでコーディング支援機能をユーザに提供する。
図1(b)において斜線のパターンで示した機能は、IDE100上に新規作成する機能を示している。すなわち、新規データモデル処理機能824、新規編集機能828、新規検索機能830および新規整形機能832を新規作成する必要がある。同図では、コーディング支援機能として3機能を示しているが、実際には多数のコーディング支援機能が必要とされるため、膨大な数の機能を開発することとなる。
図1(c)は、本実施の形態におけるIDE100の機能構成を模式的に示す。同図における新規作成機能は擬装データモデル処理機能844のみである。擬装データモデル処理機能844は、COBOLソースプログラム822を取得し、データモデル806と同じインタフェースを備える擬装データモデル846をメモリ上に展開する。既存の編集機能808、検索機能810および整形機能812は、データモデル806と擬装データモデル846との違いを意識することなく、擬装データモデル846にアクセスしてコーディング支援機能をユーザに提供する。これにより、少ない開発コストで、IDE100によるCOBOLのコーディング支援を実現する。以下、実施の形態を説明する。
図2は、本実施の形態のIDE100における基本的な機能構成を示すブロック図である。本明細書のブロック図において示される各ブロックは、ハードウェア的には、コンピュータのCPUをはじめとする素子や機械装置で実現でき、ソフトウェア的にはコンピュータプログラム等によって実現されるが、ここでは、それらの連携によって実現される機能ブロックを描いている。したがって、これらの機能ブロックはハードウェア、ソフトウェアの組合せによっていろいろなかたちで実現できることは、当業者には理解されるところである。
IDE100は、ソースプログラム200を取得して、ユーザ400によるコーディングを支援し、また、ソースプログラム200からオブジェクトプログラム300を生成する。ソースプログラム200は、JAVA(登録商標)言語もしくはCOBOL言語で記述され、オブジェクトプログラム300は、JAVA(登録商標)バイトコードである。IDE100は、典型的には、ユーザ400の端末にインストールされるソフトウェアであるが、当該端末とは別のコーディング支援サーバにインストールされてもよい。
IDE100は、ユーザインタフェース処理部10と、データ記憶部20と、データ処理部30とを備える。各種のデータ処理を行うデータ処理部30は、JAVA(登録商標)処理部40と、COBOL処理部60とを有する。ユーザ400からのJAVA(登録商標)ソースプログラムの編集要求をユーザインタフェース処理部10が検出すると、JAVA(登録商標)処理部40は、JAVA(登録商標)ソースプログラムをもとにデータモデルを生成して、データ記憶部20に記録する。JAVA(登録商標)処理部40は、当該データモデルにアクセスすることでユーザ400に対しコーディング支援機能を提供する。また、ユーザ400からのコンパイル要求をユーザインタフェース処理部10が検出すると、JAVA(登録商標)処理部40は、データモデルからオブジェクトプログラム300を生成する。
ユーザ400からのCOBOLソースプログラムの編集要求をユーザインタフェース処理部10が検出すると、COBOL処理部60は、COBOLソースプログラムをもとに擬装データモデルを生成して、データ記憶部20に記録する。JAVA(登録商標)処理部40は、データモデルと同様のインタフェースを介して擬装データモデルにアクセスして、JAVA(登録商標)の場合と同様のコーディング支援機能をユーザ400に提供する。また、ユーザ400からのコンパイル要求をユーザインタフェース処理部10が検出すると、JAVA(登録商標)処理部は、擬装データモデルからオブジェクトプログラム300を生成する。
図3は、図2のIDE100の詳細な機能構成を示すブロック図である。
ユーザインタフェース処理部:
ユーザインタフェース処理部10は、要求受付部12と表示部14とを含む。要求受付部12は、ユーザ400からの各種要求、例えば、ソースプログラム200の読み込み要求、ソースプログラム200の変更要求、オブジェクトプログラム300の生成要求等を検出する。表示部14は、ユーザ400からの要求に基づく、データ処理部30による処理結果をユーザ400の端末画面に表示させる。
データ記憶部:
データ記憶部20は、各種データをメモリまたはその他の記録媒体に記憶させる。データ記憶部20は、データモデル保持部22と言語対応情報保持部24とを含む。データモデル保持部22は、データモデルおよび擬装データモデルを保持する。
図4は、データモデル保持部22が保持するデータモデルおよび擬装データモデルを模式的に示す。まずデータモデルについて説明する。データモデルは、複数のモデル要素をJAVA(登録商標)ソースプログラムの構造にしたがって木構造に構造化したものである。データモデルは、木構造を管理するJAVA(登録商標)オブジェクトであり、例えば、「java.util.TreeMap」のオブジェクトである。データモデルの各モデル要素は、JAVA(登録商標)ソースプログラムの個々の要素(以下、「JAVA(登録商標)ソース要素」と呼ぶ。)、例えばクラス宣言やメソッド宣言等に対応づけられたJAVA(登録商標)オブジェクトである。データモデルの具体的な生成方法については後述する。
次に擬装データモデルについて説明する。擬装データモデルは、複数のモデル要素をCOBOLソースプログラムに対応するJAVA(登録商標)言語のプログラムコードの構造にしたがって木構造に構造化したものである。擬装データモデルも、木構造を管理するJAVA(登録商標)オブジェクトであり、例えば、「java.util.TreeMap」のオブジェクトである。擬装データモデルの各モデル要素は、COBOLソースプログラムの個々の要素(以下、「COBOLソース要素」と呼ぶ。)および各COBOLソース要素に相当するJAVA(登録商標)ソース要素に対応づけられたJAVA(登録商標)オブジェクトである。擬装データモデルの具体的な生成方法については後述する。
図5は、データモデルの各モデル要素が保持する属性を示す。モデル要素欄602は、各モデル要素の識別情報を記録する。同図では、モデル要素の識別情報を図4の符号で示しているが、個々のモデル要素を特定できる情報であればよい。例えば、データモデルにおいて各モデル要素を特定するためのキー情報が記録されてもよく、モデル要素のオブジェクトリファレンスそのものが記録されてもよい。後述する親モデル要素欄604および依存元モデル要素欄608についても同様である。親モデル要素欄604は、各モデル要素に対する親モデル要素の識別情報を記録する。
JAVA(登録商標)ソース要素欄606は、各モデル要素に対応するJAVA(登録商標)ソース要素を記録する。例えば、図4のモデル要素542はクラス宣言であるので、当該モデル要素に対応するJAVA(登録商標)ソース要素として、「public class JAVASAMPLE」が記録されている。ここで記録されるJAVA(登録商標)ソース要素は、そのJAVA(登録商標)ソース要素の文字列およびJAVA(登録商標)ソースプログラムにおける当該JAVA(登録商標)ソース要素の位置を示すファイルポインタまたはファイルオフセット情報である。
依存元モデル要素欄608は、モデル要素間のデータ同期処理を実現するために、各モデル要素に依存する依存元モデル要素を記録する。データ同期処理とは、依存元モデル要素に依存先モデル要素の変更を反映する処理である。同図では、モデル要素554の依存元モデル要素欄608に、依存元モデル要素であるモデル要素556およびモデル要素558が記録されている。データ同期処理については後述する。
図6は、擬装データモデルの各モデル要素が保持する属性を示す。以下、上述した図5との差分を説明する。COBOLソース要素欄610は、各モデル要素に対応するCOBOLソース要素を記録する。ここで記録されるCOBOLソース要素は、そのCOBOLソース要素の文字列およびCOBOLソースプログラムにおける当該COBOLソース要素の位置を示すファイルポインタまたはファイルオフセット情報である。
モデル生成用JAVA(登録商標)ソース要素欄612は、COBOLソース要素に対応するJAVA(登録商標)ソース要素であって、擬装データモデルを生成する際に使用されるモデル生成用JAVA(登録商標)ソース要素を記録する。コンパイル用JAVA(登録商標)ソース要素欄614は、COBOLソース要素に対応するJAVA(登録商標)ソース要素であって、オブジェクトプログラムを生成する際に使用されるコンパイル用JAVA(登録商標)ソース要素を記録する。
また、JAVA(登録商標)ソースプログラムから生成された「データモデル」と、COBOLソースプログラムから生成された「擬装データモデル」とは、同じ3つのインタフェースを備える。第1のインタフェースは、「参照用インタフェース」である。参照用インタフェースは、ソースプログラムを表示する際に使用される。第2のインタフェースは「更新用インタフェース」である。更新用インタフェースは、ソースプログラムを変更する際に使用される。第3のインタフェースは、「コンパイル用インタフェース」である。コンパイル用インタフェースは、オブジェクトプログラムを生成する際に使用される。いずれのインタフェースへのアクセスにおいても、1以上のモデル要素が指定される。
データモデルは、参照用インタフェースでアクセスされると、指定されたモデル要素に対応づけられたJAVA(登録商標)ソース要素を返す。また、更新用インタフェースでアクセスされると、指定されたモデル要素に対応づけられたJAVA(登録商標)ソース要素を変更する。また、コンパイル用インタフェースでアクセスされると、指定されたモデル要素に対応づけられたJAVA(登録商標)ソース要素を返す。
一方で、擬装データモデルは、参照用インタフェースでアクセスされると、指定されたモデル要素に対応づけられたCOBOLソース要素を返す。また、更新用インタフェースでアクセスされると、指定されたモデル要素に対応づけられたCOBOLソース要素を変更する。また、コンパイル用インタフェースでアクセスされると、指定されたモデル要素に対応づけられたコンパイル用JAVA(登録商標)ソース要素を返す。図3に戻る。
言語対応情報保持部24は、COBOL言語とJAVA(登録商標)言語との対応関係を保持する。この対応関係には、ソースプログラムの構造レベルの対応関係から個々の命令語の対応関係まで広く含まれる。図7(a)は、COBOLソース要素と共通JAVA(登録商標)ソース要素との対応関係を示す。COBOLソース要素欄622は、COBOLソース要素を記録する。共通JAVA(登録商標)ソース要素欄624は、モデル生成用JAVA(登録商標)ソース要素およびコンパイル用JAVA(登録商標)ソース要素の両方に共通して適用されるJAVA(登録商標)ソース要素を記録する。例えば、COBOLソース要素の「PROGRAM-ID」は、JAVA(登録商標)ソース要素の「class」に対応することを示している。
図7(b)は、COBOLソース要素と、モデル生成用JAVA(登録商標)ソース要素と、コンパイル用JAVA(登録商標)ソース要素との対応関係を示す。モデル生成用JAVA(登録商標)ソース要素欄626は、モデル生成用JAVA(登録商標)ソース要素を記録し、コンパイル用JAVA(登録商標)ソース要素欄628は、編集用JAVA(登録商標)ソース要素を記録する。例えば、COBOLソース要素の「PIC 9(length)」は、編集用JAVA(登録商標)ソース要素の「int」に対応し、また、コンパイル用JAVA(登録商標)ソース要素の「COBOLDecimal.getLiteral(length,0)」に対応することを示している。
図7(b)において示すように、言語対応情報保持部24は、各COBOLソース要素に対応するモデル生成用JAVA(登録商標)ソース要素とコンパイル用JAVA(登録商標)ソース要素とを区別して保持している。これは以下の理由による。すなわち、ユーザ400によるCOBOLソースプログラムの編集を実現するために生成されるデータモデルでは、その構造がCOBOLソースプログラムの構造に近いことが重要である。一方で、オブジェクトプログラムの生成においては、各COBOLソース要素と同等の動作を実現するJAVA(登録商標)ソース要素が対応づけられることが重要だからである。
また、図7(b)のコンパイル用JAVA(登録商標)ソース要素に含まれる「CobolLang」「CobolDecimal」「CobolMethod」等のクラスおよびそれらのメソッドは、COBOL言語とJAVA(登録商標)言語との対応付けのために用意されたライブラリに含まれる。例えば、「CobolLang.getLiteral」メソッドは、文字数を指定して文字列を生成する関数である。また、「CobolDecimal.getLiteral」メソッドは、桁数を指定して数値を生成する関数である。これらは例えば、プリミティブ型「char」の配列等で実装されている。
COBOLは事務処理用に開発された経緯から事務処理用の関数が充実している。一方で、JAVA(登録商標)は多目的に使用できる汎用的なプログラミング言語として開発されたものであるため、両言語間において一対一で対応できない命令語もある。上述したライブラリはこの差異を埋めるためのものであり、COBOL言語特有の命令語の動作を実現するクラスおよびメソッドがあらかじめ実装され、データ記憶部20にライブラリとして記憶されている。後述する擬装データモデル生成部66は、このライブラリを参照して、コンパイル用JAVA(登録商標)ソース要素欄628に設定する。図3に戻る。
JAVA(登録商標)処理部:
JAVA(登録商標)処理部40は、JAVA(登録商標)ソースプログラムからデータモデルを生成し、当該データモデルを介して、ユーザのコーディング作業を支援する。JAVA(登録商標)処理部40は、ソースプログラム取得部42と、ソース要素抽出部44と、データモデル生成部46と、編集部48と、ソースプログラム更新部50と、オブジェクトプログラム生成部52と、コンパイルエラー通知部54とを含む。ソースプログラム取得部42は、ユーザ400により指定されたJAVA(登録商標)ソースプログラムを取得する。
ソース要素抽出部44は、JAVA(登録商標)言語の文法規則にしたがって、取得されたJAVA(登録商標)ソースプログラムを構成するプログラムコードの要素をJAVA(登録商標)ソース要素として抽出する。図8は、JAVA(登録商標)ソースプログラムを示す。ソース要素抽出部44は、例えば、図8で示すJAVA(登録商標)ソースプログラムから、キーワードマッチングや他の要素との位置関係に基づき、図5のJAVA(登録商標)ソース要素欄606で示すJAVA(登録商標)ソース要素を抽出する。図5のモデル要素欄602に設定されたモデル要素542から558は、図8のJAVA(登録商標)ソース要素502から518にそれぞれ対応づけられている。
データモデル生成部46は、JAVA(登録商標)言語の文法規則にしたがって、JAVA(登録商標)ソース要素それぞれのJAVA(登録商標)ソースプログラムにおける関係を特定する。データモデル生成部46は、この関係に基づいて、JAVA(登録商標)ソース要素に対応づけられるモデル要素を所定の構造化規則に基づいて構造化してデータモデルを生成し、データモデル保持部22に記録する。
データモデルの生成における所定の構造化規則とはIDE100において決められている構造化規則であり、Eclipseにおける「Java Model」生成規則であってもよい。この規則は、例えば、クラスに対応するモデル要素を頂点とする木構造であること。メソッドはメソッド宣言が親モデル要素となり、メソッド情報とメソッド本体が子モデル要素となること。メソッド内部のデータ要素を示すモデル要素は、メソッド本体を示すモデル要素の子要素となること等、データモデルの構造を決定する規則である。この構造化規則にしたがって、データモデル生成部46は、例えば、図8のJAVA(登録商標)ソース要素502から518のそれぞれを図4のモデル要素542から558に対応づけてデータモデルを生成する。
また、データモデル生成部46は、データモデルの各モデル要素に、図5で示した各種属性を設定する。なお、依存元モデル要素の設定の際には、データモデル生成部46は、JAVA(登録商標)ソースプログラムの構造にしたがって、モデル要素に対応づけられたJAVA(登録商標)ソース要素の文字列比較をして、モデル要素間の依存関係を判定する。例えば、あるメソッドの中で宣言された変数があり、同一のメソッドの中でその変数と同一の文字列を使った変数の代入処理がある場合、後者の変数文字列は前者の変数文字列に依存していると判定し、前者の依存元モデル要素欄608に後者を設定する。さらに、データモデル生成部46は、各モデル要素にアクセスさせるための参照用インタフェース、更新用インタフェースおよびコンパイル用インタフェースをデータモデルに設定する。
編集部48は、データモデルにアクセスすることにより、コーディング支援機能をユーザ400に提供する。例えば、JAVA(登録商標)ソースプログラムを表示させる際には、データモデルの参照用インタフェースにアクセスして、各モデル要素に対応づけられたJAVA(登録商標)ソース要素の文字列を取得し、表示部14を介して、ユーザ400の端末に画面表示させる。また、ユーザ400により、あるモデル要素が編集対象として指定されたとき、編集部48は、参照用インタフェースを介して、指定されたモデル要素に対応づけられているJAVA(登録商標)ソース要素の文字列を取得する。編集部48は、取得したJAVA(登録商標)ソース要素の文字列をユーザ400の端末に画面表示させる。
また、モデル要素がJAVA(登録商標)のキーワード、例えば「class」や「int」等を示すモデル要素であるとき、編集部48は、取得したJAVA(登録商標)ソース要素を色づけする等して表示態様を変更する。また、あるモデル要素が、JAVA(登録商標)文法規則における特定の位置に存在する場合、例えば「for」キーワードを示すモデル要素の後ろに存在するときには、当該JAVA(登録商標)ソース要素をインデントさせる等して表示態様を変更する。
また、ユーザ400が画面表示されたJAVA(登録商標)ソースプログラムを変更したとき、編集部48は、変更にかかるモデル要素を特定し、変更用インタフェースを介して当該モデル要素にアクセスして、その変更をJAVA(登録商標)ソース要素に反映させる。
また、データモデルのモデル要素間に既述した依存関係があるとき、編集部48は、依存先のモデル要素に対応づけられたJAVA(登録商標)ソース要素の変更に併せて、依存元のモデル要素に対応づけられたJAVA(登録商標)ソース要素を変更する。例えば、図5のモデル要素544のJAVA(登録商標)ソース要素が、「TOTAL」から「RESULT」に変更されたとする。このとき、編集部48は、モデル要素556およびモデル要素558のJAVA(登録商標)ソース要素の「TOTAL」も「RESULT」に変更する。
ソースプログラム更新部50は、編集部48によるJAVA(登録商標)ソース要素の変更を検出して、当該変更をJAVA(登録商標)ソースプログラムに反映する。ソースプログラム更新部50は、データモデルの各モデル要素にリスナを登録しておくことで、各モデル要素に対応づけられたJAVA(登録商標)ソース要素の変更を検出する。ソースプログラム更新部50は、モデル要素に対応づけられたJAVA(登録商標)ソースプログラムの位置を示すファイルポインタを介してJAVA(登録商標)ソースプログラムにアクセスし、当該ファイルポインタが示す位置のプログラムコードを変更する。
オブジェクトプログラム生成部52は、データモデルのコンパイル用インタフェースにアクセスして、各モデル要素に対応づけられたJAVA(登録商標)ソース要素を取得する。続いて、このJAVA(登録商標)ソース要素をコンパイルして、オブジェクトプログラム300を生成する。オブジェクトプログラム生成部52は、取得したJAVA(登録商標)ソース要素をデータモデルの構造にしたがって組みあわせることで、JAVA(登録商標)ソースプログラムを一旦生成し、当該JAVA(登録商標)ソースプログラムをコンパイルしてもよい。
コンパイルエラー通知部54は、オブジェクトプログラム生成部52のコンパイル処理においてエラーが発生したとき、当該エラーを検出する。続いて、エラーを発生させたJAVA(登録商標)ソース要素に対応づけられているモデル要素を特定して、ユーザ400にJAVA(登録商標)ソースプログラム上での位置を通知する。
COBOL処理部:
COBOL処理部60は、COBOLソースプログラムから擬装データモデルを生成し、当該擬装データモデルを介して、JAVA(登録商標)処理部40にユーザのコーディング作業を支援させる。COBOL処理部60は、COBOLソースプログラム取得部62と、COBOLソース要素抽出部64と、擬装データモデル生成部66と、COBOLソースプログラム更新部68と、ソースプログラム生成部70とを含む。COBOLソースプログラム取得部62は、ユーザにより指定されたCOBOLソースプログラムを取得する。
COBOLソース要素抽出部64は、COBOL言語の文法規則にしたがって、取得されたCOBOLソースプログラムを構成するプログラムコードの要素をCOBOLソース要素として抽出する。図9は、COBOLソースプログラムを示す。ソース要素抽出部44は、例えば、図9で示すCOBOLソースプログラムから、キーワードマッチングや他の要素との位置関係に基づき、図6のCOBOLソース要素欄610で示すCOBOLソース要素を抽出する。図6のモデル要素欄602に設定されたモデル要素542から558は、図9のCOBOLソース要素522から538にそれぞれ対応づけられている。
擬装データモデル生成部66は、言語対応情報保持部24に記録されたCOBOLソース要素とJAVA(登録商標)ソース要素との対応関係を参照し、COBOLソース要素に相当するモデル生成用JAVA(登録商標)ソース要素およびコンパイル用JAVA(登録商標)ソース要素を生成する。
例えば、擬装データモデル生成部66は、図9のCOBOLソース要素522「PROGRAM-ID COBOLSAMPLE」に対し、図7(a)のレコード630を参照して、共通JAVA(登録商標)ソース要素「class COBOLSAMPLE」を生成する。別の例として、図9のCOBOLソース要素538「DISPLAY TOTAL」に対し、図7(b)のレコード632を参照して、モデル生成用JAVA(登録商標)ソース要素「System.out.println(TOTAL)」を生成する。また、コンパイル用JAVA(登録商標)ソース要素「COBOLMethod.display(TOTAL)」も併せて生成する。
擬装データモデル生成部66は、COBOLソース要素と、モデル生成用JAVA(登録商標)ソース要素と、コンパイル用JAVA(登録商標)ソース要素を対応づける。これにより、図9のCOBOLソースプログラムから図6のCOBOLソース要素欄610、モデル生成用JAVA(登録商標)ソース要素欄612およびコンパイル用JAVA(登録商標)ソース要素欄614で示す対応関係を生成する。
擬装データモデル生成部66は、JAVA(登録商標)言語の文法規則にしたがって、モデル生成用JAVA(登録商標)ソース要素間の関係を特定する。この関係に基づいて、COBOLソース要素、モデル生成用JAVA(登録商標)ソース要素およびコンパイル用JAVA(登録商標)ソース要素に対応づけられるモデル要素を所定の構造化規則に基づいて構造化してデータモデルを生成し、データモデル保持部22に記録する。擬装データモデルにおける所定の構造化規則は、データモデル生成部46で既述した規則に従う。
また、擬装データモデル生成部66は、擬装データモデルの各モデル要素に、図6で示した各種属性を設定する。なお、依存元モデル要素の設定は、データモデル生成部46で説明した処理と同様である。さらに、擬装データモデル生成部66は、各モデル要素にアクセスさせるための参照用インタフェース、更新用インタフェースおよびコンパイル用インタフェースを擬装データモデルに設定する。このようにして、擬装データモデル生成部66は、例えば、図9のCOBOLソース要素522から538のそれぞれを図4のモデル要素542から558に対応づけて擬装データモデルを生成する。
COBOLソースプログラム更新部68は、編集部48によるCOBOLソース要素の変更を検出して、当該変更をCOBOLソースプログラムに反映する。COBOLソースプログラム更新部68は、擬装データモデルの各モデル要素にリスナを登録しておくことで、各モデル要素に対応づけられたCOBOLソース要素の変更を検出する。COBOLソースプログラム更新部68は、モデル要素に対応づけられたCOBOLソースプログラムの位置を示すファイルポインタを介してCOBOLソースプログラムにアクセスし、当該ファイルポインタが示す位置のプログラムコードを変更する。
ソースプログラム生成部70は、擬装データモデルにおける各モデル要素のコンパイル用インタフェースにアクセスして、モデル要素に対応づけられたコンパイル用JAVA(登録商標)ソース要素を取得する。ソースプログラム生成部70は、擬装データモデルの構造にしたがって、取得したコンパイル用JAVA(登録商標)ソース要素を組み合わせて、JAVA(登録商標)ソースプログラムを生成する。擬装データモデルは木構造であるため、ソースプログラム生成部70は、根から子へ左回りにモデル要素をたどって、各モデル要素に対応づけられたコンパイル用JAVA(登録商標)ソース要素を順次出力することにより、JAVA(登録商標)ソースプログラムを生成してもよい。なお、ここで生成されるJAVA(登録商標)ソースプログラムは、擬装データモデルのもととなったCOBOLソースプログラムと同様の動作をする。
なお、擬装データモデル生成部66は、擬装データモデルの生成において、JAVA(登録商標)ソース要素に対応付けできないCOBOLソース要素を検出したときには、コンパイル用JAVA(登録商標)ソース要素として、所定の文字列を設定してもよい。この文字列は、ユーザにコーディングするよう注意喚起を促す文字列であればよく、COBOLソース要素そのものでもよい。コンパイル用JAVA(登録商標)ソース要素に当該文字列されているとき、ソースプログラム生成部70は、取得したコンパイル用JAVA(登録商標)ソース要素をそのままもしくはコメントアウトして出力してもよい。これにより、ユーザは出力されたJAVA(登録商標)ソースプログラムの中で、さらに実装すべき部分を認識できる。
次に、擬装データモデルに対する編集部48、オブジェクトプログラム生成部52およびコンパイルエラー通知部54の動作を説明する。
編集部48は、擬装データモデルにアクセスすることにより、コーディング支援機能をユーザ400に提供する。例えば、COBOLソースプログラムを表示させる際には、擬装データモデルの参照用インタフェースにアクセスして、各モデル要素に対応づけられたCOBOLソース要素の文字列を取得し、表示部14を介して、ユーザ400の端末に画面表示させる。また、ユーザ400により、あるモデル要素が編集対象として指定されたとき、編集部48は、参照用インタフェースを介して、指定されたモデル要素に対応づけられているCOBOLソース要素の文字列を取得する。編集部48は、取得したCOBOLソース要素の文字列をユーザ400の端末に画面表示させる。
また、モデル要素がJAVA(登録商標)のキーワード、例えば「class」や「int」等を示すモデル要素であるとき、編集部48は、当該モデル要素に対応づけられたCOBOLソース要素を色づけする等して表示態様を変更する。また、あるモデル要素が、JAVA(登録商標)文法規則における特定の位置に存在する場合、例えば「for」キーワードを示すモデル要素の後ろに存在するときには、当該モデル要素に対応づけられたCOBOLソース要素をインデントさせる等して表示態様を変更する。
また、ユーザ400が画面表示されたCOBOLソースプログラムを変更したとき、編集部48は、変更にかかるモデル要素を特定し、変更用インタフェースを介して当該モデル要素にアクセスして、その変更をCOBOLソース要素に反映させる。
また、擬装データモデルのモデル要素間に既述した依存関係があるとき、編集部48は、依存先のモデル要素に対応づけられたCOBOLソース要素の変更に併せて、依存元のモデル要素に対応づけられたCOBOLソース要素を変更する。例えば、図6のモデル要素544のCOBOLソース要素が、「TOTAL」から「RESULT」に変更されたとする。このとき、編集部48は、モデル要素556およびモデル要素558のCOBOLソース要素の「TOTAL」も「RESULT」に変更する。
オブジェクトプログラム生成部52は、擬装データモデルのコンパイル用インタフェースにアクセスして、各モデル要素に対応づけられたコンパイル用JAVA(登録商標)ソース要素を取得する。続いて、このコンパイル用JAVA(登録商標)ソース要素をコンパイルして、オブジェクトプログラム300を生成する。オブジェクトプログラム生成部52は、取得したコンパイル用JAVA(登録商標)ソース要素をデータモデルの構造にしたがって組みあわせることで、JAVA(登録商標)ソースプログラムを一旦生成し、当該JAVA(登録商標)ソースプログラムをコンパイルしてもよい。
コンパイルエラー通知部54は、オブジェクトプログラム生成部52のコンパイル処理においてエラーが発生したとき、当該エラーを検出する。続いて、エラーを発生させたコンパイル用JAVA(登録商標)ソース要素に対応づけられているモデル要素を特定して、そのモデル要素からCOBOLソース要素を特定することにより、ユーザ400にCOBOLソースプログラム上での位置を通知する。例えば、当該COBOLソース要素を含むプログラムコードを画面表示させる。
このように、編集部48、オブジェクトプログラム生成部52およびコンパイルエラー通知部54は、データモデルにアクセスする場合と同様のインタフェースで擬装データモデルにアクセスできる。その結果、JAVA(登録商標)ソースプログラムに対するコーディング支援機能をCOBOLソースプログラムに対しても提供できる。
次に、COBOLソースプログラムに対してIDE100が実行するコーディング支援処理の流れを説明する。
図10(a)は、IDE100におけるコーディング支援処理の流れを示すフローチャートである。要求受付部12は、ユーザ400からのCOBOLソースプログラムの指定を検出する(S12)。COBOLソースプログラム取得部62は、COBOLソースプログラムを取得し(S14)、COBOLソース要素抽出部64は、COBOLソース要素を抽出する(S16)。擬装データモデル生成部66は、通常のデータモデルと同様のインタフェースを備える擬装データモデルを生成する(S18)。
図10(b)は、図10(a)の擬装データモデル生成処理の詳細を示すフローチャートである。擬装データモデル生成部66は、COBOLソース要素抽出部64により抽出されたCOBOLソース要素を取得する(S102)。擬装データモデル生成部66は、言語対応情報保持部24を参照して、COBOLソース要素に対応するモデル生成用JAVA(登録商標)ソース要素およびコンパイル用JAVA(登録商標)ソース要素を特定する(S104)。続いて、COBOLソース要素、モデル生成用JAVA(登録商標)ソース要素およびコンパイル用JAVA(登録商標)ソース要素を対応づけてモデル要素を生成する(S106)。擬装データモデル生成部66は、モデル要素を構造化して擬装データモデルを生成する(S108)。図10(a)に戻る。
編集部48は、モデル要素の属性に基づき、編集用インタフェースを介して取得したCOBOLソース要素の表示態様を決定する(S20)。表示部14は、決定された表示態様にて、COBOLソースプログラムを画面表示させる(S22)。ユーザ400から編集対象の指定を要求受付部12が検出すると(S24のY)、編集部48は、編集対象として指定されたモデル要素に対応づけられたCOBOLソース要素を特定する(S26)。表示部14は、当該COBOLソース要素を含むプログラムコードを画面表示させる(S28)。ユーザから編集対象の指定がなければ(S24のN)、S26およびS28の処理はスキップされる。
図10(c)は、図10(a)の続きを示すフローチャートである。ユーザ400からのCOBOLソース要素の変更要求を要求受付部12が検出すると(S30のY)、編集部48は、編集にかかるモデル要素を特定して、当該モデル要素に対応づけられたCOBOLソース要素を変更する(S32)。モデル要素間に依存関係が設定されているとき(S34のY)、編集部48は、COBOLソース要素の同期処理を行う(S36)。依存関係の設定がないとき(S34のN)、S36の処理はスキップされる。COBOLソースプログラム更新部68は、COBOLソース要素の変更を検出して、COBOLソースプログラムを変更する(S38)。ユーザからCOBOLソース要素の変更要求がないとき(S30のN)、S32からS38の処理はスキップされる。
ユーザ400からJAVA(登録商標)ソースプログラムの生成指示があると(S40のY)、要求受付部12は当該生成指示を検出する。このとき、ソースプログラム生成部70は、擬装データモデルのコンパイル用インタフェースを介して、コンパイル用JAVA(登録商標)ソース要素を取得する。ソースプログラム生成部70は、取得したコンパイル用JAVA(登録商標)ソース要素を擬装データモデルの構造にしたがって組み合わせることでJAVA(登録商標)ソースプログラムを生成して出力する(S42)。ユーザからJAVA(登録商標)ソースプログラムの生成指示がないときには(S40のN)、S42の処理はスキップされる。
図10(d)は、図10(c)の続きを示すフローチャートである。ユーザからコンパイル実行指示があると(S44のY)、要求受付部12は当該実行指示を検出する。このとき、オブジェクトプログラム生成部52は、擬装データモデルのコンパイル用インタフェースを介して取得したコンパイル用JAVA(登録商標)ソース要素をコンパイルする(S46)。コンパイルエラーが発生しなければ(S48のN)、オブジェクトプログラム生成部52は、オブジェクトプログラムを出力する(S50)。
コンパイルエラーが発生したときには(S48のY)、コンパイルエラー通知部54は、当該エラーの原因箇所となったCOBOLソースプログラムの位置をユーザ400に通知する(S52)。ユーザからのコンパイル指示がないときには(S44のN)、S46からS50の処理はスキップされる。ユーザからの終了指示を要求受付部12が検出すると(S54のY)、IDE100は処理を終了する。当該終了指示がなければ(S54のN)、S20の処理に戻り、COBOLソース要素の表示態様が決定されて、COBOLソースプログラムのプログラムコードが画面表示される。
次に、本発明者による実験結果であって、本実施の形態のIDE100によりCOBOLソースプログラムに対応づけられる編集用JAVA(登録商標)ソースプログラムおよびコンパイル用JAVA(登録商標)ソースプログラムを示す。編集用JAVA(登録商標)ソースプログラムは、COBOLソース要素に対応づけられるモデル生成用JAVA(登録商標)ソース要素を組み合わせたJAVA(登録商標)ソースプログラムである。また、コンパイル用JAVA(登録商標)ソースプログラムは、COBOLソース要素に対応づけられるコンパイル用JAVA(登録商標)ソース要素を組み合わせたJAVA(登録商標)ソースプログラムである。なお、ソースプログラム生成部70により生成されるJAVA(登録商標)ソースプログラムは、ここで示すコンパイル用JAVA(登録商標)ソースプログラムである。なお、ここで示すソースプログラムは、図7(a)および図7(b)で示したソース要素間の対応関係をもとに対応付けされたものである。
第1の例として、COBOL言語の複雑な集団項目のマッピング例を示す。図11(a)は、集団項目を含むCOBOLソースプログラムを示す。COBOLソース要素700の「DEPARTMENT」は集団項目であり、内部に文字列「DEPARTMENT_NAME」とCOBOLソース要素702「STAFFS」を含む。この「STAFFS」も集団項目であり、その内部には文字列と数値を有する。また、「OCCURS」キーワードにより10回の繰り返しが指定されている。なお、COBOLソース要素704では、文字列が転記されている。
図11(b)は、図11(a)に対応する編集用JAVA(登録商標)ソースプログラムを示す。同図のCOBOLソース要素700の集団項目は、インナークラスにマッピングされており、JAVA(登録商標)ソース要素710でクラスが定義され、JAVA(登録商標)ソース要素716でインスタンス化されている。COBOLソース要素702の集団項目も、インナークラスにマッピングされており、JAVA(登録商標)ソース要素712でクラスが定義されている。また「OCCURS」の繰り返し指定は、JAVA(登録商標)ソース要素714で示すように配列にマッピングされている。また、COBOLソース要素704の文字列の転記は、JAVA(登録商標)ソース要素718の代入文にマッピングされている。
第2の例として、COBOL言語の数値要素のマッピング例を示す。図12(a)は、数値を取り扱うCOBOLソースプログラムを示す。COBOLソース要素720で2桁の数値項目を宣言し、COBOLソース要素722で当該数値項目に10を加算し、COBOLソース要素724で当該数値項目を表示させている。
図12(b)は、図12(a)に対応する編集用JAVA(登録商標)ソースプログラムを示す。COBOLソース要素720は、JAVA(登録商標)ソース要素730で「int」にマッピングされている。COBOLソース要素722は、JAVA(登録商標)ソース要素732で標準的な数値加算関数にマッピングされている。また、COBOLソース要素724は、JAVA(登録商標)ソース要素734で標準的な出力関数にマッピングされている。
図12(c)は、図12(a)に対応するコンパイル用JAVA(登録商標)ソースプログラムを示す。COBOLソース要素720、722および724はいずれも、JAVA(登録商標)ソース要素740、742および744において、標準ではない外部ライブラリが備える関数の呼び出しにマッピングされている。これは、モデル生成用JAVA(登録商標)ソース要素にマッピングする際には、COBOLソースプログラムの構造を示す擬装データモデルが作成できればよいため、COBOLソース要素の構造を踏襲しつつ、簡易な関数へマッピングすればよい。これに対し、コンパイル用JAVA(登録商標)ソース要素にマッピングする際には、各COBOLソース要素と同様の動作を実現するJAVA(登録商標)ソース要素へマッピングされる必要があるからである。
例えば、COBOLソース要素720の「PIC 9(2)」は、2桁の数値項目を示すが、これに対応する標準的なJAVA(登録商標)ソース要素はない。図12(b)のJAVA(登録商標)ソース要素730で示すように、モデル生成用JAVA(登録商標)ソース要素としては、数値を示すプリミティブ型の「int」にマッピングされている。これに対し、図12(c)のJAVA(登録商標)ソース要素740で示すように、コンパイル用JAVA(登録商標)ソース要素としては、桁数を扱えるように新規で作成されたクラスの「CobolDecimal」にマッピングされている。
第3の例として、COBOL言語のSECTION呼び出しのマッピング例を示す。図13(a)は、SECTION呼び出しを含むCOBOLソースプログラムを示す。同図には、COBOLソース要素750で示す「HOGE SECTION」をはじめ、「FOO SECTION」、「BAR SECTION」、「BAZ SECTION」が含まれている。また、COBOLソース要素752で示すように、GOTO命令によるSECTION呼び出しが行われている。
図13(b)は、図13(a)に対応する編集用JAVA(登録商標)ソースプログラムを示す。COBOLソースプログラムの各SECTIONはメソッドにマッピングされるため、COBOLソース要素750は、JAVA(登録商標)ソース要素760にマッピングされる。また、GOTO命令は、メソッド呼び出しにマッピングされるため、COBOLソース要素752は、JAVA(登録商標)ソース要素762にマッピングされる。
なお、図13(b)の編集用JAVA(登録商標)ソースプログラムは、図13(a)COBOLソースプログラムと動作が異なる。すなわち、COBOLソースプログラムでは表示されない「This is NONDISPLAY.」がJAVA(登録商標)ソースプログラムでは表示されることになる。しかし、上述したように、モデルを生成する観点からは、よりCOBOLソースプログラムの構造と近い方が望ましいため、図13(b)のような編集用JAVA(登録商標)ソースプログラムとなる。
図13(c)は、図13(a)に対応するコンパイル用JAVA(登録商標)ソースプログラムを示す。COBOLソースプログラムの各SECTIONはメソッドにマッピングされるため、COBOLソース要素750は、JAVA(登録商標)ソース要素770にマッピングされる。ただし、COBOL言語の順次実行を実現するため、メソッドの最後に次メソッド、つまりソースプログラムにおける位置として次に記述されているメソッドの呼び出しが追加される。このため、図13(c)では、JAVA(登録商標)ソース要素772が追加されている。
また図13(c)において、GOTO命令は、メソッド呼び出しに加え、「Return」キーワードが追加されている。GOTO命令を実行すると、呼び出し元に制御は戻らない。メソッド呼び出しに「Return」を加えることで、呼び出し先から制御が戻ったときにも、すぐに自身の呼び出し元に制御を返し、最終的にJAVA(登録商標)VMまで制御を返すことにより、GOTO命令と同様の動作を実現する。このため、図13(c)では、JAVA(登録商標)ソース要素774および776が追加されている。
多くのプログラミング言語において、プログラムは、順次実行、条件分岐、繰り返しの3要素を基本として構成されている。図7(a)、図7(b)および上記の実験結果で示したように、本実施の形態のIDE100では、COBOL言語とJAVA(登録商標)言語の間でいずれの3要素についてもマッピングができている。また、COBOL特有のSECTION構造やGOTO命令にも対応ができ、その他のCOBOL特有の関数についても、既述したように、外部ライブラリをあらかじめ準備することでマッピングを実現する。言い換えれば、IDE100は、いずれのCOBOLソースプログラムについても擬装データモデルを生成でき、コーディング支援を実現する。
本実施の形態によれば、JAVA(登録商標)ソースプログラムに基づくデータモデルと同様のインタフェースを備える擬装データモデルをCOBOLソースプログラムから生成する。これにより、データモデルにアクセスしてコーディングを支援する編集機能等各種機能を新規開発、もしくは大幅に修正することなく、既存の編集機能等にデータモデルと擬装データモデルとを同様に取り扱わせることができる。すなわち、ユーザは、JAVA(登録商標)用IDEのコーディング支援機能をCOBOLソースプログラムのコーディングにおいても享受できる。
COBOLソースプログラムのコーディングにおいてJAVA(登録商標)用IDEから享受できるコーディング支援機能の例を示す。例えば、ユーザによるCOBOLソース要素の指定に対応して、当該COBOLソース要素を含むプログラムコードの特定および表示ができる。また、JAVA(登録商標)言語のキーワードに対応するCOBOLソース要素に対する色づけやインデント等の表示態様の変更ができる。また、依存元のソース要素を依存先のソース要素の変更に同期させることができる。これらのコーディング支援機能を享受できることで、大規模化・複雑化したCOBOLソースプログラムのコーディングにおいて、その効率を高めるとともにコーディングミスを低減できる。
また、本実施の形態によれば、COBOLソースプログラムからJAVA(登録商標)ソースプログラムを生成できる。これにより、例えばメインフレームの更改にあたり、Windows(登録商標)やUNIX(登録商標)等、オープンシステムへのリホストも容易となる。さらに、JAVA(登録商標)言語は理解しているものの、COBOL言語は十分に理解していない開発者に対しても、JAVA(登録商標)ソースプログラムを提示できることで、COBOLソースプログラムの内容の理解を容易にする。
さらに、本実施の形態によれば、COBOLソースプログラムに基づく擬装データモデルからコンパイル用JAVA(登録商標)ソース要素を取得しコンパイルして、JAVA(登録商標)バイトコードを生成できる。これにより、当該バイトコードをJAVA(登録商標)VM上で動作させることで、COBOL言語用の実行環境が無くても、COBOLソースプログラムの動作を確認できる。また、コンパイルエラーが発生した際には、エラーの原因となったモデル要素を介して、COBOLソースプログラムの問題位置をユーザに通知できる。つまり、疑似データモデルを生成することにより、オブジェクトプログラム生成におけるコーディング支援機能についても享受できる。
COBOLソースプログラムからJAVA(登録商標)バイトコードが生成されることで、例えば、メインフレームからオープンシステムへの移行を実施する開発者に求められるJAVA(登録商標)言語スキルが低減される。すなわち、JAVA(登録商標)を十分に理解できていない開発者であっても、JAVA(登録商標)ソースプログラムをコーディングすることなく、COBOLソースプログラムのJAVA(登録商標)VM上での動きを確認できる。
なお、COBOLソース要素とJAVA(登録商標)ソース要素とを対応づけるライブラリを充実させることで、COBOLソースプログラムから疑似データモデルを介して生成されるJAVA(登録商標)ソースプログラムの精度が高めることができる。これは、JAVA(登録商標)バイトコードを生成する場合にも同様である。言い換えれば、アプリケーションがCOBOLで実装されたメインフレームから、アプリケーションがJAVA(登録商標)で実装されるオープンシステムへの移行を容易に実現できる。
以上、本発明を実施の形態をもとに説明した。この実施の形態は例示であり、それらの各構成要素や各処理プロセスの組合せにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。
上述した実施の形態では、擬装データモデルは、モデル作成用JAVA(登録商標)ソース要素をもとに生成されたが、コーディング支援用の擬装データモデルと、コンパイル用の擬装データモデルとが別に生成されてもよい。この場合、コンパイル用の擬装データモデルは、コンパイル用JAVA(登録商標)ソース要素をもとに生成され、コンパイル用インタフェースを備える。
また、上述した実施の形態では、ソースプログラム生成部70は、コンパイル用JAVA(登録商標)ソース要素をもとに、JAVA(登録商標)ソースプログラムを生成した。変形例として、モデル生成用JAVA(登録商標)ソース要素をもとに、JAVA(登録商標)ソースプログラムを生成してもよい。COBOL特有の命令語に対応するためのライブラリがない場合にも、COBOLソースプログラムに対応するJAVA(登録商標)ソースプログラムをユーザに提供でき、ユーザのコーディング作業を支援できる。
さらにまた、JAVA(登録商標)処理部40は、図3に図示しないステップ実行部を含んでもよく、オブジェクトプログラム生成部52は、擬装モデルの各モデル要素にブレークポイントを対応づけた上でコンパイルし、オブジェクトプログラムを生成してもよい。ステップ実行部は、オブジェクトプログラムの実行において、各ブレークポイントまでステップ的に実行し、また、ブレークポイントごとにデバッグ情報を出力する。このとき、ステップ実行部は、モデル要素に対応づけられたCOBOLソース要素とともにデバッグ情報を出力することで、COBOLのコーディングを支援する。
さらにまた、上述した実施の形態では、JAVA(登録商標)用IDEのコーディング支援機能をCOBOLソースプログラムのコーディングに利用する技術を提案したが、本発明の技術思想はこれに限定されない。すなわち、本発明の技術思想は、IDEがコーディング支援できる領域を様々な規格外プログラミング言語に拡大する場合全般に適用できる。
10 ユーザインタフェース処理部、12 要求受付部、14 表示部、20 データ記憶部、22 データモデル保持部、24 言語対応情報保持部、30 データ処理部、40 JAVA(登録商標)処理部、42 ソースプログラム取得部、44 ソース要素抽出部、46 データモデル生成部、48 編集部、50 ソースプログラム更新部、52 オブジェクトプログラム生成部、54 コンパイルエラー通知部、60 COBOL処理部、62 COBOLソースプログラム取得部、64 COBOLソース要素抽出部、66 擬装データモデル生成部、68 COBOLソースプログラム更新部、70 ソースプログラム生成部、100 IDE、200 ソースプログラム、300 オブジェクトプログラム、400 ユーザ、602 モデル要素欄、604 親モデル要素欄、606 JAVA(登録商標)ソース要素欄、608 依存元モデル要素欄、610 COBOLソース要素欄、612 モデル生成用JAVA(登録商標)ソース要素欄、614 コンパイル用JAVA(登録商標)ソース要素欄、622 COBOLソース要素欄、624 共通JAVA(登録商標)ソース要素欄、626 モデル生成用JAVA(登録商標)ソース要素欄、628 コンパイル用JAVA(登録商標)ソース要素欄、802 JAVA(登録商標)ソースプログラム、804 データモデル処理機能、806 データモデル、808 編集機能、810 検索機能、812 整形機能、822 COBOLソースプログラム、824 新規データモデル処理機能、826 新規データモデル、828 新規編集機能、830 新規検索機能、832 新規整形機能、844 擬装データモデル処理機能、846 擬装データモデル。