# 機能設計書 6-最適化

## 概要

本ドキュメントは、F#コンパイラの最適化機能の設計を記述する。最適化は、型付き構文木に対して各種変換を適用し、より効率的なコードを生成する機能である。

### 本機能の処理概要

最適化機能は、型チェック後の型付き構文木（TypedTree/TAST）に対して、インライン展開、定数畳み込み、デッドコード除去などの最適化変換を適用し、実行効率の高いコードを生成する。

**業務上の目的・背景**：F#は高水準な関数型言語であり、クロージャやカリー化関数、パターンマッチなどの抽象化を多用する。これらの抽象化を素朴にコード生成すると、関数呼び出しのオーバーヘッドやオブジェクト生成のコストが発生する。最適化により、これらのオーバーヘッドを削減し、高速な実行コードを生成する。

**機能の利用シーン**：Releaseビルド時に適用される。Debugビルドではデバッグ体験を優先して最適化を抑制する。--optimizeオプションで制御可能。

**主要な処理内容**：
1. インライン展開（小さな関数の呼び出し元への展開）
2. 定数畳み込み（コンパイル時計算）
3. デッドコード除去（未使用コードの削除）
4. Beta簡約（即座に呼び出されるラムダの展開）
5. 末尾呼び出し検出
6. ボックス化解除最適化

**関連システム・外部連携**：型チェック（TypedTree入力）、ILコード生成（最適化済みTree出力）と連携する。

**権限による制御**：--optimize+/-オプションで最適化の有効/無効を制御。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 9 | ビルドプロパティページ | 主画面 | 最適化オプション設定 |

## 機能種別

コード最適化処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| typedTree | TypedAssembly | Yes | 型付き構文木 | 型チェック済み |
| tcConfig | TcConfig | Yes | コンパイラ設定 | 初期化済み |
| tcGlobals | TcGlobals | Yes | グローバル型情報 | 初期化済み |
| optEnv | OptimizationEnv | Yes | 最適化環境 | 初期化済み |

### 入力データソース

- 型チェックフェーズからのTypedAssembly

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| optimizedTree | TypedAssembly | 最適化済み型付き構文木 |
| optimizationData | CcuOptimizationInfo | 最適化情報（他プロジェクト参照用） |

### 出力先

- ILコード生成フェーズへの入力

## 処理フロー

### 処理シーケンス

```
1. 最適化環境構築
   ├─ OptimizationEnv初期化
   └─ インポート済みアセンブリの最適化データ取得

2. 最適化パス
   ├─ インライン展開候補検出
   ├─ 定数畳み込み
   ├─ Beta簡約
   ├─ デッドコード除去
   └─ 末尾呼び出し最適化

3. 最適化データ出力
   ├─ モジュール情報エンコード
   └─ 値情報エンコード
```

### フローチャート

```mermaid
flowchart TD
    A[TypedAssembly入力] --> B[最適化環境構築]
    B --> C[インライン候補検出]
    C --> D[定数畳み込み]
    D --> E[Beta簡約]
    E --> F[デッドコード除去]
    F --> G[末尾呼び出し検出]
    G --> H[最適化データエンコード]
    H --> I[最適化済みTree出力]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | インラインサイズ制限 | 一定サイズ以下の関数のみインライン | 常時 |
| BR-002 | 再帰関数制限 | 再帰関数は基本的にインラインしない | 再帰呼び出し検出時 |
| BR-003 | 副作用保持 | 副作用のある式は削除しない | デッドコード除去時 |
| BR-004 | inline関数 | inline修飾子付き関数は強制インライン | inline指定時 |

### 計算ロジック

インライン展開の判定は、関数のサイズ（callSize、forAndWhileLoopSize等の定数で重み付け）と呼び出し回数に基づく。クロージャ生成コスト（closureTotalSize = 10）を考慮し、インライン化のメリットを評価する。

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

該当なし

## エラー処理

### エラーケース一覧

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

### リトライ仕様

最適化は決定的処理でありリトライは不要。

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

該当なし

## パフォーマンス要件

- 最適化自体が過度の時間を消費しない（数秒以内）
- 最適化後のコードは最適化前と比較して20-50%高速化を目標

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

特になし

## 備考

F#の最適化はクロスモジュールインライン化をサポートしており、最適化データをアセンブリに埋め込むことで、参照先アセンブリの関数も呼び出し元でインライン展開可能。

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Optimizer.fs | `src/Compiler/Optimize/Optimizer.fs` | ExprValueInfo、ValInfo、ModuleInfo等の定義 |

**読解のコツ**:
- **55-97行目**: ExprValueInfo - 式の部分的な情報（UnknownValue、ConstValue、CurriedLambdaValue等）
- **98-102行目**: ValInfo - 値の情報
- **167-176行目**: ModuleInfo、LazyModuleInfo - モジュール最適化情報

#### Step 2: サイズ定数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Optimizer.fs | `src/Compiler/Optimize/Optimizer.fs` | サイズ定数定義 |

**主要処理フロー**:
- **37-53行目**: サイズ定数
  - callSize = 1（関数呼び出しコスト）
  - forAndWhileLoopSize = 5
  - tryWithSize = 5
  - closureTotalSize = 10（クロージャ生成コスト）
  - methodDefnTotalSize = 1

#### Step 3: 最適化パスを理解する

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

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

```
ApplyAllOptimizations
    │
    ├─ OptimizeImplFile（ファイルごと）
    │      ├─ OptimizeExpr（式の最適化）
    │      │      ├─ InlineApplication
    │      │      ├─ ConstantFold
    │      │      └─ BetaReduce
    │      │
    │      └─ EliminateDeadCode
    │
    └─ EncodeOptimizationData
           └─ モジュール最適化情報の生成
```

### データフロー図

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

TypedAssembly      ──▶  OptimizeImplFile         ──▶  最適化済みTree
                              │
                              ▼
参照アセンブリ      ──▶  インライン候補取得       ──▶  インライン展開
最適化データ                  │
                              ▼
最適化済みTree      ──▶  EncodeOptimizationData   ──▶  CcuOptimizationInfo
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Optimizer.fs | `src/Compiler/Optimize/Optimizer.fs` | ソース | 最適化メイン |
| OptimizeInputs.fs | `src/Compiler/Driver/OptimizeInputs.fs` | ソース | 最適化統合 |
| DetupleArgs.fs | `src/Compiler/Optimize/DetupleArgs.fs` | ソース | タプル引数最適化 |
| InnerLambdasToTopLevelFuncs.fs | `src/Compiler/Optimize/InnerLambdasToTopLevelFuncs.fs` | ソース | ラムダ持ち上げ |
| LowerStateMachines.fs | `src/Compiler/Optimize/LowerStateMachines.fs` | ソース | 状態機械変換 |
