COBOL×AIハッカソン 2024 Day2

Geminiを活用したCOBOLプログラム開発
チーム：CO-Geminiチャレンジャーズ

1

目次

2

１．COBOLプログラム開発で生成AIに期待すること3２．チャレンジ内容

4

出典：政府統計の総合窓口(e-Stat)（https://www.e-stat.go.jp/）

２．チャレンジ内容

工程

Gemini活用シーン

ゴール

プログラム
コーディング①要件を提示し、プログラムを生成する

コンパイルが通るプログラムを作成する②プログラムの改善点の指摘・改修をする指摘に従ってプログラムを改修する③作成したプログラムの説明・プログラムへのコメント追加

プログラムの理解ができる説明を生成し、プログラム中にコメントを追加する④C０・C1カバレージを満たすテストケー
スの生成

生成したテストケースを実行し、C0・C1カバレージが100%となる

プログラム
単体テスト

5

３．Gemini活用シーン①
要件を提示しプログラムを生成する


要件を追加・詳細化しながら繰り返しGeminiに問い合わせることで目的のプログラムを生成■プロンプト①■プロンプト②（要件詳細化）

添付の2つの入力ファイルから、年ごと、都道府県別の小学校、中学校、高等学校、大学・大学院の平均生徒数を算出し、ファイルに出力するCOBOLプログラムを作成して下さい。

添付の2つの入力ファイルから、年ごと、都道府県別の小学校、中学校、高等学校、大学・大学院の平均生徒数を算出し、ファイルに出力するCOBOLプログラムを作成して下さい。

ロジック誤り・コンパイルエラーに対して、チャットでの会話で指摘し修正を繰り返し実施⇒最終的なプログラム生成には下記を実施
・詳細な要件をまとめてプロンプトとする
・Gemini回答を組み合わせてコーディング
・人手でのコンパイルエラーの解消

6仕様を下記に示します。
・年と地域コードをキーに小学校、中学校、高等学校、大学・大学院の平均生徒数を算出する
・school_all.csvを1行を読み込み、student_all.csvからキーが一致する行を探して平均生徒数を計算する。
・ファイルの終端を判定するフラグはファイルごとに用意して管理してください。
・入力ファイルの1行目はヘッダ行として各カラム名が記述されているため読み飛ばす・学校数・生徒数は整数8桁とする・平均生徒数は整数5桁＋小数2桁とする
・出力ファイルにはカラム名のヘッダを出力する
・・・
・各ファイルの仕様は後述の通り■ファイル仕様
入力ファイル①：学校数 ファイル名：school_all.csv 形式：CSV
カラム：時点（年）,地域コード,地域,小学校数【校】,中学校数【校】,高等学校数【校】,大学・大学院数【校】,注記
入力ファイル②：生徒数 ファイル名：student_all.csv 形式：CSV
・・・
出力ファイル：平均生徒数 ファイル名：average_student.csv 形式：CSV・・・

３．Gemini活用シーン①
要件を提示しプログラムを生成する■プロンプト
下記のコンパイルエラーを対策してください。
"PERFORM"文に対応する"END-PERFORM"がありません。
"END-PERFORM"に対応する"PERFORM"文がありません。

■Gemini回答
PERFORM 文の終わりにEND-PERFORM を追加し関連付けました。

■プロンプトファイル終端判定フラグ管理が２つのファイルで重複しているため、修正してください。

7■Gemini回答
・・・。これは、2 つのファイルの処理を同期させるために、片方のファイルの EOF で両方の処理を終了させる意図があると考えられますが、より明確な方法があります。
修正案
ファイル終端判定フラグを別々に管理し、SCHOOL-FILE と STUDENT-FILE それぞれに対応する EOF フラグを作成します。

・・・
READ SCHOOL-FILE
AT END MOVE ‘Y’
TO WS-END-OF-FILE.
・・・
READ STUDENT-FILE
AT END MOVE ‘Y’
TO WS-END-OF-FILE.
・・・
元処理の意図を推測
修正の妥当性判断の助けになる４．Gemini活用シーン②
プログラムの改善点を指摘・改修する■プロンプト■Gemini回答--------＜プログラムの仕様説明＞--------上記プログラムで想定されるエラーケースを教えて下さい。

1. ファイル関連
・・・
2. データ関連
・・・•キー一致エラー: school_all.csv に存在するキー（年と地域コード）
が student_all.csv に存在しない場合、平均生徒数を計算することができません。
•ゼロ除算エラー: 学校数が0の場合、平均生徒数を計算する際にゼロ除算が発生し、プログラムが異常終了する可能性があります。
3. ロジック関連
・・・
4. その他
・・・
エラー対応策•キー一致エラー: どちらかのファイルにキーが存在しない場合は、エラー処理を追加してプログラムを終了するか、または適切なメッセージを出力する必要があります。
•ゼロ除算エラー: 学校数が0の場合、平均生徒数を計算せず、エラーメッセージを出力する必要があります。
・・・

下記の2つのエラーケースについて、エラー対応策に従ってソースを修正して下さい。
・キー一致エラー
・ゼロ除算エラー8

５．Gemini活用シーン③作成したプログラムの説明・プログラムへのコメント追加


下記プロンプトでプログラムの説明およびコメント追加をしてみた■プロンプト
添付のcobolプログラムを解説してください。
このプログラムの入力ファイルとして例えば添付CSVファイルを使用します。 これを踏まえて、プログラムの処理内容を詳しく説明してください。
詳しい説明をプログラム中にコメントとして記載してください。
プログラムの用途や動作例の解説もあり、理解の助けになった■Gemini回答プログラムの用途
このプログラムは、学校と生徒に関するデータから、地域別の平均生徒数を計算し、CSVファイルに出力するプログラムです。このプログラム
は、教育機関のデータ分析や、地域別の生徒数の推移を把握する際に役立ちます。

9プログラムの動作例
学校ファイル "school_all.csv" に以下のデータが含まれているとします。
・・・ ・・・
このプログラムを実行すると、"average_student.csv" に以下のデータが出力されます。
・・・■Geminiがコメント付与したプログラム

６．Gemini活用シーン④
C０・C1カバレージを満たすテストケースの生成

下記プロンプトでテストケースおよびテストデータ・実行結果を提示させてみた■プロンプト■Gemini回答

このプログラムのC0カバレージおよびC1カバレージが100%となるテストケースとその入力データを作成してください。
各テストケースの実行結果も提示してください。

ケース1: 正常系 - 1件の学校と生徒データが存在する場合
school_all.csv
時点（年）,地域コード,地域,小学校数【校】,・・・
2023,00001,東京,100,50,30,20,東京都
2023,00002,大阪,80,40,25,15,大阪府
student_all.csv
・・・
ケース2: 正常系 - 複数の学校と生徒データが存在する場合
ケース3: 正常系 - 年と地域コードが一致するデータがない場合
ケース4: 正常系 - 学校数または生徒数が0の場合
ケース5: 異常系 – school_all.csvにデータが存在しない場合
ケース6: 異常系 – student_all.csvにデータが存在しない場合
ケース7: 異常系 – school_all.csvのデータが不正なフォーマットの場合
ケース8: 異常系 - student_all.csvのデータが不正なフォーマットの場合

Geminiが生成したテストデータ・出力
結果の誤りもあった⇒テストケースとテストデータの内容があっているかは人手でも確認が必要

10

６．Gemini活用シーン④C０・C1カバレージを満たすテストケースの生成■日立COBOL(COBOL2002)のカバレージ機能(※)と連携したC0・C1カバレージの網羅 カバレージ機能で出力したプログラム各行のC0・C1カバレージ網羅状況の情報を与えることでGeminiが未実行の行を抽出し必要なテストケースを提示してくれる■プロンプトcsv出力

日立COBOL カバレージ機能<ソースカバレージ情報ファイル>■Gemini回答■C0, C1カバレッジ未実行・未通過行
下記の行がC0, C1カバレッジで未実行・未通過となっています。
行番号

ソーステキスト

C0

C1

104

AT END MOVE "Y" TO WS-EOF-FLAG-SCHOOL.

.

.

107

AT END MOVE "Y" TO WS-EOF-FLAG-STUDENT.

.

.

■テストケースと入力ファイル
テストケース5: school_all.csvファイル終端処理
目的: school_all.csvファイルの終端処理で、AT END句が実行されることを確認します。
テストケース6: student_all.csvファイル終端処理
目的: student_all.csvファイルの終端処理で、AT END句が実行されることを確認します。

11

添付のソースカバレージ情報ファイルは、C0カバレージ、C1カバレージの網羅状況を示しています。
＜ソースカバレージ情報ファイルの仕様説明＞
C0カバレージ、C1カバレージが未実行・未通過の行を示してください。

※カバレージ機能
プログラム実行をトレースしてテスト実施後のC0カバレージ，C1カバレージ，未実行文情報などのカバレージ情報を表示できる機能（csv形式またはテキスト形式）

７．Gemini活用の所感

12