# 機能設計書 7-ILコード生成

## 概要

本ドキュメントは、F#コンパイラのILコード生成機能の設計を記述する。ILコード生成は、最適化済みの型付き構文木から.NET IL（中間言語）を生成する機能である。

### 本機能の処理概要

ILコード生成機能（IlxGen）は、F#の型付き構文木（TypedTree/TAST）を入力として、.NET CLRで実行可能なIL（Intermediate Language）コードを生成する。

**業務上の目的・背景**：F#コードを.NETプラットフォーム上で実行するには、F#固有の言語構造（判別共用体、レコード、計算式、アクティブパターン等）を.NET CLRのIL命令に変換する必要がある。IlxGenは、F#の高水準な抽象化を効率的なILコードに変換し、.NETエコシステムとの相互運用性を確保する。

**機能の利用シーン**：コンパイルの最終段階で、最適化済みの型付き構文木からILコードを生成する。

**主要な処理内容**：
1. 判別共用体のIL表現生成
2. レコードのIL表現生成
3. クロージャのクラス変換
4. 関数呼び出しのIL命令生成
5. パターンマッチのILコード生成
6. 例外処理のILコード生成
7. デバッグ情報（シーケンスポイント）生成

**関連システム・外部連携**：最適化フェーズ（入力）、ILバイナリライター（出力）と連携する。

**権限による制御**：特になし。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | ILコード生成は直接的なUI画面を持たない |

## 機能種別

コード生成処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| optimizedTree | TypedAssembly | Yes | 最適化済み型付き構文木 | 型チェック・最適化済み |
| tcGlobals | TcGlobals | Yes | グローバル型情報 | 初期化済み |
| ilxGenEnv | IlxGenEnv | Yes | ILコード生成環境 | 初期化済み |

### 入力データソース

- 最適化フェーズからのTypedAssembly

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ilModule | ILModuleDef | ILモジュール定義 |
| ilTypeDefs | ILTypeDef list | IL型定義リスト |

### 出力先

- ILバイナリライター（WriteILBinaryFile）への入力

## 処理フロー

### 処理シーケンス

```
1. 初期化
   ├─ IlxAssemblyGenerator作成
   └─ IlxGenEnv初期化

2. 型定義生成
   ├─ 判別共用体のクラス生成
   ├─ レコードのクラス生成
   └─ 例外型の生成

3. メソッド本体生成
   ├─ 式のILコード生成（GenExpr）
   ├─ パターンマッチのILコード生成
   └─ 関数呼び出しのIL生成

4. クロージャ生成
   ├─ クロージャクラス生成
   └─ キャプチャ変数のフィールド生成

5. メタデータ生成
   ├─ カスタム属性生成
   └─ デバッグ情報生成
```

### フローチャート

```mermaid
flowchart TD
    A[TypedAssembly入力] --> B[IlxAssemblyGenerator作成]
    B --> C[型定義生成]
    C --> D[メソッド本体生成]
    D --> E[クロージャクラス生成]
    E --> F[デバッグ情報生成]
    F --> G[ILModuleDef出力]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | クロージャ変換 | クロージャは内部クラスに変換 | ラムダ式使用時 |
| BR-002 | 末尾呼び出し | tail.プレフィックス付きcall/callvirt | 末尾位置の呼び出し |
| BR-003 | 判別共用体表現 | タグフィールド + ケースクラス継承 | 判別共用体定義時 |
| BR-004 | シーケンスポイント | デバッグ用ソース位置情報 | デバッグビルド時 |

### 計算ロジック

F#の高水準構造は以下のようにILに変換される：
- 判別共用体：基底クラス + 各ケース用派生クラス
- レコード：プロパティ付きsealed class
- クロージャ：キャプチャ変数をフィールドに持つクラス

## データベース操作仕様

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 内部エラー | IL生成中の不整合 | バグ報告 |

### リトライ仕様

ILコード生成は決定的処理でありリトライは不要。

## トランザクション仕様

該当なし

## パフォーマンス要件

- コード生成は線形時間で完了
- 大規模プロジェクトでも合理的な時間で完了

## セキュリティ考慮事項

- 生成されるILコードは検証可能（verifiable）である

## 備考

IlxGenはF#固有の拡張IL（ILX）を中間表現として使用し、最終的に標準ILに変換される。

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | IL.fs | `src/Compiler/AbstractIL/IL.fs` | ILModuleDef、ILTypeDef、ILMethodDef等の定義 |
| 1-2 | IlxGen.fs | `src/Compiler/CodeGen/IlxGen.fs` | 生成環境と補助関数 |

**読解のコツ**:
- **48-60行目**: ヘルパー関数（DropErasedTypars、DropErasedTyargs等）
- **61-74行目**: IL命令生成ヘルパー（iLdcZero、iLdcInt64等）

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | IlxGen.fs | `src/Compiler/CodeGen/IlxGen.fs` | GenerateIlxCode関数 |

#### Step 3: 式の変換を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | IlxGen.fs | `src/Compiler/CodeGen/IlxGen.fs` | GenExpr関数 |

#### Step 4: 型定義生成を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | IlxGen.fs | `src/Compiler/CodeGen/IlxGen.fs` | 判別共用体・レコードの生成 |

### プログラム呼び出し階層図

```
GenerateIlxCode
    │
    ├─ GenModuleDef（モジュール生成）
    │      ├─ GenTypeDef（型定義生成）
    │      │      ├─ GenUnionDef（判別共用体）
    │      │      ├─ GenRecordDef（レコード）
    │      │      └─ GenExceptionDef（例外）
    │      │
    │      └─ GenMethodDef（メソッド生成）
    │             └─ GenExpr（式のIL生成）
    │
    └─ GenClosureTypeDef（クロージャ生成）
```

### データフロー図

```
[入力]                     [処理]                           [出力]

TypedAssembly      ──▶  型定義生成              ──▶  ILTypeDef list
                              │
                              ▼
Expr（式）          ──▶  GenExpr                ──▶  ILInstr list
                              │
                              ▼
クロージャ情報      ──▶  クロージャクラス生成    ──▶  ILTypeDef
                              │
                              ▼
全体               ──▶  ILModuleDef構築         ──▶  ILModuleDef
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| IlxGen.fs | `src/Compiler/CodeGen/IlxGen.fs` | ソース | ILコード生成メイン |
| IlxGenSupport.fs | `src/Compiler/CodeGen/IlxGenSupport.fs` | ソース | ILコード生成サポート |
| IL.fs | `src/Compiler/AbstractIL/IL.fs` | ソース | IL定義 |
| ilwrite.fs | `src/Compiler/AbstractIL/ilwrite.fs` | ソース | ILバイナリ書き出し |
| CreateILModule.fs | `src/Compiler/Driver/CreateILModule.fs` | ソース | ILモジュール構築統合 |
