• 2009-02-08

    Hello,V8

    Tag:V8 向下走

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/34771424.html

    V8是一个开源的JavaScript引擎,它和Chrome一起来到世人面前,凭借着优异的性能表现让几大浏览器掀起了新一轮JavaScript引擎竞争。

    构建V8

    了解V8的第一步自然是获取V8的代码,SVN上的代码基本上可以体现出V8的最新的进展。

      svn checkout http://v8.googlecode.com/svn/trunk/ v8

    V8是用C++编写的,按照通常的思路,完成获取的过程后,就该打开对应的目录,准备make。对不起,这里没有Makefile,V8是用SCons管理其构建过程的。所以,除了基础的开发工具之外,我们需要额外安装SCons。因为SCons是用Python编写的,所以,Python也是不可或缺的。如果你和我一样用的是Ubuntu,安装变得很简单:

      sudo apt-get install scons

    万事俱备,开始构建:

      scons

    运气够好的话,就会顺利生成一个库:libv8.a。

    这里介绍的只是最简单的构建过程,如果有兴趣了解更多的话,可以参考V8的文档《Download and Build》。

    和V8打招呼

    下面这段代码来自V8起步文档

    #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' + ', V8!'");
        Handle<Script> script = Script::Compile(source);
        Handle<Value> result = script->Run();

        context.Dispose();

        String::AsciiValue ascii(result);
        printf("%s\n", *ascii);
        return 0;
    }

    正如前面提到的,V8是一个JavaScript引擎,我们所需要做的就是为它提供一段JavaScript,source起到的就是这个作用。对于程序语言实现而言,拿到输入的源码之后,就是对其进行编译(Script::Compile)编译之后的结果自然就是运行了(script->Run()),这就是这段代码的主要内容。

    当然这里还牵扯到一些其它内容,按照起步文档中的说法:
    * handle表示一个对象指针,所有V8对象的访问都依赖于handle,按照V8垃圾收集器的运作机制,这是必需的。
    * scope可以看作一个容纳任意数目handle的集合。当你用完了自己的handle,你只要删除scope,而无需一个个地删除handle。
    * context是一个执行环境,它让一个单独的V8实例可以运行独立、无关的JavaScript代码。必须显式指定JavaScript运行所需的context。

    我们看到了前面V8构建的结果是生成了一个库,那我们只要在自己程序中使用这个库就好了。按照通常编写C/C++程序的习惯,我们把include里面的v8.h放到我们工程的include目录下,把libv8.a放到lib目录下,通过-I指定include的目录,-L指定库目录。

      g++ -Iinclude -Llib -oHelloV8 src/HelloV8.cpp -lv8 -lpthread

    好了,是时侯,让V8和我们打招呼了。

      ./HelloV8

    我们会看到

      Hello, V8!

    分享到:

    历史上的今天:

    锁住数据 2007-02-08
    引用地址: