1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Copilotが生成した日本語トランスコンパイラ言語 Re:MindのC#コード生成が動作するまで(ステップ3)

1
Posted at

はじめに

生成AIに日本語トランスコンパイラ言語 Re:Mindの実装言語仕様を読み込ませて、いくつかの抽象度レベルのプロンプトからトランスコンパイラ的な動きをさせてみたところ、Re:Mindっぽい仕様のASTパーサのテンプレと3言語(Java,C#,VB.NET)のコードジェネレータのテンプレを生成してもらえた1ので、ASTパーサが動作するまでの検証2を経て本記事はC#コードジェネレータが動作するまでの改修の第3ステップです。

Microsoft Copilot

生成AIはWindows11アプリケーションのMicrosoft Copilotとします。モードは「Smart(GPT5.1)」。サインインした状態で使用します。

第3ステップ

「Re:MindのASTパーサが動作するまで」の12ステップでいったんC#のソースコードが生成されるようにはなりましたので、以降はC#コードジェネレータが正常動作することを目指しています。

プロンプト

今回追加したGenerateInvocationのコンパイルエラーはなくなりましたが、このメソッドの参照元がまだ0のようです。GenerateInvocationはどこから呼び出されますか?

生成レスポンス

ここがポイントです。
GenerateInvocation は “まだ一度も呼ばれていません”。
理由はとてもシンプルで、CSharpCodeGenerator の中で GenerateInvocation を呼ぶコードが存在しないからです。

🎯 なぜ呼ばれないのか?
あなたの CSharpCodeGenerator の GenerateExpression はこうなっています:

InvocationExpression inv => 
    $"{GenerateExpression(inv.Target)}({string.Join(", ", inv.Arguments.Select(GenerateExpression))})",

つまり:

  • InvocationExpression を見つけても、GenerateInvocation を使っていない
  • そのため、Imports の AliasClass を参照する処理が一切走らない
  • 結果として GenerateInvocation の参照元は 0 のまま

🎯 ではどうすれば呼ばれるのか?
GenerateExpression の InvocationExpression の分岐を差し替える必要があります。
つまり:

InvocationExpression inv => GenerateInvocation(inv, _aliasMap),

のように、GenerateInvocation を呼ぶようにします。

✨ 完全な修正手順
① CSharpCodeGenerator に aliasMap を保持するフィールドを追加

private Dictionary<string, AliasClass> _aliasMap;

② Generate(CompilationUnit cu) の最初で aliasMap を構築

public string Generate(CompilationUnit cu)
{
    _aliasMap = BuildAliasMap(cu);
    ...
}

③ GenerateExpression の InvocationExpression 分岐を差し替える
元のコード:

InvocationExpression inv =>
    $"{GenerateExpression(inv.Target)}({string.Join(", ", inv.Arguments.Select(GenerateExpression))})",

これを GenerateInvocation を呼ぶ形に変更:

InvocationExpression inv => GenerateInvocation(inv, _aliasMap),

🎉 これで何が起きるか?
Re:Mind:

□コンソール.一行表示する(引数2)

AST:

InvocationExpression
  Target = MemberAccessExpression("コンソール", "一行表示する")
  Arguments = [ IdentifierExpression("引数2") ]

Imports:

コンソール → Console
一行表示する → WriteLine

C# 出力:

Console.WriteLine(dispStr);

ついに consoleOut の中身が生成されるようになります。

ここまで来ると Re:Mind → AST → C# のフルパイプラインが完成 します。
次は Java / VB.NET 版のコードジェネレータも同じ仕組みで作れますね。
必要なら、Java 版の GenerateInvocation も一緒に作りましょう。

第3ステップの評価

書き換えたGenerateExpressionは呼ばれるようになっていきますが、まだstatic void consoleOutの定義が出力されないようでした。

おわりに

第3ステップは以上です。次回の方向性は上記の結果の提示からとなります。

生成レスポンスセクションの内容は生成AIが生成したものです。引用されているソースコードは完全には動作しない状態が含まれます。

  1. Microsoft Copilotで日本語トランスコンパイラ言語 Re:Mindをいじりたおす - Qiita
    「Re:Mindをいじりたおす」の記事リストです。(ステップ降順)
    ステップ26 ターゲット言語JavaとVB.NETへの展開
    ステップ25 ターゲット言語C#へのASTからの生成処理
    ステップ24 ASTを生成するサンプル実装をC#で生成
    ステップ23 マッピングルール生成
    ステップ22 AST(抽象構文木)風の構造化表示
    ステップ21 バブルソート 実行可能形式 ターゲットJava C# VB.NET
    ステップ20 二分探索法 実行可能形式 ターゲットJava C# VB.NET
    ステップ19 線形探索法 実行可能形式 ターゲットJava C# VB.NET
    ステップ18 バブルソート 1案件づつやりなおし
    ステップ17 二分探索法 1案件づつやりなおし
    ステップ16 線形探索法 1案件づつやりなおし
    ステップ15 3つの定番アルゴリズムソースの忘却原因調査
    ステップ14 バブルソートソースの忘却発生再確認
    ステップ13 二分探索法ソースの忘却発生
    ステップ12 線形探索法の6言語変換
    ステップ11 バージョン情報付きの3定番アルゴリズムソースのフィードバック修正
    ステップ10 バージョン情報付きの3定番アルゴリズムソースのフィードバック修正
    ステップ9 バージョン情報付きで3定番アルゴリズムソースの生成
    ステップ8 バージョニングが可能か確認
    ステップ7 Re:Mindの詳しい言語仕様の学習結果をバブルソートで確認
    ステップ6 Re:Mindの詳しい言語仕様の学習結果を二分探索法で確認
    ステップ5 Re:Mindの詳しい言語仕様の学習結果を線形探索法で確認
    ステップ4 Re:Mindの詳しい言語仕様の学習成果を保持するスコープを確認
    ステップ3 Re:Mindの詳しい言語仕様を学習できる方法を確認
    ステップ2 Re:Mindの言語仕様の認知度を確認
    ステップ1 Re:Mindの認知度を確認

  2. Copilotが生成した日本語トランスコンパイラ言語 Re:MindのASTパーサが動作するまで - Qiita
    「Re:MindのASTパーサが動作するまで」の記事リストです。(ステップ降順)
    ステップ12 いったん生成
    ステップ11
    ステップ10 生成済コードの伝達完了
    ステップ9
    ステップ8
    ステップ7
    ステップ6 生成済コードの伝達開始
    ステップ5
    ステップ4 Program.csが動作
    ステップ3
    ステップ2
    ステップ1 検証環境構築

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?