浅析“代码可视化” | 京东云技术团队

1.什么是代码可视化?

Code visualization is the process of creating graphical representations of source code to help understand and analyze it. 代码可视化是创建源代码的图形表示以帮助理解和分析它的过程。

个人理解:通过使用图形化手段(架构图、依赖图、分布式追踪、类图、火焰图、CallGraph等)使代码在某些特征上变得可观测,用于辅助开发人员理解分析项目或建设一些自动化工具。

2.为什么需要代码可视化?

场景1:代码逻辑理解困难

项目代码量很大且需求迭代快,每次梳理的文档很快就过时了。新同学入手困难苦不堪言,老手也很难对项目整体的业务逻辑有一个全面的认知,常常需要重新梳理逻辑。

场景2:改动影响面难以评估

需求的诉求是修改A页面的逻辑,但由于后端代码很多公用逻辑且调用层级很深,上线才后发现影响了B页面的逻辑,造成了线上事故。

场景3:项目重构缺少抓手

老旧项目经过长时间迭代和多次更换团队,导致内部代码逻辑十分混乱且没人能完全讲明白所有逻辑。但新的业务迭代需求源源不断,在原有项目上修改成本越来越高,亟需重构以获得更高地研发效率。

其他场景:自动化case回归常常覆盖不到新增逻辑;线上问题排查困难,难以快速定位到出错代码…

3.怎么实现代码可视化?

Call Graph 是程序中不同函数调用之间关系的图形表示。它显示了程序中的函数如何相互作用,使开发人员能够理解程序的流程并识别潜在的性能问题。

以下讲解代码可视化的一种方式Call Graph的生成方案,可以分为静态和动态分析:

3.1 静态程序分析

1)基于源码生成

在讲解使用源码生成CallGraph的流程前我们先复习一下编译原理的相关知识。

其中编译器前端部分主要是与源语言相关,主要包含:

词法分析:也叫扫描(scanning),他的主要任务是从左向右逐行扫描源程序的字符,识别出各个单词,确定单词的类型,将识别出的单词转换成统一的机内表示—— 词法单元(token) 形式。可以类比英语字母合成单词的过程。

语法分析:也叫解析(parsing)。语法分析器(parser)从词法分析器输出的token序列中识别出各类短语,从而构造语法分析树(syntax tree),并判断源程序在结构上是否正确。可以类比为英语单词组合成句子。

语义分析:使用语法树和符号表中的信息来检查源程序是否和语言定义的语义一致,如:类型检查、上下文相关分析等。可以类比为检查英语句子是否有意义(如:Dog is cat,这种句子语法上没问题但语义上是不对的)。它同时也收集标识符的属性信息,并把这些信息存放在语法树或符号表中,以便在后面中间代码生成过程中使用。

中间代码:一种中间表示方式,所含信息可以推导出有关程序的全部事实。同一种中间代码可以复用优化器逻辑,并直接使用相关的编译器后端功能,使得各环节更独立更利于扩展。从结构上有图IR、线性IR和混合IR。

编译器后端部分主要是与目标语言相关,包含代码优化器和目标代码生成器,这部分和生成CG关系不大不作更多原理阐述,有兴趣的同学可以了解一下LLVM、Graalvm。

有了基本的编译原理知识后,来看看通过源码生产CG的过程:

可以发现分析其实就是编译器前端流程的复现,其中AST、CFG和CG都算作是图IR。现成的源码分析工具有Antlr/javaparser/soot等。下面以javaparser工具为例简要说明生成流程:

步骤一:导入需要分析项目的源码和依赖包,并使用工具解析

步骤二:使用visit模式获取所有方法和调用方法信息

步骤三:选定一个起始方法,基于方法和调用关系生成CG

优点:语言无关,扩展性强。 缺点:精度较差需要调优;分析速度较慢;非java语言工具掌握有一定难度。

2)基于字节码生成

针对语言特性进行定制开发能够更快获取成果。Java的字节码其实也可以看做一种线性IR,分析的流程也是类似的,同时java有大量的字节码操作工具(ASM、Javaassit、bcel等),使得字节码解析变得很容易。

基本思路是从.class文件中获取类、方法签名信息,再从字节码中找到invoke指令得到调用方法签名,基于这两个信息就可以构建出CG。同时由于字节码中包含了方法的完整签名,因此不用像源码分析那样需要要引入依赖jar一并分析,因此在分析效率上会快很多。

下面用bcel工具为例简要说明生成流程:

步骤一:解析目标项目,可以直接使用打包好的jar包

步骤二:使用visit模式获取所有方法和调用方法信息

步骤三:选定一个起始方法,基于方法和调用关系生成CG

优点:分析精确度高;解析速度快。 缺点:语言相关,扩展性差。

PS:推荐一个idea插件call graph,基于idea的psi能力实现,在项目代码量不大的情况下分析还是挺精确的。

3.2 动态程序分析

也称运行时程序分析,一般基于agent方式实现,这里暂不展开讲解,后续有机会再单独写一篇文章讲述原理。有兴趣的同学可以试用一下AppMap。

4.有哪些应用场景?

场景1:变更风险识别

背景:识别基础设施变更、系统外部变更以及系统内部变更带来的风险。

场景2:精准测试

背景:精准测试定义为利用技术手段对测试过程产生的数据进行采集存储,计算,汇总,可视化最终帮助团队提升软件测试的效率、并对项目整体质量进行改进和优化的这一系列操作。详细的解释可以阅读精准测试二三谈。

场景3:架构守护

背景:在架构治理上,我们面对诸多挑战

1)设计与实现不匹配。设计的软件架构与真正实施后的架构,存在着巨大的差异。而这个差异,往往需要编码上线、乃至一段时间之后才能发现;

2)没有规范/不遵守规范。作为一个资深的开发人员,我们制定了一系列的规范,但是没有多少团队人员愿意遵守;

3)代码量巨大,难以识别问题。一个由十几个或者几十个微服务创建的系统,往往难以快速发现它们之间错综复杂的关系;

4)架构模型的每个层级都可能出错。如服务间 API 耦合、代码间耦合、数据库耦合等等;

5)架构师、开发人员自身缺乏丰富的经验。知道有问题,但是说不出来哪有问题,也不知道如何改进。

因此,我们需要一个平台/工具,来帮助我们解决这些问题。

案例:ArchGuard

提供了基于C4模型(上下文、容器、组件和代码)的可视化分析,并提供了一些架构健康监测指标。

5.拓展阅读

  • 编译原理基础知识
  • 用于软件架构的 C4 模型
  • How do you visualize code?
  • What is a Call Graph? And How to Generate them Automatically
  • 静态程序分析

(声明:部分图片源自网络,侵删)

作者:京东科技 谢骁

来源:京东云开发者社区 转载请注明来源

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

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

相关文章

计算机保研推免面试复习大纲(数学+408)

目录 线性代数概率论高等数学信号与系统离散数学操作系统计算机网络计算机组成数据结构算法编译原理C杂项 线性代数 怎么求逆矩阵 逆矩阵: A A − 1 E AA^{-1}E AA−1E,伴随矩阵: A A ∗ A ∗ A ∣ A ∣ E AA^{*}A^{*}A|A|E AA∗A∗A∣A∣…

Top 10 数据恢复工具,可从iPhone 和 iPad 恢复数据

您是否正在寻找最好的 iPad 恢复软件,但不知道哪个选项最好?没有什么可担心的。本文将为您提供有关根据文件类型、设备兼容性和数据丢失原因等因素选择合适的 iPad 恢复软件的提示。此外,前 10 名提到的恢复软件是安全可靠的。 第 1 部分、iP…

上海亚商投顾:沪指震荡调整 转基因概念股逆势大涨

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日低开低走,深成指、创业板指均跌超1%,双双创出年内新低。转基因概念股逆势大涨…

开源Vue盲盒商城4.0源码/网页盲盒源码/前端uniapp后端thinkphp+安装教程/亲测

源码简介: 开源Vue盲盒商城4.0源码,它是打包小程序app的网页盲盒源码,亲测可用,它是采用vueTP5框架开发开源盲盒网站源码,附带了安装教程。 简单测试过了,可以使用,大家可以自测下。 前端uniapp后端think…

如何使用Python给图片添加水印

目录 一、安装Pillow库 二、导入Pillow库和需要用到的模块 三、添加水印 四、调用函数并设置参数 五、需要注意的方面 总结 在Python中,我们可以使用Pillow库来处理图像,包括添加水印。Pillow是Python中最流行的图像处理库之一,它支持多…

搭建Pytorch的GPU环境超详细

效果 1、下载和安装VS2019 https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/ 登录需要用户名和密码 安装后需要联网下载组件的,安装的时候要勾选使用C++的桌面开发 2、下载和安装显卡驱动 查看自己的显卡型号 从英伟达下载和安装最新驱动

【面试经典150 | 区间】插入区间

文章目录 Tag题目解读题目来源解题思路方法一:合并区间方法二:模拟 其他语言python3 写在最后 Tag 【模拟】【数组】 题目解读 给定一个含有多个无重叠区间的数组,并且数组已经按照区间开始值升序排序。在列表中插入一个新的区间&#xff0…

【nginx学习笔记】

1.正向代理:代理的是客户端,一般有明确的访问对象 比如:我现在通过v-p-n去访问YouTube,那么就是正向代理。 2.反向代理:代理的是服务器 最常见的就是web中,nginx去代理一群后端的服务器。 3.负载均衡&…

solidworks 2024新功能之-打造更加智能的工作 硕迪科技

SOLIDWORKS 2024 的新增功能 SOLIDWORKS 的每个版本都致力于改进您的工作流程,使您常用的工具尽可能快速高效地运作。此外,SOLIDWORKS 2024 可以通过量身定制的解决方案扩展您的工具集,并使您能够通过 Cloud Services 轻松将您的设计数据连接…

【Linux进行时】进程控制

1.进程创建&#xff1a; 1.1fork函数 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 \#include <unistd.h> pid_t fork(void); 返回值&#xff1a;子进程中返回0&#xff0c;父进程返…

APP开发成本的影响因素

在温州或中国任何地方开发APP的成本取决于多个因素&#xff0c;包括应用的规模、功能、设计、复杂性以及所需的技术和人力资源。以下是一些可能影响APP开发成本的主要因素&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xf…

kvm 不同存储池中卷的复制 virsh vol-create-from 的简单使用

virsh vol-create-from 命令介绍 主要用的就是这四个参数 virsh vol-crate-from --help使用方式 sdbpool : 要复制到的存储池名称 (这个是最终文件粘贴的池) virsh pool-list/opt/vol01.xml &#xff1a; 这个是你将要复制卷的xml // sdcvol1&#xff1a; 复制目标 // 导…

外汇天眼:外汇投资入门必看!做好3件事,任何人都能提高交易胜率

近年来外汇市场愈来愈热络&#xff0c;许多投资人看准世界金融变化的趋势&#xff0c;纷纷开始入场布局&#xff0c;期望把握行情大赚一笔。 如果你之前没有做过外汇交易&#xff0c;建议最好先透过「外汇天眼学院」学习各种相关的知识与技术分析&#xff0c;等到对外汇有一定的…

中国模式识别与计算机视觉大会|多模态模型及图像安全的探索及成果

目录 前言一、多模态模型进展与探索1、GPT-4V (多模态)测试2、LLM时代文档图像处理技术趋势3、LLM时代文档图像技术机会4、MLLM时代文档图像处理技术趋势5、知名文档图像大模型OCR性能分析 二、图像安全1、篡改种类2、系统架构3、文档图像处理开放平台4、AIGC假图鉴别5、图像篡…

计算机网络第2章-CDN(4)

视频流和内容分发网 HTTP流和DASH 在HTTP流中&#xff0c;视频只是存储在HTTP服务器中作为一个普通的文件&#xff0c;每个文件有有一个特定的URL。当用户要看视频时&#xff0c;客户与服务器之间创建一个TCP连接并发送HTTP GET请求。 HTTP流具有严重缺陷&#xff0c;即所有…

Opengauss数据类型强转

Opengauss数据类型强转 解决方法案例 解决方法 使用cast(需要转换的字段 as 转换后的类型) 函数进行强转。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 案例 问题&#xff1a;统计各类图书的平均价格&#xff0c;其中在图书表中price字段为money型…

PDCA循环

PDCA循环 由美国质量管理专家沃特阿曼德休哈特&#xff08;Walter A. Shewhart&#xff09;首先提出的&#xff0c;由戴明采纳、宣传&#xff0c;获得普及&#xff0c;所以又称戴明环。 模型介绍 戴明是一位美国的质量管理大师&#xff0c;却成名于日本。在他的帮助下&#xf…

电源模块测试用例科普:如何调整电压调整率?ATECLOUD-POWER测试系统能否测试?

电压调整率可以控制电压水平&#xff0c;确保设备正常工作&#xff0c;并且可以减少电能浪费&#xff0c;是开关电源测试的其中一个测试项目。那么要如何测试电压调整率呢?测试条件是什么呢? 什么是电压调整率? 电压调整率是指变压器某个绕组的空载电压和指定负载和功率因数…

Javascript 流程控制 笔记/练习

流程控制 if 分支 单分支 if() 中的条件成立则执行 {} 中的语句&#xff0c;否则不执行 <script>if(条件){语句;} </script>双分支 if() 中的条件成立则执行 if 后{} 中的语句&#xff0c;否则执行 else{} 中的语句 <script>if(条件){语句;}else{语句;} <…

C++初阶--C++入门(1)

文章目录 C语言与C命名空间命名空间的定义和使用 C的输入输出缺省参数函数重载引用赋值与引用引用在参数上的使用以及注意事项函数返回值的引用引用与值的时间效率比较常引用 C语言与C 很多初学者都会把这两门语言进行混淆&#xff0c;但其实这是两种不同的语言&#xff0c;C相…