免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 网站相关 > 网站安全 > 使用Google v8打造自己的脚本引擎

使用Google v8打造自己的脚本引擎

时间:2011-10-30 20:22来源:未知 整理:寂涯网络 点击:

  随着 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! 。

本页地址 http://www.jybase.net/wangzhananquan/20111030517.html

百度搜索更多

谷歌搜索更多

顶一下
(2)
50%
踩一下
(2)
50%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商


关于本站免责声明视频更新google百度地图视频地图RRS订阅

如有什么问题请在本站留言,或发邮件到 hxt167#foxmail.com