当前位置: 首页 > news >正文

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结构很强大,很简洁,对于死代码消除等十分方便。

相关文章:

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 失败的话可能是网络问题&#xff0c;可以试一下是否能ping通&#xff0c;连…...

C语言--vs使用调试技巧

1.什么是bug? 1.产品说明书中规定要做的事情&#xff0c;而软件没有实现。 2.产品说明书中规定不要做的事情&#xff0c;而软件确实现了。 3.产品说明书中没有提到过的事情&#xff0c;而软件确实现了。 4.产品说明书中没有提到但是必须要做的事情&#xff0c;软件确没有实…...

Spring Boot中的国际化配置

Spring Boot中的国际化配置 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Spring Boot应用中实现国际化配置&#xff0c;使得应用能够轻松…...

WPF的IValueConverter用于校验和格式化TextBox的数字输入

在数据绑定&#xff08;Data Binding&#xff09;的上下文中&#xff0c;我们经常使用继承 IValueConverter 接口的类&#xff0c;用于在源值和目标值之间进行转换。该接口定义了两个方法&#xff1a;Convert 和 ConvertBack&#xff0c;这两个方法分别用于从源值到目标值的转换…...

SQL Server的守护神:Always On 高可用性详解

&#x1f6e1;️ SQL Server的守护神&#xff1a;Always On 高可用性详解 在企业级应用中&#xff0c;数据的可用性和业务连续性至关重要。SQL Server的Always On功能提供了一个高可用性解决方案&#xff0c;确保数据库服务的持续运行和快速故障恢复。本文将详细解释SQL Serve…...

Eureka入门

Eureka是一种服务发现工具&#xff0c;广泛应用于微服务架构中。它主要由Netflix开源&#xff0c;帮助服务在分布式系统中自动注册和发现。以下是Eureka的基本入门指南。 前提条件 在开始之前&#xff0c;确保你已经安装了以下软件&#xff1a; JDK 8或更高版本Maven或Gradl…...

高阶面试-netty部分

介绍下netty Netty 是一个基于 Java 的异步事件驱动的网络应用框架&#xff0c;提供了用于快速开发高性能、高可扩展性的协议服务器和客户端的工具 BIO、NIO、AIO 的区别是什么 BIO blocking io&#xff0c;同步阻塞IO&#xff0c;比较简单&#xff0c;为每个请求分配一个线…...

在 C++的跨平台开发中,如何处理不同操作系统和编译器之间的细微差异,以确保程序能够稳定且高效地运行?

在 C 的跨平台开发中&#xff0c;处理不同操作系统和编译器之间的细微差异是非常重要的。以下是一些处理差异的技巧&#xff1a; 使用条件编译&#xff1a;使用预处理指令&#xff0c;根据不同的操作系统和编译器来编写不同的代码。 #if defined(_WIN32)// Windows 特定代码 …...

独孤思维:脑子不好使,副业稳赚钱

01 副业&#xff0c;贴身级模仿。 比如独孤最近在测试dy虚拟资料项目。 跑了三个多月。 赚了点下小钱。 从最开始的自动生成视频&#xff0c;到后来的抽帧优化&#xff0c;再到先做的矩阵玩法。 一直都在迭代。 是独孤脑子好使吗&#xff1f; 恰恰相反。 正式因为独孤…...

【数据结构】(C语言):二叉搜索树

二叉搜索树&#xff1a; 树不是线性的&#xff0c;是层级结构。基本单位是节点&#xff0c;每个节点最多2个子节点。有序。每个节点&#xff0c;其左子节点都比它小&#xff0c;其右子节点都比它大。每个子树都是一个二叉搜索树。每个节点及其所有子节点形成子树。可以是空树。…...

泛微开发修炼之旅--23基于ecology自研的数据库分页组件(分页组件支持mysql、sqlserver、oracle、达梦等)

一、使用场景 ecology二开开发过程中&#xff0c;经常要使用到分页查询&#xff0c;随着信创项目的到来&#xff0c;各种国产数据库的出现&#xff0c;对于数据库分页查询兼容何种数据库&#xff0c;就迫在眉睫。 于是&#xff0c;我自己基于ecology开发了一个分页插件&#…...

《昇思25天学习打卡营第4天 | mindspore Transforms 数据变换常见用法》

1. 背景&#xff1a; 使用 mindspore 学习神经网络&#xff0c;打卡第四天&#xff1b; 2. 训练的内容&#xff1a; 使用 mindspore 的常见的数据变换 Transforms 的使用方法&#xff1b; 3. 常见的用法小节&#xff1a; 支持一系列常用的 Transforms 的操作 3.1 Vision …...

【Python时序预测系列】基于LSTM实现多输入多输出单步预测(案例+源码)

这是我的第312篇原创文章。 一、引言 单站点多变量输入多变量输出单步预测问题----基于LSTM实现。 多输入就是输入多个特征变量 多输出就是同时预测出多个标签的结果 单步就是利用过去N天预测未来1天的结果 二、实现过程 2.1 读取数据集 dfpd.read_csv("data.csv&qu…...

git客户端工具之Github,适用于windows和mac

对于我本人&#xff0c;我已经习惯了使用Github Desktop,不同的公司使用的代码管理平台不一样&#xff0c;就好奇Github Desktop是不是也适用于其他平台&#xff0c;结果是可以的。 一、克隆代码 File --> Clone repository… 选择第三种URL方式&#xff0c;输入url &…...

ai除安卓手机版APP软件一键操作自动渲染去擦消稀缺资源下载

安卓手机版&#xff1a;点击下载 苹果手机版&#xff1a;点击下载 电脑版&#xff08;支持Mac和Windows&#xff09;&#xff1a;点击下载 一款全新的AI除安卓手机版APP&#xff0c;一键操作&#xff0c;轻松实现自动渲染和去擦消效果&#xff0c;稀缺资源下载 1、一键操作&…...

Unity获取剪切板内容粘贴板图片文件文字

最近做了一个发送消息的unity项目&#xff0c;需要访问剪切板里面的图片文字文件等&#xff0c;翻遍了网上的东西&#xff0c;看了不是需要导入System.Windows.Forms&#xff08;关键导入了unity还不好用&#xff0c;只能用在纯c#项目中&#xff09;&#xff0c;所以我看了下py…...

利用谷歌云serverless代码托管服务Cloud Functions构建Gemini Pro API

谷歌在2024年4月发布了全新一代的多模态模型Gemini 1.5 Pro&#xff0c;Gemini 1.5 Pro不仅能够生成创意文本和代码&#xff0c;还能理解、总结上传的图片、视频和音频内容&#xff0c;并且支持高达100万tokens的上下文。在多个基准测试中表现优异&#xff0c;性能超越了ChatGP…...

极狐GitLab 17.0 重磅发布,100+ DevSecOps功能更新来啦~【一】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…...

python实现符文加、解密

在历史悠久的加密技术中&#xff0c;恺撒密码以其简单却有效的原理闻名。通过固定的字母位移&#xff0c;明文可以被转换成密文&#xff0c;而解密则是逆向操作。这种技术不仅适用于英文字母&#xff0c;还可以扩展到其他语言的字符体系&#xff0c;如日语的平假名或汉语的拼音…...

【解释】i.MX6ULL_IO_电气属性说明

【解释】i.MX6ULL_IO_电气属性说明 文章目录 1 Hyst1.1 迟滞&#xff08;Hysteresis&#xff09;是什么&#xff1f;1.2 GPIO的Hyst. Enable Field 参数1.3 应用场景 2 Pull / Keep Select Field2.1 PUE_0_Keeper — Keeper2.2 PUE_1_Pull — Pull2.3 选择Keeper还是Pull 3 Dr…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

【实施指南】Android客户端HTTPS双向认证实施指南

&#x1f510; 一、所需准备材料 证书文件&#xff08;6类核心文件&#xff09; 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)

目录 &#x1f50d; 若用递归计算每一项&#xff0c;会发生什么&#xff1f; Horners Rule&#xff08;霍纳法则&#xff09; 第一步&#xff1a;我们从最原始的泰勒公式出发 第二步&#xff1a;从形式上重新观察展开式 &#x1f31f; 第三步&#xff1a;引出霍纳法则&…...