V8 JavaScript Engineを使ってみる。

node.jsでアレコレしようと思うと、C++でアドオンを作る必要が出てきて、
V8 JavaScript Engineをシンプルに動かして試したくなった。
今回は、サンプルを動かすまでの備忘録。
いろんなブログを漁ると、V8は、2年前に流行ってたんですね。。。

環境

OS:Ubuntu 12.04
CPU:64bit

depot_toolsを入手する。

$ mkdir $HOME/tools
$ cd tools
$ git clone https://git.chromium.org/chromium/tools/depot_tools.git
$ vi ~/.bashrc
export PATH=$PATH:$HOME/tools/depot_tools

V8をビルドする。

$ mkdir v8
$ cd v8
$ git clone git://github.com/v8/v8.git v8 && cd v8
$ make dependencies
$ make x64.release -j8
(64bitでコア8個)
$ make x64.release.check
$ cd ..

サンプルコード

$ vi hello_world.cpp

 #include <v8.h>
 using namespace v8;
 int main(int argc,char* argv[]) {
   HandleScope handle_scope;
   Persistent<Context> context = Context::New();
   Context::Scope context_scope(context);
   Handle<String> source = String::New("'hello' + ' world'");
   Handle<Script> script = Script::Compile(source);
   Handle<Value> result = script->Run();
   context.Dispose();
   String::AsciiValue ascii(result);
   printf("%s\n", *ascii);
   return 0;
 }

サンプルコードのビルド

なんか、どこにもドキュメントがないけど、 ./v8/out/x64.release/obj.target/tools/gyp/以下に 静的ライブラリができてたので、それを使う。

$ g++ -I./v8/include hello_world.cpp -o hello_world ./v8/out/x64.release/obj.target/tools/gyp/libv8* -lpthread

サンプルの実行

$hello_world
hello world (出力)

やったぁ!動いた!これで、わざわざnode-gypとか使わずにコードを試せます。