tokuhirom's blog

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 的なことがやり放題となりました。
すばらしいですね。

Programming Node.js

Programming Node.js

Created: 2012-09-01T07:54:37Z
Updated: 2012-09-01T07:54:37Z
comments powered by Disqus