# Nim

## 概要

Nimは、効率性、表現力、優雅さに焦点を当てた静的型付けコンパイル型システムプログラミング言語です。C、C++、JavaScriptへのコンパイルをサポートし、Python風のシンプルな構文と強力なメタプログラミング機能を備えています。このリポジトリにはNimコンパイラ、標準ライブラリ、各種ツール、およびドキュメントが含まれています。

## 主な機能

| 機能カテゴリ | 説明 |
| --- | --- |
| マルチバックエンド | C、C++、JavaScript、Objective-Cへのコード生成をサポート |
| メタプログラミング | マクロ、テンプレート、ジェネリクスによる強力なコンパイル時プログラミング |
| メモリ管理 | ORC（デフォルト）、ARC、参照カウント（refc）など複数のメモリ管理方式 |
| FFI（外部関数インタフェース） | C/C++ライブラリとのシームレスな相互運用性 |
| 並行処理 | スレッド、チャンネル、非同期I/O（async/await）のサポート |
| クロスコンパイル | Windows、Linux、macOS、BSD、ARM、RISC-Vなど多様なプラットフォームをサポート |
| パッケージ管理 | Nimbleパッケージマネージャによる依存関係管理 |
| IDEサポート | nimsuggestによるIDE統合（コード補完、定義ジャンプなど） |

## 技術スタック

### コア

- 言語: Nim（セルフホスティング）
- バックエンド: C、C++、JavaScript、Objective-C
- ビルドツール: koch（Nim製ビルドツール）
- Cコンパイラ: GCC（推奨）、Clang、MSVC、TCC

### 主要ライブラリ

- checksums - チェックサム計算ライブラリ
- nimble - Nimパッケージマネージャ
- atlas - 依存関係管理ツール
- fusion - 追加の標準ライブラリモジュール

## ディレクトリ構成

```
Nim-devel/
├── bin/                    # コンパイル済みバイナリの出力先
├── build/                  # ビルド時の中間ファイル
├── compiler/               # Nimコンパイラのソースコード
│   ├── ast.nim            # 抽象構文木の定義
│   ├── lexer.nim          # 字句解析器
│   ├── parser.nim         # 構文解析器
│   ├── sem*.nim           # 意味解析モジュール群
│   ├── cgen.nim           # Cコード生成
│   ├── jsgen.nim          # JavaScriptコード生成
│   ├── vm.nim             # コンパイル時VM
│   └── plugins/           # コンパイラプラグイン
├── config/                 # コンパイラ設定ファイル
│   ├── nim.cfg            # デフォルト設定
│   └── nimdoc.cfg         # ドキュメント生成設定
├── doc/                    # ドキュメント（reStructuredText/Markdown）
│   ├── manual.md          # 言語マニュアル
│   ├── tut1.md            # チュートリアル Part 1
│   ├── tut2.md            # チュートリアル Part 2
│   └── tut3.md            # チュートリアル Part 3
├── lib/                    # 標準ライブラリ
│   ├── system.nim         # 暗黙的にインポートされるコアモジュール
│   ├── pure/              # 純粋なNimモジュール
│   ├── impure/            # 外部依存を持つモジュール
│   ├── wrappers/          # Cライブラリラッパー
│   ├── std/               # 新しい標準ライブラリモジュール
│   ├── core/              # コアモジュール
│   ├── posix/             # POSIX API
│   ├── windows/           # Windows API
│   └── js/                # JavaScript固有モジュール
├── nimsuggest/            # IDE統合ツール
├── nimpretty/             # コードフォーマッター
├── testament/             # テストフレームワーク
├── tests/                 # テストスイート（カテゴリ別）
├── tools/                 # 補助ツール
│   ├── niminst/           # インストーラ生成ツール
│   └── nimgrep.nim        # Nim用grepツール
├── koch.nim               # ビルドツール
├── build_all.sh           # Unix用ビルドスクリプト
├── build_all.bat          # Windows用ビルドスクリプト
└── nim.nimble             # パッケージ定義
```

## セットアップ

### 必要条件

- Cコンパイラ（以下のいずれか）
  - GCC 6.x以降（推奨）
  - Clang
  - Visual C++（Windows）
  - MinGW（Windows）
- git または wget
- Ubuntu/Debianの場合: `build-essential` パッケージ

### インストール手順

#### 1. ソースコードの取得

```bash
git clone https://github.com/nim-lang/Nim.git
cd Nim
```

#### 2. ビルドの実行

**Linux/macOS:**
```bash
./build_all.sh
```

**Windows:**
```bash
build_all.bat
```

#### 3. PATHへの追加

ビルド完了後、`bin/` ディレクトリをPATH環境変数に追加します。

```bash
export PATH=$PATH:/path/to/Nim/bin
```

### 安定版のインストール

一般ユーザーには安定版のインストールを推奨します:
https://nim-lang.org/install.html

## 開発

### kochビルドツール

`koch` はNimのメインビルドツールです。主なコマンド:

```bash
# コンパイラのブートストラップ（リリースビルド）
./koch boot -d:release

# ツールのビルド（nimsuggest, nimgrep, nimpretty等）
./koch tools

# Nimbleのビルド
./koch nimble

# ドキュメントの生成
./koch docs

# テストの実行
./koch tests

# 特定カテゴリのテスト実行
./koch tests cat async
```

### テストの実行

```bash
# 全テストの実行
./koch tests

# 特定カテゴリのテスト
./koch tests cat <category>
# 例: ./koch tests cat async

# testamentを直接使用
testament/testament all
```

### コードスタイル

Nimには公式のコードスタイルガイド（NEP-1）があります。`nimpretty` ツールでコードをフォーマットできます:

```bash
nimpretty path/to/file.nim
```

### デバッグビルド

開発時にはデバッグ版コンパイラ（`nim_dbg`）が利用可能です:

```bash
./koch tools  # nim_dbgがビルドされる
bin/nim_dbg c myfile.nim
```

### 主要なコンパイラオプション

```bash
# リリースビルド
nim c -d:release myfile.nim

# デバッグ情報付き
nim c --debugger:native myfile.nim

# JavaScript出力
nim js myfile.nim

# C++バックエンド
nim cpp myfile.nim
```

## ライセンス

MIT License

Copyright (C) 2006-2026 Andreas Rumpf

詳細は [copying.txt](../../copying.txt) を参照してください。
