アップデートとトレンドから見るNim言語の2020年

こんにちは！
[Ateam Group Manager ＆ Specialist Advent Calendar 2020](https://qiita.com/advent-calendar/2020/ateam) の15日目は
株式会社エイチームフィナジーの @hondam が担当します。

# はじめに
1年前のアドカレの時期、私はNim言語と出会いました...

* [技術書典に出会っていなかったら俺はNimをさわってないと思う](https://qiita.com/hondam/items/8e1381ff95783fdc5f3d)

そこから1年、私はNim言語を扱うことは一切ありませんでした(いや触れよ)
今日はNim言語がこの1年でどういった変化を遂げているか確認してみようと思います！

なによりも先ずはNimを最新版にアップデートですね！

```
$ nim -v
Nim Compiler Version 1.0.6

$ choosenim update stable
   Updating stable
Downloading Nim 1.4.2 from nim-lang.org
[##################################################] 100.0% 0kb/s
 Extracting nim-1.4.2.tar.xz
   Building Nim 1.4.2
   Building tools (nimble, nimgrep, nimpretty, nimsuggest)
    Updated to 1.4.2
   Switched to Nim 1.4.2
```

# アップデート
さて、それではNim言語のアップデート内容を確認しようと思います。

* 2020年1月24日 バージョン 1.0.6 リリース
    * いくつかの問題・バグの修正、ドキュメントの改善
* 2020年4月3日 バージョン 1.2.0 リリース
    * GC：ARC
    * 新しいsugarマクロ(Collect/Dup/Capture)
* 2020年6月17日 バージョン 1.2.2 リリース
    * 1.2のいくつかの問題・バグの修正
* 2020年7月30日 バージョン 1.2.6 および 1.0.8 リリース
    * いくつかの問題・バグの修正
* 2020年10月16日 バージョン 1.4.0 リリース
    * GC：ORC
    * ディープコピー
    * 宣言の順序
    * 厳密な関数
* 2020年10月27日 バージョン1.2.8 および 1.0.10 リリース
    * いくつかの問題・バグの修正
* 2020年12月1日 バージョン 1.4.2 リリース
    * 1.4のいくつかの問題・バグの修正

特筆すべきはGCオプションが追加された事でしょうか。
Nim言語には以前から多数のGCオプションが備わっており、遅延参照カウント方式がデフォルトだったと思います。それ以外にマーク&スイープやBoehm、Go言語のようなGCがオプションとして存在していました。
ARCはムーブセマンティクスを最適化して参照カウント方式のメモリ管理で、ORCはARCに存在する循環参照によるメモリリークをサイクルコレクターで解決する方式のようです。
バージョン1.2にてARCが、バージョン1.4にてORCが追加されています。将来的にはORCがNimのデフォルトのGCとなる可能性もあるようです。

以下はNim言語の開発者Andreas Rumpf氏によるARC/ORCの解説動画です。ARCのパフォーマンスはマニュアルによるメモリ管理に近しい数字が出ており素晴らしいですね。
[Andreas Rumpf: Nim ARC/ORC (NimConf 2020)](https://www.youtube.com/watch?v=aUJcYTnPWCg)

# トレンド
## Googleトレンドで見るNim言語の1年
以下はGoogleトレンドにおけるNim言語のこの1年の推移です。

<img width="600px" alt="Googleトレンド1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4305/fc29813b-9eb1-096e-de78-312180be2ce8.png" />

2020年に2月はじめ頃に若干ハネてますが、それでもトレンドとしてはこの1年であまり変化はないようです。
6月にその次に高い山がありますが、これは「[Nim Online Conference 2020](https://conf.nim-lang.org/)」が開催されたからでしょうか。

関連キーワードに「nim vs rust」とあったので、もしかするとRustと比較されたのかもしれません。
Rustを加えて比較すると、以下のようなグラフになりました。
同時期にハネているので、このあたりでNimとRustで言語的な比較がされたかもしれませんね。

<img width="600px" alt="Googleトレンド2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4305/c333a089-a909-ce53-0457-ed5ae6ce7043.png" />

さて、至高の言語と言われるNim。すでに言語仕様として完成されているとすれば、不具合解消やGCとしてARC及びORCの追加以外に大きな変更がないのは仕方ないのかもしれません。

## フレームワークで見るNim言語の1年
ではNimを使ったライブラリやフレームワークの状況はどうだったのでしょうか？

例えばWebフレームワークの場合、フロントはReactライクな[Karax](https://github.com/pragmagic/karax)、バックエンドはSinatraライクな[Jester](https://github.com/dom96/jester)が一般的だったと思います、

こちらは[Prologue](https://github.com/planety/prologue)というフルスタックなWebフレームワークが登場しているようです。上記のKaraxが含まれますが、様々なコア機能を標準搭載し、プラグインもあるようでJesterより複雑なWebアプリケーションが構築しやすいかもしれませんね。

```
$ nimble install prologue
Downloading https://github.com/planety/Prologue using git
  Verifying dependencies for prologue@0.4.2
 Installing regex@>= 0.16.2
(中略)
 Installing prologue@0.4.2
   Success: prologue installed successfully.
```

```app.nim
import prologue

proc hello*(ctx: Context) {.async.} =
  resp "<h1>Hello, Prologue!</h1>"

let app = newApp()
app.get("/", hello)
app.run()
```

```
$ nim c -r app.nim
$ open http://localhost:8080
```

<img alt="prologue" width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4305/c0ac6f61-007d-9861-7804-150fc55ddd92.png" />

GitHubでAdvanced searchした結果、リポジトリの数は1000以上ヒットしたので、探せばいろいろ見つかりそうではありました。

ちなみにNimで一番スターが付いてたのはVim³っていうParavimを立方体にするプログラムでした汗

```
$ git clone https://github.com/oakes/vim_cubed.git
$ cd vim_cubed
$ nimble run vim3
$ vim3 適当なファイル
```

<img alt="prologue" width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4305/1ca5a8d7-2501-907c-c246-e9ac47c7729c.png" />


## 書籍で見るNim言語の1年
次に書籍を見てみましょう。

私が調査したかぎりでは、残念ながら技術書典やBOOTHで販売される技術同人誌を除いては、以前から発売されている「[Nim in Action](https://www.manning.com/books/nim-in-action)」以外に新しく書籍は発売されていないようでした。公式のドキュメントやチュートリアルが整備されているというのもありますが、この1年でNim言語の書籍が発売されていないのはちょっと寂しいですね。

日本で普及するには、やはり日本語で記述された入門書が必要なのかもしれません。

## Webアプリケーションで見るNim言語の1年
あとはNim言語で作成しされたWebアプリケーションを探そうと思ったのですが、ちょっと探し方がわからずでした...

# まとめ

さてここまでNim言語に関して、この1年のアップデートやトレンドを見てきましたが、言語としての魅力はさらに高まっているものの、やはり認知や利用という点ではまだまだな状況は否めません。この記事を読まれた方には、これを機にNim言語に興味を持っていただけると幸いです。Nim言語の特徴は公式サイトや前回の私の[記事](https://qiita.com/hondam/items/8e1381ff95783fdc5f3d)を参考にしてください。

# 参考文献
* [Nim公式サイト](https://nim-lang.org/)
* [Nim公式サイト(日本語訳)](http://nim-lang-081.osdn.jp/)
* [Nim Destructors and Move Semantics](https://nim-lang.org/docs/destructors.html)