博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript 引擎——Chrome V8 引擎入门
阅读量:7062 次
发布时间:2019-06-28

本文共 3085 字,大约阅读时间需要 10 分钟。

 

本文内容

  • 介绍
  • 关于 V8 引擎
  • V8 引擎入门
  • 参考资料

 

介绍


V8 是 Google 开源的、高性能的 JavaScript 引擎。V8 是由 C++ 编写,并用在 Google 开源浏览器 Chrome 中。

Google 的 V8 项目旨在帮助那些 C ++ 开发者在他们的应用程序中使用 V8,以及对 V8 的设计和性能感兴趣的人。本文及其后的文章将介绍 V8,和如何在你的代码中使用 V8,并提供一套 JavaScript benchmarks 来测量 V8 的性能。

 

关于 V8 引擎


V8 实现了 ECMA-262 第 5 版描述的 ECMAScript,可运行在 Windows(XP 或更高)、Mac OS X(10.5 或更高)和使用 IA-32、x64 或 ARM 处理器的 Linux 系统。

V8 编译和执行 JavaScript 源代码,处理对象内存分配,对不再使用的对象进行回收。V8 的垃圾回收(Google 自己说是“能停止世界、新一代、准确的垃圾回收”)是其性能的关键。其他的性能方面,如 V8 设计元素(V8 Design Elements)。

JavaScript 是浏览器中最常用的客户端脚本,如用来操作 DOM(Document Object Model,文档对象模型)。但是,DOM 通常由 JavaScript 提供,而不是浏览器。V8—Google Chrome 就是这样。但是,V8 提供所有的数据类型、操作符、对象和 ECMA 标准规定的函数。

V8 可以使任何 C++ 应用程序向 JavaScript 代码公开自己的对象和函数。由你决定向 JavaScript 公开你希望的对象和函数。在这方面,有很多应用程序都这么做,如,Adobe Flash 和苹果 Mac OS X 中 Dashboard  部件和和雅虎部件。

 

V8 引擎入门


首先,需要下载 V8 源代码并生成 V8。之后,演示 V8 代码的 "Hello World" 示例。在演示 "Hello World" 示例时,介绍一些关键的 V8 概念。

  • Hello World 示例
  • 运行 Hello World 示例
Hello World 示例

把一个 JavaScript 语句作为一个字符串参数,作为 JavaScript 代码执行,并输出结果。但是下面代码不能执行,因为它还缺少 V8 必要的部分。

int main(int argc, char* argv[]) {
 
// Create a string containing the JavaScript source code.
String source = String::New("'Hello' + ', World'");
 
// Compile the source code.
Script script = Script::Compile(source);
 
// Run the script to get the result.
Value result = script->Run();
 
// Convert the result to an ASCII string and print it.
String::AsciiValue ascii(result);
printf("%s\n", *ascii);
return 0;
}

若真正在 V8 中运行该示例,还需要添加句柄(handles)、作用域(handle scope)和上下文环境(context):

  • 一个句柄是一个指向对象的指针。所有 V8 对象都是通过句柄访问,这样 V8 垃圾回收才能起作用。
  • 一个作用域可以看做任意数量句柄的容器。这样,当使用完句柄后,不用单独删除每个,而是简单删除作用域。
  • 一个上下文环境一个执行环境,允许单独的、不相关的 JavaScript 代码运行在 V8 单个实例。必须在你要执行的 JavaScript 代码中显示指定上下文环境。

这些概念会在 中更多描述。

下面代码同上边一样,但包含了句柄、作用域和上下文环境。另外,也包含了命名空间和 V8 头文件:

#include 
 
using namespace v8;
 
int main(int argc, char* argv[]) {
 
// Create a stack-allocated handle scope.
HandleScope handle_scope;
 
// Create a new context.
Persistent
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
source = String::New("'Hello' + ', World!'");
 
// Compile the source code.
Handle
 
// Run the script to get the result.
Handle
result = script->Run();
 
// Dispose the persistent context.
context.Dispose();
 
// Convert the result to an ASCII string and print it.
String::AsciiValue ascii(result);
printf("%s\n", *ascii);
return 0;
}
运行 Hello World 示例

你可以按如下步骤运行示例:

  • 下载 V8 源代码,并按指示生成 V8。
  • 复制上面的代码,并另存为 hello_world.cpp 到 V8 生成的目录。
  • 编译 hello_world.cpp,链接到生成期间创建的静态库。例如,在 64 位 Linux,使用 GNU 编译器:
g++ -Iinclude hello_world.cc -o hello_world out/x64.release/obj.target/tools/gyp/libv8_{base,snapshot}.a -lpthread
  • 命令行执行 hello_world 可执行文件。例如,在 Linux,当前目录为 V8 目录,输入下面命令:
./hello_world
  • 你会看到终端输出 Hello, World!

这仅仅是一个简单的例子,你可能想执行更多脚本。

 

参考资料


  • V8 项目
  • Chrom 项目
  • 嵌入式指南
  • KasperLund-V8 PPT

 

- Hello World 程序

- 简单执行 JavaScript 语句。包括获得 JSON 中的数据,字符串长度和字符串所有字符大写。

(该 Demo 要想运行起来,说容易,也不容易。在 VS 里将 V8 的包含文件和库追加到项目的包含目录和库目录设置里。)

 

o_r_%E7%BF%BB%E8%AF%91.jpg

转载地址:http://pfyll.baihongyu.com/

你可能感兴趣的文章
Android Studio的使用
查看>>
我的友情链接
查看>>
【云图】【支付宝】如何在支付宝服务窗上增加家乐福门店分布图?
查看>>
WebLogic缓存
查看>>
针对百度搜索上线的极光算法,我们应该怎样应对?
查看>>
WordPress文件结构
查看>>
Linux Shell脚本编程基础
查看>>
另一种快速排序
查看>>
数字黑洞
查看>>
2017.04
查看>>
Yesod - 表单 (7)
查看>>
jQuery 如何获取浏览器所在的IP地址
查看>>
S2JH新增WIKI页面:开发基础环境配置说明,基于SSH的企业Web应用开发框架
查看>>
IO流-设置输出字符编码格式
查看>>
知识图谱完整项目实战(附源码)(1)
查看>>
svn hooks同步更新
查看>>
Java程序员从笨鸟到菜鸟之(七十一)细谈struts2(十三)struts2实现文件上传和下载详解...
查看>>
Feign http 请求跟踪—乱码及连接池
查看>>
python unittest库 官方网站
查看>>
shell脚本安装 nfs-server
查看>>