はじめに
日本語トランスコンパイラ言語 Re:Mindは鋭意実装中ですが、たてつけとしてはオープンな実装言語仕様のため、どなたでも処理系を実装することが可能です。逆転の発想で生成AIに実装言語仕様を読み込ませて、いくつかの抽象度レベルのプロンプトからトランスコンパイラ的な動きをさせてみようと思います。本記事はその第6ステップです。
Microsoft Copilot
生成AIはWindows11アプリケーションのMicrosoft Copilotとします。サインインした状態で使用しますが、第1ステップのプロンプト実行以前、この1年くらいの間で日本語トランスコンパイラ言語 Re:Mindに関連するセッションはないものとします。第5ステップの後にはサインアウトがあります。
第6ステップ 引き続きCopilotによる日本語トランスコンパイラ言語 Re:Mindの詳しい言語仕様(リンク先のページ記述の情報由来)の学習結果を確認する
第3ステップで確認された下記の方法での学習成果を確認してみます。
公式仕様文書やドラフト記事の提示
Qiitaなどに公開されている「Lv1.1ドラフト」「Lv1.2ドラフト」のリンクや抜粋を共有いただければ、その記述規則に従ってコード例を生成できます。
第5ステップでは実質さらに下記の補足が安全を見てプロンプトに込められていましたが、今回はこれはなくした状態で再現性を確認してみます。
構文ルールの具体的な例
例えば「条件分岐は◇で始める」「繰り返しは〇で始める」「関数定義は□で始める」といったルールを教えていただければ、それに従ったRe:Mind風のアルゴリズム展開が可能です。
プロンプト
下記のリンクは「オープンな実装言語仕様 日本語トランスコンパイラ言語 Re:Mind(リマインド)」の仕様情報2023 Lv1.1ドラフトです。
https://qiita.com/mylifewithviolin/items/ee1a16a363aaa4fe3f4c
ここには基本的な構文仕様が記述されています。
こちらに記載された内容を把握した上で、定番アルゴリズム:二分探索法のソースコードを日本語トランスコンパイラ言語 Re:Mindで書いてください。
生成レスポンス
二分探索法の Re:Mind 実装
Re:Mind 仕様の「関数宣言(▽…△)」「条件分岐(◇…の場合/◇他に/◇ここまで)」「繰り返し(○…の間は繰り返す/○ここまで)」「代入(・)」および「return(□return …)」の記法に従って、昇順に整列済みの整数配列に対する二分探索を実装します。
// 昇順に整列された配列から値を探索し、見つかったインデックスを返す。見つからなければ -1。
▽public int 二分探索する(int[] 配列,int 値)
・int 左 = 0
・int 右 = 配列.Length - 1
○(左 <= 右) の間は繰り返す
・int 中央 = 左 + ((右 - 左) / 2)
◇配列[中央] == 値 の場合
□return 中央
◇他に 配列[中央] < 値 の場合
・左 = 中央 + 1
◇他に
・右 = 中央 - 1
◇ここまで
○ここまで
□return -1
△
第6ステップの評価
英字系プログラミング言語にトランスコンパイルするためのJavaDocが少しゆるくなってしまいました。それに伴い、引数の場合はJavaDocのヘッダに記述できますが、ローカル変数の場合は(宣言箇所に記述する形になるとは思われますが)その記法を定義しておかないといけないことに気づきました。
また、JavaDocで通常英字系プログラミング言語の注釈とは逆のことを書くのはトランスコンパイラ言語の場合です。プログラミングロジック仕様記述言語としては直接トランスコンパイルはしないので、この記述は不要扱いです。
おわりに
第6ステップは以上です。第7ステップは引き続き言語仕様の詳細学習のステップとなります。どこかのタイミングでターゲット言語にトランスコンパイルさせますが、Copilotさんのご提案どおり、アルゴリズム集を「日本語フロー図」的にまとめてみます。