NimはPythonのようにシンプルな構文を持ちながら、C言語と同等の速度で動かすことができるプログラミング言語です。そのため、ゲーム開発からシステムプログラミング、Web開発とさまざまな用途で活用されています。今回は、効率性と表現力が魅力のNim言語の魅力に迫ってみましょう。

  • シンプルな構文を持ち実行速度が速いNimでFizzBuzzを実行したところ

    シンプルな構文を持ち実行速度が速いNimでFizzBuzzを実行したところ

Nimとは

Nimは2008年にドイツの開発者アンドレアス・ランプフによって開発されたプログラミング言語です。最初のNimはPascalによって書かれており、その後すぐにNim自身で書き直されました。

Nimの特徴は、Pythonのようにスッキリとした構文を採用しており可読性が高いことです。型推論を備えていることから静的型付き言語ながら記述が少なくすみます。また、強力なマクロとテンプレートの機構を備えており、メタプログラミングが可能です。

そして、Nimがユニークな点は、Nimのプログラムを、JavaScriptやC言語にトランスパイルできる点にあります。そのため、Nimで書いたプログラムを、別のC言語のコンパイラでコンパイルしたり、ブラウザ上で動かしたりすることもできます。

Nimをインストールしてみよう

【Windowsの場合】

Windowsであれば、本家サイトのトップ画面にある[Install]ボタンを押して、こちらからNim本体のZIPファイルと、下の方にあるC言語のコンパイラ(名前は、mingw64.7z)をダウンロードします。

そして、圧縮解凍ソフトを使って、本体のZIPファイルとコンパイラの7zファイルを解凍します。そして、環境変数に解凍したbinフォルダのパス(Nim本体とmingw64コンパイラ)を追加しましょう。

具体的には、Windowsメニューを表示して検索ボックスに「環境変数」と入力します。そして、表示されたコントロールパネルで「環境変数」のボタンを押します。そして、環境変数の画面が出たら、「Path」をクリックします。すると環境変数名の編集のダイアログが出るので「新規」ボタンをおして、左側に、Nimを解凍してできたbinフォルダのパスを入力します。

しかし、便利なインストーラーなどが用意されていないところにも、Nimの質実剛健な潔さが感じられます。

  • WindowsでNimが使えるよう環境変数にパスを通す作業

    WindowsでNimが使えるよう環境変数にパスを通す作業

【macOS/Linuxの場合】

そして、macOSやLinuxであれば、ターミナルに以下のコマンドをコピーして実行するだけでインストールできます。インストールが完了すると、シェルの設定ファイルに、インストール先binディレクトリのパスを手動で追加するようにと指示がでます。指示通りに、~/.zshrcや~/.bashrcにパスを通しましょう。

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

Nimで一番簡単なプログラム

Nimで一番簡単なプログラムは次のようになります。「hello.nim」という名前で保存しましょう。C言語や他のコンパイラ言語のように、main関数を定義する必要もありませんし、非常にシンプルです。

echo "Hello, World!"

そして、WindowsならPowerShell、macOSならターミナル.appを起動して、次のコマンドを実行します。すると、Nimのプログラムが実行されます。

nim c -r hello.nim

すると、次の画面のように、Nimのプログラムがコンパイルされて、実行結果として「Hello, World!」と表示されます。

  • NimでHello,World!を表示するプログラムを実行したところ

    NimでHello,World!を表示するプログラムを実行したところ

FizzBuzzのプログラムを作ってみよう

もう少し、複雑なプログラムも作ってみましょう。本連載恒例のFizzBuzz問題を解くプログラムを作ってみましょう。FizzBuzz問題とは次のようなプログラムです。

1から100までの数を出力するプログラムを書いてください。ただし、3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」と表示してください。3と5の倍数の時は「FizzBuzz」と表示してください。

次のプログラムを「fizzbuzz.nim」という名前で保存しましょう。

# FizzBuzzを判定する関数を定義 --- (*1)
proc check_fizz(num: int): bool = num mod 3 == 0
proc check_buzz(num: int): bool = num mod 5 == 0

# FizzBuzzを出力する関数を定義 --- (*2)
proc fizzbuzz(num: int): string =
    let is_fizz = check_fizz(num) # 型推論で型宣言は不要 --- (*3)
    let is_buzz = check_buzz(num)
    # 条件分岐を使ってFizzBuzzを判定 --- (*4)
    if is_fizz and is_buzz:
        "FizzBuzz"
    elif is_fizz:
        "Fizz"
    elif is_buzz:
        "Buzz"
    else:
        $num # 数値を文字列に変換 --- (*5)

# 1から100までFizzBuzzを出力 --- (*6)
for i in 1..100:
    echo fizzbuzz(i)

コマンドラインで次のコマンドを実行すると、FizzBuzzのプログラムが実行されます。

nim c -r fizzbuzz.nim

次のように表示されます。無事にFizzBuzz問題の答えを出力しているのを確認できるでしょう。

  • NimでFizzBuzzのプログラムを実行したところ

    NimでFizzBuzzのプログラムを実行したところ

プログラムを確認してみましょう。NimではPythonのようなインデント(字下げ)によってプログラムのブロック構造を表現します。

(*1)では3で割り切れるかを確認するcheck_fizz関数と、5で割り切れるかを確認するcheck_buzzを定義します。

そして、(*2)ではFizzBuzzの結果を返す関数を定義します。(*3)では変数is_fizzとis_buzzに(*1)で定義した関数の戻り値を代入します。なお、Nimには型推論の機能がついているので、ローカル変数を宣言する際、敢えて変数型を指定する必要がありません。

それから、(*4)では順に条件分岐を使って、FizzBuzzを判定していきます。なお、敢えて関数の戻り値を「return 値」のように書かなくても、returnを省略して記述できます。

なお、面白いのが(*5)の$numの部分です。「$」は演算子であり、整数型の変数numを文字列に変換するという働きをします。

最後に(*6)ではfor文を使って1から100までの値についてFizzBuzz判定して結果を出力します。

まとめ

以上、今回はシンプルでありながら高速に動くプログラミング言語のNimについて紹介しました。本文では紹介できませんでしたが、演算子のオーバーロード、マクロやテンプレートも使えます。また、C言語の関数を手軽に取り込んで使う機能やツールを備えています。開発も継続して活発に行われているので今後も楽しみな言語です。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。