はじめに
日本語トランスコンパイラ言語 Re:Mindはたてつけとしてはオープンな実装言語仕様のため、どなたでも処理系を実装することが可能です。逆転の発想で生成AIに実装言語仕様を読み込ませて、いくつかの抽象度レベルのプロンプトからトランスコンパイラ的な動きをさせてみようと思っておりましたところ、ほぼ「棚ぼた」でRe:Mindっぽい仕様のASTパーサのテンプレと3言語(Java,C#,VB.NET)のコードジェネレータのテンプレを生成してもらえたので、本記事はその続きとも言える検証編の第2ステップです。
Microsoft Copilot
生成AIはWindows11アプリケーションのMicrosoft Copilotとします。モードは「Smart(GPT5.1)」。サインインした状態で使用します。いじりたおす編第26ステップの後にはサインアウトがあります。
第2ステップ
いじりたおす編第24ステップ、第25ステップで生成されたRe:MindのASTパーサとC#コードジェネレータのC#実装が検証できる環境を本編第1ステップで構築して、引き続きいじりたおす編第24ステップの生成コードのメイン部分の問題点を検討します。Copilotは自ら生成したclass CompilationUnitのコードを認識していないので、その提示から開始してみます。
プロンプト
こちらがコンパイル成功するclass CompilationUnitのコードです。これを踏まえて var unit = new CompilationUnit をちゃんと書くとなるとどうなりますか?
class CompilationUnitのコードはいじりたおす編ステップ24 ASTを生成するサンプル実装をC#で生成を参照してください。プロンプトにはコードを実際に貼り付けています。
生成レスポンス
ありがとうございます。
この AST 構造なら CompilationUnit の正しいインスタンス生成方法は「Namespaces と Imports を埋めたツリーを構築する」ことになります。
つまり、var unit = new CompilationUnit { ... } の中に
- Imports
- Namespaces
- NamespaceDeclaration の中の Classes
- ClassDeclaration の中の Methods
- MethodDeclaration の中の Body
…という階層を作っていく必要があります。
✅ 最小構成の「正しい CompilationUnit インスタンス」例
まずは 最小限の AST を作る例を示します。
(C# のコード生成が動くことを確認するための最小構成)
using ReMindAst;
using ReMindBackend;
var unit = new CompilationUnit
{
// Imports は必要なら追加
Imports =
{
new ImportDeclaration
{
Name = "System",
AliasClasses =
{
new AliasClass
{
OriginalName = "Console",
TranspiledName = "Console",
Members =
{
new AliasMember
{
OriginalName = "WriteLine",
TranspiledName = "WriteLine",
Parameters = { }
}
}
}
}
}
},
// Namespace の追加
Namespaces =
{
new NamespaceDeclaration
{
Name = "SampleNamespace",
Classes =
{
new ClassDeclaration
{
NameJa = "メインクラス",
NameEn = "MainClass",
Modifiers = { "public" },
Methods =
{
new MethodDeclaration
{
NameJa = "挨拶",
NameEn = "Greet",
ReturnType = "void",
Modifiers = { "public", "static" },
Body =
{
new ExpressionStatement
{
Expression = new InvocationExpression
{
Target = new MemberAccessExpression
{
Expression = new IdentifierExpression
{
NameJa = "コンソール",
NameEn = "Console"
},
MemberName = "WriteLine"
},
Arguments =
{
new LiteralExpression { Value = "Hello Re:Mind!" }
}
}
}
}
}
}
}
}
}
}
};
var generator = new CSharpCodeGenerator();
string code = generator.Generate(unit);
Console.WriteLine(code);
🧩 これが AST として正しい理由
あなたの AST 構造は以下の階層になっています:
CompilationUnit
├─ Imports : List<ImportDeclaration>
└─ Namespaces : List<NamespaceDeclaration>
└─ Classes : List<ClassDeclaration>
└─ Methods : List<MethodDeclaration>
└─ Body : List<Statement>
上記のコードはこの構造に完全に従っています。
✨ 生成される C# コードのイメージ(概念)
あなたの CSharpCodeGenerator の実装次第ですが、
おそらく次のようなコードが生成されるはずです:
using System;
namespace SampleNamespace
{
public class MainClass
{
public static void Greet()
{
Console.WriteLine("Hello Re:Mind!");
}
}
}
🎯 次にできること
AST はすでに非常に体系的なので、次のステップとして:
- BubbleSort の Re:Mind → AST → C# 生成 の完全パイプライン
- Java / VB.NET のコードジェネレータの整合性チェック
- Javadoc → XML コメント変換ルールの追加
- AliasClass / AliasMember のマッピングテーブルの自動生成
なども一緒に作れます。
必要であれば、
「mylifewithviolinさんの AST 仕様に完全準拠した最小テンプレート」
も作成できます。
次はどの部分を深掘りしましょうか。
第2ステップの評価
「Smart(GPT5.1)」モードのMicrosoft Copilotは、同一ログインユーザーとのやりとりをログとしては記録して画面上は履歴を出力してくれるのですが、この内容をすべて生成時に認識するわけではないというのが、「いじりたおす」編でのわたしの学習成果だったのですが、今回の応答でも、またこの後の一連のやりとりでもCopilotが生成したコードをわたしが貼り付けたのでわたしが実装したコードと表現するのにも慣れていく必要があります。(すみません、これはぐちです。)Copilotはけっこう近いサンプルとしてvar unit = new CompilationUnitの内容を生成してきましたが、こちらはAst.csに生成済なので、次回そちらと合わせたコードで調整してみます。
おわりに
第2ステップは以上です。次回の方向性は上記のとおりです。
参考情報
目次 Microsoft Copilotで日本語トランスコンパイラ言語 Re:Mindをいじりたおす
「Microsoft Copilotで日本語トランスコンパイラ言語 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の認知度を確認