node.js でも Inline::C みたいなことをしたい。
node.js をつかっているときに、ふと C 言語を書きたくなったりしたことはありませんか? 僕はありません。
そういう時には、node-tcc をつかうといいですね。node-tcc は TinyCC( http://bellard.org/tcc/ ) の node.js バインディングで、これをつかうと以下のように、簡単に C 言語を実行することができます。
var TCC = require('tcc'),
var tcc = new TCC();
tcc.compile_string('int main() { return 4649; }');
var ret = tcc.run(); // => 4649
しかし、これだけでは、C 言語をつかいこなしているとはいえないでしょう。出力が、main 関数の返り値しかありませんからね。
そこで node-ffi の出番です。以下のようにすると、C 言語のプログラムをメモリ上でコンパイルし、そのシンボルを node-ffi でよぶことができます。
var here = require('here').here,
ffi = require('ffi'),
TCC = require('tcc'),
tcc = new TCC(),
assert = require('assert');
tcc.compileString(''+here(/*
int fib(int n) {
if (n <= 2) { return 1; }
return fib(n-1) + fib(n-2);
}
*/));
tcc.relocate();
var fib_ptr = tcc.getSymbol('fib');
assert(!fib_ptr.isNull());
var fib = ffi.ForeignFunction(fib_ptr, 'int', ['int']);
console.log(fib(35));
これでいざというときも安心ですね。
これで、Perl5 における Inline::C 的なことがやり放題となりました。
すばらしいですね。
- 作者: Travis Swicegood
- 出版社/メーカー: Pragmatic Bookshelf
- 発売日: 2012/11/04
- メディア: ペーパーバック
- クリック: 4回
- この商品を含むブログを見る
Published: 2012-09-01(Sat) 07:54