随着 Google浏览器Chrome的普及,越来越多的人知道其之所以快的原因主要在于使用
了执行效率更快的V8 javascript引擎,以及WebKit内核,这里我们主要讲的是使用 Google
V8 引擎,用其来打造自己的脚本引擎,并且用脚本实现动态执行API。
由于Google将v8 的代码开源了,我们只需要在Google Code上搜索一下就可以得到v8
的代码:http://code.google.com/p/v8/。
关于 v8 的编译,v8是使用 C++代码编写而成,我们只需要使用SVN 工具,将代码下载
好,使用 Visual Studio即可完成编译,笔者用 VS2010 编译了一个动态库和一个静态库,
可以在文章的附件中查看,这里就不详细解释了。
接下来,我们开始我们的v8 之路吧!
在研究代码之前,我们先来看看v8引擎的执行机制吧! 这里的代码 Google 手抖打错了……
不知是不是我没有理解,本该是 argv[1]的,它这里多
了个[]……
先是创建了全局的上下文管理以及对象管理,在v8中都是使用Handle来管理脚本中的数
据的。我们要把数据传入脚本中也是需要先转化为Handle,像字符串数据可以用String::New
的方法来转换成Handle,最后销毁时会一起把里面的数据清空,这样做极大的简化了开发的
步骤。
接着就是对代码的编译。v8引擎执行效率高的原因主要在于此,他首先先将代码全部编
译一遍才执行代码,这样做不仅有效的减少了代码错误导致的各种问题,还极大的提高了效
率,而一些其他的脚本引擎是边翻译代码边执行,这样做就可能会使一些代码的效率严重低
下。
最后就是上下文的释放了,将分配的空间释放出来,防止内存泄露。
了解了 v8基本的运行机制后,我们便来看看代码吧。
首先,我们在svn 下 v8 的代码中可以看到 include目录,这个就是我们需要在代码中
包含的头文件。在include目录下的文件不受其他目录下文件的影响,我们可以拷贝出来单
独使用:#include"v8_include\v8.h"
笔者将 v8 的代码用 vs2010 编译成了动态库 v8Script.dll,用的时候我把 lib 文件打包到我们的程序中就可以使用了:#pragmacomment(lib,"v8Script.lib")
如果是使用静态库,则需要把 v8_base.lib 和 v8.lib 一起加到程序中,这样就可以不
用 dll了,减少程序文件,但是笔者更推荐使用dll 的方式,这样比较方便管理,也可以减
少程序的体积。
我们接下来看看一些示例代码: 包到我们的程序中就可以使用了:#pragmacomment(lib,"v8Script.lib")
如果是使用静态库,则需要把 v8_base.lib 和 v8.lib 一起加到程序中,这样就可以不
用 dll了,减少程序文件,但是笔者更推荐使用dll 的方式,这样比较方便管理,也可以减
少程序的体积。
我们接下来看看一些示例代码
usingnamespace v8;
int main()
{
// Create a stack-allocated handle scope.
HandleScope handle_scope;
// Create a new context.
Persistent<Context> context = Context::New();
// Enter the created context for compiling and
// running the hello world script.
Context::Scope context_scope(context);
// Create a string containing the JavaScript source code.
Handle<String> source = String::New("'Hello' + ', World!'");
// Compile the source code.
Handle<Script> script = Script::Compile(source); //编译代码
// Run the script to get the result.
Handle<Value> result = script->Run();
// Dispose the persistent context.
context.Dispose();
// Convert the result to an ASCII string and print it.
String::AsciiValue ascii(result);
std::cout << (*ascii) << std::endl;
return 0;
}
执行的结果便是输出:Hello, World!
我们来看看这份代码中v8脚本引擎执行的代码:'Hello' + ', World!'
正如标准的 javascript 语言一样,这是连接字符串的一种方法,结果就是反返回了字
符串 Hello, World! 。 |