皆さんは Google AI Studio を使っていますか?
このサービスは、テキストや画像だけでなく、動画やコードなどの様々なデータを理解し、Gemini に質問したり指示したりできる強力なツールです。
ただ、注目すべきは かなり長いプログラムのコードを食わせてそれを解析できる ということです。
以下は slither.io というブラウザゲームのjsファイルを丸ごと食わせて解説してもらった例
コードを全部読まなくても、Gemini に解析してもらってどういう処理があるとか、サーバーとどんな通信を行っているのかを聞くとかなり精度良く回答が帰ってきます。
つまり、コードの中身をほとんど読まなくてもだいたい理解できるってことです
それだけじゃありません
Geminiに解析させた結果を得るだけでなく、そこから新しいものを生成することだって可能です。
以下はとあるjsコードの難読化されたフィールドが何を意味するのかを推測してもらいその結果をJSON形式で出力してもらったものです。
これによって難読化が施された値を置換したりする際の入力データを自動で生成できました。
しかもかなり精度がいいです(間違っている箇所もあるけど)
そこで思いついたのが、
アレ?もしかしてコードの移植さえも全部Geminiに書いてもらえるんじゃね?
というものです。
もはやコードも何も自分で書かずに、認識してもらったプログラムを別の言語で書き直してもらうことすら完璧にできるのではないか。そう思ったのです。
GeminiにAgar.ioというゲームをRust+WASMに移植させる
本題です。
今回は Gemini に Agar.io というブラウザゲームのコードを食わせ、Rust + WASM で動作するバージョンをフルで生成させる実験を行いました。
Agar.io(アガリオ)とは、7,8年前くらいに海外で大流行したブラウザゲームです。
プレイヤーが丸いユニット(細胞)を操作し、小さい敵を食べながら大きくなっていくシンプルなゲームです。かつて海外で爆発的な人気を博し、動画だけで登録者100万人を超えるチャンネルが誕生したほどです。
今は過疎ゲーになってしまいましたが...
さすがにAgar.ioはチート対策などでクライアントのJSコードがかなり複雑なので、今回はAgar.ioを模倣して作られたゲームクライアントである Cigar2 を食わせたいと思います。
当時Agar.ioのプライベートサーバーが乱立しましたが、このCigar2はそれによく使われていました。
サーバーも立てればほとんど本家Agar.ioと同じようにプレイできるものです。
このCigarを Google AI Studio に食わせて、全く同じことができるコードをRustで書かせてみようと思います。
Geminiにゲームクライアントのソースコードを食わせる
Google AI Studio では自分のGoogle Driveにファイルをアップロードすると、それをインポートして使うことができるようになっています。
まずは、cigarのjsファイルである main_out.js をそのまま食わせてみました。
それらしいコードが長々と生成されました。
オリジナル
Geminiが書いたコード
割とそのままて感じですけど、しっかりRust+WASMとして動作する形で書いてくれています
ただ、やはりクライアントの処理がいろいろある分、やっぱりミスするところはあるみたいでそのままコピペしてビルドしても動きませんでした。
食わせるコードを削って必要最低限の処理だけ残す
さすがにフルで食わせると最後までRust化したコードは書いてくれたもののコピペするだけでビルド突破できないので、いらない部分をかなり削りました。
このようにチャットやリーダーボード(ランキング表示)の描画は、別になくてもゲームをプレイすること自体はできるのですべて消し去りました。
削ったコードをGeminiに食わせて再チャレンジです
rust+wasmでこれと全く同じ動作をするコードを書いてください。
websocketでサーバーとメッセージを送受信し、その情報をもとにcanvasに描画するということができればとりあえずOK
ただし、完璧に動作するコードを書いて
けっこう適当ですがこんな指示をしました。
700行以上にもなるRustのコードと、WASMにビルドした後にそれをwebページで読み込むためのhtmlまで用意してくれました。
なにがすごいって、Geminiはタイムアウトせずにこれをノンストップでやってくれたこと
もちろん処理が長すぎるとコードを出力してる途中でタイムアウトはあるのですが、1回の持続力はかなり長い気がしてます。
ChatGPTだと出力が長いとタイムアウトなんてすぐにしちゃうので、Google AI StudioでGeminiを動かしたときこれが一番感動しました。
Geminiに書いてもらったRustコードをWASMにビルドする
結論からいうと、やっぱりコピペだけでビルドは通らなかったのでいくつか手直ししました。
Compiling cigar-rs v0.1.0 (/workspaces/fearnot-rs/cigar-rs)
error[E0425]: cannot find value `ctx` in this scope
--> src/lib.rs:443:29
|
443 | (self.mouse_x - ctx.canvas().width() as f64 / 2.0) / self.camera.scale + self.camera.x;
| ^^^ not found in this scope
...
ビルドしたときにターミナルに表示されたエラーをまるごとコピって食わせて、「これ修正して」って頼むと直したコードをまた書いてくれます
エラーが出たらターミナルのログをコピペしてGeminiに修正箇所を教えてもらうを繰り返すことで、ついにビルド成功しました。
ちなみにビルド成功したコード完全版はこちら!
https://gist.github.com/LostMyCode/57732f9a384bcdda7acfc67622001d35
実際にビルドできたやつをブラウザで開いてみる
少し手直しが必要だったりしましたが、Rust+WASMにほぼコードを書かずに移植したCigarクライアントが動作しました。
普通にサーバーと通信してオンライン対戦することもできました。
もちろん食わせたjsファイルと全く同じような処理をしているだけなのですが、知識がほとんどなくてもこんなに簡単に移植できてしまうとは!
注意点: パフォーマンスはむしろ悪化する
今回 Rust + WASM にコードをAIにコードを書き直させてみましたが、あくまでも実験的にやったものでWASMになるからパフォーマンスが上がるとかは全く無いです。
なんなら、WASMにしたことでパフォーマンスは落ちるでしょう。
これは、WebSocket でサーバーと通信したり、HTML5 Canvas に描画したりする処理が、最終的には JavaScript 側の関数を呼び出す必要があるためです。
WebSocketでメッセージを処理するコードをWASMで記述してたとしても、WASM側のメモリにメッセージをコピーする手間が発生するし、Canvas毎フレーム描画するのに何回もjs側に呼び出しするなんて非効率です。
つまりパフォーマンスの観点ではなんら利点はないといえます。
ゲームのロジックを隠蔽したりするのには使えるかもしれませんね。(実際本家Agar.ioはチート対策のために多くの処理をWASM側でやっている。パフォーマンスは悪いけど仕方ない)
もうちょい粒子の移動の計算みたいな複雑なロジックがあったらWASMの恩恵を得られたかもですがシンプルなゲームなのでそういったこともなく😥
まとめ
今回は、Google Gemini Pro を使って、ブラウザゲームの移植をほぼ自動で行う実験を行いました。
動画や画像を食わせて解析できることが割と注目されがちですが、実はコードを食わせて解析したり新しいものを作ったりすることもサクッとできちゃう最強のツールなんですよね。
Google AI Studio こんな使い方もできるので色々試してみてはいかがでしょうか!
今回 Gemini Pro に生成させたコード完全版はこちらからご覧いただけます。
https://gist.github.com/LostMyCode/57732f9a384bcdda7acfc67622001d35
余談: 一発でうまくいったように書いたけど実は10回くらいGeminiに頼んでますw