淺析“程式碼視覺化”
來源:京東技術 導讀
本文探討了程式碼視覺化的核心概念、實現方法和在不同場景下的應用。無論讀者是開發新手還是資深工程師,本文都將提供一個新的視角,幫助讀者更好地理解程式碼視覺化的價值,並將其應用於實際開發過程中。透過閱讀本文可以掌握程式碼視覺化的基本實現原理,瞭解在不同場景下如何運用視覺化結果提前識別風險、提高程式碼質量和最佳化系統效能。
導讀
本文探討了程式碼視覺化的核心概念、實現方法和在不同場景下的應用。無論讀者是開發新手還是資深工程師,本文都將提供一個新的視角,幫助讀者更好地理解程式碼視覺化的價值,並將其應用於實際開發過程中。透過閱讀本文可以掌握程式碼視覺化的基本實現原理,瞭解在不同場景下如何運用視覺化結果提前識別風險、提高程式碼質量和最佳化系統效能。
Code visualization is the process of creating graphical representations of source code to help understand and analyze it.
透過使用圖形化手段(架構圖、依賴圖、分散式追蹤、類圖、火焰圖、CallGraph等)使程式碼在某些特徵上變得可觀測,用於輔助開發人員理解分析專案或建設一些自動化工具。
為什麼需要程式碼視覺化?
圖 1.
需求的訴求是修改A頁面的邏輯,但由於後端程式碼很多公用邏輯且呼叫層級很深,上線才後發現影響了B頁面的邏輯,造成了線上事故。
圖 2.
老舊專案經過長時間迭代和多次更換團隊,導致內部程式碼邏輯十分混亂且沒人能完全講明白所有邏輯。但新的業務迭代需求源源不斷,在原有專案上修改成本越來越高,亟需重構以獲得更高地研發效率。
圖 3.
Call Graph是程式中不同函式呼叫之間關係的圖形表示。它顯示了程式中的函式如何相互作用,使開發人員能夠理解程式的流程並識別潛在的效能問題。
3.1 靜態程式分析
在講解使用原始碼生成CallGraph的流程前我們先複習一下編譯原理的相關知識。
圖 4.
詞法分析:也叫掃描(scanning),他的主要任務是從左向右逐行掃描源程式的字元,識別出各個單詞,確定單詞的型別,將識別出的單詞轉換成統一的機內表示—— 詞法單元(token) 形式。可以類比英語字母合成單詞的過程。
圖 5.
語法分析:也叫解析(parsing)。語法分析器(parser)從詞法分析器輸出的token序列中識別出各類短語,從而構造語法分析樹(syntax tree),並判斷源程式在結構上是否正確。可以類比為英語單片語合成句子。
圖 6.
圖 7.
有了基本的編譯原理知識後,來看看透過原始碼生產CG的過程:
圖 8.
步驟一:匯入需要分析專案的原始碼和依賴包,並使用工具解析
圖 9.
步驟二:使用visit模式獲取所有方法和呼叫方法資訊
圖 10、11.
優點:語言無關,擴充套件性強。
基本思路是從.class檔案中獲取類、方法簽名資訊,再從位元組碼中找到invoke指令得到呼叫方法簽名,基於這兩個資訊就可以構建出CG。同時由於位元組碼中包含了方法的完整簽名,因此不用像原始碼分析那樣需要要引入依賴jar一併分析,因此在分析效率上會快很多。
圖 12.
步驟一:解析目標專案,可以直接使用打包好的jar包
圖 13.
步驟二:使用visit模式獲取所有方法和呼叫方法資訊
圖 14、15.
步驟三:選定一個起始方法,基於方法和呼叫關係生成CG
缺點:語言相關,擴充套件性差。
圖 16.
3.2 動態程式分析
也稱執行時程式分析,一般基於agent方式實現,這裡暫不展開講解,後續有機會再單獨寫一篇文章講述原理。有興趣的讀者可以試用一下AppMap。
圖 17.
案例:美團後裔系統
圖 18.
背景:精準測試定義為利用技術手段對測試過程產生的資料進行採集儲存,計算,彙總,視覺化最終幫助團隊提升軟體測試的效率、並對專案整體質量進行改進和最佳化的這一系列操作。詳細的解釋可以閱讀精準測試二三談。
圖 19.
1)設計與實現不匹配。設計的軟體架構與真正實施後的架構,存在著巨大的差異。而這個差異,往往需要編碼上線、乃至一段時間之後才能發現;
2)沒有規範/不遵守規範。作為資深的開發人員,制定了一系列的規範,但是沒有多少團隊人員願意遵守;
3)程式碼量巨大,難以識別問題。一個由十幾個或者幾十個微服務建立的系統,往往難以快速發現它們之間錯綜複雜的關係;
4)架構模型的每個層級都可能出錯。如服務間 API 耦合、程式碼間耦合、資料庫耦合等等;
提供了基於C4模型(上下文、容器、元件和程式碼)的視覺化分析,並提供了一些架構健康監測指標。
圖 20、21.
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70024420/viewspace-3005469/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 淺析行內元素視覺格式化視覺
- 淺析方法控制程式碼
- 聊聊程式碼倉庫視覺化:gource 篇視覺化Go
- 【程式碼視覺化實踐】程式碼變更影響分析視覺化
- 資料視覺化詳解+程式碼演練視覺化
- 低程式碼 系列 —— 視覺化編輯器3視覺化
- 一份視覺化特徵圖的程式碼視覺化特徵
- react程式碼拆分之react loadable原始碼淺析React原始碼
- 面向研發的低程式碼、程式碼視覺化設計編排視覺化
- R語言:KEGG富集、視覺化教程,附程式碼R語言視覺化
- 時間序列 ACF 和 PACF 理解、程式碼、視覺化視覺化
- 淺析 SplitChunksPlugin 及程式碼分割的意義Plugin
- quicklink原始碼淺析UI原始碼
- Koa 原始碼淺析原始碼
- 淺析Redux原始碼Redux原始碼
- String原始碼淺析原始碼
- webmagic原始碼淺析Web原始碼
- Lifecycle原始碼淺析原始碼
- Redux原始碼淺析Redux原始碼
- ThreadLocal 原始碼淺析thread原始碼
- redux 原始碼淺析Redux原始碼
- 淺析機器視覺在醫療影像處理中的應用視覺
- 40行Python程式碼,實現卷積特徵視覺化Python卷積特徵視覺化
- RocketMQ 視覺化環境搭建和基礎程式碼使用MQ視覺化
- 用低程式碼平臺視覺化設計表單視覺化
- 淺析EF效能優化優化
- js效能優化淺析JS優化
- 淺析Android外掛化Android
- Paging Library原始碼淺析原始碼
- String 原始碼淺析(一)原始碼
- Discuz! Q 原始碼淺析原始碼
- 【QT】QThread原始碼淺析QTthread原始碼
- RXSwift原始碼淺析(二)Swift原始碼
- Guava原始碼淺析——JoinerGuava原始碼
- 淺析小程式外掛
- 淺析前端框架如何更新檢視前端框架
- 淺析Linux中伺服器程式碼部署篇(分享)Linux伺服器
- 視覺化視覺化