2014年7月31日星期四

代码阅读方法

最近一段时间由于毕业设计的关系,需要修改某一个开源项目的源代码,添加新的功能,这个时候需要通读整个项目的代码。其实这个项目的代码
已经读了很长的时间了,但是一直没有进展。但是到今年这个时候,如果不能搞定这个东西就不能毕业,所以:), deadline果然是生产力!下面就将阅读过
程中的一些经验讲述出来,如果需要更详细的内容请参见

第一个经验就是让程序运行起来,了解整个程序的输入和输出。了解程序的输入输出和命令行选项等,就可以帮助你对整个程序建立直观的印象,同
时,有些程序运行的过程中会打印一些log和状态,从这个也可以对程序的整体简历直观的印象!个人感觉这样的做法对那些不借助框架的程序有作用,比如linux
下的一些程序运行的时候打印输出一些东西。但是对于Windows平台上的程序,则毫无作用,比如MFC,以我当年阅读MFC源代码的经验,运行一个MFC程序
不能让你获得任何关于这个程序本身的信息。

第二个有益的经验是发现整个程序的高层逻辑!程序的高层逻辑可以理解成程序是如何展开运行的,从入口函数开始,如何使用输入数据初始化程序
内部的数据结构,这是第一个阅读阶段。第二个阶段是以发现程序的主循环,在这个循环中不停的构建运行时需要的数据,并和输入数据一起发送给实际的处理
函数或者类。然后就可以看到程序的结束条件,这就是说观察程序是如何结束的,有什么条件,这是第三个阶段。其实在一个函数内部或者类的内部也是这样的
一个过程,初始化,处理和返回。

第三个有益的经验就是发现整个程序的关键字。程序中的关键字可以理解成整个项目中不断出现的字符串,这样的字符串出现频率很高,如果能够了解
这些字符串背后所代表的程序员的意图,那么对于了解整个程序是很有帮助的。同时也可以利用编辑器中字符串搜索功能可以很好的跟踪整个运行过程,用一个
函数不停的找到调用者,然后看下一个函数。在这个方面cscope可以起到很好的作用。

第四个经验就是要分析程序中不同数据结构的关系。一般来说现在很多的程序是面向对象设计的(或者是面向结构体)。利用不同数据结构或者类的关系,
比如继承、包含等关系,可以从数据上理解整个程序的运行!

在总结了上面的经验后,我突然发现相关的经验包括两个方面:一是动作方面的,比如函数调用等等;二是数据流动方面,数据流动本身就能一定程度上
反映整个程序的逻辑流程。

没有评论:

发表评论