您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

浅析 “代码可视化”

时间:2023-10-24 15:55:38  来源:  作者:OSC开源社区

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

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

1. 什么是代码可视化?

Code visualizationis 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

  • 静态程序分析

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

END



Tags:代码   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  Search: 代码  点击:(12)  评论:(0)  加入收藏
为何大语言模型不会取代码农?
译者 | 布加迪审校 | 重楼生成式人工智能(GenAI)会取代人类程序员吗?恐怕不会。不过,使用GenAI的人类可能会取代程序员。但是如今有这么多的大语言模型(LLM),实际效果不一而足。如...【详细内容】
2024-03-21  Search: 代码  点击:(21)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  Search: 代码  点击:(12)  评论:(0)  加入收藏
如何编写高性能的Java代码
作者 | 波哥审校 | 重楼在当今软件开发领域,编写高性能的Java代码是至关重要的。Java作为一种流行的编程语言,拥有强大的生态系统和丰富的工具链,但是要写出性能优异的Java代码...【详细内容】
2024-03-20  Search: 代码  点击:(21)  评论:(0)  加入收藏
微软AI程序员登场,10倍AI工程师真来了?996自主生成代码,性能超GPT-4 30%
新智元报道编辑:桃子 润【新智元导读】全球首个AI程序员Devin诞生之后,让码农纷纷恐慌。没想到,微软同时也整出了一个AI程序员——AutoDev,能够自主生成、执行代码等...【详细内容】
2024-03-18  Search: 代码  点击:(15)  评论:(0)  加入收藏
对JavaScript代码压缩有什么好处?
对JavaScript代码进行压缩主要带来以下好处: 减小文件大小:通过移除代码中的空白符、换行符、注释,以及缩短变量名等方式,可以显著减小JavaScript文件的大小。这有助于减少网页...【详细内容】
2024-03-13  Search: 代码  点击:(2)  评论:(0)  加入收藏
如何进行Python代码的代码重构和优化?
Python是一种高级编程语言,它具有简洁、易于理解和易于维护的特点。然而,代码重构和优化对于保持代码质量和性能至关重要。什么是代码重构?代码重构是指在不改变代码外部行为的...【详细内容】
2024-02-22  Search: 代码  点击:(33)  评论:(0)  加入收藏
18个JavaScript技巧:编写简洁高效的代码
本文翻译自 18 JavaScript Tips : You Should Know for Clean and Efficient Code,作者:Shefali, 略有删改。在这篇文章中,我将分享18个JavaScript技巧,以及一些你应该知道的示例...【详细内容】
2024-01-30  Search: 代码  点击:(65)  评论:(0)  加入收藏
C++代码优化攻略
今天我们将深入探讨C++性能优化的世界。在当今软件开发的浪潮中,高性能的代码是必不可少的。无论是开发桌面应用、移动应用,还是嵌入式系统,性能都是关键。1. 选择合适的数据结...【详细内容】
2024-01-26  Search: 代码  点击:(113)  评论:(0)  加入收藏
手把手教你为开源项目贡献代码
背景前段时间无意间看到一篇公众号 招贤令:一起来搞一个新开源项目,作者介绍他想要做一个开源项目:cprobe 用于整合目前市面上散落在各地的 Exporter,统一进行管理。比如我们常...【详细内容】
2024-01-26  Search: 代码  点击:(70)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条