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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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…

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

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

大厂都在加急招人的大模型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;局部代码块、构造代码块、静态代码块三种。 一、局部代码块…

跟《经济学人》学英文:2024年06月01日这期 The side-effects of the TikTok tussle

The side-effects of the TikTok tussle tussle&#xff1a;美 [ˈtəsəl] 激烈扭打&#xff1b;争夺 注意发音 side-effects&#xff1a;副作用&#xff1b;&#xff08;side-effect的复数&#xff09; As the app’s future hangs in the balance, the ramifications of …

MySQL的并发控制、事务、日志

目录 一.并发控制 1.锁机制 2.加锁与释放锁 二.事务&#xff08;transactions&#xff09; 1.事物的概念 2.ACID特性 3.事务隔离级别 三.日志 1.事务日志 2.错误日志 3.通用日志 4.慢查询日志 5.二进制日志 备份 一.并发控制 在 MySQL 中&#xff0c;并发控制是确…

都有哪些离线翻译器软件?没网就用这4个

经历完痛苦的期末考&#xff0c;可算是千盼万盼等来了日思夜想的暑假&#xff01;趁着这大好时光&#xff0c;怎么能不来一场出国游呢~ 不知道有多少小伙伴和我一样&#xff0c;出国玩最怕的就是语言不通&#xff0c;不管是吃饭还是游玩体验感都会大受影响~好在多出国玩了几趟…

ES6模块化学习

1. 回顾&#xff1a;node.js 中如何实现模块化 node.js 遵循了 CommonJS 的模块化规范。其中&#xff1a; 导入其它模块使用 require() 方法 模块对外共享成员使用 module.exports 对象 模块化的好处&#xff1a; 大家都遵守同样的模块化规范写代码&#xff…

水利水库大坝结构安全自动化监测主要测哪些内容?

在大坝安全自动化监测系统建设中&#xff0c;应根据坝型、坝体结构和地质条件等因素选定监测项目&#xff1b;主要监测对象包括坝体、坝基及有关的各种主要水工建筑物、大坝附近的不稳定岸坡和大坝周边的气象环境。深圳安锐科技建议参考下列表格适当调整。 &#xff08;一&am…

计算机网络(2

计算机网络续 一. 网络编程 网络编程, 指网络上的主机, 通过不同的进程, 以编程的方式实现网络通信(或网络数据传输). 即便是同一个主机, 只要不同进程, 基于网络来传输数据, 也属于网络编程. 二. 网络编程套接字(socket) socket: 操作系统提供的网络编程的 API 称作 “soc…

(0)2024年基于财务的数据科学项目Python编程基础(Jupyter Notebooks)

目录 前言学习目标&#xff1a;学习内容&#xff1a;大纲 前言 随着数据科学的迅猛发展&#xff0c;其在财务领域的应用也日益广泛。财务数据的分析和预测对于企业的决策过程至关重要。 本专栏旨在通过Jupyter Notebooks这一强大的交互式计算工具&#xff0c;介绍基于财务的数…

Day05-组织架构-角色管理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.组织架构-编辑部门-弹出层获取数据2.组织架构-编辑部门-编辑表单校验3.组织架构-编辑部门-确认取消4.组织架构-删除部门5.角色管理-搭建页面结构6.角色管理-获取数…

MySQL中的DDL语句

第一题 输入密码登录mysql&#xff0c;创建数据库zoo&#xff0c;转换到zoo数据库&#xff0c; mysql> create database zoo character set gbk; mysql> use zoo查看创建数据库zoo信息 mysql> show create database zoo;删除数据库zoo mysql> drop database zo…