2018/07/04

Nimの特徴とHelloWorldとコンパイラと

特徴

Nimのコンパイラは最初Pascalで書かれていたそうです。
Nimの面白いところは、コンパイラで、まず最適化されたCコードを生成できる。加えて、C++やObejctive-Cやjavascriptのコードを生成できることです。
使った実感としては、軽い!速い!

構文は少し特殊な印象を受けました。Pythonと同様インデントによってブロックのグルーピングを行います。ただし、Nimはスペース2つ。
関数も演算子もオーバーロード可能。
cstringなどを使って、C言語のコードを直接使うことができる。
ジェネリックOK!
ガベージコレクタ付き。
nimbleでパッケージ管理。NimScriptが使える。
使いこなせるようになれれば楽しそうな言語です。

Hello, world!とコンパイラ

恒例のHello,world!は以下のようになります。

---------
hello.nim
---------

echo "Hello, world!"
以上です。実はNimにはmain関数がいりません。実行してみましょう。
$ nim c -r hello.nim
Hello, world!
nim c -r filenameは、省略したもので、nim complie --run filenameと同じです。リリースバージョンを生成したい場合は、nim c -d:release filenameとなります。
コンパイルすると、同じディレクトリに実行ファイルhellonimcacheというディレクトリが作られ、その中にhello.chello.jsonhello.oの3つのファイルが生成されます。
またNimではコンパイルについて細かく設定できるようになっており、デフォルトのコンパイラを変更することもできます。例えばgccを使いC++ファイルを生成したい場合、以下のようにします。
$ nim cpp --cc:gcc hello.nim
すると、同じディレクトリに実行ファイルhellonimcacheディレクトリにhello.cpphello.jsonhello.oが生成されます。
$ ./hello
Hello, world!
もちろん-rをつけてそのまま実行することもできます。
$ nim cpp --cc:gcc -r hello.nim
Hello, world!
いずれにしても速度がすごいです。

Playground

Nimには、コードをWeb上で試すことができるNim Playgroundというものがあります。このPlaygroundはNimのスタンダードライブラリをインストールして試すこともできて、大変便利です。コンパイルも速い。

追記

2019年9月、Nimはversion1.0.0 stableをリリースしました。この記事に書かれている内容はやや古いものとなってしまいました。私のPCでは現在nimcacheというディレクトリではなく、.cache/nimというディレクトリに、例えばhello.nimをコンパイルすれば、hello_dというディレクトリが作成され、その中にhello.nim.chello.nim.oと言ったファイルが作成されます。様々なモジュールも廃止されたり、統合されたりしておりますので、改めて公式ドキュメントを読み直す必要があるように思います。私も大雑把な記事を書きましたので、よろしければご覧ください。