はじめに
日本語プログラミング言語Mindのバージョン9でAI仕様駆動開発(っぽいこと)を行ってみます。本記事はその最初のステップで、この記事でAI仕様駆動開発ができているわけではありません。
生成AI
Microsoft Copilot
Windows11アプリケーションのMicrosoft Copilot。昨年末から日本語プログラミング言語あおい(Re:Mind)の原型を作成してもらった生成AI123。モードは「無料プラン」。GitHub Copilotの使い方アドバイザーとして利用。
GitHub Copilot
GitHub CopilotのPro版を導入。あおいの検証で検証改修再検証フローを数回廻したところフリー版のクレジット足らなくなったのでPro版へアップグレード。スーパバイザとしてMicrosoft Copilotを使いGitHub CopilotのCodeAgent推論量を最小化するプロンプトをCopilotで生成しGitHub CopilotのCodeAgentで実行という工法?を採用しています。
環境準備
フォルダ構造
下記のようなフォルダ構造のVSCodeプロジェクトフォルダを作成します。firework.srcは本記事のお題の自動生成されたMind9のソースコードファイルです。ある程度状況が進行した状態となっておりますので、コンパイル済ファイルfirework.mcoやfirework.exeが既にあったりしますが、ほんとうの最初はルートフォルダにあるMind9関連ファイルはfirework.srcだけとなります。
C:\developments\vscode\mind9-ai>dir
2026/09/21 20:55 <DIR> .vscode
2026/09/21 21:30 <DIR> cs
2026/09/21 22:42 <DIR> docs
2026/09/21 20:53 <DIR> eval
2026/09/21 22:41 189,552 firework.exe
2026/09/21 22:41 132 firework.his
2026/09/21 22:41 194,466 firework.mco
2026/09/21 22:41 7,030 firework.src
2026/09/21 22:41 51,804 firework.sym
2026/09/21 20:17 <DIR> manual-md
2026/09/21 22:42 <DIR> result
2026/09/21 21:37 <DIR> snowdrops
manual-mdフォルダ
manual-mdフォルダにはこちらの記事で準備したMind9の公式ヘルプhtmlをmarkdownに変換したファイルが格納されています。日本語プログラミング言語のような、AIがバックグラウンドとして詳しく学習していない言語の場合は、これ必須です。EUCのhtmlのままでもいけるかもしれませんが、毎回読み込ませにいかせますのでUTF-8のmdにしておくのが推論量減らすのに有効かなという想定です。
C:\developments\vscode\mind9-ai>dir manual-md\*.md
2026/09/19 09:06 2,359 00-Cover.md
2026/09/19 09:25 10,883 00-Introduction.md
~略~
2026/09/19 09:25 13,591 operation-4-Tools.md
2026/09/19 09:25 9,956 operation-5-package-userprogs.md
2026/09/19 09:25 13,195 operation-6-SamplePrograms.md
2026/09/20 23:10 3,518 予約語・変数構造体定義・処理単語の一覧.md
49 個のファイル 1,293,691 バイト
コード生成ルール.md
このmanual-mdフォルダ内の言語マニュアルを必ず読み行くというルールを作成します。
# Mind言語のコード生成ルール
## 必須参照資料
Mind言語のコードを生成、補完、修正するときは、ワークスペースの `manual-md` フォルダ内にあるすべての `.md` ファイルを参照する。
特定のファイルだけを参照して判断してはならない。構文、予約語、変数、構造体、処理単語、入出力、ファイル操作、GUI、イベント、ウィジェット、属性、レイアウト、ダイアログ、描画、音声、デバッグ、制限事項など、コードに関係する仕様を `manual-md` 全体から確認する。
## 準拠要件
- 構造体の定義は、マニュアルに記載された定義、フィールド、型、値の扱いに完全準拠する。
- 処理単語、予約語、組み込み機能の名称、引数、引数順、戻り値、実行条件は、マニュアルの記述に完全準拠する。
- GUIコードは、GUIライブラリの仕様、ウィジェット、属性、イベント、レイアウト、ウィンドウ、ダイアログ、メニューバー、キャンバスなどの関連記述に完全準拠する。
- マニュアルに記載されていない構文、識別子、API、引数、型、動作を推測で追加しない。
- マニュアル間で記述が異なる場合は、差異を明示し、独断で補完せず確認を求める。
- 仕様を確認できない部分は、推測でコードを完成させず、不明点として示す。
- 生成コードは、マニュアルにあるサンプル、命名、記法、制約に合わせる。
- Mind 言語のソースコードは Shift_JIS(SJIS)で保存する。
UTF-8 で保存するとコンパイラが正しく解析できない。
- SJIS で文字化けしやすい記号(波ダッシュ、全角チルダなど)は使用禁止。
- Copilot は UTF-8 でテキストを生成するため、SJIS に変換しても壊れない文字のみを使用する。
## 生成前の確認
1. `manual-md` 内の全 `.md` を参照する。
2. 使用する構文、処理単語、構造体、GUI要素の仕様を確認する。
3. 引数、型、戻り値、イベント、実行順序、制限事項を確認する。
4. マニュアルにない推測が混入していないことを確認する。
## 仕様が不足している場合
必要な仕様が `manual-md` に見つからない場合は、推測で実装せず、必要な情報を質問する。既存コードに合わせる場合も、マニュアルに反する記法を優先してはならない。
このmdはMicrosoft Copilotに作ってもらっていました。一発で上記の状態になったわけではなく、Mind(Windows版)のソースコードはSJISなんですよという情報提供あたりから、こういう制約追加した方がいいですよという流れで下記の制約文を追記しています。ここは重要です。
- Mind 言語のソースコードは Shift_JIS(SJIS)で保存する。
UTF-8 で保存するとコンパイラが正しく解析できない。
- SJIS で文字化けしやすい記号(波ダッシュ、全角チルダなど)は使用禁止。
- Copilot は UTF-8 でテキストを生成するため、SJIS に変換しても壊れない文字のみを使用する。
tasks.json
VSCodeのタスクにGitHub CopilotがMindコンパイラを自動実行できるように下記のtasks.jsonを設定します。
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "call C:\\Mind9\\usemind.bat && mind ${fileBasenameNoExtension} guilib",
"group": "build",
"problemMatcher": []
}
]
}
下記はMind9のインストールフォルダ内にある環境設定バッチです。GitHub CopilotがコンソールでmindコンパイラのCLIコマンドラインを実行する都度その直前に実行するようにします。
C:\Mind9\usemind.bat
お題のソースコード
Mindでの仕様駆動開発の前に、今回のお題のMindのソースコードfirework.srcの由来ですが、こちらはC#のソースコードを下準備なしで変換させた疑似言語状態のソースです。
evalフォルダ
それらはevalフォルダに格納して保管してあります。firework.src2が自動生成の最終状態で、firework.srcが今回の記事で最初に処理させる状態ですが、08/09に人間系で編集の手を入れています。タイムスタンプが09/21になってしまっていますが最後の手入れは08/09です。
C:\developments\vscode\mind9-ai>dir eval\*.src
2026/09/21 20:53 5,691 firework.src
2026/08/09 12:38 2,966 firework.src0
2026/08/09 12:41 4,692 firework.src1
2026/08/09 12:50 4,840 firework.src2
4 個のファイル 18,189 バイト
csフォルダ
csフォルダに変換元のC#のソースコードと仕様のmdを格納してあります。最初からこうしていたわけではありませんが、やりはじめた後に品質を上げるため変換元のC#ソースコードも読み込ませました。その結果、binやobjサブフォルダはGitHub Copilotがビルドしたためできたものです。(いま気づきました(^-^;)
C:\developments\vscode\mind9-ai>dir cs\
2026/09/21 21:30 <DIR> bin
2026/08/09 12:05 11,451 FireWork.cs
2026/08/09 12:21 3,560 FireWorkForm.cs
2026/09/21 21:31 <DIR> obj
2026/08/08 21:25 1,067 Program.cs
2025/01/12 01:24 425 WinFormsApp.csproj
2026/08/09 11:53 4,255 処理概要.md
5 個のファイル 20,758 バイト
お題のソースコード(完全疑似言語状態)
firework.src2 完全疑似言語状態
粒子は 構造体
粒子Xは 変数
粒子Yは 変数
VXは 変数
VYは 変数
サイズは 変数
色は 色実体
アルファは 変数
粒子寿命は 変数
粒子最大寿命は 変数
。
花火は 構造体
花火Xは 変数
花火Yは 変数
目標Yは 変数
上昇速度は 変数
活動中?は 真偽値
爆発済み?は 真偽値
花火寿命は 変数
花火最大寿命は 変数
粒子群は 300人分の 粒子
。
花火数は 変数。
花火配列は 4人分の 花火。
キャンバスIDは 変数。
タイマーIDは 変数。
フレーム数は 変数。
ウィンドゥとは
メインウィンドゥで キャンバスのIDを取得し キャンバスIDに入れ
タイマーIDを取得し タイマーIDに入れ
花火数を 4に設定し
0から 花火数まで 反復し
新規花火を 作成し i番目の 花火配列に入れ
終わり
タイマーIDに 30ミリ秒周期を設定し
タイマーIDに 実行終りの 実行情報を イベント処理を登録し
キャンバスIDを 有効化して配置すること。
。
イベント処理とは
キャンバスIDで 描画開始し
背景色を 黒に設定し
キャンバスIDを 塗りつぶし
花火群を 更新し
花火群を 描画し
キャンバスIDで 描画終了すること。
。
新規花火を 作成しとは
花火の 花火Xを ランダム(100から1100)に設定し
花火の 花火Yを 600に設定し
花火の 目標Yを ランダム(80から200)に設定し
花火の 上昇速度を ランダム(8から13)に設定し
花火の 活動中?を 真に設定し
花火の 爆発済み?を 偽に設定し
花火の 花火寿命を 0に設定し
花火の 花火最大寿命を 0に設定すること。
。
花火群を 更新しとは
フレーム数を フレーム数+1に設定し
0から 花火数まで 反復し
i番目の 花火配列を 取得し 花火に入れ
花火の 活動中?が 偽なら
オフセットを i×110に設定し
サイクルを (フレーム数+オフセット)÷360の余りに設定し
サイクルが 0なら
新規花火を 作成し i番目の 花火配列に入れ
終わり
次へ
終わり
花火を 更新し
終わり
。
花火を 更新しとは
花火の 活動中?が 偽なら 終わる
花火の 爆発済み?が 偽なら
花火の 花火Yを 花火の 上昇速度だけ 減らし
花火の 花火Yが 花火の 目標Y以下なら
花火の 花火Yを 花火の 目標Yに設定し
花火を 爆発させ
終わり
終わる
終わり
0から 300まで 反復し
粒子群の i番目を 取得し 粒子に入れ
粒子の 粒子Xを 粒子の 粒子X + 粒子の VXに設定し
粒子の 粒子Yを 粒子の 粒子Y + 粒子の VYに設定し
粒子の VXが 正なら 粒子の VXを 粒子の VX-1に設定し
粒子の VXが 負なら 粒子の VXを 粒子の VX+1に設定し
粒子の VYを 粒子の VY+1に設定し
粒子の 粒子寿命を 粒子の 粒子寿命-1に設定し
粒子の アルファを (粒子の 粒子寿命×255)÷粒子の 粒子最大寿命に設定し
粒子の 粒子寿命が 0以下なら
粒子の アルファを 0に設定し
終わり
終わり
花火の 花火寿命を 花火の 花火寿命-1に設定し
花火の 花火寿命が 0以下なら
花火の 活動中?を 偽に設定すること。
。
花火を 爆発させとは
花火の 爆発済み?を 真に設定し
花火の 花火寿命を 22に設定し
花火の 花火最大寿命を 22に設定し
粒子数を ランダム(200から300)に設定し
0から 粒子数まで 反復し
角度を (2π×i÷粒子数)に設定し
速度を ランダム(4から12)に設定し
粒子群の i番目を 取得し 粒子に入れ
粒子の 粒子Xを 花火の 花火Xに設定し
粒子の 粒子Yを 花火の 花火Yに設定し
粒子の VXを cos(角度)×速度に設定し
粒子の VYを sin(角度)×速度に設定し
粒子の サイズを ランダム(3から7)に設定し
色番号を ランダム(1から6)に設定し
色番号が 1なら 粒子の 色を 赤に設定し
色番号が 2なら 粒子の 色を 黄に設定し
色番号が 3なら 粒子の 色を 青に設定し
色番号が 4なら 粒子の 色を 緑に設定し
色番号が 5なら 粒子の 色を 紫に設定し
色番号が 6なら 粒子の 色を 白に設定し
粒子の アルファを 255に設定し
粒子の 粒子寿命を ランダム(18から28)に設定し
粒子の 粒子最大寿命を 24に設定し
終わり
。
花火群を 描画しとは
0から 花火数まで 反復し
花火配列の i番目を 取得し 花火に入れ
花火の 爆発済み?が 偽なら
色を 白に設定し
キャンバスIDで 円を描く 花火の 花火X 花火の 花火Y 6 6
次へ
終わり
0から 300まで 反復し
粒子群の j番目を 取得し 粒子に入れ
色を 粒子の 色に設定し
色の アルファを 粒子の アルファに設定し
キャンバスIDで 円を描く 粒子の 粒子X 粒子の 粒子Y 粒子の サイズ 粒子の サイズ
粒子の アルファが 40より大なら
色を 白に設定し
色の アルファを 粒子の アルファ÷3に設定し
キャンバスIDで 円を描く 粒子の 粒子X 粒子の 粒子Y 粒子の サイズ+2 粒子の サイズ+2
終わり
終わり
終わり
。
お題のソースコード(手入れ後)
firework.src 手入れ後
花火は 構造体
粒子Xは 変数
粒子Yは 変数
粒子VXは 変数
粒子VYは 変数
粒子サイズは 変数
粒子色は 変数
粒子アルファは 変数
粒子寿命は 変数
粒子最大寿命は 変数
粒子は 粒子Xと 粒子Yと 粒子VXと 粒子VYと 粒子サイズと
粒子色と 粒子アルファと 粒子寿命と 粒子最大寿命
花火Xは 変数
花火Yは 変数
花火目標Yは 変数
花火上昇速度は 変数
花火活動中?は 変数
花火爆発済み?は 変数
花火寿命は 変数
花火最大寿命は 変数
花火粒子群は 300人分の 粒子
全体は 花火Xと 花火Yと 花火目標Yと 花火上昇速度と
花火活動中?と 花火爆発済み?と 花火寿命と 花火最大寿命と 花火粒子群
。
花火数は 変数。
花火配列は 4人分の 花火。
キャンバスIDは 変数。
タイマーIDは 変数。
フレーム数は 変数。
新規花火を作成しとは
花火の 花火Xに ランダム(100から1100)を 入れ
花火の 花火Yに 600を 入れ
花火の 花火目標Yに ランダム(80から200)を 入れ
花火の 花火上昇速度に ランダム(8から13)を 入れ
花火の 花火活動中?に 真を 入れ
花火の 花火爆発済み?に 偽を 入れ
花火の 花火寿命を クリアし
花火の 花火最大寿命を クリアすること。
。
花火を爆発させとは
i番目は 変数
花火の 花火爆発済み?を セットし
花火の 花火寿命に 22を 入れ
花火の 花火最大寿命に 22を 入れ
粒子数に ランダム(200から300)を 入れ
粒子数まで 回数指定し
i番目に 回数を 入れ
角度に (2.0×π×i÷粒子数)を 入れ
速度に ランダム(4から12)を 入れ
花火の 花火粒子群の i番目を 取得し 粒子に入れ
粒子の 粒子Xを 花火の 花火Xに設定し
粒子の 粒子Yを 花火の 花火Yに設定し
粒子の 粒子VXを cos(角度)×速度に設定し
粒子の 粒子VYを sin(角度)×速度に設定し
粒子の 粒子サイズを ランダム(3から7)に設定し
色番号を ランダム(1から6)に設定し
色番号が 1ならば 粒子の 粒子色を 赤に設定し
色番号が 2ならば 粒子の 粒子色を 黄に設定し
色番号が 3ならば 粒子の 粒子色を 青に設定し
色番号が 4ならば 粒子の 粒子色を 緑に設定し
色番号が 5ならば 粒子の 粒子色を 紫に設定し
色番号が 6ならば 粒子の 粒子色を 白に設定し
粒子の 粒子アルファに 255を 入れ
粒子の 粒子寿命を ランダム(18から28)に設定し
粒子の 粒子最大寿命に 24を 入れ
繰り返す
。
花火を更新しとは
花火の 花火活動中?が 偽? ならば 終わる つぎに
花火の 花火爆発済み?が 偽? ならば
花火の 花火Yを 花火の 花火上昇速度だけ 減らし
花火の 花火Yが 花火の 花火目標Y 以下 ならば
花火の 花火Yを 花火の 花火目標Yに設定し
花火を爆発させ
終わり
つぎに
つぎに
300まで 回数指定し
花火の 花火粒子群の i番目を 取得し 粒子に入れ
粒子の 粒子Xを 粒子の 粒子X + 粒子の 粒子VXに設定し
粒子の 粒子Yを 粒子の 粒子Y + 粒子の 粒子VYに設定し
粒子の 粒子VXが 正ならば 粒子の 粒子VXを 粒子の 粒子VX-1に設定し
粒子の 粒子VXが 負ならば 粒子の 粒子VXを 粒子の 粒子VX+1に設定し
粒子の 粒子VYを 粒子の 粒子VY+1に設定し
粒子の 粒子寿命を 粒子の 粒子寿命-1に設定し
粒子の 粒子アルファを (粒子の 粒子寿命×255)÷粒子の 粒子最大寿命に設定し
粒子の 粒子寿命が 0 以下 ならば
粒子の 粒子アルファを 0に設定し
つぎに
繰り返す
花火の 花火寿命を 花火の 花火寿命-1に設定し
花火の 花火寿命が 0 以下 ならば
花火の 花火活動中?を 偽に設定すること
つぎに。
花火群を更新しとは
i番目は 変数
フレーム数を 一つ増加し
花火数まで 回数指定し
i番目に 回数を 入れ
花火配列(i番目)を 花火に入れ
花火の 花火活動中?が 偽? ならば
オフセットに i×110を 入れ
サイクルに (フレーム数+オフセット)÷360の 余りを 入れ
サイクルが 0に 等しい ならば
新規花火を作成し 花火配列(i番目)に 入れ
つぎに
※次へ
つぎに
花火を更新し
繰り返し
。
ウィンドゥとは
メインウィンドゥで キャンバスのIDを取得し キャンバスIDに 入れ
タイマーIDを取得し タイマーIDに 入れ
花火数に 4を 入れ
花火数まで 回数指定し
新規花火を作成し 花火配列(回数)に入れ
繰り返す
タイマーIDに 30ミリ秒周期を設定し
タイマーIDに 実行終りの 実行情報を イベント処理を登録し
キャンバスIDを 有効化して配置すること。
。
イベント処理とは
キャンバスIDで 描画開始し
背景色を 黒に設定し
キャンバスIDを 塗りつぶし
花火群を更新し
花火群を描画し
キャンバスIDで 描画終了すること。
。
花火群を描画しとは
i番目は 変数
※0から 花火数まで 反復し
花火数で 回数指定し
i番目に 回数を 入れ
花火配列(i番目)を 花火に 入れ
花火の 花火爆発済み?が 偽? ならば
色を 白に設定し
キャンバスIDで 円を描く 花火の 花火X 花火の 花火Y 6 6
※次へ
つぎに
300まで 回数指定し
花火の 花火粒子群の j番目を 取得し 粒子に入れ
色を 粒子の 粒子色に設定し
色の アルファを 粒子の 粒子アルファに設定し
キャンバスIDで 円を描く 粒子の 粒子X 粒子の 粒子Y 粒子の 粒子サイズ 粒子の 粒子サイズ
粒子の 粒子アルファが 40より 大きい ならば
色を 白に設定し
色の アルファを 粒子の 粒子アルファ÷3に設定し
キャンバスIDで 円を描く 粒子の 粒子X 粒子の 粒子Y 粒子の 粒子サイズ+2 粒子の 粒子サイズ+2
つぎに
繰り返す
繰り返す
。
メインとは
花火群を描画すること。
~略~
firework.src 194 行目でエラー。行内容は、
キャンバスIDで 円を描く 粒子の 粒子X 粒子の 粒子Y 粒子の 粒子サイズ+2 粒子の 粒子サイズ+2
要因1:配列要素番号の記述が有りません。
要因2:"粒子サイズ+2"は未定義の単語です。
firework.src 195 行目でエラー。行内容は、
つぎに
要因1:配列要素番号の記述が有りません。
191 個のエラーが有ります。
こんな状態のソースコードをAIに処理させようというのが本記事のお題のひとつです。(つづく)
おわりに
Mindのコード生成のハルシネーションをおさえるためMindの言語仕様をmarkdown化してAIに学習させてみようと思っていたのですが、markdown化の過程でLSPもできますよとMicrosoft Copilotが提案してきたので、それにのっかってしまって、本題が遅れていました。同じことをしようとしている方々の参考になれば幸いです。まだたいした参考になりませんが、徐々にそうなっていくことを願っております![]()