COBOLプログラムをJAVAに直す方法を知りたいケースは2つある。
1つは、COBOLプログラマがJAVAを覚えるときに、(あるいは逆のケース)対応が知りたい場合、
もう1つは、COBOLやPL/Iのプログラムを、JAVAに直す場合、設計しなおすと、プログラムの動きから変わってしまって結構危険(また、既存のドキュメントがあるのに、それを全部作り直すには時間的・金銭的費用がかかりすぎる)ので、前のプログラムとドキュメントからなおしたい。
しかし、JAVAとCOBOLの両方わかるSEを用意すると、単価が高い。
そこで、COBOLソースとドキュメント(があればそれも)をもとに、JAVAに、ある程度機械的に変換できないか?ということを、「仮に」思いついた場合。
で、そんなとき、どうするか?についての試案を、ふと、思いついたので、書いて見ます。
酔狂としてみてください(まちがってるところもあるかもしれないが、それはまあ。。大目に見てやってくらはい)
ちなみに、COBOLの言語説明とサンプルについては、ここのサイトがわかりやすそう
COBOLからJAVAへの変換ポイント3つ
(1)バッチのCOBOLプログラムの変換
→これが基本
(2)オンラインのCOBOLプログラムの変換
オンラインの場合、以下の問題がある
・1つのプログラムの中で、何回も画面入出力が可能で、その間、セッションが切れない
→Webでは1プログラムでだいたい1画面、画面間でセッションがきれる
・場合によっては、write(出力)からread(読む)の順番になる
→Webの場合doGet()などで、データを読んでから処理、出力と、逆になるケースあり
(3)設計上の問題
メソッドとなるようなものが、1本のプログラムとなっている。これを設計と、どう折り合いをつけるか?
ここでは、まず(1)から
■■ バッチからCOBOLプログラムへの変換
一般的に、COBOLプログラムをJAVAに変換するには、
・COBOLの1本にプログラムをJavaの1つのクラスとしてしまう
・IDENTIFICATION DIVISIONは、プログラム名をクラス名にしてしまうほかは、
コメントでOK
・ENVIRONMENT DIVISION
special_namesは、置き換えなので、Javaプログラムにするときに、置き換えてしまう
FILE-CONTROLの、SELECT ASSIGN は、JCLの値を受ける。
ここについては、(あ)で説明する(後述)
・Data Division
COPY句で、ファイルのレコード構造を読み込んでいるとき
まず、ファイルのレコード構造をクラスにしてしまう。
(これは、Working-storage sectionで、方法を記述)
そのクラスを、importしておくことで、copy句と同じにする
Working Strage Section
77のように、PICで型を指定している変数の場合には、クラス内に、変数を定義する
01,03。。。など、レコード構造になっているものは、innerクラスとして定義する。
(copy句でimportした場合は、別にクラスを用意する)
ちなみに、こんなかんじ
COBOL側
01 HEADER1 CHARACTER TYPE IS N-TYPE.
03 FILLER PIC X(19) VALUE SPACE.
03 H-01 PIC N(1).
JAVA側
public class HEADER1
{
String fil1 = "";
String h-01;
}
・PROCEDURE DIVISION
もし、パターンを使っている場合は、そのパターンを別クラスで用意しておき
このクラスを定義するところでextendsする
でパターンを用意してなかったときや、最上位のパターンで、初めの行から
Stop RUNまでを1つのメソッドとして書くが、そのメソッドに関して、
public static void mainに書く方法と、
1つの特定のクラス(たとえばexecute)とかに書く方法がある
これについては(あ)で説明する(後述)
その中で呼ばれる perform ラベル1 THRU ラベル2 で定義される
ラベル1からラベル2までを1つのメソッドとおく。
GO TO 文で飛ばしている場合、エラーで抜けているならJavaの場合、exception
としてthrowしてしまう。っていうので、いけるかも??
■■(あ)2つの実装の方法とFILE-CONTROLのASSIGN
ここで、実装方法は2つある
(A)PROCEDURE DIVISIONのstop runまでを、public static void mainに記述してしまう場合
このときは、JCLの部分を、バッチ(Linuxだとシェル)にして、javacで起動するようにかく。この場合、JCLで、ファイル名を指定し、ASSIGNでプログラムに渡す部分は、
・起動するプログラムの引数として渡し、ファイル名を入れとくところを
変数でとっておき、そこに、設定する
・JCLで、javaプログラム起動前に、プロパティファイルを(自動でも、手作業でもOK)
作成しておき、プログラムはプロパティファイルを読み込み、ファイル名を入れとく
変数に設定する
(B)PROCEDURE DIVISIONのstop runまでを、特定のメソッドにいれる
JCLはJavaのクラスとして作成する。
JCL部分をpublic static void mainのなかに記述する。
このとき、JCLでは、newしたあとに、その特定のメソッドを呼び出すことになるが、
その間に、クラスに対し、ファイル名の変数に、JCLで指定したファイルパスを
いれてもいい。
(B)の方法だと、JCLのないプログラムは動かせない。そう考えると(A)のほうが無難?
次回、オンライン編につづく
1つは、COBOLプログラマがJAVAを覚えるときに、(あるいは逆のケース)対応が知りたい場合、
もう1つは、COBOLやPL/Iのプログラムを、JAVAに直す場合、設計しなおすと、プログラムの動きから変わってしまって結構危険(また、既存のドキュメントがあるのに、それを全部作り直すには時間的・金銭的費用がかかりすぎる)ので、前のプログラムとドキュメントからなおしたい。
しかし、JAVAとCOBOLの両方わかるSEを用意すると、単価が高い。
そこで、COBOLソースとドキュメント(があればそれも)をもとに、JAVAに、ある程度機械的に変換できないか?ということを、「仮に」思いついた場合。
で、そんなとき、どうするか?についての試案を、ふと、思いついたので、書いて見ます。
酔狂としてみてください(まちがってるところもあるかもしれないが、それはまあ。。大目に見てやってくらはい)
ちなみに、COBOLの言語説明とサンプルについては、ここのサイトがわかりやすそう
COBOLからJAVAへの変換ポイント3つ
(1)バッチのCOBOLプログラムの変換
→これが基本
(2)オンラインのCOBOLプログラムの変換
オンラインの場合、以下の問題がある
・1つのプログラムの中で、何回も画面入出力が可能で、その間、セッションが切れない
→Webでは1プログラムでだいたい1画面、画面間でセッションがきれる
・場合によっては、write(出力)からread(読む)の順番になる
→Webの場合doGet()などで、データを読んでから処理、出力と、逆になるケースあり
(3)設計上の問題
メソッドとなるようなものが、1本のプログラムとなっている。これを設計と、どう折り合いをつけるか?
ここでは、まず(1)から
■■ バッチからCOBOLプログラムへの変換
一般的に、COBOLプログラムをJAVAに変換するには、
・COBOLの1本にプログラムをJavaの1つのクラスとしてしまう
・IDENTIFICATION DIVISIONは、プログラム名をクラス名にしてしまうほかは、
コメントでOK
・ENVIRONMENT DIVISION
special_namesは、置き換えなので、Javaプログラムにするときに、置き換えてしまう
FILE-CONTROLの、SELECT ASSIGN は、JCLの値を受ける。
ここについては、(あ)で説明する(後述)
・Data Division
COPY句で、ファイルのレコード構造を読み込んでいるとき
まず、ファイルのレコード構造をクラスにしてしまう。
(これは、Working-storage sectionで、方法を記述)
そのクラスを、importしておくことで、copy句と同じにする
Working Strage Section
77のように、PICで型を指定している変数の場合には、クラス内に、変数を定義する
01,03。。。など、レコード構造になっているものは、innerクラスとして定義する。
(copy句でimportした場合は、別にクラスを用意する)
ちなみに、こんなかんじ
COBOL側
01 HEADER1 CHARACTER TYPE IS N-TYPE.
03 FILLER PIC X(19) VALUE SPACE.
03 H-01 PIC N(1).
JAVA側
public class HEADER1
{
String fil1 = "";
String h-01;
}
・PROCEDURE DIVISION
もし、パターンを使っている場合は、そのパターンを別クラスで用意しておき
このクラスを定義するところでextendsする
でパターンを用意してなかったときや、最上位のパターンで、初めの行から
Stop RUNまでを1つのメソッドとして書くが、そのメソッドに関して、
public static void mainに書く方法と、
1つの特定のクラス(たとえばexecute)とかに書く方法がある
これについては(あ)で説明する(後述)
その中で呼ばれる perform ラベル1 THRU ラベル2 で定義される
ラベル1からラベル2までを1つのメソッドとおく。
GO TO 文で飛ばしている場合、エラーで抜けているならJavaの場合、exception
としてthrowしてしまう。っていうので、いけるかも??
■■(あ)2つの実装の方法とFILE-CONTROLのASSIGN
ここで、実装方法は2つある
(A)PROCEDURE DIVISIONのstop runまでを、public static void mainに記述してしまう場合
このときは、JCLの部分を、バッチ(Linuxだとシェル)にして、javacで起動するようにかく。この場合、JCLで、ファイル名を指定し、ASSIGNでプログラムに渡す部分は、
・起動するプログラムの引数として渡し、ファイル名を入れとくところを
変数でとっておき、そこに、設定する
・JCLで、javaプログラム起動前に、プロパティファイルを(自動でも、手作業でもOK)
作成しておき、プログラムはプロパティファイルを読み込み、ファイル名を入れとく
変数に設定する
(B)PROCEDURE DIVISIONのstop runまでを、特定のメソッドにいれる
JCLはJavaのクラスとして作成する。
JCL部分をpublic static void mainのなかに記述する。
このとき、JCLでは、newしたあとに、その特定のメソッドを呼び出すことになるが、
その間に、クラスに対し、ファイル名の変数に、JCLで指定したファイルパスを
いれてもいい。
(B)の方法だと、JCLのないプログラムは動かせない。そう考えると(A)のほうが無難?
次回、オンライン編につづく