# 機能設計書 4-コア初期化

## 概要

本ドキュメントは、mrubyのコアモジュール初期化機能の設計を記述する。シンボルテーブル・クラス・オブジェクト・カーネル等のコアモジュールを順次初期化する。

### 本機能の処理概要

コア初期化は`mrb_init_core()`関数により、mrubyランタイムに必要な全コアモジュールを決められた順序で初期化する。各モジュールの初期化後にGCアリーナを復元し、初期化時の一時オブジェクトがGC対象となるようにする。

**業務上の目的・背景**：mrubyのクラス階層やメソッド定義はC言語側で静的に構築される。この初期化処理がRubyプログラムの実行基盤を形成する。初期化順序はクラス間の依存関係により厳密に決められている（例：ClassクラスはObjectクラスより先に初期化される必要がある）。

**機能の利用シーン**：`mrb_open()`/`mrb_open_core()`の内部で自動的に呼び出される。直接呼び出すことはない。

**主要な処理内容**：
1. シンボルテーブル初期化（`mrb_init_symtbl`）
2. Class/Module/Object階層の初期化（`mrb_init_class`）
3. Objectクラスの初期化（`mrb_init_object`）
4. Kernelモジュールの初期化（`mrb_init_kernel`）
5. Enumerableモジュールの初期化
6. Symbol/String/Exception/Proc/Array/Hash/Numeric/Rangeの各クラス初期化
7. GCモジュールの初期化
8. バージョン定数の定義
9. mrblibの初期化

**関連システム・外部連携**：各コアモジュール実装ファイル（class.c, object.c, kernel.c等）。

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | 画面機能マッピングにデータなし |

## 機能種別

初期化処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| mrb | mrb_state* | Yes | mrubyインタプリタ状態 | NULLでないこと |

### 入力データソース

なし（内部的にコア定義を構築する）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| なし | void | mrb_stateの各フィールドが初期化される |

### 出力先

mrb_state構造体の各クラスポインタ（object_class, class_class, string_class等）。

## 処理フロー

### 処理シーケンス

```
1. mrb_init_symtbl(mrb) - シンボルテーブル初期化
   └─ GCアリーナ復元
2. mrb_init_class(mrb) - Class/Module/Object階層構築
   └─ GCアリーナ復元
3. mrb_init_object(mrb) - NilClass/TrueClass/FalseClass定義
   └─ GCアリーナ復元
4. mrb_init_kernel(mrb) - Kernelモジュールメソッド定義
   └─ GCアリーナ復元
5. mrb_init_enumerable(mrb) - Enumerableモジュール
   └─ GCアリーナ復元
6-14. 残りのコアクラス初期化（Symbol, String, Exception, Proc, Array, Hash, Numeric, Range, GC, Version, mrblib）
   └─ 各々GCアリーナ復元
```

### フローチャート

```mermaid
flowchart TD
    A[mrb_init_core] --> B[mrb_init_symtbl]
    B --> C[DONE: arena restore]
    C --> D[mrb_init_class]
    D --> E[DONE]
    E --> F[mrb_init_object]
    F --> G[DONE]
    G --> H[mrb_init_kernel]
    H --> I[DONE]
    I --> J[mrb_init_enumerable ... mrb_init_mrblib]
    J --> K[初期化完了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 初期化順序 | クラス依存関係に基づく厳密な初期化順序 | 全コア初期化 |
| BR-02 | GCアリーナ復元 | 各モジュール初期化後にarena_idx=0に復元 | DONEマクロ |

### 計算ロジック

特になし。

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

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 各種例外 | 初期化失敗 | メモリ不足等で各init関数が失敗 | mrb_core_init_protectで捕捉 |

### リトライ仕様

リトライ機構なし。

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

該当なし

## パフォーマンス要件

特になし。起動時に一度だけ実行される。

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

特になし。

## 備考

- init.cは51行の非常にコンパクトなファイル
- `DONE`マクロは`mrb_gc_arena_restore(mrb, 0)`の短縮形
- 初期化順序を変更するとクラス依存関係の問題で動作不良になる可能性がある

---

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

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

### 推奨読解順序

#### Step 1: 初期化の全体構成を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | init.c | `src/init.c` | mrb_init_core()（28-50行目）: 16個の初期化関数の呼び出し順序 |

**読解のコツ**: `DONE`マクロ（27行目）は`mrb_gc_arena_restore(mrb, 0)`の略。各初期化でGCアリーナに蓄積されたオブジェクトを解放するため。

#### Step 2: 各初期化関数のプロトタイプを確認する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | init.c | `src/init.c` | 関数プロトタイプ宣言（9-25行目）: 16個のinit関数 |

**主要処理フロー**:
1. **31行目**: mrb_init_symtbl - シンボルテーブル（最初に必要）
2. **33行目**: mrb_init_class - Class/Module階層（2番目に必要）
3. **34行目**: mrb_init_object - Object/NilClass/TrueClass/FalseClass
4. **35行目**: mrb_init_kernel - Kernelモジュール
5. **36行目**: mrb_init_enumerable - Enumerableモジュール
6. **38-48行目**: 残りのコアモジュール

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

```
mrb_init_core()
    │
    ├─ mrb_init_symtbl() ─── シンボルテーブル
    ├─ mrb_init_class() ─── Class/Module/Object階層
    ├─ mrb_init_object() ─── NilClass/TrueClass/FalseClass
    ├─ mrb_init_kernel() ─── Kernelモジュール
    ├─ mrb_init_enumerable() ─── Enumerable
    ├─ mrb_init_symbol() ─── Symbolクラス
    ├─ mrb_init_string() ─── Stringクラス
    ├─ mrb_init_exception() ─── 例外クラス階層
    ├─ mrb_init_proc() ─── Procクラス
    ├─ mrb_init_array() ─── Arrayクラス
    ├─ mrb_init_hash() ─── Hashクラス
    ├─ mrb_init_numeric() ─── Numericクラス階層
    ├─ mrb_init_range() ─── Rangeクラス
    ├─ mrb_init_gc() ─── GCモジュール
    ├─ mrb_init_version() ─── バージョン定数
    └─ mrb_init_mrblib() ─── mrblib（Rubyで書かれた標準ライブラリ）
```

### データフロー図

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

mrb_state* ──────────────▶ mrb_init_core()              ──▶ mrb_state*
(未初期化)                  │                                (クラス階層構築済み)
                           ├─ シンボルテーブル構築
                           ├─ クラス階層構築
                           └─ メソッド定義
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| init.c | `src/init.c` | ソース | コア初期化のオーケストレーション |
| class.c | `src/class.c` | ソース | mrb_init_class()の実装 |
| object.c | `src/object.c` | ソース | mrb_init_object()の実装 |
| kernel.c | `src/kernel.c` | ソース | mrb_init_kernel()の実装 |
| symbol.c | `src/symbol.c` | ソース | mrb_init_symtbl()/mrb_init_symbol()の実装 |
| string.c | `src/string.c` | ソース | mrb_init_string()の実装 |
| error.c | `src/error.c` | ソース | mrb_init_exception()の実装 |
| proc.c | `src/proc.c` | ソース | mrb_init_proc()の実装 |
| array.c | `src/array.c` | ソース | mrb_init_array()の実装 |
| hash.c | `src/hash.c` | ソース | mrb_init_hash()の実装 |
| numeric.c | `src/numeric.c` | ソース | mrb_init_numeric()の実装 |
| range.c | `src/range.c` | ソース | mrb_init_range()の実装 |
| version.c | `src/version.c` | ソース | mrb_init_version()の実装 |
