如何阅读源代码(3)

 

4阅读开源代码工具

工欲善其事,必先利其器。阅读源代码最好的工具是understand,用Source Insight也可以,至于Understand工具的使用技巧和方法参见代码阅读分析工具Understand使用总结这篇文章。

5阅读源代码的技巧

最后,对于在这篇文章中提到的分析源代码程序的一些方法做一下小结,以作为本文的结束。

5.1分析一个源代码,一个有效的方法是:

a、阅读源代码的说明文档,比如源代码中的README, 作者写的非常的详细,仔细读过之后,在阅读程序的时候往往能够从README文件中找到相应的说明,从而简化了源程序的阅读工作。

b、如果源代码有文档目录,一般为doc或者docs, 最好也在阅读源程序之前仔细阅读,因为这些文档同样起了很好的说明注释作用。

c、从makefile文件入手,分析源代码的层次结构,找出哪个是主程序,哪些是函数包。这对于快速把握程序结构有很大帮助。

d、从main函数入手,一步一步往下阅读,遇到可以猜测出意思来的简单的函数,可以跳过。但是一定要注意程序中使用的全局变量(如果是C程序),可以把关键的数据结构说明拷贝到一个文本编辑器中以便随时查找。

e、分析函数包(针对C程序),要注意哪些是全局函数,哪些是内部使用的函数,注意extern关键字。对于变量,也需要同样注意。先分析清楚内部函数,再来分析外部函数,因为内部函数肯定是在外部函数中被调用的。

f、需要说明的是数据结构的重要性:对于一个C程序来说,所有的函数都是在操作同一些数据,而由于没有较好的封装性,这些数据可能出现在程序的任何地方,被任何函数修改,所以一定要注意这些数据的定义和意义,也要注意是哪些函数在对它们进行操作,做了哪些改变。

g、在阅读程序的同时,最好能够把程序存入到SVN之类的版本控制器中去,在需要的时候可以对源代码做一些修改试验,因为动手修改是比仅仅是阅读要好得多的读程序的方法。在你修改运行程序的时候,可以从SVN中把原来的代码调出来与你改动的部分进行比较(diff命令), 可以看出一些源代码的优缺点并且能够实际的练习自己的编程技术。

h、阅读程序的同时,要注意一些小工具的使用,能够提高速度,比如vi中的查找功能,模式匹配查找,做标记,还有grep,find这两个最强大最常用的文本搜索工具的使用。

i、对于一个大的项目,首先要弄清项目的框架结构和各个项目模块的功能(输入什么,处理以后输出什么). 在这一点上Ant工具做的相当到位,通过编写build.xml和xml的良好的语法结构可以清楚的看到框架。Make工具也做比较出色。具体细节可参考GNU Make /Apache Ant Manual和程序的build.xml或makefile文件。

j、参照源代码和对应文档及业务知识 掌握各个项目模块的主流程也就是先从每个模块的main函数开始,按照顺序列出所用的函数,试着画流程图。注意:对于列出的函数我们现在只关心输入什么,处理后输出什么即函数的功能,不关心函数的实现,用UltraEdit32最新版阅读时十分方便。(用sourceinsight或者understand阅读源代码工具更好)

k、以上两步熟悉以后,在进一步熟悉各个项目模块的主流程,要弄清各个自定义函数的具体实现(标准库函数除外 原因:由厂商提供,厂商只提供函数的功能)。

l、在每一步都要做好源代码阅读笔记,总结方法和技巧。每个项目的源代码阅读要多读几遍,书读百遍,其义之见,定期与同仁切磋交流。

m、提出更好的解决方案,(按照软件工程的设计步骤)评估方案的性能(界面,易用性,内存等方面).

n、每日构建 具体参考构建工具和相关文挡,接着,看一看大师是如何做的。一般,要初步了解人家的框架模型,(这可以通过追踪一些核心函数/类得到一些印象,或者开发文档等);进一步,找到核心数据结构,核心数据结构会直接影响代码的质量。(曾经有人说:我不要看你的程序,让我看一看你的数据结构!)事实上,当你完全读懂它的数据结构时,在来阅读源代码,就是水到渠成的事了。

5.2 Unix/Linux下面以命令行方式运行的程序

对于一个Unix/Linux下面以命令行方式运行的程序,有这么一些套路,大家可以在阅读程序的时候作为参考。

a、在程序开头,往往都是分析命令行,根据命令行参数对一些变量或者数组,或者结构赋值,后面的程序就是根据这些变量来进行不同的操作。

b、分析命令行之后,进行数据准备,往往是计数器清空,结构清零等等。

c、在程序中间有一些预编译选项,可以在makefile中找到相应部分。

d、注意程序中对于日志的处理,和调试选项打开的时候做的动作,这些对于调试程序有很大的帮助。

e、注意多线程对数据的操作。

对于开源软件,下列方法也不错:

先用看看实现的功能,如果自己会咋样设计实现,查看相关文档,多次阅读理解其中设计模式、架构、算法实现细节

5.3 开源软件

开源项目已阅读了不少,总结下来按照下面的steps来操作比较恰当:

a阅读features。以此来搞清楚该项目有哪些特性

b思考。想想如果自己来做有这些features的项目该如何构架

c下载并安装demo或sample。通过demo或sample直观地感受这个项目

d搜集能得到的doc,尽快地掌握如何使用这个项目

e如果有介绍项目架构的文档,通过它了解项目的总体架构,如果没有,通过api-doc了解源码包的结构

f分两遍来阅读源码。第一遍以应用为线索,以总体结构为基础,阅读在应用中使用到的类和方法,但不用过深挖掘细节,对于嵌套调用,只用通过函数名了解最上层函数的意义,这一遍的目的在于把大致结构了然于心。第二遍就是阅读类和方法的实现细节,以第一遍的阅读为基础,带着疑问去阅读那些自己难以实现的模块。

g总结。回味这个项目设计上的精妙,用到了哪些设计模式,能在哪些领域可以借鉴等等。

结束语:

当然,在这篇文章中,并没有阐述所有的阅读源代码的方法和技巧,也没有涉及面向对象程序的阅读方法。我想把这些留到以后再做讨论。也请大家可以就这些话题展开讨论。

6、参考文献

1)、怎样阅读源代码

2)、如何阅读源代码

3)、如何阅读别人的代码

注:因一些问题有疑惑或需要经验的指导,在网上搜索了一些文章,经过自己的体会整理成这篇博客,有些文章拷贝时没记录原作者而只能在参考文献中列出文章名称,在此对原作者的开源共享精神十分感谢,也希望和大家多交流,不当之处请指教,谢谢!
阅读更多

没有更多推荐了,返回首页