Nim
Nim | |
---|---|
拡張子 | .nim |
パラダイム | マルチパラダイム: コンパイル言語、並行プログラミング言語、手続き型、命令型、オブジェクト指向 |
登場時期 | 2008年 |
設計者 | アンドレアス・ランプフ |
最新リリース | 0.18.0[1]/ 2018年3月1日 |
型付け | 静的型付け[2]、強い型付け[3] 、型推論、構造的な型付け |
影響を受けた言語 | Ada、Modula-3, Lisp、C++、Object Pascal、Python, Oberon |
プラットフォーム | クロスプラットフォーム |
ライセンス | MIT[4][5] |
ウェブサイト | nim-lang.org |
Nim (旧称はNimrod)とは命令型、マルチパラダイム、コンパイル言語という特徴を持つプログラミング言語[6]であり、アンドレアス・ランプフにより設計・開発された。Nimは「効率的で表現豊かで優雅」であるように設計されている[7]。メタプログラミング、関数型プログラミング、メッセージパッシング[4]、手続き型プログラミング、オブジェクト指向プログラミングをサポートしており、 コンパイル時のコード生成、代数的データ型、C言語のForeign function interface (FFI)、JavaScriptへのコンパイルなどの機能を提供している[8]。Pythonのようなシンプルな構文で書かれるが、C言語並みの高いパフォーマンスを有している。Rust、D言語、Goなどの言語としばしば比較される。
Contents
概要
Nimはシンプルな構文による静的型付け言語である[9]。構文マクロや項書き換えマクロなどのコンパイル時のメタプログラミング機能をサポートしている[10]。項書き換えマクロは例えばBignum
やMatrix
などのデータ構造の効率的ライブラリ実装を可能にしており、Bignum
やMatrix
などがあたかも元々の言語機能に組み込まれていたかのような効率的な実装を可能にする[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に影響を与えた言語
- 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のコンパイラなどの外部コンパイラに従ったコンパイルを選択することもできる[19](ClangやGNU Compiler Collectionなどの多くのコンパイラがサポートされており、これらコンパイラの最適化や移植能力を利用することができる)。Nimのコンパイラは加えてC++とObjective-Cのコードを吐くことができ、これらの言語で書かれたアプリケーションプログラミングインタフェース(API)を備えた簡易なインターフェイスを提供する[6]。この機能によってNimによるiOSやAndroidのアプリケーションの開発も可能である[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、Cairo、OpenGL、WinAPI、zlib、libzip、OpenSSL、cURLなど多くの言語に言語バインディング (Language binding) が存在する[23]。NimはPostgreSQL、MySQL、SQLiteのデータベースを使用することができる。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]
関連項目
参考文献
- ↑ 1.0 1.1 “Version 0.18.0 released”. Official website. . 2018-03-1閲覧.
- ↑ “Nim by example”. GitHub. . 2014閲覧.
- ↑ Караджов, Захари; Станимиров, Борислав (2014). “Метапрограмиране с Nimrod” (Bulgarian). VarnaConf . 2014閲覧.
- ↑ 4.0 4.1 “FAQ”. Official website. . 2015閲覧.
- ↑ “copying.txt”. Nim. GitHub. . 2015閲覧.
- ↑ 6.0 6.1 Rumpf, Andreas (2014年2月11日). “Nimrod: A new systems programming language”. Dr. Dobb's Journal. . 2014閲覧.
- ↑ “The Nim Programming Language”. Official website. . 2014閲覧.
- ↑ “What's so special about Nim?”. Hookrace blog. . 2015閲覧.
- ↑ “Nim Syntax”. akehrer. . 2015閲覧.
- ↑ 10.0 10.1 10.2 “Nim Manual”. Official website. . 2014閲覧.
- ↑ “Strangeloop Nim presentation”. . 2015閲覧.
- ↑ “Nim's Garbage Collector”. Nim documentation. . 2015閲覧.
- ↑ “A Quick Comparison of Nim vs. Rust”. . 05082015閲覧.
- ↑ 英: Andrew Binstock (Dr. Dobb'sの編集長)
- ↑ 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閲覧.
- ↑ “Contributors”. Nim. GitHub. . 2013閲覧.
- ↑ Rumpf, Andreas (2014年1月15日). “Nimrod: A New Approach to Metaprogramming”. InfoQ: 該当時間: 2:23 . 2014閲覧.
- ↑ Hankiewicz, Grzegorz Adam (2014年3月10日). “Nimrod for cross platform software”. Rants from the Ballmer Peak. GitHub. . 2014閲覧.
- ↑ “Nimrod-on-android failure” (2012年7月28日). . 2015閲覧.
- ↑ Nimble
- ↑ “Nim Standard Library”. Nim documentation. . 2015閲覧.
- ↑ Nim code examples at Rosetta Code
- ↑ “What is special about Nim?”. HookRace (2015年1月1日). . 2015閲覧.
- ↑ “Primary source code repository and bug tracker”. GitHub. . 2015閲覧.
- ↑ “Nim Forum”. nim-lang.org. . 2015閲覧.
- ↑ “Nim at OSCON 2015”. OSCON (2015年7月20日). . 2015閲覧.
- ↑ “Essential Languages: Nim, Scala, Python”. . 05082015閲覧.
- ↑ Presentation of Nim by Andreas Rumpf on OSCON 2015 - YouTube