効率的で表現力豊かなプログラミング言語「Nim」をインストールする

2018.09.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは、データインテーグレーション部の平野です。
台風接近により、入社2日目にして15時半過ぎに会社を出て家からのリモートワーク中です。
まだ家でできる仕事がないため、ブログの執筆をしています。
…いえいえ、弊社ではブログ執筆は立派な業務ですから、ちゃんと仕事をしています!

Nimという言語

皆様、Nimというプログラミング言語をご存知でしょうか?
Nimはpython風構文でサクッと書くことができて、
コンパイルして出力される実行ファイルはC言語と同等の速度で動くと言われる言語です。
認知度は低いのですが、パフォーマンスの高さやコードの書き味の良さなど密かに人気があります。
ガベージコレクションもしてくれるので、C言語やC++は敷居が高くて・・・という人(私)にはぴったりな感じです。

CUIの文字列処理なんかだと本当にサクッと書くことができるので、
標準のLinuxコマンドでは難しいような処理で、頻度の高いものを幾つかNimで書いたりしています。

今回はこのNimのコンパイラをインストールします。

実行環境

Windows10のWSLでUbuntuを動かした上でに動作になります。

Nimのコンパイラをインストールする

Ubuntuのaptでは古いバージョンがインストールされるようなので、
オフィシャルページのガイドに従ってインストールしました。
まずインストールページに行くと、「Intallation using choosenim」と「Manual installation from source」がありますが、今回はchoosenimを使ってインストールします。
choosenimは複数のバージョンのNimがインストールされているときに、バージョンを切り替えたりできる補助ツールです。

では早速以下のコマンドを実行します。

curl https://nim-lang.org/choosenim/init.sh -sSf | sh

実行すると、「Nimの使用状況のデータを匿名で送信しても良いか?」と問われますので、y/nで回答します。 これは別にnを選択してもインストールはできるようです。

$ curl https://nim-lang.org/choosenim/init.sh -sSf | sh
choosenim-init: Downloading choosenim-0.3.2_linux_amd64
    Prompt: Can choosenim record and send anonymised telemetry data? [y/n]
        ... Anonymous aggregate user analytics allow us to prioritise
        ... fixes and features based on how, where and when people use Nim.
        ... For more details see: https://goo.gl/NzUEPf.
    Answer:

回答すると引き続きダウンロード、インストールの作業が始まります。
おおよそ以下のように表示されれば完了です。

Downloading Nim 0.18.0 from nim-lang.org
[##################################################] 100.0% 0kb/s
 Extracting nim-0.18.0.tar.xz
   Building Nim 0.18.0
   Building tools (nimble, nimgrep, nimsuggest)
  Installed component nim
  Installed component nimble
  Installed component nimgrep
  Installed component nimsuggest
   Switched to Nim 0.18.0
choosenim-init: ChooseNim installed in /home/Shigetoshi/.nimble/bin
choosenim-init: You must now ensure that the Nimble bin dir is in your PATH.
choosenim-init: Place the following line in the ~/.profile or ~/.bashrc file.
choosenim-init:     export PATH=/home/Shigetoshi/.nimble/bin:$PATH

これで ~/.nimble~/.choosenimにNim関連の一連のファイルが保存されます。
あとは書かれている通り、お好みで~/.nimble/binをPATHに追加すればインストール完了です。

他ユーザでのインストール時の注意点

上記でインストールされたNimはユーザのhome下に置かれますので、
別のユーザも使用するためにはそのユーザも先程のコマンドを実行してインストールする必要があります。
なので、別ユーザでもう一度同じことをしたのですが、そのとき少しハマりました。

まずそのまま curl https://nim-lang.org/choosenim/init.sh -sSf | shを実行すると

$ curl https://nim-lang.org/choosenim/init.sh -sSf | sh
choosenim-init: Downloading choosenim-0.3.2_linux_amd64
chmod: changing permissions of /tmp/choosenim-0.3.2_linux_amd64: Operation not permitted

と怒られます。
これは単純に以前にインストールしたユーザのtmpファイルが残っているので、所有者に消してもらってください。
そして上記がない状態でもう一度 curl https://nim-lang.org/choosenim/init.sh -sSf | sh すると

$ curl https://nim-lang.org/choosenim/init.sh -sSf | sh
choosenim-init: Downloading choosenim-0.3.2_linux_amd64
-1
choosenim.nim(204)       choosenim
os.nim(960)              createDir
os.nim(933)              existsOrCreateDir
os.nim(913)              rawCreateDir
oserr.nim(110)           raiseOSError
Error: unhandled exception: Permission denied [OSError]

となってしまいます。
今度は具体的なエラー内容が書かれていないのですが、結論として
/tmp/untar-nim というディレクトリが、やはり前回インストールしたユーザ権限で残っているのが原因でした。
なので上と合わせてこちらも所有者に消してもらう必要があります。
2つのディレクトリを消してもらったあとであれば、正常にインストールが行えました。

インストールスクリプト

上記の/tmpに一時ファイルが残存することと、インストール時に使用状況の送信に同意するかの確認があるため、 ワンコマンドでインストールをするには、以下のようなスクリプトを書いておくのが良さそうです。

curl https://nim-lang.org/choosenim/init.sh -sSf > choosenim.sh
sh choosenim.sh -y                                                   # 使用状況の送信に同意
rm -fr choosenim.sh /tmp/choosenim-0.3.2_linux_amd64 /tmp/untar-nim

まとめ

Nim言語のインストール方法とちょっとつまずいた点を紹介しました。
私もまだきちんと使い込めてはいないのですが、「こういう書き方で書けたら自分が思ってる通りの表現なんだけどな〜」という書き方が出来て楽しいです。
Nim言語の中身についてはまた近いうちに書ければと思いますが、興味を持った方はぜひ試してみて頂ければと思います。