v8代码构建

本文详细介绍了Google的V8引擎,包括其在Chrome和Node.js中的应用,C++开发者的使用指南,以及V8的垃圾收集机制。还涵盖了从源代码构建V8的过程,使用GN构建系统以及常见配置选项。
摘要由CSDN通过智能技术生成

前言

V8 是 Google 的开源高性能 JavaScript 和 WebAssembly 引擎,用 C++ 编写。 它用于 Chrome 和 Node.js 等。 它实现了 ECMAScript 和 WebAssembly,并在 Windows 7 或更高版本、macOS 10.12+ 以及使用 x64、IA-32、ARM 或 MIPS 处理器的 Linux 系统上运行。 V8 可以独立运行,也可以嵌入到任何 C++ 应用程序中。

本文档面向想要在应用程序中使用 V8 的 C++ 开发人员,以及任何对 V8 的设计和性能感兴趣的人。 本文档向您介绍 V8,而其余文档则向您展示如何在代码中使用 V8 并描述其一些设计细节,并提供一组用于衡量 V8 性能的 JavaScript 基准测试。

V8 编译并执行 JavaScript 源代码,处理对象的内存分配,并垃圾收集不再需要的对象。 V8 的停止世界、分代、准确的垃圾收集器是 V8 性能的关键之一。

JavaScript 通常用于浏览器中的客户端脚本,例如用于操作文档对象模型 (DOM) 对象。 然而,DOM 通常不是由 JavaScript 引擎提供,而是由浏览器提供。 V8 也是如此——Google Chrome 提供了 DOM。 然而,V8 确实提供了 ECMA 标准中指定的所有数据类型、运算符、对象和函数。

V8 使任何 C++ 应用程序都可以向 JavaScript 代码公开其自己的对象和函数。 您可以决定要向 JavaScript 公开哪些对象和函数。

官方网址:https://v8.dev/

从源代码构建 V8

官方网址:https://v8.dev/docs/build
为了能够在 Windows/Linux/macOS x64 上从头开始构建 V8,请按照以下步骤操作。

版本选择

v8版本构件方案

V8 版本号的格式为 x.y.z.w,其中:

  • x.y 是 Chromium浏览器M编号除以 10(例如 M60 → 6.0)
  • 每当有新的 LKGR 时,z 就会自动增加(通常每天几次)
  • w表示补丁号

如果 w 为 0,则版本号中将省略它。 例如。 反向合并补丁后,v5.9.211(而不是“v5.9.211.0”)升级到 v5.9.211.1。

应该选择哪个版本的v8

  • 首先找到稳定版的Chrome版本

  • 然后找到Chrome 中附带的 V8 次要版本相对应的分支头
    -V8 的版本相关分支不会出现在 https://chromium.googlesource.com/v8/v8.git 的在线存储库中; 相反,只出现标签。 要查找该分支的头部,请访问以下形式的 URL:
    https://chromium.googlesource.com/v8/v8.git/+/branch-heads/<minor-version>
    <minor-version>需要替换成v8分支版本号,比如对于上面的例子替换成12.2即可,进入页面后能找到形如Version 12.2.281.21的标志,这个就是v8代码的分支号。

  • 接下来我们先获取源代码

获取源代码

V8 的 Git 存储库位于 https://chromium.googlesource.com/v8/v8.git,在 GitHub 上有一个官方镜像:https://github.com/v8/v8

不要只是 git clone 这些 URL 中的任何一个! 如果您想构建 V8,请按照以下说明正确设置所有内容。

下载安装depot_tools

Mac/Linux
  • 安装git
  • 安装depot_tools
    • 使用下面命令下载depot_tools
      git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
      
    • 将 depot_tools 添加到PATH的前面
      // 假设depot_tools的路径为/path/to/depot_tools
      export PATH=/path/to/depot_tools:$PATH
      
Windows

更新depot_tools

在Windows平台使用cmd.exe,在Mac/Linux平台使用终端,输入gclient更新depot_tools,如果更新失败,需要注意终端也需要配置代理服务器,配置教程参考mac在终端设置代理

下载源代码

现在,获取 V8 源代码,包括所有分支和依赖项

// 创建一个文件夹,选择你创建的位置和名称
mkdir ~/v8
// 切换到你创建的文件夹的位置
cd ~/v8
// 下载v8代码
fetch v8
// 切换到代码目录
cd v8

下载时间比较长,我这里下载完成差不多5个G的大小

列出所有的分支记录

git branch -a

我这里显示的结果如下:

* (HEAD detached at origin/main)
  main
  // 省略一部分
  remotes/branch-heads/12.1
  remotes/branch-heads/12.2
  remotes/branch-heads/12.3
  remotes/branch-heads/2.0
  // 省略一部分

切换分支

我们根据之前的应该选择哪个版本的v8部分获取到的版本好,选择分支,这里我选择remotes/branch-heads/12.2
使用下面的命令

git checkout remotes/branch-heads/12.2

输出如下:

Previous HEAD position was f9edd262140 [turboshaft][s390] Port InstructionSelector part 1
HEAD is now at ddbcde1a3ad Version 12.2.281.21

分支切换成功

使用GN构建

GN 是一种元构建系统,它为许多其他构建系统生成构建文件,使用GN从源代码构建 V8 涉及三个步骤:

  • 生成构建文件
  • 编译
  • 测试

使用GN构建 V8 有两种方式:

  • 使用名为 gm 的帮助脚本来构建V8,它很好地结合了所有三个步骤
  • 使用原始方式构建,您可以在较低级别上手动为每个步骤运行单独的命令

这里我们采用原始的构建方式

生成构建文件

gn args out/x64.debug

out/x64.debug是指定的编译相对路径,然后会打开一个文本编辑器,让你输入编译选项,该文件保存在out/x64.debug/args.gn里。
当然,你也可以直接把编译选项直接添加到命令行中,我建议用文本编辑器的方法,方便修改和保存

gn gen out/foo --args='is_debug=false target_cpu="x64" v8_target_cpu="arm64" use_goma=true'

重点!重点!重点!
谷歌针对浏览器给出的说明文档链接:
https://www.chromium.org/developers/gn-build-configuration/
gn官方文档链接:
https://gn.googlesource.com/gn/+/master/docs/reference.md
谷歌给出的比较好理解,但是没那么全,下面的配置项是我自己尝试了很多很多遍总结出来的。

  • Debug

    v8_monolithic=true 
    treat_warnings_as_errors=false
    v8_use_external_startup_data=false 
    use_custom_libcxx=false 
    is_clang=false 
    is_debug=true
    is_component_build=false 
    v8_symbol_level=2
    
  • Release

    v8_monolithic=true 
    treat_warnings_as_errors=false
    v8_use_external_startup_data=false 
    use_custom_libcxx=false 
    is_clang=false 
    is_debug=true
    is_component_build=false 
    v8_symbol_level=2
    blink_symbol_level=0
    

保存关闭。然后cmd中继续输入:

ninja -C out/x64.debug v8_monolith

然后就等待。。。等待。。。再等待。。。
我的电脑基本来一次就得一个小时起。

列出常用的配置项

  • is_debug = false:默认是debug编译的,如果需要release编译,该值设置为false
  • is_java_debug:在 Android 上,您可以使用以下命令打开/关闭 ProGuard,默认值为is_debug
  • dcheck_always_on = true:启用了 DCHECK,以捕获潜在的错误。
  • is_component_build = true:该选项将v8引擎以共享库的方式构建。这样每次构建的时候只需要构建修改过的部分就可以了,构建速度相对较快,但是,我们不设置此项,原因如下:
    • 我们不修改V8的代码,所以不需要频繁的构建
    • ios无法构建动态库,而我们需要ios的v8库
    • 最重要的原因,我使用该选项构建完成后总报错=-=
  • symbol_level = 0:symbol_level 设置范围为 0(无符号或最少符号)到 2(完整符号)。 较低的级别使得调试几乎不可能,但构建速度会快得多。 在某些情况下,您只想尽快构建(许多构建机器人都这样做),它可能很有用。这个选项是针对浏览器的构建而言的,我们使用V8,还有一个更方便的选项
  • v8_symbol_level=0:该选项是针对V8符号的设置项,我们对于Debug设置2,对于Release设置0
  • enable_nacl = false:大多数开发人员通常不需要测试 Native Client 功能,可以通过禁用它来加快构建速度。
  • blink_symbol_level=0:WebCore 有很多模板,占了调试符号的很大一部分。 如果您不调试 WebCore,则可以将闪烁符号级别设置为 0
  • target_cpu = "x86":默认情况下,GN 版本将与主机操作系统和 CPU 架构相匹配。所以我们不需要设置此项

生成的路径为

// 对于Mac/Linux
out/x64.debug/obj/libv8_monolith.a
// 对于Windows
out/x64.debug/obj/v8_monolith.lib
  • 34
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值