浅析“代码可视化”

这篇具有很好参考价值的文章主要介绍了浅析“代码可视化”。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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
  • 静态程序分析

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

作者:京东科技 谢骁

来源:京东云开发者社区 转载请注明来源文章来源地址https://www.toymoban.com/news/detail-710869.html

到了这里,关于浅析“代码可视化”的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是可视化编程?为什么它如此重要?

    可视化编程,又叫可视化程序设计,一直以来就是备受讨论的“热门技术”。一方面,程序员抵触它,觉得它不如用代码开发。另一方面,对于产品经理等稍微懂点开发的业余人员,它确实能提供价值。所以,它到底是什么呢?本文将从可视化编程的定义、应用、优势等三个

    2024年02月12日
    浏览(37)
  • 为什么要做数据可视化系统

    数据可视化系统在当今数字时代发挥着重要的作用,成为许多组织和企业的不可或缺的工具。随着信息爆炸式增长和数据处理的需求不断增加,数据可视化系统帮助人们更好地理解和分析数据,为决策提供重要支持。数聚股份将详细介绍为什么要做数据可视化系统,并探讨其

    2024年02月13日
    浏览(29)
  • 视觉化洞察:为什么我们需要数据可视化?

    为什么我们需要数据可视化?这个问题在信息时代变得愈发重要。数据,如今已成为生活的一部分,我们每天都在产生大量的数据,从社交媒体到购物记录,从健康数据到工作表现,数据无处不在。然而,数据本身通常是冷冰冰的数字,对于大多数人而言,理解和分析这些数

    2024年02月10日
    浏览(43)
  • 低代码开发与数据可视化

    随着数字化转型的深入发展,软件开发在各行各业中的重要性日益凸显。近年来,低代码开发与数据可视化技术的兴起,为软件开发带来了革命性的变革。本文将深入探讨低代码开发与数据可视化的概念、优势以及应用场景,旨在帮助读者更好地理解这两项技术,并为其在实

    2024年03月24日
    浏览(28)
  • 常见的可视化例子及代码

    可视化是一种强大的工具,广泛应用于各个领域,以帮助理解和解释数据。 几种常用可视化图表类型。画图网站推荐 微生信、在线维恩图软件、图标和海报,配色网站推荐 Adobe Color、Dopely Color、uiGradients、中国色、Subcolor和 ColorDrop 折线图 柱状图 带饼状图的柱状图 散点图 双

    2024年02月03日
    浏览(30)
  • 可视化低代码表单设计器

    JNPF 表单设计器是一款在线可视化表单建模工具,基于Vue+Springboot技术开发,具有组件丰富、操作简单、所见即所得等特性,既能够设计普通的数据录入表单,也能够配合流程设计出各类审批流转表单。 应用地址:https://www.jnpfsoft.com/?csdnxx 表单设计器功能区域介绍: 【控件区

    2024年02月19日
    浏览(17)
  • python数据可视化显示(附代码)

    Python是一种非常流行的编程语言,具有广泛的应用领域,包括数据可视化。在数据可视化中,Python提供了多种工具来帮助用户创建各种类型的图表、图形和可视化效果。本文将介绍Python数据可视化的基本概念、工具和技术,并提供代码示例以说明如何使用Python进行数据可视化

    2024年02月13日
    浏览(33)
  • 【100天精通Python】Day71:Python可视化_一文掌握Seaborn库的使用《一》_数据分布可视化,数据关系可视化,示例+代码

    目录 1. 数据分布的可视化 1.1 直方图(Histograms) 1.2 核密度估计图(Kernel Density Estimation Plot)

    2024年02月06日
    浏览(38)
  • 低代码开发:数据处理与可视化

    低代码开发是一种快速、高效的应用开发方法,它通过简化和自动化开发过程,使非专业开发人员也能快速构建数据处理和可视化应用。本文将介绍低代码开发的定义、优势,并以数据处理与可视化为例,探讨低代码开发在这一领域的应用和价值。 随着大数据时代的到来,数

    2024年01月21日
    浏览(40)
  • 低代码可视化逻辑编排工具:JNPF

    目录 Intro 一、是什么? 提供自动化的解决方案 二、为什么受欢迎? JNPF自身特点——安全、方便、高效、低耗 对于企业,更“安全” 成本“最低”,效率“最高” 三、JNPF开发平台功能展示 技术介绍 参考地址 近几年,随着低代码与无代码相关话题的火热,逻辑编排作为其

    2024年02月06日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包