2019年11月9日土曜日

Nim言語、色々研究していると、やっぱりほぼCだった

Nim言語、色々面白い機能満載で使いたかったんだけど、しかしてここ一ヶ月ぐらい研究してるけど、どうもCの呪縛を完全に離れられてない感じ。
  • ref/var戻しの場合は、refで定義済のtypeじゃないと受け付けないとか。
  • アンダースコアを多用した識別名が使えないとか<これはNimの都合だろう
  • スカラ型への`=`を定義できないとか<凄えやりたかったのに....
付属のソースだと、大部分が一旦生Objectを定義して、その後必ずref版も作っててどういうことだろうなーと思ったら、どうやらそういうことらしい。事実、非var引数なら非refでも使えてしまうので、ここが混乱を招いてると思われる。

考えてみたらそうだわね。バックエンドはCだものね。returnにはスカラ型しか本来は書けない。

というわけでNim自体は色々な用途に適応できるけど、大規模なものには熟練を要する、といった感じ。

PHPを「卒業」する先の選択肢として考えてたけど、これだとちょっと難しそうだなー。やっぱりGoかなー。

一方、簡単なCLIを書く場合は非常にお手軽に使えるので、そういう方向では生き残っていきそうに見える。事実、OSの生APIは非常に自然に呼べるように考えられてるし、足りなかったら再定義して使える。

※この点で、Nimを完全なコンパイラと呼ぶのは語弊があり、豊富なpragmaにより、標準ライブラリの大部分もトランスパイラの一部であると考えられる。事実emit pragmaでバックエンド言語のソースが直接吐ける。これらの発想自体は本当に面白い。

言い換えると、もともとCで書けてた分野に対して、better Cとして使う分には素晴らしい効果を発揮すると思われる。ただ この分野ではrustが強敵なのだが。

逆にWeb方面は、ぶっちゃけあまり向いてないと思う。DBやらJSONやらのやりとりが主体となり、これはむしろ動的言語寄りの言語機能が必要だ。Nimではコンパイルタイムリフレクションという刺激的な手法で回避はしているが、第3者がこれを使いこなすのはなかなか難しそうだ。macroで書いたりtemplateで書いたりする必要があるので。