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

## 概要

本ドキュメントは、Nimコンパイラにおける型システム機能の設計仕様を記述する。この機能はNim言語の型安全性を支える基盤であり、型の比較、型変換、ジェネリクス、型推論などの型操作を担当する。

### 本機能の処理概要

型システム機能は、Nimの静的型付けを実現するためのコア機能であり、型の比較、変換可能性の判定、型の走査・検索、および型関連のエラーメッセージ生成を行う。

**業務上の目的・背景**：Nimは静的型付け言語であり、コンパイル時に型の整合性を検証することでランタイムエラーを防止する。型システムは、型推論によるプログラマの負担軽減、ジェネリクスによるコード再利用性の向上、そしてサブタイピングや型変換による柔軟性の確保を実現する。この機能は、安全で効率的なコードを生成するための基盤となる。

**機能の利用シーン**：この機能はセマンティック解析フェーズ全体で使用される。具体的には、変数への代入時の型チェック、関数呼び出し時の引数型マッチング、ジェネリック関数のインスタンス化、オーバーロード解決時の候補選択など、型に関わるあらゆる場面で呼び出される。また、型エラーメッセージの生成にも使用される。

**主要な処理内容**：
1. 型関係の判定（等価、サブタイプ、変換可能等）
2. 型の走査と述語検索（containsGarbageCollectedRef等）
3. 継承階層の解析（inheritanceDiff）
4. 型パラメータの解決（ジェネリクス）
5. 型のバックエンド表現の比較
6. 効果システムの互換性チェック

**関連システム・外部連携**：オーバーロード解決（sigmatch.nim）、セマンティック型解析（semtypes.nim）、コード生成（cgen.nim, jsgen.nim）と連携し、型情報を共有する。

**権限による制御**：特になし。型システムは言語のコア機能であり、すべてのコードに適用される。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 24 | nimsuggest con（コンテキスト） | 補助機能 | 型情報の取得処理 |
| 1 | nimコンパイラメイン画面 | 補助機能 | 型チェックはセマンティック解析の一部 |

## 機能種別

型解析 / 型比較 / 型変換

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| t, a, b | PType | Yes | 比較・操作対象の型 | nil可（nil安全な処理） |
| conf | ConfigRef | Yes | コンパイラ設定 | nil不可 |
| marker | IntSet | No | 循環検出用マーカー | 初期化済み |
| predicate | TTypePredicate | No | 型検索用述語関数 | callable |

### 入力データソース

- パーサーが生成したAST内の型情報
- シンボルテーブルの型定義
- ジェネリックインスタンスの型引数

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| TTypeRelation | enum | 型関係（isNone, isEqual, isSubtype等） |
| bool | bool | 型述語の結果（containsX系関数） |
| int | int | 継承距離（inheritanceDiff） |
| string | string | 型の文字列表現（typeToString） |

### 出力先

- 関数戻り値として呼び出し元に返却
- エラーメッセージとして標準エラー出力

## 処理フロー

### 処理シーケンス

```
1. 型の前処理
   └─ skipTypes()でmodifier型をスキップ
2. 型種別の判定
   └─ t.kindで型の種類を特定
3. 型固有の処理
   └─ case文で型種別ごとの処理を実行
4. 再帰的な型走査（必要な場合）
   └─ iterOverType()で子型を走査
5. 結果の返却
   └─ TTypeRelation, bool等を返却
```

### フローチャート

```mermaid
flowchart TD
    A[型比較開始] --> B{型がnil?}
    B -->|Yes| C[isNone返却]
    B -->|No| D[skipTypesで正規化]
    D --> E{型種別判定}
    E -->|tyObject| F[オブジェクト型処理]
    E -->|tyGenericInst| G[ジェネリックインスタンス処理]
    E -->|tyProc| H[プロシージャ型処理]
    E -->|その他| I[基本型処理]
    F --> J{継承関係?}
    J -->|Yes| K[inheritanceDiff計算]
    J -->|No| L[isNone返却]
    K --> M[isSubtype返却]
    G --> N[型引数を再帰比較]
    H --> O[パラメータ型を比較]
    I --> P[直接比較]
    N --> Q[結果返却]
    O --> Q
    P --> Q
    L --> Q
    M --> Q
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-13-01 | 型関係の順序 | TTypeRelationはisNone < isConvertible < ... < isEqualの順 | 型比較時 |
| BR-13-02 | 循環検出 | IntSetマーカーで型の循環参照を検出 | 再帰的型走査時 |
| BR-13-03 | modifier型スキップ | tyGenericInst, tyAlias等は基底型にスキップ | 型比較時 |
| BR-13-04 | 継承距離 | 直接の親子は1、間接は距離に応じて増加、無関係は-1 | inheritanceDiff |
| BR-13-05 | 効果互換性 | raises, tags, forbidsの互換性をチェック | プロシージャ型比較時 |

### 計算ロジック

- 継承距離: `inheritanceDiff(a, b)` - 型aから型bへの継承パス長を計算
- 型分類: `classify(t)` - NoneLike, IntLike, FloatLikeに分類
- 順序型判定: `isOrdinalType(t)` - 整数、文字、列挙型等か判定

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

### 操作別データベース影響一覧

本機能はデータベースを使用しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| typeMismatch | 型エラー | 期待型と実際の型が不一致 | 詳細なエラーメッセージを表示 |
| efRaisesDiffer | 効果エラー | raises効果が不一致 | 効果の差異を報告 |
| efTagsDiffer | 効果エラー | tags効果が不一致 | 効果の差異を報告 |

### リトライ仕様

型比較にリトライ機構はない。エラー発生時は詳細なエラーメッセージを生成し、コンパイルを継続（他のエラーも収集）。

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

該当なし。

## パフォーマンス要件

- 型走査: IntSetマーカーにより循環を検出し、無限ループを防止
- 型比較: 早期リターンにより不要な比較を回避
- メモリ: 型構造体は共有され、コピーは最小限

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

- 型システム自体がセキュリティ機能として機能（型安全性の保証）
- nil安全性の静的検証（strictNotNil）
- 効果システムによる副作用の追跡

## 備考

- TTypeRelationの順序は重要で、オーバーロード解決の優先度に影響
- abstractPtrs, abstractVar等の型集合は頻繁に使用される定数
- 型の文字列化はエラーメッセージの品質に直結

---

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

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

### 推奨読解順序

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

まず、型関係を表す列挙型と型集合定数を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | types.nim | `compiler/types.nim` | TTypeRelation列挙型（24-38行目）: 型関係の種類と順序 |
| 1-2 | types.nim | `compiler/types.nim` | abstractPtrs, abstractVar等の定数（77-91行目）: 型のスキップ対象集合 |
| 1-3 | ast.nim | `compiler/ast.nim` | TTypeKind列挙型: 型の種類を定義 |
| 1-4 | ast.nim | `compiler/ast.nim` | PType構造体: 型情報を保持するオブジェクト |

**読解のコツ**: TTypeRelationは順序が重要で、isNone（不一致）からisEqual（完全一致）まで段階的に関係が強くなる。オーバーロード解決でより強い関係が優先される。

#### Step 2: 型走査の仕組みを理解する

型構造を再帰的に走査する仕組みを把握。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | types.nim | `compiler/types.nim` | TTypeIter型（55行目）: 型イテレータのコールバック型 |
| 2-2 | types.nim | `compiler/types.nim` | iterOverType()関数（228-230行目）: 型走査のエントリーポイント |
| 2-3 | types.nim | `compiler/types.nim` | iterOverTypeAux()関数（208-226行目）: 再帰的な型走査実装 |
| 2-4 | types.nim | `compiler/types.nim` | searchTypeFor()関数（279-281行目）: 述語による型検索 |

**主要処理フロー**:
- **214行**: `containsOrIncl(marker, t.id)` - 循環検出
- **223-225行**: `for a in t.kids` - 子型の再帰走査

#### Step 3: 型述語関数を理解する

特定の性質を持つ型を検出する関数群。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | types.nim | `compiler/types.nim` | containsGarbageCollectedRef()関数（340-343行目）: GC対象を含むか |
| 3-2 | types.nim | `compiler/types.nim` | containsGenericType()関数（1209-1210行目）: ジェネリック型を含むか |
| 3-3 | types.nim | `compiler/types.nim` | containsUnresolvedType()関数（1226-1227行目）: 未解決型を含むか |
| 3-4 | types.nim | `compiler/types.nim` | isOrdinalType()関数（182-188行目）: 順序型かどうか |

#### Step 4: 継承と型変換を理解する

オブジェクト型の継承関係と型変換の判定。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | types.nim | `compiler/types.nim` | safeInheritanceDiff()関数（1243-1248行目）: 安全な継承距離計算 |
| 4-2 | types.nim | `compiler/types.nim` | isPureObject()関数（96-100行目）: 純粋オブジェクト判定 |
| 4-3 | types.nim | `compiler/types.nim` | isException()関数（1587-1596行目）: 例外型判定 |

#### Step 5: 効果システムを理解する

プロシージャ型の効果互換性チェック。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | types.nim | `compiler/types.nim` | EffectsCompat列挙型（1282-1288行目）: 効果互換性の結果 |
| 5-2 | types.nim | `compiler/types.nim` | compatibleEffects()関数（1291-1336行目）: 効果の互換性判定 |
| 5-3 | types.nim | `compiler/types.nim` | getProcConvMismatch()関数（1442-1471行目）: プロシージャ変換の不一致 |

**主要処理フロー**:
- **1305-1313行**: raises効果の比較
- **1315-1322行**: tags効果の比較
- **1324-1329行**: forbids効果の比較

#### Step 6: エラーメッセージ生成を理解する

型エラー時の詳細なメッセージ生成。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 6-1 | types.nim | `compiler/types.nim` | typeMismatch()関数（1519-1549行目）: 型不一致エラーメッセージ |
| 6-2 | types.nim | `compiler/types.nim` | addPragmaAndCallConvMismatch()関数（1473-1492行目）: プラグマ不一致の追加 |

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

```
型比較・走査
    │
    ├─ iterOverType()
    │      └─ iterOverTypeAux()
    │             └─ iterOverNode() [AST内の型を走査]
    │
    ├─ searchTypeFor()
    │      └─ searchTypeForAux()
    │             └─ searchTypeNodeForAux() [ノード内の型を検索]
    │
    ├─ containsGarbageCollectedRef()
    │      └─ searchTypeFor(isGCRef)
    │
    ├─ containsGenericType()
    │      └─ iterOverType(containsGenericTypeIter)
    │
    └─ compatibleEffects()
           ├─ compatibleExceptions()
           └─ compatibleEffectsAux()

型エラー処理
    │
    └─ typeMismatch()
           ├─ typeToString()
           ├─ addDeclaredLoc()
           └─ processPragmaAndCallConvMismatch()
```

### データフロー図

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

PType (型A) ─────────────▶ 型比較関数
PType (型B) ─────────────▶     │
                               ▼
                      skipTypes()で正規化
                               │
                               ▼
                      型種別ごとの比較
                               │
                    ┌──────────┼──────────┐
                    ▼          ▼          ▼
               tyObject   tyProc    tyGeneric
                    │          │          │
                    ▼          ▼          ▼
            継承距離計算  効果比較  型引数比較
                    │          │          │
                    └──────────┼──────────┘
                               ▼
                      TTypeRelation ───────────▶ 型関係（isNone〜isEqual）
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| types.nim | `compiler/types.nim` | ソース | 型操作のメイン実装（約1800行） |
| ast.nim | `compiler/ast.nim` | ソース | PType構造体、TTypeKind列挙型の定義 |
| semtypes.nim | `compiler/semtypes.nim` | ソース | 型のセマンティック解析 |
| sigmatch.nim | `compiler/sigmatch.nim` | ソース | 型マッチングによるオーバーロード解決 |
| renderer.nim | `compiler/renderer.nim` | ソース | typeToString()の実装 |
| astalgo.nim | `compiler/astalgo.nim` | ソース | AST操作ユーティリティ |
