LAC WATCH

セキュリティとITの最新情報

RSS

株式会社ラック

メールマガジン

サイバーセキュリティや
ラックに関する情報をお届けします。

ラックピープル | 

ChatGPTを使って、COBOLのリバースエンジニアリングをやってみた!

ChatGPTが世間で話題になったころ、私も興味があったのでどんなものか少し触ってみたことがあります。しかし、GoogleやYahoo!でもできるような検索や翻訳などに使うくらいで、生成AIならではの使い方が思いつきませんでした。

そんなとき、約60年前に事務処理用として開発されたプログラミング言語「COBOL」のプログラムを読ませて、リバースエンジニアリングみたいなことができないかという話がありました。

最近は、COBOLのプログラマーが高齢化から引退し、減少傾向が進んでいますが、COBOLで開発されたシステムはまだ存在しています。そうした中で、COBOLを知らない人でもChatGPTを使えば、COBOLプログラムの内容を理解するための助けになるのではと考えました。

本記事では、ChatGPTを用いて、COBOLのリバースエンジニアリングをやってみて分かった指示のポイントや、結果を紹介します。

リバースエンジニアリング開始

まずCOBOLのサンプルプログラムを作ってChatGPTに読ませたところ、プログラムの概要を適切に説明してくれました。これはいけると思い、「COBOLを知らない人でもプログラムが理解できる設計書」というよりは、説明書のようなものを目指して作成しました。

設計書の項目は以下の5つです。

  • プログラムID
  • プログラム概要
  • 入出力情報
  • 処理内容
  • セクション構造図

また、プログラムソースはテキストをChatGPTに貼り付け、生成した設計書はテキストファイルに出力するようにしました。

なお今回は、ChatGPT-4を使用し、サンプルプログラムは200ステップ程度でSECTIONにより構造化されたプログラムを使用しています。

試行錯誤を繰り返す

サクッとできるかと思いきやイメージ通りのものができあがらず、ChatGPTへ指示を与えるプロンプトを何度も修正してはやり直す作業を繰り返しました。

一番苦労したのは、指示通りにならないということです。指示文の意図が正しく伝わらず想定通りのものができない、次に同じ指示をした際に同じものができない、一度はできていたことが次にはできなくなる、という事象が発生しました。

指示文のポイント

何度もやり直しを繰り返しているうちに、上手く指示をするポイントが見えてきました。ポイントは以下の通りです。

  • 日本語を正しく
  • 短文で簡潔
  • 箇条書き
  • 例を示す
  • 役割を与える

これらのポイントは、プロンプトの書き方やプロンプトエンジニアリングを検索すると、よく語られていることと同じだと思います。言葉にすると当たり前に見えるポイントばかりです。しかし、実際に試行錯誤を繰り返し、ようやく納得できる指示をChatGPTに与えられた後に、改めてこれらの言葉を見ると「なるほど」と感じる部分が多々ありました。

考え方を変換

もうひとつポイントとしてあげるのは、「一度に多くの指示をしない」ということです。

設計書を作るにあたって当初考えていたのは、最初に全ての指示とCOBOLソースを与えておけば、設計書ができあがるという、バッチ処理のようなことです。ところが、ChatGPTは途中で確認を依頼してきたり、反応が無くなったり、エラーになったりと最後まで手を掛けずにできあがるということはありませんでした。

ChatGPTとの会話

そこで当初の考え方を変え、少しずつ指示をして会話しながら作成するようにしました。

一度に与えていた指示を設計書の項目ごとに5回に分けて、各項目に指示して生成される結果を確認しました。そして、間違いなどがあれば指摘して修正させて、問題が無ければ次の指示に進み、最後に指示したフォーマットに合わせて設計書を編集させて、テキストファイルに出力するようにしました。

その結果、無反応やエラーになることも随分減り、間違いの指摘やエラー時のやり直しも全部できあがってからするより、項目ごとにする方が楽になりました。

また、ポイントとは違うかもしれませんが、完璧を求めないというのも重要だと思います。同じプログラムソースで同じ指示をしても、生成される文章の言い回しなどが毎回違いますし、指示を無視することや間違った生成をすることもあります。それを全てカバーするような指示をするのは非現実的であり、そこに労力を注ぐのも非効率です。そのため、会話でカバーする方が現実的であり、効率も良いと判断しました。

設計書を作成するにあたって、完璧なものは求めずに生成された不完全なものを人が確認して修正させる、というように割り切る必要があると感じました。

ちょっとひと工夫

指示は、毎回同じ内容です。それを都度ChatGPTに手入力するのも大変ですし、コピペするのも時間がかかるので指示の仕方を楽にする方法を考えました。項目ごとに分割した指示を、以下のように7個のテキストファイルにしました。

指示_親が、指示_子を制御するようなことをイメージしています。

  • 指示_親.txt
  • 指示_子_1.txt ~指示_子_6.txt
ChatGPTに指示する手順

指示_親には指示_子を、1から6までひとつずつ順番に読み込み、指示に従って出力結果を表示した後に確認を依頼して確認結果がOKなら、次の指示_子を読み込むように指示しています。指示_子_1から指示_子_5は、設計書の5項目の1項目ずつに対応させています。指示_子_6は、設計書をテキストファイルに出力するように指示をしています。

最初に、これらのテキストファイルとプログラムソースのテキストファイルを一緒にChatGPTに貼り付けて、「指示_親.txtを読んで」と依頼すれば、まず指示_親を読み、次に指示_子_1から順番に読み込んで結果を表示しては確認を依頼する、ということを繰り返します。こちらが確認OKを回答すれば次に進み、最後にテキストファイルに出力されるようになりました。これで指示をするのが随分と楽になりました。

最後に

ChatGPTだけだとCOBOLソースから設計書を生成させるには会話が必要で、生成された内容を確認するのには、ある程度COBOLのスキルのある人が必要ということも分かりました。ChatGPTのAPIおよびプラグインを活用すれば、もっと楽により良いものができる可能性があると思います。

しかし、結局のところ人が介在して生成した結果を確認する必要があり、人無しで最後まで自動で生成させるにはまだまだだと感じました。ChatGPTに全てを任せるというよりは、アシスタントのように使うという方がしっくり来ると思います。

ChatGPTは様々な分野で活用されつつありますが、いわゆるプロンプトエンジニアリングと呼ばれている、指示の仕方の工夫次第でより楽に、より便利にできる可能性があると感じました。

また、ChatGPTは日々進化しており、最近では画像読み込みや画像生成ができるようになりました。プラグインを使わなくても、フローチャートを読ませてプログラムを生成させるなんてこともできそうです。今回は、大規模なプログラムや構造化されていないプログラムについては確認できていないので、今後はそれらについても確認をしたいと思っています。

生成した設計書

生成した設計書

この記事は役に立ちましたか?

はい いいえ