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.pswp.cn/diannao/41527.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41527.shtml
英文地址,請注明出處:http://en.pswp.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修改指針或者…