マイコン研究会の日記

大阪市立大学マイコン研究会のブログです。

Github Copilotの挑戦

はじめに

新4回生の済木です。今回、個人的に使用申請を出していたGithub Copilotがいつの間にか使えるようになっていたので、これだけでどの程度プログラムが書けるのか簡単に試していこうと思います。本当は去年の11月ごろに使用許可が出ていたけど、つい最近まで気づかなかった。

Github Copilot って?

Github CopilotはGithubとOpenAIの提供するシステムで、人間の書いたコメントや関数名等に応じてその続きのプログラムを提案してくれるものです。例えば、「入力された数値が素数かどうか判定する」といったコメントを記述すると、以下のようにその続きに予想されるプログラムが出力されます。(Github Copilotの予想部分は灰色っぽい文字になっている)

f:id:ocumcr:20220407175502p:plain

上図ではboolまで入力していますが、この程度のプログラムであればほとんど人間が頭を使うこと無く記述できるようになっています。

注意として、結局のところGithub Copilotの予想が正しいのかどうかを確認できるのは人間なので、これを使えば誰でもプログラミングができるようになる!といったものではありません。あくまでCopilot(副操縦士)というわけです。

実践

条件

  • 人間は、関数やクラスの内容をコメントとして日本語及び英語で記述できる。
  • 人間は、関数の返り値の型を記述できる。
  • 人間は、関数の引数を記述できる。
  • 人間は、関数やクラスの名前を記述できる。
  • 人間は、状況に応じて(グローバル、ローカル、メンバ)変数を追加することができる。
  • 人間は、状況に応じて(通常の、あるいはメンバ)関数を追加することができる。ただし、その内容を直接書くことはできない。
  • 人間は、状況に応じてクラスを追加することができる。ただし、その内容を直接書くことはできない。
  • 人間は、状況に応じて適切に開き括弧、閉じ括弧を記述できる。
  • 人間は、状況に応じてヘッダファイルをincludeできる。
  • using namespace std; は記述されているものとする。

①2次元のベクトルを扱うクラスを作る

まず、2次元のベクトルを扱うクラスを作成してみます。

コメント、クラス名、波括弧を入力すると以下のように予想が出力されました。

f:id:ocumcr:20220407181017j:plain

f:id:ocumcr:20220407181020j:plain

お気づきの方もいられるかと思いますが、メンバ変数が宣言されていないためこのままだとプログラムは動きません(おっちょこちょいかな?かわいいね)。privateにメンバ変数を追加してあげましょう。

f:id:ocumcr:20220407181447p:plain

????????????????

メンバ関数で利用している変数名はx_, y_なのに、こっちだとアンダーバーの抜けた変数名が提案されています。いきなりやらかしの多いCopilot君ですが、まぁこのくらいであれば人間の手で簡単に修正できるので問題なしとしましょう。

AtCoder Beginner ContestのA問題を解いてみる

次に、AtCoder Beginer Contest(ABC)のA問題を解かせてみます。ABCはAtCoder社の開催する競技プログラミングのコンテストの中でもっとも初心者向けであり、その中でもA問題は(保証はされていませんが)1番簡単な問題という位置付けになっています。

今回は、ABC 246のA問題Four Pointsの問題文をコメントとして入力することで、どの程度正解に近いコードが出力されるのかを検証してみます。

入力はコメント、main関数の名前です。

f:id:ocumcr:20220407191353p:plain

一見きちんとプログラムが書けているように見えますが、おそらく間違った出力をしてしまいます。とりあえず、iostreamを用意していなかったのでincludeしてから提出してみましたが、結果は案の定WAでした。

上の問題では出力の内容こそ間違っていたものの、入出力の形式を指定していないにも関わらずうまく予想できていたことには可能性を感じます。何かもう1つ問題を解かせてみましょう。

次に試してみるのは、ABC 245のA問題Good morningです。前と同様に問題文をコメントとして入力して、それに対する反応を見ます。結果は以下のようになりました。

f:id:ocumcr:20220407192339p:plain

今回も入出力の形式は守られていましたが、提出してみた結果はWAでした。よく見てみると、プログラム中の条件文が若干間違っています。正しくは、b\lt dではなく b \leq dになるはずです。実際、そのように修正してから提出してみるとACが取れました。

今回は2つの問題についてGithub Copilotを用いて解答を作成していましたが、いずれも正解にはなりませんでした。ただ、両方入出力の部分は正しく書けており、2問目に関してはほとんど正解のプログラムを出力することに成功していました。

不正解のプログラムを出力してしまった原因としては、コメントが日本語であったこと、コメントによる説明が不足していたこと、そもそもGithub Copilotの学習がまだ十分でないことが考えられます。

③何かゲームを作ってみる

最後に、Github Copilotを用いて何かしらのゲームを作成してみます。

ひとまず、ライフゲームでも出力させてみましょう。クラス名を定義すると、以下のように予想を吐き出しました。

f:id:ocumcr:20220407194228p:plain

相変わらずメンバ変数を用意してくれないみたいです。とりあえずここで用意されたメンバ関数の定義を続けて予測させます。

f:id:ocumcr:20220407194401p:plain

f:id:ocumcr:20220407194553p:plain

f:id:ocumcr:20220407194500p:plain

f:id:ocumcr:20220407194622p:plain

f:id:ocumcr:20220407194717p:plain

f:id:ocumcr:20220407194743p:plain

f:id:ocumcr:20220407194809p:plain

f:id:ocumcr:20220407194842p:plain

f:id:ocumcr:20220407194858p:plain

f:id:ocumcr:20220407194928p:plain

ひとまず、メンバ関数とメイン関数については以上です。

ところで、private領域にメンバ変数を用意しようとすると以下のように地獄みたいなことになってしまいました。

f:id:ocumcr:20220407195309p:plain

仕方がないので変数は手入力しました。このくらいであれば人間が頭を使っているとは言えないので大丈夫でしょう。

f:id:ocumcr:20220407200522p:plain

さて、最後にコンパイルして実行してみます。コンパイラはg++(GCC)のversion10.2.0です。

適当に入力を入れた結果、以下のようになりました。

f:id:ocumcr:20220407200940p:plain

見辛い!!!!!

まったく改行やステップ数が書かれていないため、どこが区切りなのかわかりません。さすがにわかりにくいので、手入力で改行を追加しました。また、入力が単純すぎてつまらなかったので、少し複雑にしてやり直してみました。その結果が以下の画像です。

f:id:ocumcr:20220407201413p:plain

ライフゲームのルールはいくつかありますが、update関数の条件を見るとこのプログラムにおいては以下の3つのルールで動作しているようです。

  1. 生きているセルの周囲9マス(自身を含める)に生きているセルが2つか3つあれば生存
  2. 死んでいるセルの周囲9マスに生きているセルが3つあれば誕生
  3. それ以外は死滅

確かに、プログラムで出力された結果はその通りになっているのではないでしょうか?これはGithub Copilotの勝利と言っても過言ではないでしょう。

総評

Github Copilotにいくつかの挑戦をしてもらいましたが。頻繁に記述されるような小プログラムに関してはある程度任せられるかな、といった感想です。

例えば2次元ベクトルの例でも、メンバ変数の名前がおかしいといった不満点はあるものの、その程度であれば人間が必要なものを追記できるはずです。ある程度人間の側がサポートすることを踏まえれば、すでにお遊びを超えて実用的なツールと化していると言えるでしょう。

また、適当なタイミングで予測をさせることで、「なるほど!たしかにこんな関数があればよさそうだな」とプログラマを刺激させる効果も期待できそうです。

まだまだ進化の余地はありますが、活用次第ではプログラミングの質を上げるツールとして十分期待できるでしょう。

ただし最初の方にも書きましたが、これはあくまで補助的なツールであり、完全に任せることはできません。また、予想されたプログラムが本当に正しく動作するのかどうかは、結局人間が判断しなくてはいけません。Github Copilotを活用するためには、最低限同レベルのプログラムを人間が記述できる必要がありそうです。