如何阅读代码

引言

  最近笔者在啃嵌套的状态机Verilog代码的时候,连着遇到了很多头大的问题,迫使我去反思是不是自己阅读Verilog代码的方法论上出现了问题。所以在查阅了一些资料和帖子后,整理了一下关于代码阅读的方法,督促自己能够培养起来更好的阅读代码的习惯,更快地理解掌握源码含义。在这里分享出来,也请各位读者不吝赐教。

  对于一名初学者而言,肚子里实在挤不出几滴“墨水”,虽然掌握了基本的语法结构,但是如何将这些代码的“砖块”垒成一座目标的“工程大厦”,颇让人一筹莫展。而广泛地阅读优质的代码,通过输入“input”不断习得一些框架及结构,能让我们在coding的时候做到有的放矢。同时,阅读优秀的代码本身也是站在别人的肩膀上,学习他人思考问题角度的很好途径。
  阅读优秀源码是一件受益良多的事,但是面对一眼看不到底的代码,毫无章法地死磕显然不是正确的路子。正所谓“工欲善其事,必先利其器”,正确的阅读方法能够让我们事倍功半,更好地理解把握作者解决问题的思路,也能扫清一些我们阅读的阻碍,便于以后的复盘和整理。

明确目的

  看代码之前我们要先弄清楚自己准备从中获得什么,明确自己的目的然后再去看,有了目的后面才能有针对性,可以是要了解其中一个模块的实现、某个算法的实现方法、代码的整体框架结构等。

阅读文档

  正所谓看一个小时的代码等于看十分钟的文档,相对于代码,文档能够从整体出发,更加提纲挈领地带我们理解代码的架构和设计思路,先阅读代码文档后再看代码事半功倍(前提是有文档,没文档那也没办法了)。

画图

  在阅读代码过程中,画图是必要的,图片可以是模块图、关键部分的时序图、算法流程图、思维导图等等。“一图胜千言”,画图可以简洁明了地归纳模块的功能和结构,更关键的是借助画图将代码整理切割,再彼此连接,也能帮助厘清代码逻辑、时序和数据流动的关系。

整体到细节,端口到内部

  代码的主体阅读采用自顶向下,从整体到细节的剥洋葱式读法。先从整体模块的输入输出对模块整体功能有初步认识。通过主要的输入和输出明确代码的主线逻辑任务,对于支线任务先放到一遍,防止在不重要的支线代码上兜圈子,例如先重点关注逻辑置一的操作,逻辑清零相对而言就是次要逻辑,可以放到后面再看。
  对于代码中的数据信号,则要采用端口到内部的方式理解阅读。首先我们要弄清楚哪些是模块中比较关键的数据信号,这些关键输入信号来自哪些模块,输出信号提供给哪些模块,建立起大概的结构图。同时也要明确这些数据经过了哪些模块,在模块中进行了什么样的处理。通过输入数据的正向分析和输出数据的反向追溯,像修隧道两头挖那样,最后构建出模块的数据流处理过程。在分析完重要信号后再看一些不重要的信号。

把代码跑起来

  前人言:“没有跑起来的代码是死代码”,把代码在自己的编译环境下跑起来能够很大程度上给自己信心,而通过仿真,查看波形能够筛选掉很多干扰的无关量,而通过更改部分代码看看是否会发生预想中的输出波形变化能够很好地验证我们对于代码部分功能的推测,并且通过仿真波形也能直观地观察并行输出的中间变量数据,尤其便于观察模块中的数据流。

多问自己

  越是主动积极地去思考,就能收获越深刻的理解。多问自己一些问题,来达到交互的目的,例如问自己此处代码有无其他写法,该代码的使用情景是什么样的,有没有其他方法实现,如果是我的话,我会如何实现。通过比较和回答自己的问题来加深对代码逻辑的理解。

最终效果

  在阅读完代码以后,针对自己的目的,我们应该学习了解工程中各个模块的作用,比较重要的模块的数据传输网络,模块内部关键数据流的处理方法等。能够达到复述整体流程,体会代码使用情景的程度。

  以上是我整理出的阅读代码的主要思路和一些方法,它山之石可以攻玉,还请各位读者能够多多提出自己的看法,欢迎交流指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值