コンパイルとC相互運用
コンパイルの流れ
典型的には、NimコンパイラがCソースを生成し、GCC、Clang、MSVCなどのCコンパイラがネイティブ実行ファイルを生成します。
Cはポータブルな低レベル中間表現として使われます。型検査、ジェネリクスの具体化、マクロ展開、メモリ管理コードの挿入は、その前にNimコンパイラが行います。そのため、NimをCの薄い構文糖衣と捉えるのは正確ではありません。
複数バックエンド
Cに加え、C++、Objective-C、JavaScriptを主要な出力先として選べます。
ターゲットを採用する前に、利用するパッケージ、生成物サイズ、既存ツールチェーンとの接続を検証してください。
Cを呼ぶ・Cから呼ばれる
importc でC関数や変数を取り込み、exportc でNimの関数をC ABIに公開できます。
proc printf(format: cstring): cint
{.importc, header: "<stdio.h>", varargs.}
proc add(a, b: cint): cint {.exportc, cdecl, dynlib.} =
a + b
共有ライブラリ境界では、Nim固有のstring、seq、ref objectを直接公開せず、固定幅整数、ポインタ+長さ、C互換struct、opaque handle、明示的な生成・破棄関数、エラーコードに限定すると安定します。詳細は言語マニュアルを参照してください。