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のようなインデント(字下げ)によってプログラムのブロック構造を表現します。

この記事は
Members+会員の方のみ御覧いただけます

ログイン/無料会員登録

会員サービスの詳細はこちら