Nim

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索
Nim
パラダイム マルチパラダイム: コンパイル言語並行プログラミング言語手続き型命令型オブジェクト指向
登場時期 2008年(9年前) (2008
設計者 アンドレアス・ランプフ
評価版リリース 0.14.2[1] / 2016年6月9日(17か月前) (2016-06-09
型付け 静的型付け[2] 強い型付け[3] 型推論構造的な型付け
影響を受けた言語 AdaModula-3, LispC++Object PascalPython, Oberon
プラットフォーム WindowsmacOSLinuxFreeBSDNetBSD
ライセンス MIT[4][5]
ウェブサイト nim-lang.org
拡張子 .nim

Nim (旧称はNimrod)とは命令型マルチパラダイムコンパイル言語という特徴を持つプログラミング言語[6]であり、アンドレアス・ランプフにより設計・開発された。Nimは「効率的で表現豊かで優雅」であるように設計されている[7]メタプログラミング関数型プログラミングメッセージパッシング[4]手続き型プログラミングオブジェクト指向プログラミングをサポートしており、 コンパイル時のコード生成、代数的データ型C言語Foreign function interface (FFI)、JavaScriptへのコンパイルなどの機能を提供している[8]Pythonのようなシンプルな構文で書かれるが、C言語並みの高いパフォーマンスを有している。RustD言語Goなどの言語としばしば比較される。

概要[編集]

Nimはシンプルな構文による静的型付け言語である[9]構文マクロ項書き換えマクロなどのコンパイル時のメタプログラミング機能をサポートしている[10]。項書き換えマクロは例えばBignumMatrixなどのデータ構造の効率的ライブラリ実装を可能にしており、BignumMatrixなどがあたかも元々の言語機能に組み込まれていたかのような効率的な実装を可能にする[11]イテレータもサポートしており、このイテレータはNimの中で第一級オブジェクトとして用いることができ[10]、これら機能は関数プログラミングを可能にする。オブジェクト指向プログラミングは継承多重ディスパッチによってサポートされている。関数はジェネリックになりうるし、オーバーロードも可能である。またTypeクラスがサポートされており、これはジェネリクスを促進するものである。演算子オーバーロードもサポートされている[10]。Nimは循環参照検出つきの遅延参照カウントに基づくガベージコレクタを搭載している[12][13]。アンドリュー・ビンストック[14]はNimに関して「(Nimは)PascalおよびPythonにまたがる非常に独創的なデザインを提供し、CやJavaScriptのコードにコンパイルすることができる[15]」と述べた。

歴史[編集]

Nimの開発は2005年にアンドレアス・ランプフ[16]によって始まった。NimのコンパイラはPascalによって書かれていた[17]。2008年にはNimで書かれたコンパイラがリリースされた[1]。Nimのコンパイラはオープンソースであり、アンドレアス・ランプフに加えてボランティアのグループが開発を行っている[18]

言語設計[編集]

Nimに影響を与えた言語[編集]

コンパイラ[編集]

Nimのコンパイラは最適化されたCのコードを吐くことができ、Cのコンパイラなどの外部コンパイラに従ったコンパイルを選択することもできる[19]ClangGNU Compiler Collectionなどの多くのコンパイラがサポートされており、これらコンパイラの最適化や移植能力を利用することができる)。Nimのコンパイラは加えてC++Objective-Cのコードを吐くことができ、これらの言語で書かれたアプリケーションプログラミングインタフェース(API)を備えた簡易なインターフェイスを提供する[6]。この機能によってNimによるiOSAndroidのアプリケーションの開発も可能である[20][21]

パッケージシステム[編集]

Nimble はNimによってNimモジュールをパッケージするのに用いられているパッケージマネージャーである。これは構成にNimScriptを用いている。NimbleはGitリポジトリ上でパッケージの主要ソースとして働く。パッケージのリストはJSONファイルに保存され、nim-lang/packages repositoryから自由にアクセス可能である。このJSONファイルはNimbleに要求されたGit URLを与え、パッケージをクローンし、インストールする。

ツール[編集]

Nimble[編集]

Nimble[22]はNimモジュールのパッケージに使われているパッケージマネージャである。Nimbleの構成にはNimScriptが使われている。Nimbleのパッケージは主にGitで管理されており、NimbleはGitリポジトリ上で動作する。NimbleのパッケージのリストはJSONファイルに保管されており、nim-lang/packagesリポジトリで自由にアクセス可能である。このJSONファイルはNimbleにGit URLを提供し、そのURLからパッケージがクローンされインストールされる。

c2nim[編集]

c2nimはAnsi CのコードからNimのコードに変換するときに新たなBindingを生成するのに寄与する。出力は人間に読むことが可能なNimのコードになり、これにより変換後に人の手での改善・改良を可能になる。

ライブラリ[編集]

NimのプログラムはC言語で使われているものであれば、どんなライブラリでも使用することが可能である。GTK+2、SDL2、CairoOpenGLWinAPIzliblibzipOpenSSLcURLなど多くの言語に言語バインディング (Language binding) が存在する[23]。NimはPostgreSQLMySQLSQLiteのデータベースを使用することができる。NimはLuaインタープリタおよびPythonインタープリタとインターフェースをとることができる。

コードの例[編集]

以下のコードサンプルはNim 0.13.0.のシンタックスで有効であり、バージョンが新しくなるにつれて記法が変わる可能性がある[24]

Hello world[編集]

NimによるHello worldのプログラム:

echo "Hello World!"

Stringをひっくり返す[編集]

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: expr, fieldtype: typedesc) =
  type
    name = object
      fieldname: fieldtype

genType(Test, foo, int)

var x = Test(foo: 4566)
echo(x.foo) # 4566

genTypeはコンパイル時に呼び出され、Test型が作成される。

Cの関数をラップする[編集]

次のプログラムは既存のCのコードがNimで直接使うことができることを示す例である。

proc printf(formatstr: cstring)
  {.header: "<stdio.h>", varargs.}

printf("%s %d\n", "foo", 5)

この例では有名なCの関数printfがインポートされ使用されている[25]

コミュニティ[編集]

NimはGitHubおよびフォーラムによって主催されているバグのトラッキングをするコミュニティがある[26][27]O'Reilly Open Source Convention (OSCON)でのプレゼンテーションが2015年に行われた[28]。 O'Reilly Community: Essential Languages: Nim, Scala, Python.[29][30]

関連項目[編集]

  • D言語
  • UFCS ‐ Nimによってサポートされている機能。

参考文献[編集]

  1. ^ a b News”. Official website. 2016年6月11日閲覧。
  2. ^ Nim by example”. GitHub. 2014年7月20日閲覧。
  3. ^ Караджов, Захари; Станимиров, Борислав (2014). “Метапрограмиране с Nimrod” (Bulgarian). VarnaConf. http://ibob.github.io/slides/nimrodbg/#/ 2014年7月27日閲覧。 
  4. ^ a b FAQ”. Official website. 2015年3月27日閲覧。
  5. ^ copying.txt”. Nim. GitHub. 2015年3月27日閲覧。
  6. ^ a b Rumpf, Andreas (2014年2月11日). “Nimrod: A new systems programming language”. Dr. Dobb's Journal. 2014年7月20日閲覧。
  7. ^ The Nim Programming Language”. Official website. 2014年7月20日閲覧。
  8. ^ What's so special about Nim?”. Hookrace blog. 2015年3月27日閲覧。
  9. ^ Nim Syntax”. akehrer. 2015年3月27日閲覧。
  10. ^ a b c Nim Manual”. Official website. 2014年7月20日閲覧。
  11. ^ Strangeloop Nim presentation”. 2015年4月30日閲覧。
  12. ^ Nim's Garbage Collector”. Nim documentation. 2015年4月3日閲覧。
  13. ^ A Quick Comparison of Nim vs. Rust”. 05082015閲覧。
  14. ^ : Andrew Binstock (Dr. Dobb'sの編集長)
  15. ^ The Rise And Fall of Languages in 2013 By Andrew Binstock, January 07, 2014 Dr. Dobb's
  16. ^ : Andreas Rumpf
  17. ^ Nim Pascal Sources”. Nim. GitHub. 2013年4月5日閲覧。
  18. ^ Contributors”. Nim. GitHub. 2013年4月5日閲覧。
  19. ^ Rumpf, Andreas (2014年1月15日). “Nimrod: A New Approach to Metaprogramming”. InfoQ: 該当時間: 2:23. http://www.infoq.com/presentations/nimrod 2014年7月20日閲覧。 
  20. ^ Hankiewicz, Grzegorz Adam (2014年3月10日). “Nimrod for cross platform software”. Rants from the Ballmer Peak. GitHub. 2014年7月20日閲覧。
  21. ^ Nimrod-on-android failure” (2012年7月28日). 2015年2月28日閲覧。
  22. ^ Nimble
  23. ^ Nim Standard Library”. Nim documentation. 2015年4月4日閲覧。
  24. ^ Nim code examples at Rosetta Code
  25. ^ What is special about Nim?”. HookRace (2015年1月1日). 2015年2月17日閲覧。
  26. ^ Primary source code repository and bug tracker”. GitHub. 2015年5月4日閲覧。
  27. ^ Nim Forum”. nim-lang.org. 2015年5月4日閲覧。
  28. ^ Nim at OSCON 2015”. OSCON (2015年7月20日). 2015年5月4日閲覧。
  29. ^ Essential Languages: Nim, Scala, Python”. 05082015閲覧。
  30. ^ Presentation of Nim by Andreas Rumpf on OSCON 2015 - YouTube

外部リンク[編集]