# 機能設計書: ブートストラップ (No.21)

## 1. 機能概要

### 1.1 機能名
ブートストラップ (koch.nim boot)

### 1.2 機能説明
Nimコンパイラ自身をセルフホスティング方式でビルドするブートストラップ機能。Cソースから始まり、3段階のコンパイルを経てNimコンパイラを構築する。このプロセスにより、コンパイラの一貫性と整合性が保証される。

### 1.3 関連画面
- CLI（コマンドラインインターフェース）

## 2. 機能詳細

### 2.1 入力
| 項目 | 型 | 必須 | 説明 |
|------|-----|------|------|
| args | string | No | コンパイルオプション（例: -d:release, -d:danger） |
| skipIntegrityCheck | bool | No | 整合性チェックをスキップするフラグ |

### 2.2 処理フロー
1. **初期化フェーズ**
   - bundleChecksums(false)を呼び出し、チェックサム依存を準備
   - libFFI使用時はdist/libffiディレクトリを確認・インストール

2. **開始Nimの検索**
   - findStartNim()で既存のNimコンパイラを検索
   - bin/nim、$PATH/nim、または build.sh/build.batからビルド

3. **3段階ブートストラップ**
   - **イテレーション 0**: csourcesAnyから nim1.exe を生成
     - --skipUserCfg --skipParentCfg -d:nimKochBootstrap オプション使用
   - **イテレーション 1**: nim1.exe から nim2.exe を生成
   - **イテレーション 2**: nim2.exe から nim3.exe を生成（整合性チェック時のみ）

4. **整合性検証**
   - sameFileContent()でnim2.exeとnim3.exeを比較
   - 一致すれば成功、不一致なら警告を出力

5. **最終出力**
   - 生成されたコンパイラを bin/nim.exe にコピー

### 2.3 出力
| 項目 | 型 | 説明 |
|------|-----|------|
| bin/nim.exe | 実行ファイル | 生成されたNimコンパイラ |

### 2.4 エラーハンドリング
| エラー条件 | 処理 |
|------------|------|
| 開始Nimが見つからない | build.sh/build.batを実行、失敗時はFAILUREで終了 |
| コンパイルエラー | execの戻り値に基づき終了 |
| 整合性チェック失敗 | 警告を出力（Windowsでは無視） |

## 3. ビジネスルール

### 3.1 制約条件
- Cソース（csourcesAny）が利用可能であること
- 十分なディスク容量があること
- C言語コンパイラ（gcc等）がインストールされていること

### 3.2 ブートオプション
| オプション | 説明 |
|------------|------|
| -d:release | リリースバージョンを生成 |
| -d:danger | 最適化を最大限に有効化 |
| -d:nimUseLinenoise | linenoise対話モードを有効化 |
| -d:leanCompiler | メモリ使用量を削減 |
| -d:nimHasLibFFI | FFIサポートを追加 |

## 4. 技術仕様

### 4.1 使用ライブラリ
- std/os
- std/strutils
- std/parseopt
- std/osproc
- tools/kochdocs
- tools/deps

### 4.2 依存コンポーネント
| コンポーネント | 用途 |
|----------------|------|
| csourcesAny | 初期Nimコンパイラ生成用Cソース |
| dist/checksums | チェックサム検証ライブラリ |
| dist/nimony | nifler/nifmakeツール |

### 4.3 キャッシュ戦略
```nim
let smartNimcache = (if "release" in args or "danger" in args:
                     "nimcache/r_" else: "nimcache/d_") &
                    hostOS & "_" & hostCPU
```

### 4.4 コンパイルコマンド構造
```nim
exec "$# $# $# --nimcache:$# $# --noNimblePath --compileOnly compiler/nim.nim" %
  [nimi, bootOptions, extraOption, smartNimcache, args]
exec "$# jsonscript --noNimblePath --nimcache:$# $# compiler/nim.nim" %
  [nimi, smartNimcache, args]
```

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

### 5.1 推奨読解順序

#### 5.1.1 データ構造の理解
1. **koch.nim 12-30行目**: 定数定義（各種コミットハッシュ）
   - NimbleStableCommit, ChecksumsStableCommit等の依存バージョン管理

2. **koch.nim 149-151行目**: 重要な定数
   ```nim
   const
     compileNimInst = "tools/niminst/niminst"
     distDir = "dist"
   ```

#### 5.1.2 エントリーポイント
3. **koch.nim 720-792行目**: main処理
   - コマンドライン解析とbootコマンドへの分岐

#### 5.1.3 コア処理
4. **koch.nim 346-407行目**: boot関数
   - ブートストラップの中核ロジック

5. **koch.nim 321-340行目**: findStartNim関数
   - 初期Nimコンパイラの検索

### 5.2 読解のコツ

#### テンプレート活用
- `withDir`テンプレート（122-128行目）：一時的なディレクトリ変更
- `doUseCpp`テンプレート（344行目）：C++コンパイル判定

#### 実行パターン
- `exec`：コマンド実行（失敗時は終了）
- `tryExec`：コマンド実行（成功/失敗をboolで返す）

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

```
koch boot
  |
  +-- bundleChecksums(false)
  |     +-- cloneDependency(dist/checksums)
  |     +-- cloneDependency(dist/nimony)
  |
  +-- findStartNim()
  |     +-- findNimImpl()
  |     +-- tryExec("./build.sh") [fallback]
  |
  +-- [Loop: 0..times]
        |
        +-- exec("nim c --compileOnly compiler/nim.nim")
        +-- exec("nim jsonscript compiler/nim.nim")
        +-- sameFileContent(output, i.thVersion)
        +-- copyExe(output, finalDest)
```

### 5.4 データフロー図

```
[csourcesAny/C files]
        |
        v
[build.sh/build.bat] --> [bin/nim (初期)]
        |
        v
[nim1.exe] <-- Iteration 0
        |
        v
[nim2.exe] <-- Iteration 1 (--skipUserCfg等)
        |
        v
[nim3.exe] <-- Iteration 2 (整合性検証用)
        |
        v (一致確認)
[bin/nim.exe] <-- 最終出力
```

### 5.5 関連ファイル一覧

| ファイルパス | 種別 | 役割 |
|-------------|------|------|
| koch.nim | メイン | ブートストラップ制御 |
| compiler/nim.nim | コンパイラ | Nimコンパイラ本体 |
| tools/deps.nim | ユーティリティ | 依存関係管理 |
| tools/kochdocs.nim | ユーティリティ | ドキュメント/補助機能 |
| dist/checksums/ | ライブラリ | チェックサム検証 |
| dist/nimony/ | ツール | nifler/nifmake |
| build.sh | スクリプト | Unix用初期ビルド |
| build.bat | スクリプト | Windows用初期ビルド |

## 6. 変更履歴

| 日付 | 変更者 | 変更内容 |
|------|--------|----------|
| 2026-02-17 | Claude | 初版作成 |
