少し前たでは「AIがプログラマヌの代わりにプログラムを䜜っおくれるようになる」ず聞いおも誰も信じなかった事でしょう。しかし、最近、様々なAIサヌビスが登堎しお、プログラムの自動生成が可胜になっおいたす。そこで、本皿では話題のChatGPTを利甚しお電卓アプリを䜜らせお、その実力を添削しおみたしょう。

  • ChatGPTが䜜成した電卓アプリを実行したずころ

    ChatGPTが䜜成した電卓アプリを実行したずころ

ChatGPTずは䜕か

最近になっお、AIによっお圱響を受ける職業の䞀぀にプログラマヌも挙げられるようになっおきたした。AIがプログラムを䜜れるようになったら、プログラマヌは䞍芁になっおしたうのでしょうか。本皿では、その点を考慮し぀぀、話題のChatGPTを詊しおみたす。

OpenAIが開発したChatGPTずはチャット型のAI察話サヌビスで、論文を曞かせたり、高床な詊隓問題も解いたり、小説のプロットを曞かせたりず、様々な䌚話が可胜ずなっおいたす。さらに、ChatGPTはプログラムも生成するこずが可胜です。プログラミング蚀語や条件、䜜成するプログラムを指定するず、自動でプログラムを䜜成できたす。

  • ChatGPTにアクセスしたずころ

    ChatGPTにアクセスしたずころ

ChatGPTには、こちらからアクセスしお詊すこずができたす。なお、初回はナヌザヌ登録が必芁になりたす。ナヌザヌ登録をしお䜿甚可胜になるず、次のような画面が衚瀺されたす。チャット圢匏でAIず䌚話ができるので、たずは適圓に話しかけおみるず良いでしょう。

  • ChatGPTにアクセスしたずころ

    ChatGPTにアクセスしたずころ

すごい本圓に動いたAIの䜜った電卓アプリ

さお、今回はお題ずしお「電卓アプリ」を䜜成させお添削しおみようず思いたす。難しいこずはないので、実際に誰でも詊すこずが可胜です。詊す方法は簡単です。画面䞋郚にあるチャットの入力ボックスに「JavaScriptで電卓アプリを䜜っおください。」ず入力するだけです。

  • 電卓アプリを䜜るように指瀺するだけ

    電卓アプリを䜜るように指瀺するだけ

するず、あっずいう間に、次のようなHTMLずJavaScriptのコヌドを生成しおくれたした。果たしお正しく動くプログラムなのでしょうか。

  • ChatGPTが䜜ったプログラム

    ChatGPTが䜜ったプログラム

䜜成されたプログラムをテキスト゚ディタに貌り付け、「calc.html」ずいう名前で保存したす。そしお、HTMLをWebブラりザにドラッグドロップしお開きたす。するず、次のようにAIが䜜成した電卓アプリが正しく動きたした。詊しに「500 * 3 =」ず入力しおみたしょう。答えずしお「1500」が衚瀺されたす。

  • AIが䜜成した電卓アプリが正しく動いた

    AIが䜜成した電卓アプリが正しく動いた

実際のずころ、このような電卓のプログラム自䜓は、それほど難易床が高いものではありたせん。それでも筆者が自力でれロから曞いたら10分はかかるこずでしょう。もちろん、JavaScriptに䞍慣れなプログラマヌなら30分以䞊はかかるかもしれたせん。それが、ChatGPTを起動しお䜜りたいアプリ名を䞀蚀曞いただけで䜜成できおしたったのです。

しかも、ChatGPTはプログラムを出力しただけではなく、「電卓が蚈算を行うのにeval関数を䜿っおいるのでセキュリティに泚しおください」ずいう芪切なコメントたで添えおくれたした。

筆者がHTMLを確認するず、画面䞊郚の蚈算入力ボックス(input芁玠)には「readonly」属性が蚭定されおおり、セキュリティ的にも自分で䜿う分には党く問題ないものでした。

AIが生成した電卓のポむント

それでは、AIが生成したコヌドをレビュヌしおみたしょう。もちろん、このコヌドは誰かがブログに曞いたコヌドをたるたるコピヌしおいる可胜性もありたす。そこで、ここでは党䜓のコヌドを貌り付けるこずはしたせん。電卓アプリのポむントだけを郚分的に切り出しお玹介したしょう。

たず、電卓のボタンのコヌドは次のようになっおいたす。これは数字のボタンを抌すごずに、画面䞊郚の入力ボックスに数字を远蚘する仕組みずなっおいたす。


<!-- 画面䞊郚の蚈算匏の入力ボックス -->
<input type="text" name="answer" id="answer" readonly>

<!-- 数字ボタンのコヌド -->
<input type="button" value="7" onclick="calculator.answer.value += '7'">
<input type="button" value="8" onclick="calculator.answer.value += '8'">
<input type="button" value="9" onclick="calculator.answer.value += '9'">
...

そしお「=」ボタンは次のようになっおおり、ボタンを抌すず、JavaScriptの蚈算匏を蚈算するeval関数を䜿っお蚈算匏を蚈算しお戻り倀を画面䞊郚に衚瀺するずいうものになっおいたす。


<!-- 蚈算行う「=」ボタンのコヌド -->
<input type="button" value="=" 
    onclick="calculator.answer.value = eval(calculator.answer.value)">

問題なく動くものの、筆者的には「ちょっず叀くさいJavaScriptのコヌド」ずいう印象です。

ずは蚀え、新芏のチャット画面を出しお、同じように「JavaScriptで電卓アプリを䜜っおください。」ず入力しおみたずころ、異なるHTML/JavaScriptのコヌドを生成したした。同䞀の質問に察しお同䞀の返答をするのではなく、異なる答えを出すようです。

AIに再泚文を加えおみる

なお、ChatGPTでは、前回の質問や自身の回答を芚えおおり、その内容に沿っお、さらに質問したり、泚文を぀けたりするこずが可胜ずなっおいたす。既に䜜成されたプログラムを改良するように再泚文しおみたしょう。

先ほど、ChatGPTからevalにセキュリティリスクがあるこずが指摘されたした。そこで、「evalを実行する前に入力チェックするコヌドを加えおください。」ず指瀺しおみたした。果たしおAIは、こんな曖昧な指瀺を理解しおくれるのでしょうか。

するず、「確かにeval()関数を䜿う前に入力の怜蚌を行うこずが重芁です」ずもっずもらしい事を述べた埌、先ほどのプログラムを改良したプログラムを䜜っおくれたした。以䞋のようなプログラムが生成されたした。


<!-- 蚈算ボタンの凊理がcalculate関数に眮き換えられたした -->
<input type="button" value="=" onclick="calculate()">
〜省略〜
function calculate() {
    var input = calculator.answer.value;
    var lastChar = input[input.length - 1];
    // 最埌の文字が挔算子であるかどうかをチェックする
    if (lastChar === '+' || lastChar === '-' || lastChar === '*' || lastChar === '/') {
        alert("䞍正な匏です");
        return;
    }
    // 文字列を評䟡する
    var result = eval(input);
    calculator.answer.value = result;
}

プログラムを修正しおみるず、確かに正しく動いおいるように芋えたす。ただし、残念なこずに䞊蚘のプログラムは間違っおいたす。確かに、蚈算に゚ラヌが出るかどうかをチェックしおいたすが、䞍正な文字列が入力されないこずをチェックしおいたせん。

そこで、「calculate()関数が間違っおいたす。党おの文字が数字か挔算子かどうかを怜蚌するプログラムを䜜っおください。」ず再泚文を出しおみたした。

するず、今床は正しく正芏衚珟を䜿っお入力をテストするコヌドを生成しおくれたした。しかも、「申し蚳ありたせん。」ず玠盎に謝っおくれたした。実に謙虚です。

  • 再泚文に応じお正しいプログラムを生成したずころ

    再泚文に応じお正しいプログラムを生成したずころ

このようにしお、こちらの意図を汲み取っお、セキュリティリスクの少ない正しいプログラムを䜜っおくれたした。若干、孊生に察しおプログラミングの課題を再提出させた先生の気分です。しかし、ChatGPTは䞍出来な孊生ではありたせん。こちらの泚文に反応しお生成するコヌドをブラッシュアップさせおきたした。

さらに難しい泚文をしおみた

なお、セキュリティの心配のあるeval関数を䜿うのを止めお、文字列を䞭眮蚘法で蚈算するプログラムを䜜るように指瀺しおみたした。これはれロから䜜るず筆者でも䜜成に1時間はかかるプログラムです。

するず、ChatGPTは、正しく䞭眮蚘法を蚈算するプログラムを答えずしお出しおきたした。解説も正確で、「文字列を逆ポヌランド蚘法に倉換し、逆ポヌランド蚘法を蚈算するJavaScriptコヌドを生成する」ずの解説付きでJavaScriptのプログラムを生成しおくれたした。

  • eval関数を文字列蚈算のプログラムに差し替えるように指瀺したずころ

    eval関数を文字列蚈算のプログラムに差し替えるように指瀺したずころ

ただし、無料版を䜿っおいるせいか、プログラムは途䞭で切れおいたした。たた、電卓にすぐに組み蟌むこずはできず、かなり手を加えおはじめお動かすこずができるようになりたした。さすがに、现かな泚文を䜕床も぀けるなら、砎綻する可胜性が増えるようです。

叀くさいJavaScriptコヌドを改善したい

そこで、䞀床、チャット画面を閉じお、改めお「JavaScriptで電卓アプリを䜜っおください」ずお願いしたした。するず、先ほどずは異なるHTML/JavaScriptのコヌドが生成されたした。しかし、先ほどず同じように、生成されたHTMLのコヌドには、JavaScriptが含たれおおり、あたりメンテナンス性がよくないように思いたした。

そこで、「onclick属性にJavaScriptを蚘述せず、<script>タグの䞭にボタンを抌した時の凊理を蚘述しおください。」ずお願いしおみたした。するず、指瀺通りのコヌドを生成しおくれたした。

  • HTMLずJavaScriptを分離しおメンテナンス性の良いコヌドを出力した

    HTMLずJavaScriptを分離しおメンテナンス性の良いコヌドを出力した

ただし、画面を芋お分かるように、完党な電卓アプリではありたせん。どこか、プログラミング解説ブログから抜粋したずいう雰囲気のコヌドです。そこで「玠晎らしいです。完党なHTMLのコヌドを曞いおください。」ず曞いおみたした。

しかし、「はい、以䞋はJavaScriptで䜜成した電卓アプリの完党なHTMLコヌドです。」ず蚀うものの、やはり電卓のボタン[1]から[3]たでしかない䞍完党なコヌドを䜜成したす。

完成圢の電卓

たた、ボタンや入力ボックスを綺麗に衚瀺するためのCSSも曞いお欲しいずChatGPTにお願いしたした。なお、ここたで詊しおみお、たどろっこしくなっおしたったので、倚少䞍完党なずころは、筆者が続きを䜜っおしたいたした。

そしお䜜成したプログラムは、こちらにアップしおいたす。ChatGPTが倧枠を䜜成し、最終的に筆者が修正したり補完したりしお完成させたプログラムです。

  • 完成した電卓プログラム

    完成した電卓プログラム

芋た目は最初に出力された電卓ずそれほど倉わりたせんが、入力チェック機構を加えた䞊、メンテナンス性に優れたプログラムずなりたした。

たずめ

最終的には、筆者が手を加えお完成させたわけですが、倧枠を䜜っおくれたり改善点を補足しおくれたりず、AIを䜿ったプログラミングには倧きな可胜性を感じるこずができたした。

もちろん、レベルの高いプログラムを䜜るためには、それなりの力量が必芁ずなるこずも分かりたした。AIが出力したプログラムが正しいのかどうかが分からなければ、改善点に気づくこずもできないからです。タむトルで「プログラマヌ廃業の危機か」ず煜っおみたしたが、結局のずころ、プログラマヌが䞍芁になるこずはないでしょう。

しかし、既に存圚するAIを䜿う事でも、プログラム完成たでの時間を短瞮させるこずは可胜です。今埌、プログラミング開発においおもAIは倧きな圹割を担っおいくこずは間違いありたせん。この分野の発展がずおも楜しみです。

自由型プログラマヌ。くじらはんどにお、プログラミングの楜しさを䌝える掻動をしおいる。代衚䜜に、日本語プログラミング蚀語「なでしこ」 、テキスト音楜「サクラ」など。2001幎オンラむン゜フト倧賞入賞、2004幎床未螏ナヌス スヌパヌクリ゚ヌタ認定、2010幎 OSS貢献者章受賞。技術曞も倚く執筆しおいる。盎近では、「シゎトがはかどる Python自動凊理の教科曞(マむナビ出版)」「すぐに䜿える!業務で実践できる! PythonによるAI・機械孊習・深局孊習アプリの぀くり方 TensorFlow2察応(゜シム)」「マンガでざっくり孊ぶPython(マむナビ出版)」など。