javascript v8编译器的使用记录

我的机器是MacOS Mx系列。

一、v8源码下载构建

1.1 下载并更新depot_tools

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=/path/to/depot_tools:$PATH

失败的话可能是网络问题,可以试一下是否能ping通,连接这个google的网站需要配置proxy才可以,不然会一直失败:

# 给git配置proxy
git config --global http.proxy 127.0.0.1:代理端口
# 给终端配置proxy
export http_proxy=http://localhost:代理端口
export https_proxy=http://localhost:代理端口

配置完proxy之后我们再下载的话应该就没有问题了。然后我们可以更新depot_tools工具:

gclient

depot_tools 是一个由 Google 开发的工具集,主要用于管理 Chromium 和 Chromium OS 项目的代码仓库、代码审查和构建过程。它包含了许多实用的工具,例如:

  • gclient: 用于管理 Chromium 项目的代码库,包括下载、同步和更新代码。
  • git cl: 用于与代码审查系统(如 Gerrit)交互,提交代码变更和查看审查结果。
  • fetch: 用于下载 Chromium 项目的源代码。
  • gerrit: 用于代码审查和版本控制。
  • roll-dep: 用于管理 Chromium 项目的依赖关系。

除了这些核心工具之外,depot_tools 还包含一些其他的辅助工具,例如:

  • python: 用于执行一些脚本和命令。
  • gn: 用于生成构建文件。
  • ninja: 用于执行构建过程。

depot_tools 被广泛用于 Chromium 项目的开发,它能够简化开发流程,提高开发效率。对于 Chromium 开发者来说,掌握 depot_tools 是非常重要的。

总结来说,depot_tools 是一个专门为 Chromium 项目开发的工具集,它包含了各种工具来管理代码仓库、代码审查和构建过程,是 Chromium 开发者必不可少的工具。

1.2 下载v8源码

mkdir v8
cd v8
fetch v8
cd v8

然后就可以拉下来源码了,如果需要配置git账号的话可以自己查阅资料,这里不过多赘述。

1.3 v8构建

# 我是MacOS Mx的机器,所以是arm64的,不知道自己是什么target名字的话可以看gm.py文件
tools/dev/gm.py arm64.debug

我是MacOS Mx的机器,所以是arm64的,不知道自己是什么target名字的话可以看gm.py文件,搜一下x64或者arm64就可以了,然后我这里编的是debug版本的,release的话就用arm64.release。构建完成之后就会在out目录下生成arm64.debug目录,目录下就是构建生成的产物,d8就是我们要是用的编译器。

二、v8编译器的基本使用

2.1 生成ast

function add(a, b) {return a + b;
}
add(1, 2)

对于这段javascript代码我们可以使用如下命令打印出ast:

./d8 --print-ast add.js

生成的ast如下所示:

[generating bytecode for function: ]
--- AST ---
FUNC at 0
. KIND 0
. LITERAL ID 0
. SUSPEND COUNT 0
. NAME ""
. INFERRED NAME ""
. DECLS
. . FUNCTION "add" = function add
. EXPRESSION STATEMENT at 39
. . kAssign at -1
. . . VAR PROXY local[0] (0x13304cae8) (mode = TEMPORARY, assigned = true) ".result"
. . . CALL
. . . . VAR PROXY unallocated (0x13304c9e0) (mode = VAR, assigned = true) "add"
. . . . LITERAL 1
. . . . LITERAL 2
. RETURN at -1
. . VAR PROXY local[0] (0x13304cae8) (mode = TEMPORARY, assigned = true) ".result"[generating bytecode for function: add]
--- AST ---
FUNC at 12
. KIND 0
. LITERAL ID 1
. SUSPEND COUNT 0
. NAME "add"
. INFERRED NAME ""
. PARAMS
. . VAR (0x13304ca70) (mode = VAR, assigned = false) "a"
. . VAR (0x13304caf0) (mode = VAR, assigned = false) "b"
. DECLS
. . VARIABLE (0x13304ca70) (mode = VAR, assigned = false) "a"
. . VARIABLE (0x13304caf0) (mode = VAR, assigned = false) "b"
. RETURN at 23
. . kAdd at 32
. . . VAR PROXY parameter[0] (0x13304ca70) (mode = VAR, assigned = false) "a"
. . . VAR PROXY parameter[1] (0x13304caf0) (mode = VAR, assigned = false) "b"

上边是个匿名函数,相当于javascript的启动函数,我们能看到对于add函数的call调用,以及参数1和参数2。下边就是add函数我们能看到a参数和b参数。

v8优化解析速度的一个策略就是懒解析技术,如果我们在add.js中将add函数的调用给删掉,我们再打印ast能够看到几乎生成了一个空的入口函数,以及根本就没有add函数了,这是v8优化解析速度的一个策略。

2.2 编译字节码

./d8 --print-bytecode add.js

使用上述命令能够打印出字节码,下边是生成的add函数的字节码:

[generated bytecode for function: add (0x3b3c00298591 <SharedFunctionInfo add>)]
Bytecode length: 6
Parameter count 3
Register count 0
Frame size 00x31230004008c @    0 : 0b 04             Ldar a10x31230004008e @    2 : 3b 03 00          Add a0, [0]0x312300040091 @    5 : af                Return
Constant pool (size = 0)
Handler Table (size = 0)
Source Position Table (size = 0)

 首先把参数1加载到累加寄存器上,然后把参数0加到累加器上,最后返回。

2.3 打印汇编代码

  • --trace-opt-verbose: extra verbose optimized compilation tracing
  • --trace-turbo: race generated TurboFan IR
  • --print-code: print generated code
  • --print-opt-code: print optimized code
  • --code-comments: emit comments in code disassembly; for more readable source positions you should add --no-concurrent_recompilation

使用这些选项能够打印出汇编,以及turbo的优化记录,d8的选项很全的,对于开发人员来说是非常友好的,大家可以自行挖掘。

三、v8编译器的IR可视化工具turbolizer

3.1 turbolizer构建

这个可视化工具在tools/turbolizer目录下,第一次使用我们需要自己构建,查看README就能看到怎么构建:

cd tools/turbolizer
npm i
npm run-script build

这里的构建依赖一个npm的工具,我们需要先安装npm,npm在Node.js的安装包中:

# download and install Node.js
brew install node@20
# verifies the right Node.js version is in the environment
node -v # should print `v20.15.0`
# verifies the right NPM version is in the environment
npm -v # should print `10.7.0`

这里注意配置好proxy,安装完成之后根据提示信息配置环境变量:

echo 'export PATH="/opt/homebrew/opt/node@20/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
export LDFLAGS="-L/opt/homebrew/opt/node@20/lib"
export CPPFLAGS="-I/opt/homebrew/opt/node@20/include"

都成功之后我们npm -v应该能正确打印出版本号了,然后就可以回到第一步构建turbolizer了,速度很快。

3.2 npm简介

npm 是 Node Package Manager 的缩写,中文意思是 节点包管理器。它是 JavaScript 生态系统中最重要的工具之一,帮助开发者管理和共享 JavaScript 代码。

npm 有两个主要功能:

  1. 包管理: npm 允许开发者从一个庞大的公开库中下载并安装其他开发者编写的代码包(package),这些包可以提供各种各样的功能,例如:

    • 网络请求库(如 axios)
    • 数据处理库(如 lodash)
    • 测试框架(如 jest)
    • 等等。

    使用 npm,开发者可以轻松地将这些代码包添加到自己的项目中,而无需自己编写所有的代码。

  2. 包发布: npm 也允许开发者将自己编写的代码包发布到 npm 的公共库中,以便其他开发者可以下载和使用。

总而言之,npm 是 JavaScript 开发者不可或缺的工具,它简化了代码管理和共享,极大地提高了开发效率。

一些常用的 npm 命令:

  • npm install: 安装包
  • npm uninstall: 卸载包
  • npm update: 更新包
  • npm search: 搜索包
  • npm publish: 发布包

3.3 turbolizer使用

# python2
python2 -m SimpleHTTPServer 8000
# python3
python3 -m  http.server 8000

对于不同的python版本用对应的命令构建窗口,然后在浏览器中打开0.0.0.0:8000(注意要关闭tizi):

我们2.3的命令能够在目录下生成一个json文件,然后在页面中按Ctrl+L可以选择打开文件:

左边是程序代码,中间是javascript的IR(Sea of Node),右侧是汇编代码。中间一栏的左上角还可以选择pass,看每个优化之后的IR结构:

四、总结

这一节没有什么干货,就是记录一下v8编译器构建过程中遇到的坑,我是刚接触v8编译器,第一感觉是v8编译器对于程序员来说十分友好,非常方便调试。再有一个感触就是Sea of Node这种IR结构很强大,很简洁,对于死代码消除等十分方便。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/41527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【代码随想录_Day25】452. 用最少数量的箭引爆气球 435. 无重叠区间 763. 划分字母区间

Day25 OK&#xff0c;今日份的打卡&#xff01;第二十五天 以下是今日份的总结用最少数量的箭引爆气球无重叠区间划分字母区间 以下是今日份的总结 用最少数量的箭引爆气球无重叠区间划分字母区间 今天的题目难度不低&#xff0c;而且非常的有意思&#xff0c;尽量还是写一些…

imx6ull/linux应用编程学习(11)CAN应用编程基础

关于裸机的can通信&#xff0c;会在其他文章发&#xff0c;这里主要讲讲linux上的can通信。 与I2C,SPI等同步通讯方式不同&#xff0c;CAN通讯是异步通讯&#xff0c;也就是没有时钟信号线来保持信号接收同步&#xff0c;也就是所说的半双工&#xff0c;无法同时发送与接收&…

python项目常见使用的传参调试方法

简介 你是否经常遇到下载的github开源知名项目&#xff0c;不知如何调试&#xff1f;只知道按说明的命令行运行&#xff1f;遇到异常或想改造也无从下手&#xff1f;这篇文档章将指导你如何入手调试别人的大型开源项目。 常见项目使用说明及代码如何调试 常见情况一 使用说…

16.【C语言】初识常见关键字 上

1.关键字由C语言自带&#xff0c;不能自创 2.关键字不作变量名 3.关键字举例&#xff1a; auto自动&#xff1a;每个局部变量都由auto修饰&#xff0c;含义&#xff1a;自动创建&#xff0c;自动销毁 auto int a0;等价于int a0; exturn:申明外部符号 register:寄存器关键字…

数据治理的制胜法宝:筛斗数据技术在现代企业管理中的应用

数据治理的制胜法宝&#xff1a;筛斗数据技术在现代企业管理中的应用 在当今这个数据驱动的时代&#xff0c;企业管理的效率和竞争力越来越依赖于对数据的精准把握和高效利用。然而&#xff0c;随着企业规模的扩大和业务复杂度的增加&#xff0c;数据治理成为了一个亟需解决的…

EasyExcel 单元格根据图片数量动态设置宽度

在使用 EasyExcel 导出 Excel 时&#xff0c;如果某个单元格是图片内容&#xff0c;且存在多张图片&#xff0c;此时就需要单元格根据图片数量动态设置宽度。 经过自己的研究和实验&#xff0c;导出效果如下&#xff1a; 具体代码如下&#xff1a; EasyExcel 版本 <depen…

Haxm安装失败的解决办法

确认你的处理器是否是Intel的&#xff0c;如果是AMD那就无法安装&#xff0c;如果是Intel的&#xff0c;再确认是否支持V1T 如果处理器是Intel的且支持VT&#xff0c;在开机时进入BIOS界面&#xff0c;不同的品牌进入BIOS的方法各不相同&#xff0c;通常是F2/F12/delete些&…

Python爬虫零基础实战,简洁实用!

1.爬虫简介 简单来讲&#xff0c;爬虫就是一个探测机器&#xff0c;它的基本操作就是模拟人的行为去各个网站溜达&#xff0c;点点按钮&#xff0c;查查数据&#xff0c;或者把看到的信息背回来。就像一只虫子在一幢楼里不知疲倦地爬来爬去。 你可以简单地想象&#xff1a;每个…

论文学习 --- RL Maximumdiffusion reinforcement learning

前言 个人拙见,如果我的理解有问题欢迎讨论 (●′ω`●) 文章出处:https://techxplore.com/news/2024-05-random-robots-reliable-ai-algorithm.html 研究背景 最大扩散强化学习(MaxDiff RL)是一种创新的强化学习方法,借鉴了统计力学中的扩散过程和最大熵原理。该方法在…

Hadoop的namenode启动不起来

1、 排查原因 Initialization failed for Block pool (Datanode Uuid a5d441af-d074-4758-a3ff-e1563b709267) service to node1/192.168.88.101:8020. Exiting. java.io.IOException: Incompatible clusterIDs in /data/dn: namenode clusterID CID-674c5515-3fe1-4a9c-881d…

AIGC技术加持,英智法律智能体来了!

法律行业作为一个由大量文件积累的领域&#xff0c;非常适合由数据驱动的AI智能体。人工智能在法律领域的应用已经成为不可逆转的趋势。根据最高人民法院发布的《关于规范和加强人工智能司法应用的意见》&#xff0c;国家鼓励在司法领域广泛应用人工智能技术&#xff0c;以提高…

四端口千兆以太网交换机与 SFP 扩展功能

在数字化时代&#xff0c;网络基础设施的重要性日益凸显&#xff0c;它是企业和个人取得成功的关键支撑。配备 SFP 插槽的 4 端口千兆以太网交换机提供了一种灵活且可扩展的网络解决方案&#xff0c;能够应对快速的数据传输、低延迟以及不断增长的带宽需求。本篇文章深入探讨了…

IP地址配置

1.为虚拟机配置IP地址&#xff0c;网关&#xff0c;DNS 例如&#xff1a;手动给虚拟机配置IP地址为 192.168.5.50/24&#xff1b;网关地址为&#xff1a;192.168.5.2&#xff1b;DNS地址为&#xff1a;192.168.5.2 解题步骤如下&#xff1a; #配置IP地址 [rootlocalhost ~]#…

大厂都在加急招人的大模型LLM,到底怎么学?

大模型如何入坑&#xff1f; 想要完全了解大模型&#xff0c;你首先要了解市面上的LLM大模型现状&#xff0c;学习Python语言、Prompt提示工程&#xff0c;然后深入理解Function Calling、RAG、LangChain 、Agents等 很多人不知道想要自学大模型&#xff0c;要按什么路线学&a…

【网络安全】第4讲 身份认证技术(笔记)

一、身份认证技术概述 1、身份认证 是网络安全的第一道防线。是最基本的安全服务&#xff0c;其他的安全服务都依赖于它。在物联网应用系统中&#xff0c;身份认证也是整个物联网应用层信息安全体系的基础。 2、基本身份认证技术 &#xff08;1&#xff09;双方认证 是一种双…

人员定位系统在监狱中的应用也同样重要!

监狱管理应用人员定位系统怎么样&#xff1f;新锐科创告诉你&#xff0c;人员定位系统在监狱中的应用也是很重要的&#xff0c;运用这种新型的定位系统&#xff0c;来起到管理监狱人员的作用。 人员定位系统 在监狱中&#xff0c;关押着大量的犯人&#xff0c;所以&#xff0c…

拓扑Transformer模型TopoFormer:革新药物研发的智能钥匙

在药物研发的浩瀚征途中&#xff0c;每一步都充满了挑战与未知。从发现潜在的治疗靶点&#xff0c;到筛选出有效的药物分子&#xff0c;再到通过临床试验验证其安全性和有效性&#xff0c;这一过程往往耗时漫长且成本高昂。然而&#xff0c;随着人工智能技术的飞速发展&#xf…

昇思25天学习打卡营第15天|ResNet50图像分类

学AI还能赢奖品&#xff1f;每天30分钟&#xff0c;25天打通AI任督二脉 (qq.com) ResNet50图像分类 图像分类是最基础的计算机视觉应用&#xff0c;属于有监督学习类别&#xff0c;如给定一张图像(猫、狗、飞机、汽车等等)&#xff0c;判断图像所属的类别。本章将介绍使用ResN…

【JAVA入门】Day13 - 代码块

【JAVA入门】Day13 - 代码块 文章目录 【JAVA入门】Day13 - 代码块一、局部代码块二、构造代码块三、静态代码块 在 Java 中&#xff0c;两个大括号 { } 中间的部分叫一个代码块&#xff0c;代码块又分为&#xff1a;局部代码块、构造代码块、静态代码块三种。 一、局部代码块…

c++11新特性-3-自动类型推导

文章目录 自动类型推导1.auto1.1 const修饰1.2 auto不能使用的场景1.3 auto应用场景 2.decltype1.1 基本语法 自动类型推导 1.auto 注意&#xff0c;auto必须进行初始化 auto i 10; //int类型auto k 3.14; //double类型auto db; //错误1.1 const修饰 当const修改指针或者…