LoginSignup
5
4

More than 3 years have passed since last update.

NimのコードをNode.js用のJavaScriptコードにトランスコンパイルする

Last updated at Posted at 2021-01-09

概要

  • NimのコードをJSバックエンドでコンパイルしてNode.jsスクリプトとして実行してみます
  • NimのコードからNode.js用のライブラリを生成して、Node.jsスクリプトからライブラリを読み込んで関数を呼び出してみます

NimはJavaScriptを生成できる

Nimは公式でNimのコードからJavaScriptのコードにトランスコンパイル可能です。

例えば、以下のようなNimコードに対して

index.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で実行してみます。

index.nim
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関数を呼び出せるようにするものです。

lib.nim
import jsffi

var module {.importc.}: JsObject

proc plus*(x, y: cint): cint =
  return x + y

module.exports.plus = plus

次に、上記ライブラリを読み込んで使用するindex.jsを定義します。

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 を付ける
  • NimのコードからNode.js用ライブラリを生成してNode.jsスクリプトからライブラリを読み込み、関数を実行できる
    • module {.importc.}: JsObjectでモジュールを読み込んで関数をセットする

以上です

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4