# 機能設計書 55-IL型システム

## 概要

本ドキュメントは、F#コンパイラにおけるIL（Intermediate Language）抽象構文の型システム定義について記述する。

### 本機能の処理概要

.NET CLIの中間言語（IL）を表現するための抽象構文木（AST）およびデータ型を定義するモジュール。コンパイラ内部でIL操作を行うための基盤となる型システムを提供する。

**業務上の目的・背景**：F#コンパイラは、F#ソースコードを.NET ILに変換して出力する。本機能はILの各構成要素（モジュール、型、メソッド、フィールド、命令等）を表現するための型定義を提供し、コンパイラ内部でのIL操作を可能にする。

**機能の利用シーン**：
- F#コンパイラでの型情報管理
- ILリーダー/ライターでのデータ構造
- コード最適化での中間表現
- IntelliSenseでの型情報表示

**主要な処理内容**：
1. ILモジュール/アセンブリの表現（ILModuleDef, ILAssemblyRef）
2. 型定義の表現（ILTypeDef, ILTypeRef, ILTypeSpec）
3. メソッド/フィールドの表現（ILMethodDef, ILFieldDef）
4. IL命令の表現（ILCode, ILInstr）
5. カスタム属性の表現（ILAttribute）
6. 署名とトークンの表現

**関連システム・外部連携**：
- ILリーダー（ilread.fs）
- ILライター（ilwrite.fs）
- F#型システム（TypedTree）

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | 内部データ構造のため画面連携なし |

## 機能種別

データ構造定義

## 入力仕様

本機能は型定義のため入力パラメータはない。

## 出力仕様

本機能は型定義のため出力データはない。

## データ構造

### 主要な型定義

#### モジュール/アセンブリ関連

| 型名 | 説明 |
|------|------|
| ILModuleDef | ILモジュール定義（アセンブリのメインコンポーネント） |
| ILAssemblyRef | アセンブリ参照（外部アセンブリへの参照） |
| ILModuleRef | モジュール参照 |
| PublicKey | 公開鍵（PublicKey/PublicKeyToken） |
| ILVersionInfo | バージョン情報（Major.Minor.Build.Revision） |

#### 型定義関連

| 型名 | 説明 |
|------|------|
| ILTypeDef | 型定義（クラス、構造体、インターフェース等） |
| ILTypeRef | 型参照 |
| ILTypeSpec | 型仕様（ジェネリック引数付き） |
| ILType | IL型（プリミティブ、配列、ポインタ等） |
| ILGenericParameterDef | ジェネリックパラメータ定義 |

#### メンバー関連

| 型名 | 説明 |
|------|------|
| ILMethodDef | メソッド定義 |
| ILFieldDef | フィールド定義 |
| ILPropertyDef | プロパティ定義 |
| ILEventDef | イベント定義 |
| ILMethodRef | メソッド参照 |
| ILFieldRef | フィールド参照 |

#### コード関連

| 型名 | 説明 |
|------|------|
| ILCode | ILコード（メソッド本体） |
| ILInstr | IL命令 |
| ILLocal | ローカル変数 |
| ILExceptionSpec | 例外仕様 |

#### 属性関連

| 型名 | 説明 |
|------|------|
| ILAttribute | カスタム属性 |
| ILAttributeElement | 属性要素値 |
| ILSecurityDecl | セキュリティ宣言 |

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-55-01 | 名前空間分割 | 名前空間はドット区切りでリストに分割・キャッシュ | 常時 |
| BR-55-02 | SHA1ハッシュ | 公開鍵トークンはSHA1ハッシュの下位8バイト | 署名時 |
| BR-55-03 | PrimaryAssembly | mscorlib/System.Runtime/netstandard を識別 | 参照解決時 |
| BR-55-04 | 遅延評価 | 大きなコレクションはInterruptibleLazyで遅延評価 | メモリ効率化 |

## エラー処理

本機能は型定義のため、直接的なエラー処理はない。型コンストラクタでのパラメータ検証のみ。

## パフォーマンス要件

- 名前空間分割結果のキャッシュ（ConcurrentDictionary）
- LazyOrderedMultiMapによる遅延評価と高速ルックアップ
- InterruptibleLazyによる中断可能な遅延評価

## 備考

- グローバルミュータブルステート（名前空間キャッシュ）は並行安全
- logging = falseでリリースビルド

---

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

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

### 推奨読解順序

#### Step 1: 基本ユーティリティを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | il.fs | `src/Compiler/AbstractIL/il.fs` | splitNamespace関数（98-99行目）で名前空間分割を理解 |
| 1-2 | il.fs | `src/Compiler/AbstractIL/il.fs` | LazyOrderedMultiMap（172-206行目）で遅延コレクションを理解 |
| 1-3 | il.fs | `src/Compiler/AbstractIL/il.fs` | SHA1モジュール（218-358行目）でハッシュ計算を理解 |

#### Step 2: 基本型を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | il.fs | `src/Compiler/AbstractIL/il.fs` | ILVersionInfo（365-382行目）でバージョン表現を理解 |
| 2-2 | il.fs | `src/Compiler/AbstractIL/il.fs` | PublicKey（387-400行目）で公開鍵を理解 |
| 2-3 | il.fs | `src/Compiler/AbstractIL/il.fs` | PrimaryAssembly（42-59行目）でプライマリアセンブリ識別を理解 |

#### Step 3: 名前空間キャッシュを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | il.fs | `src/Compiler/AbstractIL/il.fs` | memoizeNamespaceTable（67行目）でグローバルキャッシュを理解 |

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

```
IL型システム
    │
    ├─ ユーティリティ
    │      ├─ splitNamespace (名前空間分割)
    │      ├─ splitILTypeName (型名分割)
    │      └─ sha1HashBytes (SHA1ハッシュ)
    │
    ├─ 基本型
    │      ├─ ILVersionInfo (バージョン)
    │      ├─ PublicKey (公開鍵)
    │      └─ PrimaryAssembly (プライマリアセンブリ)
    │
    ├─ コレクション
    │      └─ LazyOrderedMultiMap (遅延マップ)
    │
    └─ IL抽象構文（il.fsの後半で定義）
           ├─ ILModuleDef
           ├─ ILTypeDef
           ├─ ILMethodDef
           └─ ... その他多数
```

### データフロー図

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

型名文字列            ──▶  splitNamespace            ──▶  名前空間リスト
       │
       ▼
名前空間リスト        ──▶  キャッシュ保存            ──▶  高速再利用
       │
       ▼
公開鍵バイト列        ──▶  sha1HashBytes             ──▶  公開鍵トークン
       │
       ▼
遅延データ            ──▶  LazyOrderedMultiMap       ──▶  高速ルックアップ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| il.fs | `src/Compiler/AbstractIL/il.fs` | ソース | IL抽象構文の型定義（本体） |
| il.fsi | `src/Compiler/AbstractIL/il.fsi` | シグネチャ | IL抽象構文の公開API |
| ilread.fs | `src/Compiler/AbstractIL/ilread.fs` | ソース | IL型の読み込み |
| ilwrite.fs | `src/Compiler/AbstractIL/ilwrite.fs` | ソース | IL型の書き込み |
