Nim：学習の流れ（Ruby、PHP経験者の視点から）

# プリプロセスは後回し。スクリプト言語と同じような流れで学ぶ。

　NimはC、C++、Rustと同じく、静的型付けでビルドを必要とする言語です。

　そのため、プリプロセッサというコンパイル段階の処理も文法に入ってきます。

　RubyやPHPなどスクリプト言語を経験してから、Nimを学習する際にはこのあたりが混乱するように思います。

　とはいえ、まずは、プリプロセッサ部分ではなく、ランタイム時（コンパイル後実行中に処理されるもの）の文法を理解し、その後、プリプロセッサの使い方、使い所を覚えた方がよいと思います。

　公式ドキュメントの「**[Nim Manual](https://nim-lang.org/docs/manual.html)**」がちょうど上記のような流れなので、これを上から順に読んで行くのがいいと思います。ただし、最初は、プリプロセッサ部分は飛ばしてもいいと思います。

 

```shell
1. インストール
   Winならchocolatey、Macならbrew、Linuxは各ディストリビューションに応じたパッケージ管理ソフト。
   finishスクリプトによる設定。kochによるtoolsのビルド。

2. VSCodeの準備
　 NimとNativeDebugの拡張をいれてコーディング準備。この２つの拡張があればコード補完、デバッガの利用もバッチリ。

3. パッケージ管理ツールの使い方（初級）
　nimbleによるビルドの方法、パッケージのインストール（この２つぐらいで最初はいいと思う）。

4. ランタイム時に処理される文法
  macro、template、pragma以外。

5. 主たる標準ライブラリの利用
  OS（ファイル処理）、loggerなど汎用性の高い処理。

6. nimbleによる外部パッケージのインストール
　jester、cligenなど比較的有名なパッケージをインストールしたりする。

7. nimbleによる自作パッケージの公開
　　ディレクトリ構成を含めた作り方と配布の方法。

8. Gitなどバージョン管理を利用したチーム開発の方法
　nimbleによるチーム内でのライブラリ共有など。

9. プリプロセッサで処理される文法
　when、macro、template、pragmaなど。


```

※公式の日本語訳もあるみたいですが、manualの部分はまだ英語のままみたいですね（2020.6.10時点）。
[▶ Nimドキュメント日本語訳](http://nim-lang-081.osdn.jp/)

※Nim Manualの日本語訳に近いのがこのGistです。大変、理解の補助になります。
[▶ miyakogi/nim_syntax.md](https://gist.github.com/miyakogi/b1df00c8bc99927d9d0d)

※nimbleの公式ドキュメント
[▶ nimble README](https://github.com/nim-lang/nimble)

※試験的機能には並列処理(parallel)などの機能もあり、早く標準になればいいなあという機能を試せます。
[▶ 試験的機能](https://nim-lang.org/docs/manual_experimental.html)

# 学習をする題材（コマンドラインツールの作成）

　Nimは、Goと同じく、ビルドして実行ファイルが作りやすい言語です。
　なので、コマンドラインツールをつくりながら言語学習をするのがよいではと思います。
　普段自分がPCを触っていて不便だと思うことを、Nimをつかってコマンドラインツールをつくるのはいいかなと思います。

　cligenというパッケージを使うとすごく簡単にコマンドが作れます。関数の定義からUsageなどを作ってくれます。
　nimbleの練習やコード練習も兼ねて使うことをお勧めします。

[▶ コマンドライン作成ライブラリ：c-blake/cligen](https://github.com/c-blake/cligen)


# 2020年6月時点のNimについての感想

## GoとRustは、新しい観点があって良いのだが、コーディングストレスがあった

　Nimは、バージョンが1.2.0になり、じわじわと日本でも認知度が上がっていると思います。

　ところで、日本では、GoやRustがやっと普及しだした感じです。
　個人的に、GoとRustをそれぞれでアプリをつくってみましたが、それを通じて以下のように感じました。

　オブジェクト指向言語とは異なる新しいアイデアは良いと思います。
　けれど、それぞれずっとコーディングしていると疲れてきました。

　Goは文法がシンプル過ぎるが故に、一人でアプリを作っていくとコーディングの反復が増え疲れてきました。
　Rustは記号が多めであったり、標準ライブラリーのネスト、チェーンメソッドの多さに読むのが疲れて来ました。
　Goは並列処理、Rustは安全性を保ちながら高速処理を実現するにはよいと思いますが、必ずしもこれらの言語でしないといけない訳ではないです。
　そんなとき、メジャーバージョンがでたNimを触ってみました。

## コーディングストレスの少ない文法・標準ライブラリ：Nim
　　
　文法はPythonとPascalをあわせた感じで、文字数がかなり少なくて済み、それだけでも少しコーディングのストレスが減りました。
　それに加えて、標準ライブラリもPythonライクでおおよそ、汎用的な処理は書きやすくなるようライブラリが準備されています。
 それでありながら、静的型付けはあり、ビルドをして実行ファイルができ、高速。また、マルチプラットフォーム対応。

　「至高・エレガント」と評されるNimですが、個人的には15年プログラムをしてきて、この言語ほどしっくり来る言語もないなと感じました。

　では、良いこと尽くめかというと、普及度がないため、以下のような問題点はあります。とはいえ、過渡的なものだと思っています。

## ライブラリが未熟、チーム開発用のツール・機能が少ない？(2020年6月時点）

　誕生年は2008年で、Go(2009）やRust（2010）とそう変わりません。
　GoやRustのように開発組織が大きくないことが影響してか、普及度、実績が少ないためか、OSSライブラリがまだまだ未熟だなという印象を受けます。

[▶ Wikipedia：Nim ](https://ja.wikipedia.org/wiki/Nim)


　また、パッケージ管理のnimbleも、yarnやnpmをはじめ他のパッケージ管理ツールに比べると、チーム開発を想定した仕様が少し足らないようにも思います。（dependenciesの自動追加とか）

[▶ 関連記事：Nim：プロジェクトの共同開発時に、nimbleで依存パッケージをローカルの開発環境にインストールする。](https://qiita.com/SFITB/items/58493184417be3b24502)

 上記のことは、普及していけば自然と解決されるように思います。問題は、どう普及していくかだと思います。
　RubyにRails、PythonにはScipyやPandasなど、後ろ盾の小さいプログラム言語はキラーアプリが切欠となって普及していくと思います。

　そうしたキラーアプリができるかも一つ注目するところなのかもしれません。

## GoやRust疲れユーザーが流れ着く楽園：Nim

　どのようにNimが普及するのか、はたまた、普及せずにフェードアウトしてしまうのか。
　それは未来のことなのでわかりません。
　
　ただ、コーディングしていてストレスが少なく、高速であり、利用価値があると個人的には感じています。

　私がそうであったように、GoやRustを使い始めたが、プロジェクトをつづけていくうちにコーディングストレスが高くなり、他にもっとよい言語はないかという人がNimに来たりしないかなと思っています。

　私はそうでした。

　今後、ライブラリが充実したり、少しずつでも採用プロダクションが増えてくれば、自ずと広まるのかなという気もします。
　私も、まだプロダクションでは使っていませんが、社内用のツールを作っています。VSCodeの拡張管理やWorkspace管理のツールを手始めにつくっています。


# 最後に・・・Nimが広まってほしいなと思った動機

　Nimを応援したいのは、開発者「Andreas Rumpf （アンドレアス・ランプ）」の言葉にすごく共感したところもあります。以下は、インタビュー記事にあったOSS開発者へのメッセージです。


**"GoogleやMozillaの支援がなくてもプロジェクトは強くなれる。時に、制約は創造性をもたらすこともある。"**

[▶ アンドレアス・ランプへのインタビュー ](https://www.sourcesort.com/interview/andreas-rumpf-on-creating-and-growing-nim)

　個人的に判官びいきなので、小さいプロジェクトを応援したいなというのもありますが、それだけでなく素晴らしいプログラム言語だと思います。

　少しでもNimのユーザーが増えることを心より願って、この記事を投稿しました。
　そして、Nimへの関心を示された方の学習の一助になれば幸いです。