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回
- この商品を含むブログを見る