生成AIによるCOBOLプログラム説明の試行

高木 渉(株式会社 日立製作所)

ChatGPT 3.5にCOBOLのプログラムを説明させてみました。対象のプログラムは掲載していませんが、平成16年春 基本情報技術者試験 午後 問11にあったソースプログラムを利用しています。残念ながら執筆時点で、この年の過去問題は、試験の主催元の独立行政法人情報処理推進機構のWebサイトに掲載されていません。

ChatGPTに対するプロンプトの工夫はせず、単に、概要を説明してください、という指示にとどめています。また、示した応答内容は、それぞれ何度か試した応答の一つです。

(1) 最初は、試験問題のプログラムを、正答を埋めた上で、そのまま与えました。分かりやすく説明されました。

(2) 次に、(1)のプログラムの変数名などの名前を、わざと分かりにくい通し番号の記号列に置き換えて、同じように説明してもらいました。概要がつかみやすい説明にはなっていません。

(3) 最後に、分かりにくくした(2)のプログラムと共に、各変数名の意味情報を与えて、説明を求めました。それなりに分かりやすくなっています。

一連の試行から、意味のある変数名を使っているプログラムであれば、ChatGPTは、変数名の情報も使って処理内容を分かり易く説明してくれます。変数名が内容を表さないようなプログラムの場合でも、各変数名と変数の内容とを対応させた情報を、追加でChatGPTに与えることで、処理説明の分かり易さが改善する可能性があります。

1. 元のプログラムをそのまま説明させる
ChatGPTへの指示
次のCOBOLプログラムの処理の概要を説明してください。
     :
【ソースプログラムは省略】
     :

ChatGPTの応答

このCOBOLプログラムは、3つのファイル(NIPPO-FILE、SAGYO-FILE、CHOKA-FILE)を処理するためのものです。プログラムの処理内容を以下に説明します。

1. DATA DIVISIONセクションでは、各ファイルのレコード形式を定義しています。

  • NIPPO-FILEファイルには、従業員の勤怠情報が含まれています。
  • SAGYO-FILEファイルには、従業員の作業情報が含まれています。
  • CHOKA-FILEファイルには、従業員の勤務時間の集計結果が含まれます。

2. WORKING-STORAGE SECTIONセクションでは、プログラムの実行中に使用される変数を定義しています。

3. PROCEDURE DIVISIONセクションでは、メインの処理ロジックが記述されています。

  • MAIN-RTNルーチンでは、ファイルをオープンし、READ-RTNルーチンを呼び出して最初のレコードを読み込みます。
  • UNTIL EOF = “E”のループ内で、従業員ごとに作業情報を集計し、WRITE-RTNルーチンを呼び出して結果をファイルに書き込みます。
  • ループの最後で、ファイルをクローズしてプログラムを終了します。

4. READ-RTNルーチンでは、NIPPO-FILEからレコードを読み込みます。ファイルの終端に達した場合は、“E”EOF変数に設定します。

5. WRITE-RTNルーチンでは、集計結果をSAGYO-FILECHOKA-FILEに書き込みます。従業員ごとに作業情報をSAGYO-RECに書き込んでから、勤務時間の集計結果をCHOKA-RECに書き込みます。

これらの処理により、従業員ごとの作業情報を集計し、勤務時間の集計結果を出力するCOBOLプログラムが実現されます。

2. 変数名などを通し番号に置き換えたプログラムを説明させる

上の1. で与えたプログラムに対して、ファイル名・データ名、及び手続名をA001~A029 に置換したプログラムを作成しました。 一旦、Chatをリセットしたあと、ChatGPTに置換後のプログラムの内容説明を依頼してみました。

ChatGPTへの指示
次のCOBOLプログラムの処理の概要を説明してください。
     :
【ソースプログラムは省略】
     :

ChatGPTの応答

1. DATA DIVISIONでは、ファイルの構造を定義しています。各ファイルには、レコードのフィールドが定義されています。

2. WORKING-STORAGE SECTIONでは、一時的な変数が定義されています。

3. PROCEDURE DIVISIONには、プログラムのメインの処理ロジックが記述されています。

4. A027というパラグラフで、ファイルをオープンし、A028の処理を実行します。

5. A028は、ファイルA001からレコードを読み取ります。ファイルの終わりに達すると、A017に”E”を移動します。

6. A027パラグラフから抜け出した後、A017が”E”になっている間、ループを実行します。

7. ループ内で、一連の処理が行われます。まず、A022を0にクリアし、A014とA023を初期化します。A003の値をA018に移動し、A017が”E”でもなく、A003がA018と一致する場合に処理を継続します。

8. ネストしたループ内で、A021を0にクリアし、A019とA020にA004とA005の値を移動します。A017が”E”でもなく、A003がA018と一致し、A004がA019と一致する場合に処理を継続します。

9. さらにネストしたループでは、A021にA021 + A007を計算します。A024を1から順に増加させながら、A024がA022より大きくなるか、A025(A024)がA006と一致するまで繰り返し処理を行います。

10. もしA024がA022より大きければ、A025(A024)にA006の値を移動し、A022にA024を設定します。

11. A026(A024)にA026(A024) + A007を計算します。

12. A028を呼び出します。

13. ネストしたループの終了後、A020が0であれば、A016にA016 + A021 – 8を計算し、そうでなければA016にA016 + A021を計算します。

14. A029を呼び出します。

15. A029では、A015とA010にA018の値を移動し、A024を1から順に増加させながら繰り返し処理を行います。

16. ループ内でA025(A024)の値をA011に移動し、A026(A024)の値をA012に移動します。そして、A009に書き込みます。

17. A014に書き込みます。

18. ループが終了したら、A001、A013、A008のファイルをクローズし、プログラムを終了します。

このプログラムは、複数のファイルを読み書きしながら、特定のフィールドの値を変更していく処理を行っています。具体的なビジネスロジックや目的はわかりませんが、上記の概要を参考にしてください。

3. 変数名などが通し番号になっているプログラムを、変数名の意味情報も与えて説明させる

上の2.で使ったプログラムについて、ChatGPTに、変数名と意味との対応情報も与えてからプログラムを説明してもらいました。

ChatGPTへの指示
この後に示すプログラムで、変数名や手続名の意味は次のとおりです。A001: 作業日報ファイル
A002: 作業日報レコード
A003: 作業日報レコードの社員コード
A004: 作業日報レコードの作業日
A005: 作業日報レコードの作業日種別
A006: 作業日報レコードの業務コード
A007: 作業日報レコードの作業時間
A008: 作業時間月計ファイル
A009: 作業時間月計レコード
A010: 作業時間月計レコードの社員コード
A011: 作業時間月計レコードの業務コード
A012: 作業時間月計レコードの作業時間
A013: 超過時間月計ファイル
A014: 超過時間月計レコード
A015: 超過時間月計レコードの社員コード
A016: 超過時間月計レコードの超過時間
A017: ファイル終端フラグ
A018: 社員コード
A019: 作業日
A020: 作業日種別
A021: 作業時間合計
A022: 業務数
A023: 業務
A024: カウンタ
A025: 業務コード
A026: 作業時間
A027: 主手続
A028: 読込手続
A029: 書出手続
以上の情報を踏まえて、次のCOBOLプログラムの処理内容を説明してください。
     :
【ソースプログラムは省略】
     :

ChatGPTの応答

このCOBOLプログラムは、作業日報データを処理し、作業時間月計と超過時間月計を作成するためのものです。以下ではプログラムの処理内容を概要的に説明します。

1. ファイルの定義

  • 作業日報ファイル(A001)と作業時間月計ファイル(A008)、超過時間月計ファイル(A013)のFDセクションが定義されています。
  • 各ファイルにはレコード構造が定義されており、A002レコード(作業日報レコード)とA009レコード(作業時間月計レコード)、A014レコード(超過時間月計レコード)が含まれています。

2. ワーキングストレージセクションの定義

  • ワーキングストレージセクションには、処理中に使用する変数が定義されています。例えば、ファイル終端フラグ(A017)、社員コード(A018)、作業日(A019)、作業日種別(A020)、作業時間合計(A021)、業務数(A022)などが含まれています。
  • A023は業務とその作業時間情報を保持するためのグループデータです。A025は業務コード、A026は作業時間を表します。

3. 処理部(PROCEDURE DIVISION)

  • A027手続は主手続として定義されています。この手続では、ファイルのオープン、処理のメインループ、ファイルのクローズが行われます。
  • オープン文でA001(作業日報ファイル)を入力ファイルとしてオープンし、A013(超過時間月計ファイル)とA008(作業時間月計ファイル)を出力ファイルとしてオープンします。
  • A028手続では、作業日報ファイルからA001レコードを1件読み込みます。ファイル終端に達するとA017を”E”に設定します。
  • メインループでは、A017が”E”でない限り処理を行います。
  • メインループの内部では、作業日報レコードの情報を使用して作業時間月計レコード(A009)と超過時間月計レコード(A014)を更新します。
  • ファイル終端に達した場合またはA003がA018と一致しなくなった場合、この内部ループを抜けます。
  • 内部ループでは、作業日報レコードの作業時間を業務ごとに集計しています。また、業務コードの一致を確認し、作業時間を集計します。
  • A020が0の場合、業務の作業時間に8を差し引いた値を超過時間月計として処理します。
  • メインループの最後では、作業時間月計レコード(A009)と超過時間月計レコード(A014)を書き込みます。
  • メインループの終了後、A029手続では超過時間月計レコード(A014)を書き込みます。
  • 最後に、ファイルをクローズしてプログラムを終了します。

このプログラムは、作業日報から作業時間と超過時間を集計し、月ごとの統計情報を作成する処理を行っています。

関連記事