お問い合わせ

ホーム > COBOLのはなし > 生成AIによるCOBOLプログラム説明の試行

生成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の応答

このCOBOLプログラムは、3つのファイル(A001、A008、A013)を処理するプログラムです。プログラムの全体の概要は次の通りです:

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. ファイルの定義

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

3. 処理部(PROCEDURE DIVISION)

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