Redian新闻
>
浅析 “代码可视化”

浅析 “代码可视化”

公众号新闻

来源 | OSCHINA 社区

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

原文链接:https://my.oschina.net/u/4090830/blog/10120313

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 关系不大不作更多原理阐述,有兴趣的同学可以了解一下 LLVMGraalvm



有了基本的编译原理知识后,来看看通过源码生产 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
  • 静态程序分析
(声明:部分图片源自网络,侵删)


END



当人类情感遇上国产AI



这里有最新开源资讯、软件更新、技术干货等内容

点这里 ↓↓↓ 记得 关注✔ 标星⭐ 哦


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
30+高级图表一键生成!Bloomberg“御用”可视化工具真绝了我们真的需要另一种非开源的源代码可用许可证吗? | Linux 中国矩阵成真!Pytorch最新工具mm,3D可视化矩阵乘法、Transformer注意力风雨之夜“茅”氏家族力推“东方美学”IP酱酒,酒香醇厚,酒体清澈,官方防伪码可查[电脑] 13600K+ROG STRIX B760-F +ATS RTX 4060,九州风神CH560可视化数显装机秀PyTorch最新工具mm来了!3D可视化矩阵乘法、Transformer注意力!美警局长详解击毙中领馆袭击者视频,这就叫法律权威可视化文末送书 | 统计至简:知乎数学可视化大神全角度拆解统计学与概率论从后冷战“全球化”到后新冠“半球化”:不容乐观的未来降温了!阿宝推荐 超舒服的儿童家居服套装,AB面绒恒温保暖,可视化温感变色小马扫码可见水产品“从塘头到餐桌”,首个食品溯源平台上线一个强大的可视化历史查阅工具应该是怎么样的?基于影像多组学数据库的无创可视化新方法,揭示乳腺癌肿瘤内异质性表型和治疗靶点谁是 2023 年加拿大数据可视化初创公司中的领先影响力驱动者?听说这么飞加航可以900cad回国?浅析加航学生套票,9.1前要买!我们的一年(6)外星世界外星人GPT-4写代码不如ChatGPT,误用率高达62%!加州大学两位华人开源代码可靠性基准RobustAPI做产品之后,我才知道“可视化”还能这么设计,牛!联想将推出用于沉浸式可视化的新型3D显示器;苹果获Vision Pro被动冷却系统专利矩阵模拟!Transformer大模型3D可视化,GPT-3、Nano-GPT每一层清晰可见「专题速递」水下图像的画质增强、HDRVivid生态、视觉质量评价模型、音乐可视化效果浅析日本核废水排海讨论中的常见话术资本项目数字化服务试点两周年,招行“数字化”支持企业“便利化”开学买1个可视化计时器的钱,够买这台计时器/任务打卡/便签三合一的了(明10点开团)“老板文化”等于“公司文化”吗?超划算!茅台酒居然只要299!酒香醇厚,酒体清澈,官方防伪码可查开学买1个可视化计时器的钱,够买这台计时器/任务打卡/便签三合一的了|开团30+高级图表一键生成!Bloomberg“御用”可视化工具好绝又一款更快、更好、更稳定的 Redis 可视化工具开源了!!!红色日记 10.21-31MOBA赛道浅析:抛开流量杂音,玩家诉求是不变的答案男女平等---还要等多久?买什么厨电,可以花一次钱,省下80%的厨房空间?大容量可视化空气炸锅!《编织梦幻的人·恩斯特篇之二》
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。