本文会介绍如何下载、编译v8以及使用d8调试代码
v8的官方文档中有介绍如何查看源代码,大概流程如下:
谷歌 git 中有v8代码仓库,GitHub上也有镜像仓库,但如果你想要编译v8,请不要克隆这些仓库,正确的做法应该是先克隆 depot_tools 这个工具
下载 depot_tools
首先,你要有git,之后执行如下代码即可下载 depot_tools
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
这里由于是谷歌的服务,可能下载很慢(我大约20分钟),但只要不提示超时,等等就还有希望,如果超时了,那么就要切换网络环境再试一下
还有可能出现这种报错:
fetch-pack: unexpected disconnect while reading sideband packet
fatal: early EOF
fatal: index-pack failed
这时不要动,等待5分钟左右,他就会继续执行(幸好我没有动)最后会执行成功
下载成功后,需要添加环境变量,我使用的 Mac 和 zsh,所以在 ~/.zshrc
文件中添加一行代码即可(把 /path/to 改成你下载 depot_tools 的路径)
export PATH=/path/to/depot_tools:$PATH
设置了环境变量之后,你在终端里写的命令就可以到这里来找
下面执行 gclient
命令,他可以更新 depot_tools
下载v8
执行 fetch v8
会下载 v8 代码(同样又是漫长的等待)
接着进入 v8 目录,切换到一个稳定的分支上,git checkout remotes/branch-heads/9.4
这是最新发布的9.4的稳定分支,还可以在这上面创建一条自己的分支 git checkout -b zmy-dev-9.4
,使用gclient sync
命令更新v8依赖
编译v8
编译v8正常需要3步,但可以使用gm命令简化,只需要执行一行命令即可
tools/dev/gm.py x64.debug
但意外又发生了,报错如下:
xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance
貌似是没有 xcode,所以我去安装了一下(在Mac的App store 安装即可,但是要12G,又下载了好久)
安装完 xcode 之后,还是报错如上,我就查到了这里,执行这个命令可解决:
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
这个报错终于解决了,但别的报错又出现了:
ImportError: cannot import name 'Mapping' from 'collections' (/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/collections/__init__.py)
好像是没有安装 Python 的包,去查了一下,发现这不是包的问题,而是 Python 的版本不对,又去 deopt_tools 仓库看了一下,应该要使用 Python 3.8 的版本(我现在使用的是 3.10)所以又去安装 Python 3.8
最后终于能成功编译了,中间流程类似这样:
我大约等待了30分钟,才编译完成,把cpu跑的就剩1%的空闲了
接着你可以把 d8 加入 alias,这样就能在终端方便的使用了(d8是调试v8的工具,记得把/path/to改成你自己的下载目录)
alias d8=/path/to/v8/out/x64.debug/d8
最后我们可以测试一下成果,新建 test.js,代码如下
var a = 'zmy'
使用d8测试,执行命令 d8 --print-ast test.js
,结果会打印出这段代码的 ast
[generating bytecode for function: ]
--- AST ---
FUNC at 0
. KIND 0
. LITERAL ID 0
. SUSPEND COUNT 0
. NAME ""
. INFERRED NAME ""
. DECLS
. . VARIABLE (0x7fed2180ba90) (mode = VAR, assigned = true) "a"
. BLOCK NOCOMPLETIONS at -1
. . EXPRESSION STATEMENT at 8
. . . INIT at 8
. . . . VAR PROXY unallocated (0x7fed2180ba90) (mode = VAR, assigned = true) "a"
. . . . LITERAL "zmy"
这就代表编译成功啦~