V8是谷歌的开源高性能JavaScript和WebAssembly引擎,用c++编写。它在Chrome和Node.js中使用。
本文档的目标读者是那些希望在自己的应用程序中使用V8的c++开发人员,以及对V8的设计和性能感兴趣的人。本文档向您介绍V8,其余的文档向您展示如何在您的代码中使用V8,并描述了它的一些设计细节,同时提供了一组用于度量V8性能的JavaScript基准。
V8实现了ECMAScript和WebAssembly,并运行在Windows 7或更高版本、macOS 10.12+和使用x64、IA-32或ARM处理器的Linux系统上。其他系统(IBM i、AIX)和处理器(MIPS、ppcle64、s390x)由外部维护,参见端口。V8可以独立运行,也可以嵌入到任何c++应用程序中。
V8编译和执行JavaScript源代码,处理对象的内存分配,垃圾收集它不再需要的对象。V8的停止世界,世代,精确的垃圾收集器是V8性能的关键之一。
JavaScript通常用于浏览器中的客户端脚本,例如用于操作文档对象模型(Document Object Model, DOM)对象。然而,DOM通常不是由JavaScript引擎提供的,而是由浏览器提供的。V8 -谷歌Chrome提供DOM也是如此。V8提供了ECMA标准中指定的所有数据类型、操作符、对象和函数。
V8允许任何c++应用程序向JavaScript代码公开自己的对象和函数。由您来决定要向JavaScript公开的对象和函数。
使用Git下载源码
V8的Git库位于https://chromium.googlesource.com/v8/v8.git,
在GitHub上有一个官方镜像:https://github.com/v8/v8。
使用GN编译源码
V8是在GN的帮助下构建的。GN是一种元构建系统,因为它为许多其他构建系统生成构建文件。因此,如何构建取决于您使用的“后端”构建系统和编译器。
下面的说明假设您已经签出了V8并且已经安装了构建依赖项。
更多关于GN的信息可以在Chromium的文档或GN自己的文档中找到。
从源代码构建V8涉及三个步骤:
- 生成构建文件
- 编译
- 运行测试
- 构建V8有两个工作流程:
- 使用名为gm的助手脚本的便利工作流很好地结合了所有三个步骤
- 原始工作流,您可以在较低级别手动为每个步骤运行单独的命令
Gm是一个方便的一体化脚本,可以生成构建文件、触发构建并可选地运行测试。它可以在V8签出的tools/dev/gm.py中找到。我们建议在你的shell配置中添加一个别名:
alias gm=/path/to/v8/tools/dev/gm.py
然后你可以使用gm为已知的配置构建V8,比如x64.release:
gm x64.release
-
要在构建之后立即运行测试,请运行:
gm x64.release.check
Gm输出它正在执行的所有命令,以便于在必要时跟踪和重新执行它们。
Gm允许使用单个命令构建所需的二进制文件并运行特定的测试:
Building 说明地址:Building V8 with GN · V8
一般成功后就会在build下看到all.sln。即表示生成成功了。
打开all.sln 编译生成即可。 个人表示上面没什么特别的难处。
附编译好的lib,Debug和Release。
下载地址:GoogleV8最新Lib库-C++代码类资源-优快云下载
测试代码 V8_test.
最新代码地址(假如你使用的最新的V8,那么测试代码就需要最新)Google 官方 HelloWorld:https://developers.google.com/v8/get_started
很多人下载的最新的代码,目前百度的很多代码都是旧版的,所以此处会报错。加之对V8类不是很熟悉,不好修改。
附代码:
// V8_test.cpp : 定义控制台应用程序的入口点。
//
//https://developers.google.com/v8/get_started
#include "stdafx.h"
#include "v8.h"
//#pragma comment(lib,"v8_base.ia32.lib")
//#pragma comment(lib,"v8_nosnapshot.ia32.lib")
//#pragma comment(lib,"v8_snapshot.lib")
//v8 need this 使用V8需要链接ws2_32.lib和winmm.lib
//#pragma comment( lib,"ws2_32.lib" )
//#pragma comment(lib,"winmm.lib")
using namespace v8;
//v8::Handle<v8::Context> CreateShellContext(v8::Isolate* isolate) {
// // Create a template for the global object.
// return v8::Context::New(isolate);
//}
int _tmain(int argc, _TCHAR* argv[])
{
v8::Isolate* isolate = Isolate::GetCurrent();
HandleScope handle_scope(isolate);
Handle<v8::Context> context = Context::New(isolate);
Context::Scope context_scope(context);
// Create a string containing the JavaScript source code.
Handle<String> source = String::NewFromUtf8(isolate,"'Hello' + ', World!'");
// Compile the source code.
Handle<Script> script = Script::Compile(source);
context->Enter();
// Run the script to get the result.
Handle<Value> result = script->Run();
// Dispose the persistent context.
context->Exit();
// Convert the result to an ASCII string and print it.
String::Utf8Value utf8(result);
printf("%s\n",utf8);
return 0;
}
编译注意,本人采用的是在编译器链接中加入的附加lib,属性,链接,附加依赖项:ws2_32.lib
v8_base.ia32.lib v8_nosnapshot.ia32.lib v8_snapshot.lib icui18n.lib icuuc.lib winmm.lib,附加包含文件,就一个V8\include,即可。注意附加lib不可少,新版本的多了icui18n.lib,icuuc.lib,貌似不加会报错,可以自己测试下吧。
然后就没有啦,OK,HelloWorld就出来啦。有问题请留言。
附录文章: 见《V 8 编译 二》