ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

COBOLプログラムをいきなりJAVAへ書き換える方法 試案

2005-03-28 12:25:00 | JavaとWeb
 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)のほうが無難?




次回、オンライン編につづく

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする