【デジタルアライアンス ウエハラ】
カミムラさん、バトンありがとうございます!
久しぶりにブログ記事担当することになったので、書いてみたいと思っていたポエムっぽい技術記事を書いてみようと思います。
個人的に一番好きな言語はPythonなのですが、最近好きな言語が増えました。
それがNimです。
Nimというプログラミング言語を聞いたことがあるでしょうか?
Nimは2008年に登場した比較的新しい言語です。
同時期に出てきた言語としてはGo, Rustなどがあります。
Goはすでに普及していて、個人的に好きなOSS(フリーのソフトウェア)もGoでつくられているものが多い印象です。
例をあげるならDockerですね。(1)
コマンド一発で開発環境を構築できるので業務開発で個人的に多用しています。
もうDockerなしは考えられないくらいです。
Rustは最近広まってきているような気がしています。
RustはもともとC/C++を置き換えるために作られたものです。
製品としてはDiscordのバックグラウンドでしょうか。(2)
パフォーマンスがよくてwasmとも相性がいいのが特徴かなと思っています。
ようやくNimの登場です。
Nimの最大の特徴はPythonっぽいわかりやすい文法とC言語に匹敵する速度を持つことです。
なぜNimが非常に優れたパフォーマンスを発揮できるかといいますと、NimはC言語のトランスパイル言語だからです。
Nimのコンパイラは実行ファイルを直接吐くのではなく最適化されたC言語を吐きます。
このコンパイラが非常に優秀なので多少雑に書いたとしてもパフォーマンスにさほど影響しません。
そして最適化されたC言語からコンパイルして実行ファイルを吐きます。
また、Nimのコンパイラはオプションが豊富で使いたいバックのコンパイラの変更やマルチスレッド化もできます。
コンパイラが変更できるので、gccだったりllvmだったり好きなコンパイラを使用することができます。
gccのように最適化オプションを備えています。
僕的には–opt:sizeを使うのが最高です。
これと-d:releaseを組み合わせるともう爆速です。
圧倒的な速さを実感できます。
速度だけならGo, Rustも十分速いです。
しかしNimのコンパイラにはほかの言語にはない特徴があります。
それがほかの言語にトランスパイルできることです。
先ほどNimのコンパイラは最適化されたCを吐くといいましたが、Nimが吐くのはCだけではありません。
・JavaScript
・C++
・Objective C
などがあります。(3)
他の言語にトランスパイルできることの個人的に感じるメリットとして、
クロスプラットフォームに動かすことを目的としたアプリケーションの開発に便利なのではないかなと思います。
例を挙げるとすると、Mac, WindowsのOSのBluetoothを何かしたいアプリを作るとしましょう。
さらにwebとなんらかの形で連携したいとしましょう。
従来だとObjective C, C++, JavaScriptと3つの別の言語を使う必要があったかもしれません。
しかし、Nimで開発するとそのすべてをNimだけで開発することができます。
僕自身、家ではwindowsは持っていないのでMacでしか確かめていないのですが、
Objective Cで書かれたMacのAPIを呼び出すことは簡単にできました。
こういうことはほかの言語では難しいのではないかなあと思います。
Nimが素晴らしいのはコンパイルオプションだけではありません。
文法もPythonライクで非常に親しみやすいのも特徴です。
なので一度Pythonを書いたことがあればなじみやすいはずです!
Nimのもつもう一つの特徴として、macroが柔軟でメタプログラミングしやすいことが挙げられます。
例を挙げると本来なら何度もfor文を書かないといけない個所など、macroで定義することでオリジナルの文法で短く書くことができます。
macroで定義したものはコンパイル時に決定されるため、オリジナルのオペレーターやconstの値をコンパイル時に決めたりできます。
僕はまだまだ未熟なので難しいですが、独自のマクロを定義することで標準ではないけどほしい文法などを作ることも可能です。
このようにNimにはほかの言語にはない優れた特徴があるのですが、そんなNimにも欠点があります。
その欠点として、マイナー言語であることによる情報のなさとGo, Rustのような特徴的なOSSが存在しないことだと思います。
Nimの中で最大のOSSはNimじゃないかと思うくらいNimはNim自体の完成度がとても高い言語だと思います。
まだversion1.4.8と若い言語です。
これから5年、10年したのちにもっとNimが一般的になっていたらいいなあと思う次第です。
もし少しでもNimに興味をもってもらえたら最高です!
インストールはこちらのページ(4)からできます!
続いては、同じ部署の方にバトンをお渡しします!
よろしくお願いいたします!
【参考】
(1) DockerのエンジンはGo製
(2) DiscordがGoからRustに切り替える理由
(3) Nim Compiler User Guide
(4) Nimの公式ページ