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、Cairo、OpenGL、WinAPI、zlib、libzip、OpenSSL、cURLなど、多くのライブラリに言語バインディングが存在します。また、PostgreSQL、MySQL、SQLiteなどのデータベースや、Lua、Pythonのインタープリタとも連携できます。
コード例
以下にNimのコード例をいくつか示します。
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