ピンボール戦車少女

LAC WATCH

セキュリティとITの最新情(qing)報(bao)

RSS

株式会社ラック
ラックピープル | 

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

シェアボタンを表示

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

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

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

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

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

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

設(she)計書の項目(mu)は以(yi)下の5つです。

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

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

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

試行錯誤を繰り返す

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

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

指示文のポイント

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

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

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

考え方を変換

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

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

ChatGPTとの会話

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

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

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

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

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

ちょっとひと工夫

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

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

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

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

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

最後に

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

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

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

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

生成した設計書

生成した設計書

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

はい いいえ