快速导航
什么是代码可视化?怎么实现代码可视化?
来源:ob哈希    发布时间:2024-07-06 06:00:03

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  的器件模块配置界面使用户在不用关心具体器件工作原理和设置的情况下直接生成所要配置的器件初始

  的条件下是不是能够观察到仿真的结果?是的。不过仿真的结果不能够直接观察到,而要通过将生成的

  方面。MES系统软件之所以能有效的监控整个车间的生产的全部过程,主要是通过对制造过程中

  的整体态势。比如设备在偏僻区域(海下、深山、沙漠、分布全国各地等),可以

  无人检测,无需消耗人力物力进行仔细的检测,通过三维数据的分析可以直观的探测出设备状态和产能。设备运行

  就是对抽象数据来进行直观视觉呈现的研究,抽象数据既包含数值数据,也包含非数值数据如文本信息、地图信息等,它们可通过利用图形图像处理、人机交互、人工智能的技术

  调试、嵌入式开发案例简述随着本组业务的扩大,新进组员的增多,在开发定制或者排查基线的问题时候

  跟踪调试1.1 安装VSCode1.2 配置调试和编译文件一、在Ubuntu下

  :keras + Tensorboard Tensorboard提供训练过程

  无论是城市管线还是社区,商场,大厦里的管线,想要实时检测到管线的情况怕是有难度。如何通过物联网和互联网技术

  巴图自动化Modbus协议转Profinet协议网关模块连智能仪表与PLC通讯

  巴图自动化Profinet协议转Modbus协议网关模块连接智能仪表与PLC通讯

  嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-在NXP源码基础上适配ELF 1开发板的按键功能