
_START_ARTICLE_
Nim
_START_SECTION_
概要
_START_PARAGRAPH_
Nimはシンプルな構文による静的型付け言語である。構文マクロや項書き換えマクロなどのコンパイル時のメタプログラミング機能をサポートしている。項書き換えマクロは例えばBignumやMatrixなどのデータ構造の効率的ライブラリ実装を可能にしており、BignumやMatrixなどがあたかも元々の言語機能に組み込まれていたかのような効率的な実装を可能にする。イテレータもサポートしており、このイテレータはNimの中で第一級オブジェクトとして用いることができ、これら機能は関数プログラミングを可能にする。オブジェクト指向プログラミングは継承と多重ディスパッチによってサポートされている。関数はジェネリックになりうるし、オーバーロードも可能である。またTypeクラスがサポートされており、これはジェネリクスを促進するものである。演算子オーバーロードもサポートされている。Nimは循環参照検出つきの遅延参照カウントに基づくガベージコレクタを搭載している。アンドリュー・ビンストックはNimに関して「（Nimは）PascalおよびPythonにまたがる非常に独創的なデザインを提供し、CやJavaScriptのコードにコンパイルすることができる」と述べた。
_START_SECTION_
歴史
_START_PARAGRAPH_
Nimの開発は2005年にアンドレアス・ランプフによって始まった。NimのコンパイラはPascalによって書かれていた。2008年にはNimで書かれたコンパイラがリリースされた。Nimのコンパイラはオープンソースであり、アンドレアス・ランプフに加えてボランティアのグループが開発を行っている。
_START_SECTION_
コンパイラ
_START_PARAGRAPH_
Nimのコンパイラは最適化されたCのコードを吐くことができ、Cのコンパイラなどの外部コンパイラに従ったコンパイルを選択することもできる（ClangやGNU Compiler Collectionなどの多くのコンパイラがサポートされており、これらコンパイラの最適化や移植能力を利用することができる）。Nimのコンパイラは加えてC++とObjective-Cのコードを吐くことができ、これらの言語で書かれたアプリケーションプログラミングインタフェース(API)を備えた簡易なインターフェイスを提供する。この機能によってNimによるiOSやAndroidのアプリケーションの開発も可能である。
_START_SECTION_
パッケージシステム
_START_PARAGRAPH_
Nimble はNimによってNimモジュールをパッケージするのに用いられているパッケージマネージャーである。これは構成にNimScriptを用いている。NimbleはGitリポジトリ上でパッケージの主要ソースとして働く。パッケージのリストはJSONファイルに保存され、nim-lang/packages repositoryから自由にアクセス可能である。このJSONファイルはNimbleに要求されたGit URLを与え、パッケージをクローンし、インストールする。
_START_SECTION_
Nimble
_START_PARAGRAPH_
NimbleはNimモジュールのパッケージに使われているパッケージマネージャである。Nimbleの構成にはNimScriptが使われている。Nimbleのパッケージは主にGitで管理されており、NimbleはGitリポジトリ上で動作する。NimbleのパッケージのリストはJSONファイルに保管されており、nim-lang/packagesリポジトリで自由にアクセス可能である。このJSONファイルはNimbleにGit URLを提供し、そのURLからパッケージがクローンされインストールされる。
_START_SECTION_
c2nim
_START_PARAGRAPH_
c2nimはAnsi CのコードからNimのコードに変換するときに新たなBindingを生成するのに寄与する。出力は人間に読むことが可能なNimのコードになり、これにより変換後に人の手での改善・改良が可能になる。
_START_SECTION_
ライブラリ
_START_PARAGRAPH_
NimのプログラムはC言語で使われているものであれば、どんなライブラリでも使用することが可能である。GTK+2、SDL2、Cairo、OpenGL、WinAPI、zlib、libzip、OpenSSL、cURLなど多くの言語に言語バインディング (Language binding) が存在する。NimはPostgreSQL、MySQL、SQLiteのデータベースを使用することができる。NimはLuaインタープリタおよびPythonインタープリタとインターフェースをとることができる。
_START_SECTION_
コードの例
_START_PARAGRAPH_
以下のコードサンプルはNim 0.13.0.のシンタックスで有効であり、バージョンが新しくなるにつれて記法が変わる可能性がある。
_START_SECTION_
Hello world
_START_PARAGRAPH_
NimによるHello worldのプログラム:_NEWLINE_echo "Hello World!"
_START_SECTION_
Stringをひっくり返す
_START_PARAGRAPH_
Nimの機能を知るためのシンプルな例。_NEWLINE_proc reverse(s: string): string =_NEWLINE_  result = "" # 暗黙的なresult変数_NEWLINE_  for i in countdown(high(s), 0):_NEWLINE_    result.add s[i]var str1 = "Reverse This!"echo "Reversed: ", reverse(str1)_NEWLINE_もっともエキゾチックな機能は暗黙的なresult変数である。すなわち、returnの型がvoidではないNimのすべてのプロシージャは暗黙的なresult変数を持っており、result変数は返される（returnされる）値を保持している。Forループでは、countdownという呼び出しが見られ、このcountdownはイテレータである。もしFor loopに際して型が定義され、またイテレータが省略されればNimのコンパイラはitemsイテレータの使用を試みる。
_START_SECTION_
メタプログラミング
_START_PARAGRAPH_
これはNimのテンプレート機能を使ったメタプログラミングの例である。_NEWLINE_template genType(name, fieldname: untyped, fieldtype: typedesc) =_NEWLINE_  type_NEWLINE_    name = object_NEWLINE_      fieldname: fieldtypegenType(Test, foo, int)var x = Test(foo: 4566)echo(x.foo) # 4566_NEWLINE_genTypeはコンパイル時に呼び出され、Test型が作成される。
_START_SECTION_
Cの関数をラップする
_START_PARAGRAPH_
次のプログラムは既存のCのコードがNimで直接使うことができることを示す例である。_NEWLINE_proc printf(formatstr: cstring)_NEWLINE_  {.header: "<stdio.h>", varargs.}printf("%s %d\n", "foo", 5)_NEWLINE_この例では有名なCの関数printfがインポートされ使用されている。
_START_SECTION_
コミュニティ
_START_PARAGRAPH_
NimはGitHubおよびフォーラムによって主催されているバグのトラッキングをするコミュニティがある。 O'Reilly Open Source Convention (OSCON)でのプレゼンテーションが2015年に行われた。 O'Reilly Community: Essential Languages: Nim, Scala, Python.