最新Google V8 引擎编译

本文介绍V8 JavaScript和WebAssembly引擎的基础知识,包括其在Chrome和Node.js中的应用,以及如何使用C++集成V8,还提供了编译和测试V8的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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涉及三个步骤:

  1. 生成构建文件
  2. 编译
  3. 运行测试
  4. 构建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  编译  二》




评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值