経済性、表現力、優美
Nim は静的型付けを採用したコンパイラ方式のシステムプログラミング言語です。 Python, Ada や Modula など洗練された言語で定評のある思想を取り入れています。
経済性
- Nim は依存性のないネイティブ動作の実行可能ファイルを生成します。 生成ファイルは仮想マシンへの依存性がなく、小型軽量であるため簡単に配布できます
- Nim コンパイラと生成された実行可能ファイルは Windows, Linux, BSD および macOS など主要なプラットホームにすべて対応しています。
- リアルタイムシステムに対応した高速遅延参照カウント方式によるメモリ管理。
- オーバーヘッドのないイテレーターとユーザ定義関数のコンパイル時の評価、 値ベースのデータ型の優先的スタック割り当てなどモダンな概念を併用することで、 究極の高性能コードを実現します。
- 各種バックエンドへの対応: C, C++ または JavaScript へコンパイルします。 Nim は必要に応じて、さまざまなバックエンドとフロントエンドを使用できます。
表現力
- Nim は自己完結型です: コンパイラと標準ライブラリは Nim で実装してあります。
- Nim には抽象構文木 (AST) を直接操作できる無限の可能性を秘めた強力なマクロシステムがあります。
優美
- 必要性がないため Nim のシンタックスはマクロによる変更はできません — シンタックスは十分柔軟です。
- 局所型推論、タプル、ジェネリックと総和型によるモダンな型システム。
- ステートメントはインデントでまとめますが、複数行をまたがることもできます。
import strformat
type
Person = object
name: string
age: Natural # 正数として age を確保します。
let people = [
Person(name: "John", age: 45),
Person(name: "Kate", age: 30)
]
for person in people:
# コンパイル時に評価される、
# 型安全の文字列補完
echo(fmt"{person.name} is {person.age} years old")
# Nim の 'iterator' と 'yield' コンストラクトにより、
# イテレータは普通の関数と同じように簡単に記述できます。
# コンパイル時はインラインループとして展開します。
iterator oddNumbers[Idx, T](a: array[Idx, T]): T =
for x in a:
if x mod 2 == 1:
yield x
for odd in oddNumbers([3, 6, 9, 12, 15, 18]):
echo odd
# データ処理を中心とする難解な
# x86 インストラクションの記述において、
# アセンブラと JIT で使う参照テーブルの変換で
# Nim のマクロシステムを使用します。
import macros, strutils
macro toLookupTable(data: static[string]): untyped =
result = newTree(nnkBracket)
for w in data.split(';'):
result.add newLit(w)
const
data = "mov;btc;cli;xor"
opcodes = toLookupTable(data)
for o in opcodes:
echo o