はじめに
天才鬼才@killyさんが開発したMind(6以降)の走行系は実装言語非依存の中間コード処理系となっており現在はC言語で実装されていますが、他言語での実装も構造的に可能なつくりとなっております。Zig言語というのがC言語後継有力候補らしく、C言語ヘッダが読み込めるとかでC言語からの移行が容易そうなので、試しにZig言語版のMind8中間コードディスパッチャも実装してみたくなりました。
通常の人間系であれば気の遠くなる作業ですが、昨今GitHub Copilot Pro+の余裕のある推論量に触れて、こういう機械的な移行のようなことって得意なのことが別件(C#,Javaによる互換実装)がほぼ確定しておりましたので、やらせてみる(やっていただく)ことにしました。
使用AI
Microsoft Copilot
Windows11アプリケーションのMicrosoft Copilot。昨年末から日本語プログラミング言語あおい Aoi(Re:Mind)の原型を作成してもらった生成AI123。モードは「無料プラン」。
GitHub Copilot
GitHub CopilotのPro+版。あおい実装4と検証の主担当。
AI仕様駆動開発の実際
Microsoft Copilot
日本語プログラミング言語あおいがネィティブにコード生成するとしたらどれがいいですかね、やっぱRustですかねとか雑談しておりましたら、いまはZigってのもありますよと教えていただいたところでございました。
GitHub Copilot
プロンプト1
完了状態が
C:\developments\vscode\mind8dispatch\docs
Mind8ディスパッチャC#互換実装次の優先項目1の実行プラン完了レポート.md
Mind8ディスパッチャC#互換実装次の優先項目3の実行プラン完了レポート.md
Mind8ディスパッチャC#互換実装次の優先項目3の実行プラン完了レポート.md
Mind8ディスパッチャC#互換実装次の優先項目4の実行プラン完了レポート.md
と同等となるように
docs\Mind8ディスパッチャZig互換実装の実装状況.md
の残課題を実行して
docs\Mind8ディスパッチャZig互換実装の実装状況完了レポート.md
を出力してください。
このプロンプト一発で完了したわけではないのですが、概ね良好に進行しました。C#互換実装のリソースは参考情報として最大限活用していますが、Zigはオブジェクト指向言語ではないので、元のCディスパッチャに近いつくりとなっています。
生成レスポンス1
実装を進め、実装状況完了レポートv2を出力しました。
C関数の対応番号を 30 → 269番号へ拡大。
動的実行、変数・メモリ操作、整数・ビット演算、文字列格納、標準出力などを追加・修正。
ユニットテスト33件、C/Zig差分試験74件が成功。
hello系MCO 10本すべてで標準出力・終了コードが一致。比較にはSerialを42へ変更した一時コピーを使用し、原本は変更していません。
zig build check による一括検証と、実行ファイルのビルド・配置を確認済み。
全面互換はまだ未達です。 全743番号中474番号が未実装です。残る機能、未検証条件、比較上の制約をレポートに明記しました。
docs\Mind8ディスパッチャZig互換実装の実装状況完了レポートv2.md の一部抜粋
# Mind8ディスパッチャ Zig互換実装の実装状況 完了レポート v2
## 結論
全面互換に向けて、v1の基礎VMから、制御・変数・メモリ・整数演算・文字列・標準
出力を実行できる段階へ実装を進めました。
- 通常ユーザーカーネルの対応番号を **30から269へ拡大**しました。
- **10本すべてのhello系MCOでC版と標準出力のバイト列・終了コードが一致**しま
した。
- **33件のユニットテストと74件のC/Zig差分試験**が成功しました。
- 未実装番号が残ることを機械検出するstrict検査も用意しました。
**全面互換は未達です。** Cテーブル743番号のうち474番号が未実装であり、対応済
み番号にも未検証の特殊条件があります。本書の「完了」は今回の実装・検証作業の
完了を指し、Cランタイム全体の置換完了を意味しません。
実行結果
PS C:\developments\vscode\mind8dispatchzig> zig-out\bin\mind8dispatcher.exe hello.mco
Hello by mind8
PS C:\developments\vscode\mind8dispatchzig>
おわりに
以上です。いかがでしたでしょうか?
C言語の資産をどうするかはIT業界内での重要課題なのですが、このあたりは開発者様のご意向次第という感じでこれはあくまで部外者による前提条件の概念実証という形となります。C#やJava版のように大きく構造が変わることはなさそうなので、移行先としてはよいかもしれません。C#やJava版の互換実装はこれらの言語の膨大なライブラリにネィティブにアクセスできるようにという目的なので、本件とは趣旨が異なります。