コード補完AIツールCodeiumはArduino開発でも使えるか検証!

コード補完AIツール
最近多くのAIツールがリリースされていますが、その中の一つにプログラミング時のソースコード自動補完AIツールがあります。
プログラムを出力させるだけであればChatGPTなど通常の対話型AIでも十分利用できますが、コード自動補完AIの利点はプログラミングに特化していること、普段利用している開発環境と統合して使えることなどがあります。
こうしたコード自動補完AIの中でも最も有名なものはGitHub Copilotではないでしょうか。
最近ではMetaのCode Llamaなどローカル環境で実行できるものもありますが、なかなかのPCスペックが要求されたり、管理が複雑であったりなど、利便性という点ではサービスとして展開されているGitHub Copilotなどに軍配があがります。
しかしGitHub Copilotは課金制なのでなかなか試しづらい。ということで今回は個人であれば無料で利用できるコード自動補完AIツールCodeiumを利用してみます。
またこうしたコード自動補完AIはArduinoのような組み込み、IoT機器開発でも利用できるのか検証していきます。
想定する開発環境
今回想定する開発環境ですが、まずコード自動補完AIはCodeiumを利用していきます(Codeiumについては後述)。またCodeiumとの連携を考え、Arduino開発環境にはVisual Studio Code上で利用できるPlatformIOを用います。
Codeiumとその対応言語
Codeiumとは
CodeiumはGitHub Copilotなどと同様に、AIによるコード自動補完を行う開発ツールです。Codeium自体は様々な開発環境向けの拡張機能が提供されていて、メジャーな開発環境はだいたいカバーされている印象です。今回はVisual Studio Code上で利用していきます。
個人開発であれば無料です(2024/3/5現在)。有料版のプランのほうがよりリッチな機能が提供されているようですが、今回は無料プランで利用していきます。
対応言語
CodeiumのFAQに対応言語が示されています(図1,2)。

What programming languages do you support?
Codeium’s performance is good (and enabled by default) for the following languages (alphabetical order): APL, Assembly, Astro, Blade, C, C++, C#, Clojure, CMake, COBOL, CoffeeScript, Crystal, CSS, CUDA, Dart, Delphi, Dockerfile, Elixir, Erlang, F#, Fortran, GDScript, Go, Gradle, Groovy, Hack, Haskell, HCL, HTML, Java, JavaScript, Julia, JSON, Kotlin, LISP, Less, Lua, Makefile, MATLAB, MUMPS, Nim, Objective-C, OCaml, pbtxt, PHP, Protobuf, Python, Perl, Powershell, Prolog, R, Ruby, Rust, SAS, Sass, Scala, SCSS, shell, Solidity, SQL, Starlark, Swift, Svelte, Typescript, TeX, TSX, VBA, Vimscript, Vue, YAML, Zig. On any other languages, you can explicitly enable Codeium.
図2:図1からテキストで抜粋。太字の箇所がCodeiumが対応している言語。その他の言語でも利用できる旨が書かれている。
Arduino、とは明示的には書かれていませんね。Arduino用のプログラムは基本的にはC/C++で構成されているので利用できそうですが、Arduino用の関数やクラスもあるのでどこまでCodeium側がArduinoでの開発を理解してくれるのかは不明です。是非試してみましょう。
PlatformIOとVisual Studio Code用のCodeium拡張機能の導入
今回、Arduinoの開発環境はVisual Studio上でPlatformIOを用いることにします。Codeiumを利用するため更にCodeium用の拡張機能を導入します(図3)。

導入するとCodeiumボタンが現れ(図4左端)、これをクリックするとチャット欄が現れます。ここに文章を入れると回答してくれます(図4)。

また、エディタの方でプログラムの入力を始めるとコードの補完やコメントの追加の提案をしてくれるようになります。気に入ったら採用していきます。(図5)

Arduino用プログラムをCodeiumで作ってみよう
それでは実際にPlatformIOでArduino用プログラムを作成していきます。
PlatformIOにて、対応ボードをArduino Leonardoとしてプロジェクトを作成します(図6)。

必要な準備は以上です。どんどん中身のコードを書いていきます。まずこのプロジェクトではサーボモータを利用する予定なので、PlatformIOでサーボモータ制御用ライブラリを導入し、サーボに関するコードを入力していきます。
ヘッダのインクルードとサーボ変数のみ用意した状態でsetup()を記述しようとすると…

図7のようにサーボへのピン割当を行うattach()が表示されました。ピン番号は今回は別のものを利用するのでそこだけ書き換えます。
次にloop()の中身を記述していきます。まずはCodeiumにどういったコードが書きたいか理解してもらうために簡単に動作についてのコメントを記述しておきます(図8)。

これをどんどん繰り返します。意図しないコードが提案されるときもあるので、そういう場合は提案を採用しないか、採用した上で修正します(図9)。コメントを付与しておくと、それなりに良い提案をしてくれるようになりました。

また、作成したコードの説明コメントを自動で付与してくれる機能が便利でした。関数の上に表示されている”Generate Function Comment”を押すと、関数の説明コメントを提案してくれます。(図10、11)


また、図10でRefactorを選ぶと図12のようなウインドウが開くので”Add comments and docstrings to the code”を選ぶとプログラムの動作を説明するコメントを関数内部に記述してくれます。これも正しい説明や意図通りの説明ではない場合があるので、確認は必要です。

こうしたコメントは日本語にすることも可能です。(図13)

Arduinoの仕様をCodeiumは理解しているか
先程はサーボに関するコードを提案してくれましたが、それ以外のArduinoの仕様は理解しているのでしょうか、試してみましょう。ArduinoでのLEDとサーボモータの利用方法についてチャットで質問してみました(図14)。全て完璧な説明というわけではなかったり、LEDではanalogWrite()とdigitalWrite()についてどちらか一方しか説明してくれないなどはありますが、概ね正しい説明でした。Arduinoに特有の質問でも答えてくれそうです。

この他にもコード提案にconstrain()などのArduino独自の関数を入れてくるなど、Arduinoの仕様を理解して提案してくれていました。
結論:使えそう
これまで見てきたように、CodeiumはArduinoの仕様をある程度理解してコード提案をしてくれることがわかりました。Arduinoのような組み込み、IoT機器開発でも利用できそうなので、今後有効活用したいと思います。