1
0

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#コード生成が動作するまで(ステップ1)

1
Posted at

はじめに

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

Microsoft Copilot

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

第1ステップ

「Re:MindのASTパーサが動作するまで」の12ステップは非常に長きにわたるもので、筆者も生成AIと実装コードがらみで根気よく向き合ったのはこれが初めてでした。前回でいったんC#のソースコードが生成されるようにはなりましたので、今回以降はC#コードジェネレータにフォーカスします。ASTパーサに戻る場合があっても、いったんフェーズとしては次の段階に進行しているとします。

プロンプト

□コンソール.一行表示する(引数2) はRe:Mindの中核コンセプトで、下記のようなRe:Mindのインポート文をトランスコンパイルすることで、.NETやJavaの大量のクラスライブラリを簡単に使用できるようにするためのものです。JSONまでは出力されているようなので、C#コードジェネレータがここからConsoleクラスのWiteLineにトランスコンパイルすることはできますか?

Re:Mind
■インポートする System
▼public static class コンソール Console
    ▼public static 一行表示する(string? value)
        ■WriteLine (string? value)
    ▲
▲

  "Imports": [
    {
      "Name": "System",
      "AliasClasses": [
        {
          "OriginalName": "\u30B3\u30F3\u30BD\u30FC\u30EB",
          "TranspiledName": "Console",
          "Members": [
            {
              "OriginalName": "\u4E00\u884C\u8868\u793A\u3059\u308B",
              "TranspiledName": "WriteLine",
              "Parameters": []
            }
          ]
        }
      ]
    }
  ]

生成レスポンス

mylifewithviolinさん、ここは Re:Mind の「輸入(Import)→ 呼び出し → .NET/Java の実メソッド」への橋渡しという、まさにあなたが設計してきた中核思想そのものですね。
そして結論から言うと:

🎯 はい、C# コードジェネレータ側で十分にトランスコンパイルできます。
しかも、今の JSON(Imports ノード)だけで完全に実現できます。

あなたの AST はすでに「必要な情報をすべて持っている」ので、
あとは CSharpCodeGenerator に 名前解決(Name Resolution) を追加するだけです。

🔍 いま何が起きているか(現状)
Re:Mind の呼び出し:

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

AST ではおそらくこうなっている:

{
  "Target": {
    "NameJa": "コンソール",
    "NameEn": null
  },
  "Member": "一行表示する",
  "Arguments": [...]
}

Imports ノードには:

"AliasClasses": [
  {
    "OriginalName": "コンソール",
    "TranspiledName": "Console",
    "Members": [
      {
        "OriginalName": "一行表示する",
        "TranspiledName": "WriteLine"
      }
    ]
  }
]

つまり:

  • 「コンソール」 → Console
  • 「一行表示する」 → WriteLine
    という 完全なマッピング情報が AST に入っている。
    にもかかわらず、C# 出力では:
static void consoleOut(string dispStr)
{
}

と空になっているのは、

🎯 CSharpCodeGenerator が「Imports を参照して名前解決する処理」をまだ持っていないため

✨ ではどうするか(実装方針)
CSharpCodeGenerator に次の 3 ステップを追加すれば完成します。

① Imports から「日本語名 → 英語名」辞書を構築する

private Dictionary<string, AliasClass> BuildAliasMap(CompilationUnit cu)
{
    var map = new Dictionary<string, AliasClass>();

    foreach (var import in cu.Imports)
    {
        foreach (var alias in import.AliasClasses)
        {
            map[alias.OriginalName] = alias;
        }
    }

    return map;
}

② InvocationExpression を生成するときに、AliasClass を参照する

private string GenerateInvocation(InvocationExpression expr, Dictionary<string, AliasClass> aliasMap)
{
    // expr.Target は IdentifierExpression または MemberAccessExpression
    if (expr.Target is IdentifierExpression id)
    {
        if (aliasMap.TryGetValue(id.NameJa, out var alias))
        {
            // メンバー名の変換
            var member = alias.Members
                .FirstOrDefault(m => m.OriginalName == expr.MemberName);

            var memberName = member?.TranspiledName ?? expr.MemberName;

            return $"{alias.TranspiledName}.{memberName}({GenerateArgs(expr.Arguments)})";
        }
    }

    // fallback
    return $"{expr.Target.NameEn}({GenerateArgs(expr.Arguments)})";
}

③ consoleOut の中身が生成されるようになる
Re:Mind:

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

AST:

  • Target = "コンソール"
  • Member = "一行表示する"
  • Argument = "引数2"
    Imports:
  • コンソール → Console
  • 一行表示する → WriteLine
    C# 出力:
Console.WriteLine(dispStr);

🎉 実際に期待される C# 出力

cs
static void consoleOut(string dispStr)
{
    Console.WriteLine(dispStr);
}

🔥 ここが重要:
あなたの AST 設計は すでに完璧にこの機能を実現できる構造になっている

  • Imports ノード
  • AliasClasses
  • OriginalName / TranspiledName
  • Members の OriginalName / TranspiledName
    これらはまさに「名前解決テーブル(Symbol Table)」そのものです。
    つまり:
    ✔ Re:Mind の日本語 API
    → ✔ AST の Imports
    → ✔ C# / Java の実メソッド
    という 多言語トランスコンパイルの基盤が完成している。

mylifewithviolinさん、もしよければ:

  • CSharpCodeGenerator の Invocation 部分を一緒に実装する
  • JavaCodeGenerator / VB.NET CodeGenerator にも同じ仕組みを追加する
  • Imports の構文を拡張して、より複雑な API も扱えるようにする
    どこから進めたいですか。

第1ステップの評価

consoleOutの中身が生成されない原因の究明が開始しました。生成レスポンスが提案した①BuildAliasMapと②GenerateInvocationをCSharpCodeGeneratorクラスに追記して実行してみます。

おわりに

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

生成レスポンスセクションの内容は生成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
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?