Nim

Nimとは



Nim(旧称Nimrod)は、効率性、表現力、優雅さを重視して設計されたプログラミング言語です。命令型、マルチパラダイム、コンパイル言語という特徴を持ち、アンドレアス・ランプフによって設計・開発されました。Nimは、メタプログラミング、関数型プログラミング、メッセージパッシング、手続き型プログラミングオブジェクト指向プログラミングなど、多様なプログラミングスタイルをサポートします。

また、コンパイル時のコード生成、代数的データ型C言語のForeign function interface (FFI)、JavaScriptへのコンパイルなど、高度な機能も提供しています。Pythonのようなシンプルな構文を持ちながら、C言語並みの高いパフォーマンスを実現できるのが特徴です。

比較的新しいシステムプログラミング言語として、Rust、Go、D言語などがありますが、Nimはこれらの言語と並び、注目を集めています。

Nimの主な特徴



シンプルな構文: Pythonのように読みやすい構文を採用しており、学習コストが低いのが特徴です。
静的型付け: コンパイル時に型チェックが行われるため、実行時のエラーを減らすことができます。
メタプログラミング: コンパイル時にコードを生成する機能により、高度な最適化や柔軟なコード生成が可能です。特に、項書き換えマクロは、BignumやMatrixのようなデータ構造を効率的に実装するのに役立ちます。
関数型プログラミング: イテレータを第一級オブジェクトとして扱えるなど、関数プログラミングの要素もサポートしています。
オブジェクト指向プログラミング: 継承と多重ディスパッチにより、オブジェクト指向プログラミングも可能です。
ジェネリクス: 関数や型でジェネリクスを利用でき、より柔軟なコード記述ができます。
演算子オーバーロード: 演算子をオーバーロードすることで、コードの可読性を向上させることができます。
ガベージコレクション: 遅延参照カウントに基づくガベージコレクタを搭載しており、メモリ管理を自動化しています。
C言語との連携: C言語のコードを直接利用できるため、既存のライブラリやシステムとの連携が容易です。
JavaScriptへのコンパイル: Webアプリケーション開発にも利用できます。

Nimの歴史



Nimの開発は2005年にアンドレアス・ランプフによって開始されました。初期のコンパイラはPascalで書かれていましたが、2008年にはNim自身で書かれたコンパイラがリリースされました。Nimのコンパイラはオープンソースであり、アンドレアス・ランプフとボランティアグループによって開発が進められています。

Nimに影響を与えた言語



Nimは、以下のプログラミング言語から影響を受けています。

Modula-3: traced pointer vs untraced pointer
Delphi: 型安全な列挙型
Ada: 部分範囲型、特殊型
C++: 過剰なオーバーロード、ジェネリックプログラミング
Python: インデントに基づく構文
Lisp: マクロシステム、抽象構文木、同図像性
Oberon: エクスポートマーカー
C#: async/await, lambda macro
Go: Defer

コンパイラ



Nimのコンパイラは、最適化されたCコードを出力できます。また、Cコンパイラなどの外部コンパイラを使用してコンパイルすることも可能です。ClangやGNU Compiler Collectionなど、多くのコンパイラがサポートされています。さらに、C++Objective-Cのコードを出力することもでき、これらの言語で記述されたAPIとの連携も容易です。

パッケージシステム



Nimには、Nimbleというパッケージマネージャーがあります。NimbleはGitリポジトリをベースにパッケージを管理し、パッケージのリストはファイルに保存されています。

ツール



Nimble: Nimモジュールのパッケージを管理するためのツールです。
c2nim: Ansi CのコードをNimのコードに変換するツールです。

ライブラリ



Nimは、C言語で利用可能なライブラリをほぼすべて利用できます。GTK2、SDL2、CairoOpenGL、WinAPI、zlib、libzip、OpenSSL、cURLなど、多くのライブラリに言語バインディングが存在します。また、PostgreSQLMySQL、SQLiteなどのデータベースや、LuaPythonのインタープリタとも連携できます。

コード例



以下にNimのコード例をいくつか示します。

Hello world|Hello_world


nim
echo "Hello, world!"


文字列の反転


nim
proc reverseString(s: string): string =
result = ""
for i in countdown(s.high, 0):
result &= s[i]

echo reverseString("hello")


メタプログラミング


nim
template genType(name: untyped, fields: untyped) =
type
name = object
fields

genType(Test, a: int, b: string)

var x: Test
x.a = 1
x.b = "test"

echo x.a
echo x.b


C言語の関数をラップする


nim
proc printf(formatstr: cstring, args: varargs[cstring]): cint {.importc.}= "printf"

printf("Hello, %s!
", "Nim".cstring)


コミュニティ



Nimは活発なコミュニティを持っており、GitHubやフォーラムでバグトラッキングや情報交換が行われています。また、OSCON(O'Reilly Open Source Convention)でも紹介されています。

関連項目



D言語
* UFCS (Uniform Function Call Syntax)

脚注



参考文献

外部リンク

公式ウェブサイト

Nim-lang - Open Hub

Nimble

c2nim

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。