技術書典に出会っていなかったら俺はNimをさわってないと思う

この記事は、[株式会社エイチームフィナジー](https://finergy.a-tm.co.jp/) の [Advent Calendar 2019 6日目](https://qiita.com/advent-calendar/2019/ateam-finergy)です。

と、いうことで(~~Qiita上にはたくさんのNimの記事がありますが~~) Nimについて書きます。
記事内容は薄いので2、3分もあれば読めます。

# 背景
俺たち「そろそろ技術書典に参戦するか」
俺たち「何書く？」
俺たち「マイナー言語を触ってみよう。言語選択は早い者勝ちね」
ワイ「(マイナーの定義はさておき)Nimでオナシャス」
ワイ「(アドカレあるし、記事まとめておくかぁ...)」

# Nimとは？
[Nim](https://nim-lang.org/) は **アンドレアス・ランプフ**氏によって設計・開発された命令型、マルチパラダイム、コンパイル言語という特徴を持つプログラミング言語です。

アンドレアス・ランプフ氏は3DICC社に所属するエンジニアです。彼はNim開発以前に様々な言語を触っていたようです。が、どの言語も満足せず、自身で作成することにしたようです。それがNimプロジェクトの始まりで、2005年頃のようでした。

当初Niｍは**Nimrod**(旧約聖書の登場人物)という名前でしたが、マーケティング上の理由から2014年12月29日にリリースされたバージョン [0.10.2](https://nim-lang.org/blog/2014/12/29/version-0102-released.html) からNimに変更されました。

この記事を書いている時点の最新バージョンは ~~[1.0.2](https://nim-lang.org/blog/2019/10/23/version-102-released.html)~~ [1.0.4](https://nim-lang.org/blog/2019/11/26/version-104-released.html) です。
※htsignさんコメントいただきありがとうございます。

## Nimの特徴

### 直感的でわかりやすいシンタックス
公式サイトの記載からNimの特徴を見てみましょう。

以下は公式サイトに掲載されているNimのコード例です。

Nimの最初の特徴して挙げられているのが、その**シンタックス**で、曰く「**直感的でわかりやすい**」とのことです。
Python(のインデントを含めた多くの特徴)やPascalを参考にしているらしいので似ていると思いますが、シンプルですね。

```Nim
import strformat
type
  Person = object
    name*: string # Field is exported using `*`.
    age: Natural  # Natural type ensures the age is positive.

var people = [
  Person(name: "John", age: 45),
  Person(name: "Kate", age: 30)
]

for person in people:
  # Type-safe string interpolation.
  echo(fmt"{person.name} is {person.age} years old")
```

### 豊富なガベージコレクタオプション

次に、Nimには複数のガベージコレクタのオプションがあることが挙げられています。
コンパイル時に使用するGCを選択する事ができますが、マーク＆スイープGCやBoehm GC、Go言語ライクのGCなどが用意されています。
以下は公式に掲載されている各言語のGCにおける一時停止時間とメモリ使用量の比較です。
この画像を見るに、多言語と比べ**GGの一時停止時間が短い、メモリ使用量が少ない**ようです。

![NimGC比較](https://nim-lang.org/assets/img/features/gc_latency.png)

### Cコンパイラによる最適化

以下は各言語でHello world!を実行するバイナリサイズの比較です。
Nimが比較された言語と比べてサイズが小さい事がわかります。これはNimがCを通してコンパイルするため、既存のCコンパイラの恩恵を受けれることにあります。

![バイナリサイズ比較](https://nim-lang.org/assets/img/features/binary_size.png)

### Javascriptへコンパイル
フロントエンドとバックエンド両方をターゲットに出来ます。NimはJavascriptへコンパイルする事も可能です。そのためHTMLから生成したJavascriptの関数を呼び出すことが出来ます。

### メタプログラミング
Nimのメタプログラミング機能には、ジェネリック、テンプレート、マクロのサポートが含まれています。
まぁ黒魔術ですね。強力です。私は使いこなせません。

### パッケージ管理
Nimbleと呼ばれるパッケージマネージャーがあります。最新のバージョンではNimbleはバンドルされています。
NimのパッケージはGitおよびMercurialリポジトリを介して配布されますが、パッケージはGithubにあるnim-lang/packagesリポジトリのpackages.jsonで管理されています。
.nimbleファイルを生成することで、プロジェクトにNimパッケージを適用することが出来ます。
.nimbleファイルの記述はNimScriptを用います。

## Nimの特徴まとめ

* PythonぽくCやJSが書ける(C++やObjective-Cも対応)。
* Cコンパイルした場合はCと同じようなパフォーマンスが出る。
* 強力なメタプログラミング機能
* Nimbleというパッケージ管理ツールがある。記述はNimScriptを使う。

## Nimの対外的な評価(Slant調べ)

### ジャンル別言語ランキング
* 人気のある、または実績のあるプログラミング言語を除いた、最高のプログラミング言語：**１位**
* Pythonから来た人が他に学ぶ最適な言語：**１位**
* 最高のシステムプログラミング言語：**１位**
* 暗号通貨プログラミングに最適なプログラミング言語：**１位**
* コマンドラインユーティリティを書くのに最適な言語：**２位**
* ゲーム開発に最適な機能プログラミング言語：**３位**
* 最高のメタプログラミング言語：**４位**
* 最高のコンパイルされたプログラミング言語：**４位**
* 学ぶのに最適なプログラミング言語：**４位**
* フロントエンドとバックエンドに同時に使用するのに最適な言語：**４位**
* PC用の2Dビデオゲームを構築するのに最適なプログラミング言語：**４位**
* 組み込みシステムプログラミングのために学ぶ最適な言語：**５位**

### Pros
* 静的型付け(型推論あり)
* 強力なメタプログラミング
* Async/await機能
* ランタイム速度
* CもしくはJavascriptへのコンパイル可能
* コンパイラとすべてのコア言語ツールがオープンソース
* PasalやPythonにヒントを得たシンタックス
* マルチパラダイム(命令型、OOP、関数型)
* Unicodeサポート
* etc..

### Cons
* HaxeやKotlinのような類似のプロジェクトの開発に追いつくには、コミュニティが小さすぎる

# まとめ
ということで、技術書典でNim本を書こうと思ってNimをさわって(調べて？)みましたが、とても良い言語に思われます。しかしながら日本での知名度や利用度合いはかなり低いように思われます。公式の日本語ドキュメントや書籍(「[Nim in Action](https://www.manning.com/books/nim-in-action)」というNimに関して詳細に書かれた洋書はあります)が出たり、知名度の高いサービス等で採用されたりすれば普及の可能性はあるのではと思います。
対外的な評価の項にあるように、最適と思われる箇所でPythonぽい言語で書きたい人にはマッチするのではないでしょうか。

この記事を読んで少しでもNimというプログラミング言語に興味を持たれた方は是非一度 [Nim](https://nim-lang.org/) を使ってみってください。

(技術書8典当選するかなぁ...)

# 参考
* [Nim Programming Language](https://nim-lang.org/)
* [Nim(Github)](https://github.com/nim-lang/Nim)
* [When was Nimrod renamed to Nim?](https://forum.nim-lang.org/t/2994)
* [Andreas Rumpf on designing and growing Nim](https://www.sourcesort.com/interview/andreas-rumpf-on-creating-and-growing-nim)
* [Nim(Slant)](https://www.slant.co/topics/6032/viewpoints/7/~systems-programming-languages~nim)
* [[動画] OSCON 2015 - Andreas Rumpf - Nim: An Overview](https://www.youtube.com/watch?v=4rJEBs_Nnaw)