# 機能設計書 89-グローバル状態

## 概要

本ドキュメントは、F#コンパイラにおけるグローバル型情報（TcGlobals）の管理機能の設計について記述する。TcGlobalsは、コンパイラ全体で使用される組み込み型、組み込み値、ランタイム情報などを一元管理する。

### 本機能の処理概要

**業務上の目的・背景**：
F#コンパイラは、`int`、`string`、`list`などの組み込み型や、`+`、`-`などの組み込み演算子への参照を頻繁に必要とする。TcGlobalsは、これらの情報をコンパイル開始時に一度だけ解決し、コンパイラ全体で共有することで、重複した解決を避け、パフォーマンスを向上させる。

**機能の利用シーン**：
- 型検査での組み込み型の参照
- 最適化での組み込み関数の認識
- コード生成でのIL型情報取得
- パターンマッチでの組み込みパターン生成

**主要な処理内容**：
1. 組み込み型参照（int_tcr, string_tcr, list_tcr等）の提供
2. 組み込み値参照（raise_vref, seq_to_list_vref等）の提供
3. IL型情報（ILType）の提供
4. FSharp.Coreパス情報の管理
5. コンパイラグローバル状態の管理

**関連システム・外部連携**：
- TypedTree: TAST型定義
- FSharp.Core: 標準ライブラリ
- AbstractIL: IL表現

**権限による制御**：
特になし。コンパイラ内部のシングルトン的な構造。

## 関連画面

該当なし（コンパイラ内部機能）

## 機能種別

コンパイラ基盤（グローバル状態管理）

## データ構造仕様

### TcGlobalsクラス

コンパイラ全体で使用されるグローバル情報を保持するクラス。

#### 主要なフィールド（型参照）

| フィールド名 | 型 | 説明 |
|------------|-----|------|
| int_tcr | TyconRef | int型への参照 |
| int32_tcr | TyconRef | int32型への参照 |
| int64_tcr | TyconRef | int64型への参照 |
| string_tcr | TyconRef | string型への参照 |
| bool_tcr | TyconRef | bool型への参照 |
| unit_tcr | TyconRef | unit型への参照 |
| obj_tcr | TyconRef | obj型への参照 |
| list_tcr | TyconRef | list型への参照 |
| option_tcr | TyconRef | option型への参照 |
| array_tcr | TyconRef | array型への参照 |
| seq_tcr | TyconRef | seq型への参照 |

#### 主要なフィールド（値参照）

| フィールド名 | 型 | 説明 |
|------------|-----|------|
| raise_vref | ValRef | raise関数への参照 |
| seq_to_list_vref | ValRef | Seq.toList関数への参照 |
| seq_to_array_vref | ValRef | Seq.toArray関数への参照 |
| cons_ucref | UnionCaseRef | ::コンストラクタへの参照 |
| nil_ucref | UnionCaseRef | []コンストラクタへの参照 |

### FSharpLibモジュール

FSharp.Coreの標準パスを管理。

```fsharp
module FSharpLib =
    let Root = "Microsoft.FSharp"
    let Core = Root + ".Core"
    let Control = Root + ".Control"
    let Collections = Root + ".Collections"
    let Quotations = Root + ".Quotations"
```

### IntrinsicValRef

コンパイラが認識する組み込み値への参照。

```fsharp
type IntrinsicValRef =
    | IntrinsicValRef of
        NonLocalEntityRef *
        string *           // 名前
        bool *             // 拡張メンバーか
        TType *            // 型
        ValLinkagePartialKey
```

## 処理フロー

### TcGlobalsの初期化

```
コンパイル開始
    │
    ▼
FSharp.Core参照の解決
    │
    ├─ mscorlib/System参照
    │
    ├─ FSharp.Core参照
    │
    └─ その他の参照アセンブリ
    │
    ▼
TcGlobals作成
    │
    ├─ 組み込み型参照の解決
    │     ├─ int_tcr, string_tcr, etc.
    │     └─ list_tcr, option_tcr, etc.
    │
    ├─ 組み込み値参照の解決
    │     ├─ raise_vref
    │     └─ seq_to_list_vref, etc.
    │
    └─ IL型情報の設定
          ├─ ilg (ILGlobals)
          └─ IL型マッピング
    │
    ▼
型検査・最適化・コード生成で使用
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-89-01 | 遅延解決 | 一部の参照は使用時に遅延解決 | メモリ効率のため |
| BR-89-02 | FSharp.Core依存 | FSharp.Coreがない環境でも最小限動作 | compilingFSharpCore時 |
| BR-89-03 | 型等価性 | 型参照は同一性で比較 | Stamp比較 |

## 備考

- TcGlobalsはコンパイル単位ごとに1つ
- compilingFSharpCoreフラグでFSharp.Core自身のコンパイルを検出
- CompilerGlobalStateは名前生成器などの可変状態を管理

---

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

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

### 推奨読解順序

#### Step 1: モジュール定義を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | TcGlobals.fs | `src/Compiler/TypedTree/TcGlobals.fs` | FSharpLibモジュール |

#### Step 2: IntrinsicValRefを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | TcGlobals.fs | `src/Compiler/TypedTree/TcGlobals.fs` | IntrinsicValRef型 |

#### Step 3: TcGlobalsクラスを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | TcGlobals.fs | `src/Compiler/TypedTree/TcGlobals.fs` | TcGlobalsクラス |

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| TcGlobals.fs | `src/Compiler/TypedTree/TcGlobals.fs` | ソース | グローバル状態管理 |
| TypedTree.fs | `src/Compiler/TypedTree/TypedTree.fs` | ソース | TAST型定義 |
| CompilerGlobalState.fs | `src/Compiler/Driver/CompilerGlobalState.fs` | ソース | コンパイラ可変状態 |
