概要
- NimのコードをJSバックエンドでコンパイルしてNode.jsスクリプトとして実行してみます
- NimのコードからNode.js用のライブラリを生成して、Node.jsスクリプトからライブラリを読み込んで関数を呼び出してみます
NimはJavaScriptを生成できる
Nimは公式でNimのコードからJavaScriptのコードにトランスコンパイル可能です。
例えば、以下のようなNimコードに対して
proc plus*(x, y: cint): cint {.exportc.} =
return x + y
以下のコマンドでコンパイルします。すると、index.nim
からindex.js
が生成されます。
$ nim js index.nim
$ ls index*
index.js index.nim
このようにJavaScriptコードを生成できます。
しかしここで生成されるJavaScriptはフロントエンド用で、HTMLから読み込む想定のものです。
Node.jsからは扱うことはできません。
NimはNode.jsのコードも生成できる
しかし、コンパイル時にオプションを渡すことにより、Node.js用のJavaScriptコードを生成できます。
Nim Backend Integration - Nim
前述のコードを手直ししてNode.js用コンパイルを実施し、Node.jsで実行してみます。
proc plus*(x, y: cint): cint {.exportc.} =
return x + y
echo plus(1, 2)
$ nim js -d:nodejs index.nim
$ node index.js
3
node.jsで実行できました。
NimのコードからNode.js用ライブラリを生成してみる
Node.js用の単体のスクリプトとして実行できることがわかりました。
次はNode.js用ライブラリを生成してNode.jsスクリプトから読み込めることを確認します。
以下のNimコードを用意します。
以下のNimコードでは、plus
関数を定義して、Node.jsからplus
関数を呼び出せるようにするものです。
import jsffi
var module {.importc.}: JsObject
proc plus*(x, y: cint): cint =
return x + y
module.exports.plus = plus
次に、上記ライブラリを読み込んで使用するindex.js
を定義します。
const lib = require("./lib");
console.log(lib.plus(1, 2));
これらのファイルを同じディレクトリに配置し、以下のコマンドを実行します。
$ nim js -d:nodejs lib.nim
$ ls lib*
lib.js lib.nim
$ node index.js
3
無事、Node.jsスクリプトから、Nimで生成したNode.js用ライブラリを読み込んで、関数を呼び出すことができました。
まとめ
以下の内容について記載しました。
- NimのコードをJSバックエンドでコンパイルしてNode.jsスクリプトとして実行できる
- コンパイルするときはjsバックエンドで
-d:nodejs
を付ける
- コンパイルするときはjsバックエンドで
- NimのコードからNode.js用ライブラリを生成してNode.jsスクリプトからライブラリを読み込み、関数を実行できる
-
module {.importc.}: JsObject
でモジュールを読み込んで関数をセットする
-
以上です