# 機能設計書 10-静的リンク

## 概要

本ドキュメントは、F#コンパイラの静的リンク機能の設計を記述する。静的リンクは、F#アプリケーションとその依存アセンブリを単一のアセンブリにマージする機能である。

### 本機能の処理概要

静的リンク機能（StaticLinking）は、--standaloneオプションまたは--staticlink:アセンブリ名オプションを指定した場合に、依存するDLLを出力アセンブリに統合する。

**業務上の目的・背景**：F#アプリケーションをデプロイする際、FSharp.Core.dllやその他の依存アセンブリを同梱する必要がある。静的リンクにより、これらの依存関係を単一のEXE/DLLに統合し、配布と実行を簡素化できる。これは特にコマンドラインツールやスタンドアロンアプリケーションで有用。

**機能の利用シーン**：単一ファイル配布が必要なコマンドラインツール、依存関係を含まない配布パッケージの作成時に使用される。

**主要な処理内容**：
1. 依存アセンブリの検出（FindDependentILModulesForStaticLinking）
2. 静的リンク可能性の検証
3. ILモジュールのマージ（StaticLinkILModules）
4. 型転送の処理（TypeForwarding）
5. リソースと属性のマージ

**関連システム・外部連携**：ILバイナリリーダー（依存アセンブリ読み込み）、ILバイナリライター（出力）と連携する。

**権限による制御**：--standalone、--staticlink:アセンブリ名オプションで静的リンク対象を制御。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 9 | ビルドプロパティページ | 主画面 | スタンドアロン設定（直接サポートは限定的） |

## 機能種別

アセンブリ統合処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| tcConfig | TcConfig | Yes | コンパイラ設定 | standalone有効 |
| ilGlobals | ILGlobals | Yes | ILグローバル情報 | 初期化済み |
| tcImports | TcImports | Yes | インポート情報 | 初期化済み |
| ilxMainModule | ILModuleDef | Yes | メインILモジュール | IL生成済み |

### 入力データソース

- ILコード生成フェーズからのILModuleDef
- 依存アセンブリファイル

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| mergedModule | ILModuleDef | 統合済みILモジュール |
| rewriter | ILScopeRef -> ILScopeRef | スコープ参照書き換え関数 |

### 出力先

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

## 処理フロー

### 処理シーケンス

```
1. 依存検出
   ├─ FindDependentILModulesForStaticLinking
   │      ├─ アセンブリ参照の収集
   │      └─ 依存グラフの構築
   └─ トポロジカルソート

2. 検証
   ├─ EXE静的リンク禁止チェック
   ├─ 混合DLL禁止チェック
   └─ クォーテーション使用チェック

3. ILマージ
   ├─ StaticLinkILModules
   │      ├─ TypeForwarding設定
   │      ├─ 型定義マージ
   │      ├─ リソースマージ
   │      └─ 属性マージ
   └─ スコープ参照書き換え

4. 出力
   └─ 統合済みILModuleDef返却
```

### フローチャート

```mermaid
flowchart TD
    A[ILModuleDef入力] --> B[依存アセンブリ検出]
    B --> C{静的リンク対象?}
    C -->|No| D[そのまま返却]
    C -->|Yes| E[リンク可能性検証]
    E --> F{検証成功?}
    F -->|No| G[エラー報告]
    F -->|Yes| H[ILモジュールマージ]
    H --> I[型転送処理]
    I --> J[リソースマージ]
    J --> K[統合ILModuleDef出力]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | EXE禁止 | 依存EXEの静的リンクは禁止 | 常時 |
| BR-002 | 混合DLL禁止 | ネイティブコード含むDLLは禁止 | 常時 |
| BR-003 | クォーテーション禁止 | FSharp20PlusQuotations使用DLLは禁止 | 常時 |
| BR-004 | 独立セット除外 | mscorlib、System等は静的リンク対象外 | 常時 |

### 計算ロジック

依存グラフはアセンブリ参照から構築される。トポロジカルソートにより、依存順序でアセンブリを処理。TypeForwardingにより、統合後も外部からの型参照が正しく解決されるようにする。

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

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| FS2024 | 静的リンクエラー | EXEの静的リンク試行 | 対象から除外 |
| FS2025 | 混合DLLエラー | ネイティブコード含むDLL | 対象から除外 |
| FS2026 | クォーテーションエラー | クォーテーション使用DLL | 対象から除外 |

### リトライ仕様

静的リンクは決定的処理でありリトライは不要。

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

該当なし

## パフォーマンス要件

- 静的リンクは依存アセンブリ数に線形の時間で完了
- 大規模な依存関係でも合理的な時間で完了

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

- 統合されるアセンブリは信頼されたソースからのものであるべき
- 署名付きアセンブリの静的リンクは署名を無効化

## 備考

静的リンクは.NET自己完結型配布（self-contained deployment）の前身的機能。最新の.NETでは公式のシングルファイル配布機能が推奨される場合もある。

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | StaticLinking.fs | `src/Compiler/Driver/StaticLinking.fs` | TypeForwarding、Node等の定義 |

**読解のコツ**:
- **27-98行目**: TypeForwardingクラス - 型転送処理
- **257-266行目**: Node型 - 依存グラフノード

#### Step 2: 依存検出を理解する

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

**主要処理フロー**:
- **269-300行目**: FindDependentILModulesForStaticLinking関数
- **286-296行目**: assumedIndependentSet - 除外アセンブリセット（mscorlib、System等）

#### Step 3: ILマージを理解する

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

**主要処理フロー**:
- **104-256行目**: StaticLinkILModules関数
- **112-121行目**: クォーテーション使用チェック
- **123-129行目**: EXE・混合DLLチェック
- **148-204行目**: リソースマージ
- **206-228行目**: 型定義マージ

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

```
静的リンク実行
    │
    ├─ FindDependentILModulesForStaticLinking
    │      ├─ computeILRefs（参照収集）
    │      ├─ 依存グラフ構築
    │      └─ トポロジカルソート
    │
    └─ StaticLinkILModules
           ├─ TypeForwarding作成
           ├─ 検証（EXE、混合DLL、クォーテーション）
           ├─ 属性マージ（savedManifestAttrs）
           ├─ リソースマージ（savedResources）
           ├─ 型定義マージ（topTypeDef、normalTypeDefs）
           └─ morphILTypeRefsInILModuleMemoized
```

### データフロー図

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

ilxMainModule      ──▶  依存検出                 ──▶  依存ILModuleリスト
                              │
                              ▼
依存ILModuleリスト  ──▶  検証                    ──▶  検証済みリスト
                              │
                              ▼
検証済みリスト      ──▶  StaticLinkILModules     ──▶  統合ILModuleDef
                                                    + rewriter関数
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| StaticLinking.fs | `src/Compiler/Driver/StaticLinking.fs` | ソース | 静的リンクメイン |
| IL.fs | `src/Compiler/AbstractIL/IL.fs` | ソース | IL定義 |
| ILBinaryReader.fs | `src/Compiler/AbstractIL/ILBinaryReader.fs` | ソース | ILバイナリ読み込み |
| Morphs.fs | `src/Compiler/AbstractIL/Morphs.fs` | ソース | IL変換 |
