# 画面設計書 3-nim cpp（C++コード生成）

## 概要

本ドキュメントは、NimソースコードをC++言語にコンパイルするサブコマンド`nim cpp`のCLIインターフェース設計書です。

### 本画面の処理概要

`nim cpp`コマンドは、Nim言語で書かれたソースコードをC++言語の中間コードに変換し、外部C++コンパイラ（g++、clang++、MSVC等）を呼び出して最終的な実行ファイルを生成するサブコマンドです。C++ライブラリとの連携や、C++固有の機能（例外処理、テンプレート等）を活用する際に使用されます。

**業務上の目的・背景**：既存のC++ライブラリやフレームワークとNimコードを統合する必要がある場合に使用します。C++の例外システムを活用したい場合や、C++のみで提供されるライブラリ（Qt、Boost等）との連携時に特に重要です。また、C++のRTTIやテンプレート機能を活用するプロジェクトでも使用されます。

**画面へのアクセス方法**：ターミナルから`nim cpp <filename.nim>`または`nim compiletocpp <filename.nim>`を実行します。

**主要な操作・処理内容**：
1. Nimソースファイルの字句解析・構文解析
2. 意味解析（型チェック、名前解決、マクロ展開）
3. 中間表現からC++コードへの変換（cgen.nimをC++モードで使用）
4. 生成されたC++コードをnimcacheディレクトリに出力
5. 外部C++コンパイラの呼び出し
6. リンカによる実行ファイル生成

**画面遷移**：
- 入力元：`nim`メインコマンドから`cmdCompileToCpp`として呼び出し
- 遷移先：なし（コンパイル完了後終了）、`--run`オプション時は生成バイナリを実行

**権限による表示制御**：OSのファイルシステム権限に依存。nimcacheディレクトリおよび出力先への書き込み権限が必要です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 5 | Cコード生成 | 主機能 | NimコードからC++ソースコードを生成（cgen.nimを共用） |
| 11 | 外部Cコンパイラ連携 | 補助機能 | C++コンパイラとの連携によるバイナリ生成 |

## 画面種別

CLIサブコマンド（コンパイラバックエンド）

## URL/ルーティング

```
nim cpp [options] <projectfile.nim>
nim compiletocpp [options] <projectfile.nim>
```

オプション例：
- `nim cpp hello.nim` - デフォルト設定でC++コンパイル
- `nim cpp -d:release hello.nim` - リリースビルド
- `nim cpp --exceptions:cpp hello.nim` - C++例外を使用
- `nim cpp -r hello.nim` - コンパイル後に実行
- `nim cpp --passC:"-std=c++17" hello.nim` - C++17規格を指定

## 入出力項目

| 項目名 | 型 | 入力/出力 | 必須 | 説明 |
|--------|-----|----------|------|------|
| projectfile | string | 入力 | はい | コンパイル対象のNimソースファイル |
| --exceptions:cpp | flag | 入力 | いいえ | C++例外システムを使用 |
| --passC:OPTIONS | string | 入力 | いいえ | C++コンパイラに渡す追加オプション |
| -d:NAME | string | 入力 | いいえ | 条件コンパイルシンボル定義 |
| -o:FILE | string | 入力 | いいえ | 出力ファイルパス |
| *.cpp | file | 出力 | - | 生成されたC++ソースファイル |
| executable | file | 出力 | - | 最終実行ファイル |

## 表示項目

| 項目 | 説明 | 表示条件 |
|------|------|----------|
| CC: filename | コンパイル中のC++ファイル | --listCmd有効時 |
| Hint: [Link] | リンク処理開始 | デフォルト |
| Hint: [Success] | コンパイル成功と出力パス | デフォルト |
| C++コンパイラ出力 | C++コンパイラの警告・エラー | コンパイル時 |

## イベント仕様

### 1-コンパイル開始

`nim cpp`コマンドは内部的に`cmdCompileToCpp`として処理され、`commandCompileToC`関数が呼び出されます。backendがbackendCppに設定されることで、C++コード生成モードになります。

### 2-C++固有の設定

C++バックエンド使用時の特別な設定：
- `conf.backend = backendCpp`
- `conf.exc = excCpp`（デフォルトでC++例外使用）
- `compileToCpp`フラグがtrueに設定

### 3-C++コード生成

cgen.nimはC++モードで動作：
- `compileToCpp`テンプレートで判定（cgen.nim 行357-358）
- C++固有の構文（クラス、テンプレート等）を生成
- 継承階層がC++のクラス継承として出力

### 4-外部コンパイラ呼び出し

C++コンパイラ（g++、clang++、cl.exe等）が呼び出されます。

## データベース更新仕様

本CLIツールはデータベースを使用しません。

### ファイルシステム操作

| 操作 | 対象 | 種別 | 概要 |
|------|------|------|------|
| コンパイル | *.nim | READ | Nimソースファイル読み込み |
| コンパイル | nimcache/*.cpp | WRITE | 生成C++ソースファイル出力 |
| コンパイル | nimcache/*.hpp | WRITE | 生成ヘッダファイル出力 |
| リンク | 実行ファイル | WRITE | 最終バイナリ出力 |

## メッセージ仕様

| メッセージ種別 | メッセージ | 発生条件 |
|---------------|----------|----------|
| ヒント | "Hint: [Link]" | リンク処理開始時 |
| ヒント | "Hint: [Success] ..." | コンパイル成功時 |
| エラー | "Error: C++ compiler not found" | C++コンパイラ不在時 |
| 警告 | C++コンパイラからの警告 | C++コンパイル時 |

## 例外処理

| 状態 | エラーメッセージ | 処理 |
|------|-----------------|------|
| ソースファイル不在 | "cannot open file: $1" | エラー終了 |
| C++コンパイラエラー | C++コンパイラのエラーメッセージ | エラー終了 |
| リンクエラー | リンカからのエラーメッセージ | エラー終了 |

## 備考

- C++バックエンドではデフォルトで`--exceptions:cpp`が有効
- `{.emit.}`プラグマでC++コードを直接埋め込み可能
- C++テンプレートの利用には`{.importcpp.}`プラグマを使用
- オブジェクトの継承はC++クラス継承としてコンパイル
- `sfCompileToCpp`フラグで個別モジュール単位のC++コンパイルも可能

---

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

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

### 推奨読解順序

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

C/C++コード生成で共通のデータ構造を把握します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | options.nim | `compiler/options.nim` | TBackend列挙型（backendCpp）、ExceptionSystem（excCpp） |
| 1-2 | cgendata.nim | `compiler/cgendata.nim` | BModule型のフラグ |

**読解のコツ**: `backendCpp`と`excCpp`の組み合わせがC++バックエンドの特徴。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | main.nim | `compiler/main.nim` | customizeForBackend関数（行261-282）でbackendCppの設定 |
| 2-2 | commands.nim | `compiler/commands.nim` | parseCommand "cpp" -> cmdCompileToCpp |

**主要処理フロー**:
1. **main.nim 行261-282**: `customizeForBackend`でバックエンド設定
2. **main.nim 行272-273**: C++バックエンドの場合、`conf.exc = excCpp`
3. **main.nim 行288-289**: `compileToBackend`で実際のコンパイル

#### Step 3: C++固有のコード生成を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | cgen.nim | `compiler/cgen.nim` | compileToCppテンプレート（行357-358） |
| 3-2 | ccgtypes.nim | `compiler/ccgtypes.nim` | C++クラス生成 |

**主要処理フロー**:
- **cgen.nim 行357-358**: `compileToCpp`テンプレートでC++モード判定
- オブジェクト型がC++クラスとして出力される

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

```
main.nim::mainCommand()
    │
    └─ case cmdCompileToCpp
           │
           └─ compileToBackend()
                  │
                  ├─ customizeForBackend(backendCpp)
                  │      └─ conf.exc = excCpp
                  │
                  └─ commandCompileToC()  [C/C++共通]
                         │
                         ├─ compilePipelineProject()
                         │      └─ cgen (C++モード)
                         │             └─ compileToCpp = true
                         │
                         └─ callCCompiler()  [C++コンパイラ呼び出し]
```

### データフロー図

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

*.nim ───▶ セマンティック解析 ───▶ 型付きAST
                 │
                 ▼
型付きAST ───▶ cgen.nim (C++モード) ───▶ C++コード
                 │
                 ▼
*.cpp ───▶ g++/clang++/cl.exe ───▶ *.o
                 │
                 ▼
*.o ───▶ リンカ ───▶ 実行ファイル
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| cgen.nim | `compiler/cgen.nim` | ソース | C/C++コード生成（共通） |
| main.nim | `compiler/main.nim` | ソース | customizeForBackend関数 |
| commands.nim | `compiler/commands.nim` | ソース | cmdCompileToCppコマンド定義 |
| options.nim | `compiler/options.nim` | ソース | backendCpp、excCpp定義 |
| extccomp.nim | `compiler/extccomp.nim` | ソース | C++コンパイラ連携 |
