# アーキテクチャ構成図

## システム全体構成図

```mermaid
graph TB
    subgraph "Nim Compiler System"
        subgraph "入力"
            SRC[/"Nim ソースコード (.nim)"/]
            CFG[/"設定ファイル (nim.cfg)"/]
            CLI[/"コマンドライン引数"/]
        end

        subgraph "コンパイラ本体 (compiler/)"
            subgraph "フロントエンド"
                NIM[nim.nim<br/>エントリポイント]
                MAIN[main.nim<br/>コマンドディスパッチャー]
                OPT[options.nim<br/>オプション管理]
            end

            subgraph "パイプライン制御"
                PIPE[pipelines.nim<br/>パイプライン制御]
                PASS[passes.nim<br/>パス管理]
                MG[modulegraphs.nim<br/>モジュールグラフ]
            end

            subgraph "字句・構文解析"
                LEX[lexer.nim<br/>字句解析器]
                PARSE[parser.nim<br/>構文解析器]
                IDENT[idents.nim<br/>識別子管理]
            end

            subgraph "中間表現"
                AST[ast.nim<br/>AST定義]
                ASTDEF[astdef.nim<br/>AST基本型]
                TRANS[transf.nim<br/>AST変換]
            end

            subgraph "意味解析"
                SEM[sem.nim<br/>意味解析メイン]
                SEMEX[semexprs.nim<br/>式の意味解析]
                SEMST[semstmts.nim<br/>文の意味解析]
                SEMTY[semtypes.nim<br/>型の意味解析]
                SIG[sigmatch.nim<br/>オーバーロード解決]
            end

            subgraph "バックエンド"
                CGEN[cgen.nim<br/>C/C++/ObjC生成]
                JSGEN[jsgen.nim<br/>JavaScript生成]
                NIFGEN[nifgen.nim<br/>NIF生成]
            end

            subgraph "仮想マシン"
                VM[vm.nim<br/>VM実行エンジン]
                VMGEN[vmgen.nim<br/>VMコード生成]
                VMDEF[vmdef.nim<br/>VM定義]
            end
        end

        subgraph "標準ライブラリ (lib/)"
            SYSMOD[system.nim<br/>システムモジュール]
            PURE[pure/<br/>純粋Nimモジュール]
            STD[std/<br/>標準モジュール]
        end

        subgraph "ツール群"
            SUGGEST[nimsuggest/<br/>IDE統合]
            PRETTY[nimpretty/<br/>フォーマッター]
            TEST[testament/<br/>テスト]
            KOCH[koch.nim<br/>ビルドツール]
        end

        subgraph "出力"
            COUT[/"C/C++/ObjC コード"/]
            JSOUT[/"JavaScript コード"/]
            EXE[/"実行ファイル"/]
            DOC[/"ドキュメント"/]
        end
    end

    subgraph "外部システム"
        CC[外部Cコンパイラ<br/>GCC/Clang/MSVC]
        NODE[Node.js]
        NIMBLE[Nimble<br/>パッケージマネージャー]
    end

    SRC --> NIM
    CFG --> NIM
    CLI --> NIM
    NIM --> MAIN
    MAIN --> OPT
    MAIN --> PIPE
    PIPE --> PASS
    PIPE --> MG
    PASS --> LEX
    LEX --> PARSE
    PARSE --> AST
    AST --> SEM
    SEM --> SEMEX
    SEM --> SEMST
    SEM --> SEMTY
    SEMEX --> SIG
    SEM --> TRANS
    TRANS --> CGEN
    TRANS --> JSGEN
    TRANS --> NIFGEN
    SEM --> VM
    VM --> VMGEN
    CGEN --> COUT
    JSGEN --> JSOUT
    COUT --> CC
    CC --> EXE
    JSOUT --> NODE
    SYSMOD --> SEM
    SUGGEST --> PIPE
    KOCH --> NIM
```

## コンパイルパイプライン図

```mermaid
flowchart LR
    subgraph "パイプラインパス (PipelinePass)"
        direction TB
        NONE[NonePass]
        SEMP[SemPass<br/>意味解析のみ]
        CGENP[CgenPass<br/>Cコード生成]
        JSGENP[JSgenPass<br/>JS生成]
        NIFGENP[NifgenPass<br/>NIF生成]
        EVALP[EvalPass<br/>評価]
        INTERP[InterpreterPass<br/>インタプリタ]
        DEPP[GenDependPass<br/>依存関係生成]
        DOCP[Docgen2Pass<br/>ドキュメント生成]
    end

    SRC[/"ソースコード"/] --> LEX[字句解析]
    LEX --> TOK[トークン列]
    TOK --> PARSE[構文解析]
    PARSE --> AST1[生AST]
    AST1 --> SEM[意味解析]
    SEM --> AST2[型付きAST]
    AST2 --> TRANS[変換]
    TRANS --> AST3[変換済みAST]
    AST3 --> |CgenPass| CGEN[C生成]
    AST3 --> |JSgenPass| JSGEN[JS生成]
    AST3 --> |NifgenPass| NIFGEN[NIF生成]
    CGEN --> CCODE[/"Cコード"/]
    JSGEN --> JSCODE[/"JSコード"/]
    NIFGEN --> NIFFILE[/"NIFファイル"/]
```

## モジュール依存関係図

```mermaid
graph TD
    subgraph "エントリポイント"
        NIM[nim.nim]
    end

    subgraph "コマンド処理"
        MAIN[main.nim]
        CMD[commands.nim]
        CMDH[cmdlinehelper.nim]
    end

    subgraph "パイプライン"
        PIPE[pipelines.nim]
        PASS[passes.nim]
        PIPEU[pipelineutils.nim]
    end

    subgraph "構文解析"
        LEX[lexer.nim]
        PARSE[parser.nim]
        SYN[syntaxes.nim]
        LLS[llstream.nim]
    end

    subgraph "AST・型システム"
        AST[ast.nim]
        ASTDEF[astdef.nim]
        TYPES[types.nim]
        IDENT[idents.nim]
    end

    subgraph "意味解析"
        SEM[sem.nim]
        SEMEX[semexprs.nim]
        SEMST[semstmts.nim]
        SEMTY[semtypes.nim]
        SEMDATA[semdata.nim]
        SIG[sigmatch.nim]
        LOOKUP[lookups.nim]
    end

    subgraph "コード生成"
        CGEN[cgen.nim]
        CCGE[ccgexprs.nim]
        CCGS[ccgstmts.nim]
        CCGT[ccgtypes.nim]
        JSGEN[jsgen.nim]
    end

    subgraph "仮想マシン"
        VM[vm.nim]
        VMGEN[vmgen.nim]
        VMDEF[vmdef.nim]
    end

    subgraph "共通"
        OPT[options.nim]
        MSG[msgs.nim]
        LINE[lineinfos.nim]
        MG[modulegraphs.nim]
    end

    NIM --> MAIN
    NIM --> CMD
    NIM --> CMDH
    MAIN --> PIPE
    MAIN --> OPT
    PIPE --> PASS
    PIPE --> SEM
    PIPE --> CGEN
    PIPE --> JSGEN
    PASS --> SYN
    SYN --> PARSE
    PARSE --> LEX
    LEX --> LLS
    LEX --> IDENT
    SEM --> SEMEX
    SEM --> SEMST
    SEM --> SEMTY
    SEM --> SEMDATA
    SEMEX --> SIG
    SEM --> LOOKUP
    SEM --> AST
    AST --> ASTDEF
    AST --> TYPES
    CGEN --> CCGE
    CGEN --> CCGS
    CGEN --> CCGT
    VM --> VMGEN
    VM --> VMDEF
    SEM --> VM
    OPT --> LINE
    MSG --> LINE
    MG --> AST
```

## 標準ライブラリ構成図

```mermaid
graph TB
    subgraph "lib/"
        SYS[system.nim<br/>暗黙的インポート]

        subgraph "core/"
            CORE[コアモジュール]
        end

        subgraph "std/"
            ASSERT[assertions.nim]
            SYNCIO[syncio.nim]
            PATHS[paths.nim]
            DIRS[dirs.nim]
            FILES[files.nim]
            ENVVARS[envvars.nim]
            TASKS[tasks.nim]
            THREADS[typedthreads.nim]
        end

        subgraph "pure/"
            JSON[json.nim]
            OS[os.nim]
            STRUTILS[strutils.nim]
            MATH[math.nim]
            TIMES[times.nim]
            HTTP[httpclient.nim]
            ASYNC[asyncdispatch.nim]
            NET[net.nim]
            STREAMS[streams.nim]
        end

        subgraph "impure/"
            IMP[外部依存モジュール]
        end

        subgraph "wrappers/"
            WRAP[Cラッパー]
        end

        subgraph "posix/"
            POSIX[POSIX API]
        end

        subgraph "windows/"
            WIN[Windows API]
        end

        subgraph "js/"
            JSLIB[JavaScript固有]
        end
    end

    SYS --> CORE
    SYS --> ASSERT
    PATHS --> DIRS
    PATHS --> FILES
    OS --> PATHS
    HTTP --> ASYNC
    HTTP --> NET
    NET --> STREAMS
```

## コンパイル時処理フロー図

```mermaid
sequenceDiagram
    participant User as ユーザー
    participant CLI as nim.nim
    participant Main as main.nim
    participant Pipe as pipelines.nim
    participant Lex as lexer.nim
    participant Parse as parser.nim
    participant Sem as sem.nim
    participant VM as vm.nim
    participant CGen as cgen.nim
    participant CC as 外部Cコンパイラ

    User->>CLI: nim c main.nim
    CLI->>Main: handleCmdLine()
    Main->>Main: loadConfigs()
    Main->>Pipe: mainCommand()

    loop 各モジュール
        Pipe->>Lex: openLexer()
        Lex->>Parse: トークン列
        Parse->>Pipe: AST
        Pipe->>Sem: semWithPContext()

        alt マクロ呼び出し
            Sem->>VM: evalAtCompileTime()
            VM->>Sem: 変換済みAST
        end

        Sem->>Pipe: 型付きAST
        Pipe->>CGen: genTopLevelStmt()
    end

    CGen->>Pipe: Cコード
    Pipe->>CC: callCCompiler()
    CC->>User: 実行ファイル
```

## バックエンド選択フロー図

```mermaid
flowchart TD
    START[コンパイル開始] --> CMD{コマンド}

    CMD --> |nim c| BACKEND_C[backendC]
    CMD --> |nim cpp| BACKEND_CPP[backendCpp]
    CMD --> |nim objc| BACKEND_OBJC[backendObjc]
    CMD --> |nim js| BACKEND_JS[backendJs]
    CMD --> |nim m| BACKEND_NIF[backendNif]

    BACKEND_C --> CGEN[cgen.nim<br/>C生成]
    BACKEND_CPP --> CGEN
    BACKEND_OBJC --> CGEN
    BACKEND_JS --> JSGEN[jsgen.nim<br/>JS生成]
    BACKEND_NIF --> NIFGEN[nifgen.nim<br/>NIF生成]

    CGEN --> EXTCC[extccomp.nim<br/>外部コンパイラ呼び出し]
    EXTCC --> |GCC| GCC[GCC]
    EXTCC --> |Clang| CLANG[Clang]
    EXTCC --> |MSVC| MSVC[Visual C++]

    GCC --> EXE[実行ファイル]
    CLANG --> EXE
    MSVC --> EXE

    JSGEN --> JSFILE[.js ファイル]
    NIFGEN --> NIFFILE[.nif ファイル]
```

## 仮想マシン（VM）アーキテクチャ図

```mermaid
graph TB
    subgraph "コンパイル時評価"
        STATIC[static式]
        CONST[constセクション]
        MACRO[マクロ呼び出し]
    end

    subgraph "VM コンポーネント"
        VMGEN[vmgen.nim<br/>バイトコード生成]
        VMDEF[vmdef.nim<br/>VM定義・命令セット]
        VM[vm.nim<br/>実行エンジン]
        VMOPS[vmops.nim<br/>組み込み操作]
    end

    subgraph "VM状態"
        REG[レジスタ]
        STACK[スタックフレーム]
        HEAP[ヒープ]
        BYTECODE[バイトコード]
    end

    STATIC --> VMGEN
    CONST --> VMGEN
    MACRO --> VMGEN

    VMGEN --> BYTECODE
    VMDEF --> VM
    BYTECODE --> VM
    VM --> REG
    VM --> STACK
    VM --> HEAP
    VM --> VMOPS

    VM --> |結果AST| SEMOUT[意味解析に戻る]
```
