Nim

Nim (旧称Nimrod) とは命令型、マルチパラダイム、コンパイル言語という特徴を持つプログラミング言語であり、アンドレアス・ランプフにより設計・開発された。Nimは「効率的で表現豊かで優雅」であるように設計されている。メタプログラミング、関数型プログラミング、メッセージパッシング、手続き型プログラミング、オブジェクト指向プログラミングをサポートしており、 コンパイル時のコード生成、代数的データ型、C言語のForeign function interface (FFI)、JavaScriptへのコンパイルなどの機能を提供している。Pythonのようなシンプルな構文で書かれるが、C言語並みの高いパフォーマンスを有している。Nimは様々な用途に使用可能なシステムプログラミング言語であるが、Nimのように比較的新しい（C/C++以降に発表された）言語としては他にもRust、Go、D言語などの言語がある。 Nimはシンプルな構文による静的型付け言語である。構文マクロや項書き換えマクロなどのコンパイル時のメタプログラミング機能をサポートしている。項書き換えマクロは例えばBignumやMatrixなどのデータ構造の効率的ライブラリ実装を可能にしており、BignumやMatrixなどがあたかも元々の言語機能に組み込まれていたかのような効率的な実装を可能にする。イテレータもサポートしており、このイテレータはNimの中で第一級オブジェクトとして用いることができ、これら機能は関数プログラミングを可能にする。オブジェクト指向プログラミングは継承と多重ディスパッチによってサポートされている。関数はジェネリックになりうるし、オーバーロードも可能である。またTypeクラスがサポートされており、これはジェネリクスを促進するものである。演算子オーバーロードもサポートされている。Nimは循環参照検出つきの遅延参照カウントに基づくガベージコレクタを搭載している。アンドリュー・ビンストックはNimに関して「（Nimは）PascalおよびPythonにまたがる非常に独創的なデザインを提供し、CやJavaScriptのコードにコンパイルすることができる」と述べた。 Nimの開発は2005年にアンドレアス・ランプフによって始まった。NimのコンパイラはPascalによって書かれていた。2008年にはNimで書かれたコンパイラがリリースされた。Nimのコンパイラはオープンソースであり、アンドレアス・ランプフに加えてボランティアのグループが開発を行っている。 Modula-3: traced pointer vs untraced pointer. Delphi: 型安全な列挙型 (set of char). Ada: 部分範囲型、特殊型、safe variant / case object. C++: Excessive overloading、ジェネリックプログラミング Python: インデントに基づくシンタックス。 Lisp: マクロ・システム、抽象構文木の採用、同図像性 Oberon: The export marker. C#: async/await, lambda macro. Go: Defer. Nimのコンパイラは最適化されたCのコードを吐くことができ、Cのコンパイラなどの外部コンパイラに従ったコンパイルを選択することもできる（ClangやGNU Compiler Collectionなどの多くのコンパイラがサポートされており、これらコンパイラの最適化や移植能力を利用することができる）。Nimのコンパイラは加えてC++とObjective-Cのコードを吐くことができ、これらの言語で書かれたアプリケーションプログラミングインタフェース(API)を備えた簡易なインターフェイスを提供する。この機能によってNimによるiOSやAndroidのアプリケーションの開発も可能である。 Nimble はNimによってNimモジュールをパッケージするのに用いられているパッケージマネージャーである。これは構成にNimScriptを用いている。NimbleはGitリポジトリ上でパッケージの主要ソースとして働く。パッケージのリストはJSONファイルに保存され、nim-lang/packages repositoryから自由にアクセス可能である。このJSONファイルはNimbleに要求されたGit URLを与え、パッケージをクローンし、インストールする。 NimbleはNimモジュールのパッケージに使われているパッケージマネージャである。Nimbleの構成にはNimScriptが使われている。Nimbleのパッケージは主にGitで管理されており、NimbleはGitリポジトリ上で動作する。NimbleのパッケージのリストはJSONファイルに保管されており、nim-lang/packagesリポジトリで自由にアクセス可能である。このJSONファイルはNimbleにGit URLを提供し、そのURLからパッケージがクローンされインストールされる。 c2nimはAnsi CのコードからNimのコードに変換するときに新たなBindingを生成するのに寄与する。出力は人間に読むことが可能なNimのコードになり、これにより変換後に人の手での改善・改良が可能になる。 NimのプログラムはC言語で使われているものであれば、どんなライブラリでも使用することが可能である。GTK2、SDL2、Cairo、OpenGL、WinAPI、zlib、libzip、OpenSSL、cURLなど多くの言語に言語バインディング (Language binding) が存在する。NimはPostgreSQL、MySQL、SQLiteのデータベースを使用することができる。NimはLuaインタープリタおよびPythonインタープリタとインターフェースをとることができる。 以下のコードサンプルはNim 0.13.0.のシンタックスで有効であり、バージョンが新しくなるにつれて記法が変わる可能性がある。 NimによるHello worldのプログラム: echo "Hello World!" Nimの機能を知るためのシンプルな例。 proc reverse(s: string): string = result = "" # 暗黙的なresult変数 for i in countdown(high(s), 0): result.add s[i] var str1 = "Reverse This!" echo "Reversed: ", reverse(str1) もっともエキゾチックな機能は暗黙的なresult変数である。すなわち、returnの型がvoidではないNimのすべてのプロシージャは暗黙的なresult変数を持っており、result変数は返される（returnされる）値を保持している。Forループでは、countdownという呼び出しが見られ、このcountdownはイテレータである。もしFor loopに際して型が定義され、またイテレータが省略されればNimのコンパイラはitemsイテレータの使用を試みる。 これはNimのテンプレート機能を使ったメタプログラミングの例である。 template genType(name, fieldname: untyped, fieldtype: typedesc) = type name = object fieldname: fieldtype genType(Test, foo, int) var x = Test(foo: 4566) echo(x.foo) # 4566 genTypeはコンパイル時に呼び出され、Test型が作成される。 次のプログラムは既存のCのコードがNimで直接使うことができることを示す例である。 proc printf(formatstr: cstring) {.header: "<stdio.h>", varargs.} printf("%s %d\n", "foo", 5) この例では有名なCの関数printfがインポートされ使用されている。 NimはGitHubおよびフォーラムによって主催されているバグのトラッキングをするコミュニティがある。 O'Reilly Open Source Convention (OSCON)でのプレゼンテーションが2015年に行われた。 O'Reilly Community: Essential Languages: Nim, Scala, Python. D言語 UFCS ‐ Nimによってサポートされている機能。 [脚注の使い方] ^ システムプログラミング言語#主なプログラミング言語も参照。 ^ 英: Andrew Binstock (Dr. Dobb'sの編集長) ^ 出典URL: https://github.com/nim-lang/Nim/releases/tag/v2.2.0 ^ “Nim by example”. GitHub. 2014年7月20日閲覧。 ^ Караджов, Захари; Станимиров, Борислав (2014). Метапрограмиране с Nimrod. VarnaConf (Bulgarian). 2014年7月27日閲覧。 ^ a b “FAQ”. Official website. 2015年3月27日閲覧。 ^ “copying.txt”. Nim. GitHub. 2015年3月27日閲覧。 ^ “Version 0.10.2 released - Nim Blog”. 2020年12月11日閲覧。 ^ a b Rumpf, Andreas (2014年2月11日). “Nimrod: A new systems programming language”. Dr. Dobb's Journal. 2014年7月20日閲覧。 ^ “The Nim Programming Language”. Official website. 2014年7月20日閲覧。 ^ “What's so special about Nim?”. Hookrace blog. 2015年3月27日閲覧。 ^ “nim-lang.org”. nim-lang.org. 2020年12月17日閲覧。2020年12月１７日時点でトップページに「Nim is a statically typed compiled systems programming language.」とある。 ^ “BEST SYSTEMS PROGRAMMING LANGUAGES”. slant. 2020年12月17日閲覧。 ^ “Nim Syntax”. akehrer. 2015年3月27日閲覧。 ^ a b c “Nim Manual”. Official website. 2014年7月20日閲覧。 ^ “Strangeloop Nim presentation”. 2015年4月30日閲覧。 ^ “Nim's Garbage Collector”. Nim documentation. 2015年4月3日閲覧。 ^ “A Quick Comparison of Nim vs. Rust”. 2015年5月8日閲覧。 ^ The Rise And Fall of Languages in 2013 By Andrew Binstock, January 07, 2014 Dr. Dobb's ^ 独: Andreas Rumpf ^ “Nim Pascal Sources”. Nim. GitHub. 2013年4月5日閲覧。 ^ “News”. Nim-lang.org. 2016年6月11日閲覧。 ^ “Contributors”. Nim. GitHub. 2013年4月5日閲覧。 ^ Rumpf, Andreas (15 January 2014). Nimrod: A New Approach to Metaprogramming. InfoQ. 該当時間: 2:23. 2014年7月20日閲覧。 ^ Hankiewicz, Grzegorz Adam (2014年3月10日). “Nimrod for cross platform software”. Rants from the Ballmer Peak. GitHub. 2014年7月20日閲覧。 ^ “Nimrod-on-android failure” (2012年7月28日). 2015年2月28日閲覧。 ^ Nimble ^ “Nim Standard Library”. Nim documentation. 2015年4月4日閲覧。 ^ Nim code examples at Rosetta Code ^ “What is special about Nim?”. HookRace (2015年1月1日). 2015年2月17日閲覧。 ^ “Primary source code repository and bug tracker”. GitHub. 2015年5月4日閲覧。 ^ “Nim Forum”. nim-lang.org. 2015年5月4日閲覧。 ^ “Nim at OSCON 2015”. OSCON (2015年7月20日). 2015年5月4日閲覧。 ^ “Essential Languages: Nim, Scala, Python”. 2015年5月8日閲覧。 ^ Presentation of Nim by Andreas Rumpf on OSCON 2015 - YouTube 公式ウェブサイト Nim-lang - Open Hub Nimble c2nim