0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是代码可视化?怎么实现代码可视化?

OSC开源社区 来源:OSCHINA 社区 2023-11-23 11:31 次阅读

作者 | 京东云开发者-京东科技 谢骁

1. 什么是代码可视化?

Code visualizationis the process of creating graphical representations of source code to help understand and analyze it. 代码可视化是创建源代码的图形表示以帮助理解和分析它的过程。 个人理解:通过使用图形化手段(架构图、依赖图、分布式追踪、类图、火焰图、CallGraph 等)使代码在某些特征上变得可观测,用于辅助开发人员理解分析项目或建设一些自动化工具。

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

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

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

A:项目都有哪些功能啊?项目入口在哪啊?核心调用链路是啥?都有哪些下游啊?这里好像循环调用了?

B:小刘的那个需求改动xx逻辑?这块怎么和文档上不一-样了?谁把这块重构了?

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

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

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

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

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

Call Graph是程序中不同函数调用之间关系的图形表示。它显示了程序中的函数如何相互作用,使开发人员能够理解程序的流程并识别潜在的性能问题。 以下讲解代码可视化的一种方式 Call Graph 的生成方案,可以分为静态和动态分析:

3.1 静态程序分析

1)基于源码生成

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

e28ee724-7261-11ee-939d-92fbcf53809c.png

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

e292d294-7261-11ee-939d-92fbcf53809c.png

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

e2975ab2-7261-11ee-939d-92fbcf53809c.png

语义分析:使用语法树和符号表中的信息来检查源程序是否和语言定义的语义一致,如:类型检查、上下文相关分析等。可以类比为检查英语句子是否有意义(如:Dog is cat,这种句子语法上没问题但语义上是不对的)。它同时也收集标识符的属性信息,并把这些信息存放在语法树或符号表中,以便在后面中间代码生成过程中使用。 中间代码:一种中间表示方式,所含信息可以推导出有关程序的全部事实。同一种中间代码可以复用优化器逻辑,并直接使用相关的编译器后端功能,使得各环节更独立更利于扩展。从结构上有图 IR、线性 IR 和混合 IR。 编译器后端部分主要是与目标语言相关,包含代码优化器和目标代码生成器,这部分和生成 CG 关系不大不作更多原理阐述,有兴趣的同学可以了解一下LLVM、Graalvm。

e2a1a256-7261-11ee-939d-92fbcf53809c.png

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

e2b09126-7261-11ee-939d-92fbcf53809c.png

可以发现分析其实就是编译器前端流程的复现,其中 AST、CFG 和 CG 都算作是图 IR。现成的源码分析工具有Antlr/javaparser/soot 等。下面以 javaparser 工具为例简要说明生成流程: 步骤一:导入需要分析项目的源码和依赖包,并使用工具解析

e2c34276-7261-11ee-939d-92fbcf53809c.png

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

e2cdb13e-7261-11ee-939d-92fbcf53809c.png

e2df5d8a-7261-11ee-939d-92fbcf53809c.png

步骤三:选定一个起始方法,基于方法和调用关系生成 CG 优点:语言无关,扩展性强。缺点:精度较差需要调优;分析速度较慢;非 java 语言工具掌握有一定难度。

2)基于字节码生成

针对语言特性进行定制开发能够更快获取成果。Java 的字节码其实也可以看做一种线性 IR,分析的流程也是类似的,同时 java 有大量的字节码操作工具(ASM、Javaassit、bcel 等),使得字节码解析变得很容易。 基本思路是从.class 文件中获取类、方法签名信息,再从字节码中找到 invoke 指令得到调用方法签名,基于这两个信息就可以构建出 CG。同时由于字节码中包含了方法的完整签名,因此不用像源码分析那样需要要引入依赖 jar 一并分析,因此在分析效率上会快很多。

e2ef58a2-7261-11ee-939d-92fbcf53809c.png

下面用 bcel 工具为例简要说明生成流程: 步骤一:解析目标项目,可以直接使用打包好的 jar 包

e304e3e8-7261-11ee-939d-92fbcf53809c.png

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

e31bd1ca-7261-11ee-939d-92fbcf53809c.png

e32c703e-7261-11ee-939d-92fbcf53809c.png

步骤三:选定一个起始方法,基于方法和调用关系生成 CG 优点:分析精确度高;解析速度快。缺点:语言相关,扩展性差。 PS:推荐一个 idea 插件call graph,基于 idea 的psi能力实现,在项目代码量不大的情况下分析还是挺精确的。

e32ff678-7261-11ee-939d-92fbcf53809c.png

3.2 动态程序分析

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

e33a503c-7261-11ee-939d-92fbcf53809c.png

4. 有哪些应用场景?

场景 1:变更风险识别

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

e33e7a2c-7261-11ee-939d-92fbcf53809c.png

场景 2:精准测试

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

e354bdfa-7261-11ee-939d-92fbcf53809c.png

场景 3:架构守护

背景:在架构治理上,我们面对诸多挑战 1)设计与实现不匹配。设计的软件架构与真正实施后的架构,存在着巨大的差异。而这个差异,往往需要编码上线、乃至一段时间之后才能发现; 2)没有规范 / 不遵守规范。作为一个资深的开发人员,我们制定了一系列的规范,但是没有多少团队人员愿意遵守; 3)代码量巨大,难以识别问题。一个由十几个或者几十个微服务创建的系统,往往难以快速发现它们之间错综复杂的关系; 4)架构模型的每个层级都可能出错。如服务间 API 耦合、代码间耦合、数据库耦合等等; 5)架构师、开发人员自身缺乏丰富的经验。知道有问题,但是说不出来哪有问题,也不知道如何改进。 因此,我们需要一个平台 / 工具,来帮助我们解决这些问题。

审核编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 分析器
    +关注

    关注

    0

    文章

    90

    浏览量

    12410
  • 函数
    +关注

    关注

    3

    文章

    3881

    浏览量

    61310
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48618
  • 软件架构
    +关注

    关注

    0

    文章

    60

    浏览量

    10224
  • 自动化工具
    +关注

    关注

    0

    文章

    6

    浏览量

    1624

原文标题:浅析 “代码可视化”

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    何谓单片机编程的可视化?

    何谓单片机编程的可视化?可视化编程就是提供给用户可视化的器件模块配置界面使用户在不用关心具体器件工作原理和设置的情况下直接生成所要配置的器件初始
    发表于 07-08 16:53

    单片机可视化编程

    单片机的可视化编程是不是指在环境下避开复杂的指令编写而通过图形的方式产生指令代码?-在可视化的条件下是否可以观察到仿真的结果?是的。不过仿真的结果不能够直接观察到,而要通过将生成的代码
    发表于 07-08 16:56

    可视化MES系统软件

    和客户都会造成损失,为了更好的满足客户需求、实现企业信息,目前企业制造过程中主要还存在以下需求:(1)数据可视化方面。MES系统软件之所以能有效的监控整个车间的生产过程,主要是通过对制造过程中
    发表于 11-30 19:55

    Tensorflow之Tensorboard的可视化使用

    TF之Tensorboard:Tensorflow之Tensorboard可视化使用之详细攻略
    发表于 12-27 10:05

    如何把AD中非可视化区域物件移到可视化区域?

    AD中非可视化区域物件怎么移到可视化区域???
    发表于 09-10 05:36

    python数据可视化的方法和代码

    Python数据可视化汇总
    发表于 10-14 14:59

    基于STM的可视化门禁系统

    基于STM的可视化门禁系统
    发表于 03-07 09:49

    基于stm的可视化门禁系统

    基于stm的可视化门禁系统
    发表于 03-11 09:23

    Python数据可视化

    Python数据可视化:网易云音乐歌单
    发表于 07-19 08:30

    三维可视化的应用和优势

    的整体态势。  比如设备在偏僻区域(海下、深山、沙漠、分布全国各地等),可以实现无人检测,无需消耗人力物力进行检测,通过三维数据的分析可以直观的探测出设备状态和产能。  设备运行可视化:根据图像
    发表于 12-02 11:52

    常见的几种可视化介绍

    说说常见的几种可视化一、信息可视化信息可视化就是对抽象数据进行直观视觉呈现的研究,抽象数据既包含数值数据,也包含非数值数据如文本信息、地图信息等,它们可通过利用图形图像处理、人机交互、人工智能的技术
    发表于 07-12 07:49

    基于VSCode的嵌入式开发的可视化代码调试方法分享

    一种基于VSCode的嵌入式开发的可视化代码调试方法关键字: VSCode、gdbserver、可视化调试、嵌入式开发案例简述随着本组业务的扩大,新进组员的增多,在开发定制或者排查基线的问题时候
    发表于 12-14 07:54

    如何在Ubuntu下实现可视化代码跟踪调试

    目录一、在Ubuntu下实现可视化代码跟踪调试1.1 安装VSCode1.2 配置调试和编译文件一、在Ubuntu下实现可视化
    发表于 12-14 07:02

    经验分享|BI数据可视化报表布局——容器

    容器功能是一种用于数据可视化图表排版的功能,主要作用对图表进行有效的布局调整,或者用于巧妙在同一地方安排多个不同类型的数据可视化图表,供使用者点击切换浏览。目前,在奥威BI软件上一同有两类容器功能
    发表于 03-15 17:10

    keras可视化介绍

    , 0.24421487748622894]5 训练过程的可视化:keras + Tensorboard Tensorboard提供训练过程可视化的功能,是通过keras的回调函数来实现的。 # 截取部分
    发表于 08-18 07:53