# 非機能要件定義書

## 概要

本ドキュメントは、Nimコンパイラプロジェクト（Nim-devel）における非機能要件を定義したものです。Nimは高性能なシステムプログラミング言語のコンパイラであり、Windows、Linux、macOSを含む複数のプラットフォームで動作します。本書では、性能、可用性、セキュリティ、拡張性、保守性、運用・監視に関する要件を明確にします。

## 性能要件

### レスポンスタイム

| 処理種別 | 目標値 | 備考 |
| --- | --- | --- |
| コンパイル（小規模プロジェクト） | 数秒以内 | releaseモードでの最適化コンパイル |
| コンパイル（大規模プロジェクト） | 数十秒〜数分以内 | 並列ビルドを使用（`--parallel_build: "0"`でCPUコア数を自動検出） |
| ブートストラップ | 90分以内 | Azure Pipelinesでのタイムアウト設定（`timeoutInMinutes: 90`） |
| CI/CDジョブ | 60分以内 | GitHub Actionsでの標準タイムアウト設定 |

### スループット

| 項目 | 目標値 | 備考 |
| --- | --- | --- |
| 並列ビルドジョブ | CPUコア数 + 2 | `make -j $((nCPU + 2)) -l $nCPU` による並列コンパイル |
| コンパイラエラー表示数 | 最大3件 | gcc: `-fmax-errors=3`、clang: `-ferror-limit=3` |
| テストバッチ分割 | 3バッチ | Windows CI環境での`NIM_TESTAMENT_BATCH: "0_3", "1_3", "2_3"` |

### 最適化オプション

| モード | gcc/clang オプション | 説明 |
| --- | --- | --- |
| release | `-O3 -fno-ident -fno-math-errno` | 最高速度最適化 |
| size | `-Os -fno-ident` | サイズ最適化 |
| debug | `-g3 -Og` | デバッグ最適化 |
| danger | チェック全無効化 | 境界チェック、オーバーフローチェック等の無効化 |

## 可用性要件

| 項目 | 目標値 | 備考 |
| --- | --- | --- |
| 稼働率 | 99.9%以上（CI/CD） | GitHub Actions、Azure Pipelinesによる継続的な可用性確保 |
| 計画停止時間 | なし | OSS開発のため計画停止の概念は適用されない |
| 障害復旧時間（RTO） | 即時〜数時間 | CI/CDパイプラインの自動リトライ、手動修正対応 |
| 目標復旧時点（RPO） | 即時 | Gitによるバージョン管理、全コミットが保持される |

### マルチプラットフォーム対応

| OS | アーキテクチャ | サポート状況 |
| --- | --- | --- |
| Windows (XP以降) | x86, x86_64 | 公式サポート |
| Linux | x86, x86_64, ppc64, armv6l | 公式サポート |
| macOS (10.04以降) | x86, x86_64, ppc64, ARM64 (Apple Silicon) | 公式サポート |
| FreeBSD, OpenBSD, NetBSD | 各種 | コミュニティサポート |
| VxWorks, NintendoSwitch, Android | 各種 | 実験的サポート |

### CI/CD冗長構成

| 項目 | 構成 | 備考 |
| --- | --- | --- |
| CI基盤 | Azure Pipelines + GitHub Actions | 冗長な2系統のCI/CDパイプライン |
| マトリックステスト | Linux/Windows/macOS | 各プラットフォームでの並行テスト |
| テスト自動化 | Testament | 専用テストフレームワークによる包括的テスト |

## セキュリティ要件

### セキュリティポリシー

- **脆弱性報告**: security@nim-lang.org への連絡による脆弱性報告プロセス
- **セキュリティアドバイザリ**: https://github.com/nim-lang/security にて公開
- **パッチ適用**: 新バージョンおよびバグフィックスリリースでの対応
- **バックポート**: セキュリティ修正の旧バージョンへのバックポートは行わない（Linuxディストリビューションが独自にバックポートする場合あり）

### コンパイラセキュリティ機能

| 機能 | 説明 | 設定 |
| --- | --- | --- |
| バウンドチェック | 配列境界チェック | `bound_checks:on`（デフォルト） |
| オーバーフローチェック | 整数オーバーフロー検出 | `overflow_checks:on`（デフォルト） |
| 範囲チェック | 範囲型の検証 | `range_checks:on`（デフォルト） |
| スタックトレース | エラー時のスタックトレース出力 | `stacktrace:on`（debug時） |
| メモリ安全性 | ORC/ARCによるメモリ管理 | 自動参照カウント |

### コードサイニング・認証

- GitHub Actionsでの`GITHUB_TOKEN`による認証
- Azure Pipelinesでの`System.AccessToken`による認証

## 拡張性要件

### アーキテクチャ拡張性

| 項目 | 対応状況 | 備考 |
| --- | --- | --- |
| クロスコンパイル | サポート | ARM, ARM64, RISC-V, MIPS等への対応 |
| バックエンド追加 | サポート | C, C++, JavaScript, Objective-Cへのコード生成 |
| プラグイン機構 | サポート | `compiler/plugins`ディレクトリによる拡張 |
| マクロシステム | サポート | コンパイル時メタプログラミング |

### パッケージ管理拡張性

| 項目 | 説明 | 備考 |
| --- | --- | --- |
| Nimble | パッケージマネージャー | サードパーティライブラリのインストール・管理 |
| Atlas | 依存関係管理ツール | プロジェクト依存関係の管理 |
| nimblepath | パッケージパス設定 | `$home/.nimble/pkgs/`, `$home/.nimble/pkgs2/` |

### ビルドシステム拡張性

| 機能 | 説明 |
| --- | --- |
| LTO（Link Time Optimization） | `--lto` / `--lto_incremental` オプション |
| strip | `-s` リンカオプションによるバイナリサイズ削減 |
| 並列ビルド | `--parallel_build: "0"` によるCPUコア自動検出 |

## 保守性要件

### コードベース構造

| ディレクトリ | 内容 | 役割 |
| --- | --- | --- |
| `compiler/` | コンパイラソース | Nimコンパイラ本体 |
| `lib/` | 標準ライブラリ | pure/, impure/, wrappers/等 |
| `tests/` | テストスイート | カテゴリ別テストケース |
| `doc/` | ドキュメント | reStructuredText形式 |
| `tools/` | 開発ツール | niminst, kochdocs等 |

### テストインフラ

| 項目 | 説明 | 備考 |
| --- | --- | --- |
| Testament | テストフレームワーク | カテゴリ別テスト、パターンマッチング対応 |
| Valgrind | メモリリーク検出 | `--valgrind:on/off`で切り替え |
| Megatest | 大規模テスト | `--megatest:on/off`で切り替え |

### コーディング規約

| 項目 | 内容 |
| --- | --- |
| 行の長さ | `LineTooLong`ヒントによる警告（設定可能） |
| strictモード | `nimStrictMode`による厳格なコンパイル |
| ヒント/警告のエラー化 | `hintAsError`, `warningAsError`による品質強制 |

### ドキュメンテーション

| 種別 | 形式 | 生成方法 |
| --- | --- | --- |
| APIドキュメント | HTML | `koch doc`コマンド |
| PDFドキュメント | PDF | `koch pdf`コマンド |
| GitHub Pages | Web | 自動デプロイ（`ci_docs.yml`） |

## 運用・監視要件

### CI/CDパイプライン監視

| 項目 | 実装 | 備考 |
| --- | --- | --- |
| ビルド状態表示 | Azure Pipelines Badge | README.mdでの表示 |
| テスト結果レポート | HTML形式 | `testresults.html`生成 |
| Azure Test Management | API連携 | `SYSTEM_ACCESSTOKEN`経由で結果公開 |
| メモリ使用量追跡 | ci_publish.yml | PRマージ時のメモリ使用量コメント |

### ログ設定

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| スタックトレース | `stacktrace:on/off` | debugモードでon |
| 行追跡 | `linetrace:on/off` | debugモードでon |
| 過剰スタックトレース | `excessiveStackTrace:on/off` | 詳細なトレース |
| デバッガ対応 | `debugger:on/off` | 外部デバッガ連携 |
| バックエンドログ | `--backendLogging:on/off` | Testament設定 |

### システム情報収集

| 項目 | 実装 | 収集情報 |
| --- | --- | --- |
| CI環境情報 | `nimCiSystemInfo` | OS、gcc、node.js、make バージョン等 |
| コンパイラバージョン | `nim -v` | Nim/コンパイラバージョン表示 |
| ハッシュ管理 | `config/build_config.txt` | csourcesハッシュ等の構成管理 |

### Staleプルリクエスト管理

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| Stale判定日数 | 365日 | 1年間活動がないPR |
| Close日数 | 30日 | Stale後30日でクローズ |
| 除外ラベル | ARC, bounty, Showstopper等 | 重要PRは除外 |

## 備考

### ライセンス

- **ライセンス種別**: MIT License
- **著作権**: Copyright (C) 2006-2026 Andreas Rumpf
- **商用利用**: 明示的に許可

### 依存関係管理

| 項目 | バージョン/コミット | 備考 |
| --- | --- | --- |
| Nimble | 9207e8b2bbdf66b5a4d1020214cff44d2d30df92 | v0.20.1 |
| Atlas | 2aa62121b40d580aa2fb27920a37b938d36c5f57 | v0.9.4 |
| Checksums | 0b8e46379c5bc1bf73d8b3011908389c60fb9b98 | v2.0.1 |
| Node.js | 20.x | CI環境での使用 |

### 外部ツール依存

| ツール | 用途 | 必須/任意 |
| --- | --- | --- |
| GCC/Clang | Cコード生成・コンパイル | 必須（いずれか） |
| MinGW | Windows環境でのコンパイル | Windows必須 |
| Valgrind | メモリリーク検出 | 任意（テスト時） |
| Boehm GC | ガベージコレクション | 任意 |
