`

阅读源代码2

阅读更多
        由于工作的关系,我常常需要读一些源代码,并在上面做一些修改并且拿来使用,或者是借鉴其中的某些部分。可以说,open source对于程序员来说,是很有意义的事情。根据我的经验,读源代码,至少有3个好处。第一个好处是可以学习到很多编程的方法,看好的源代码,对于提高自己的编程水平,比自己写源代码的帮助更大。当然不是说不用自己写,而是说,自己写代码的同时,可以从别人写的好的源代码中间学习到更多的编程方法和技巧。第二个好处是,可以提高自己把握大规模源代码的能力。一个比较大型的程序,往往都是经过了很多个版本很长的时间,有很多人参与开发,修正错误,添加功能而发展起来的。所以往往源代码的规模都比较大,少则10-100多k, 多的有好几十个MB. 在阅读大量源代码的时候,能够提高自己对大的软件的把握能力,快速了解脉络,熟悉细节,不仅仅是编程技巧,还能在程序的架构,设计方面提高自己的能力。(这里说一句题外话,<<设计模式>>这本书相信很多人都看过,而且很多人对它推崇备至,奉为经典。现在也出了不少书,都是冠以"设计模式"这一名称。在书中就提到,设计模式并不是一本教材,不是教你如何去编程序,而是把平时编程中一些固定的模式记录下来,加以不断的测试和改进,分发给广大程序员的一些经验之谈。我在看这本书的时候,有一些地方一些设计方法往往让我有似曾相识的感觉,另外一些则是我以前就常常用到的。而这些经验的获得,一部分得益于自己的编码过程,另外一个很重要的来源就是阅读别人写的源代码。)阅读源代码第三个好处,就是获得一些好的思想。比如,有很多人在开始一个软件项目之前都喜欢到sourceforge.net上去找一下,是否有人以前做过相同或者相似的软件,如果有,则拿下来读一读,可以使自己对这个软件项目有更多更深的认识。我以前曾经想找一本关于如何阅读源代码的书来看看,却没有找到。相反,倒是找到了不少分析源代码的书,比如Linux kernel, Apache source, 等等。所以我想,为什么不自己来写下一些经验和大家交流呢?(当然不是写书,没有那个能力也没有那个时间。)所以在这里我准备用一个例子来写一下如何阅读源代码,分享一些经验,算是抛砖引玉吧!

  最后,对于在这篇文章中提到的分析源代码程序的一些方法做一下小结,以作为本文的结束。
分析一个源代码,一个有效的方法是:
1、阅读源代码的说明文档,比如本例中的README, 作者写的非常的详细,仔细读过之后,在阅读程序的时候往往能够从README文件中找到相应的说明,从而简化了源程序的阅读工作。
2、如果源代码有文档目录,一般为doc或者docs, 最好也在阅读源程序之前仔细阅读,因为这些文档同样起了很好的说明注释作用。
3、从makefile文件入手,分析源代码的层次结构,找出哪个是主程序,哪些是函数包。这对于快速把握程序结构有很大帮助。
4、从main函数入手,一步一步往下阅读,遇到可以猜测出意思来的简单的函数,可以跳过。但是一定要注意程序中使用的全局变量(如果是C程序),可以把关键的数据结构说明拷贝到一个文本编辑器中以便随时查找。
5、分析函数包(针对C程序),要注意哪些是全局函数,哪些是内部使用的函数,注意extern关键字。对于变量,也需要同样注意。先分析清楚内部函数,再来分析外部函数,因为内部函数肯定是在外部函数中被调用的。
6、需要说明的是数据结构的重要性:对于一个C程序来说,所有的函数都是在操作同一些数据,而由于没有较好的封装性,这些数据可能出现在程序的任何地方,被任何函数修改,所以一定要注意这些数据的定义和意义,也要注意是哪些函数在对它们进行操作,做了哪些改变。
7、在阅读程序的同时,最好能够把程序存入到cvs之类的版本控制器中去,在需要的时候可以对源代码做一些修改试验,因为动手修改是比仅仅是阅读要好得多的读程序的方法。在你修改运行程序的时候,可以从cvs中把原来的代码调出来与你改动的部分进行比较(diff命令), 可以看出一些源代码的优缺点并且能够实际的练习自己的编程技术。
8、阅读程序的同时,要注意一些小工具的使用,能够提高速度,比如vi中的查找功能,模式匹配查找,做标记,还有grep,find这两个最强大最常用的文本搜索工具的使用。


对于一个Unix/Linux下面以命令行方式运行的程序,有这么一些套路,大家可以在阅读程序的时候作为参考。
1、在程序开头,往往都是分析命令行,根据命令行参数对一些变量或者数组,或者结构赋值,后面的程序就是根据这些变量来进行不同的操作。
2、分析命令行之后,进行数据准备,往往是计数器清空,结构清零等等。
3、在程序中间有一些预编译选项,可以在makefile中找到相应部分。
4、注意程序中对于日志的处理,和调试选项打开的时候做的动作,这些对于调试程序有很大的帮助。
5、注意多线程对数据的操作。(这在本例中没有涉及)
分享到:
评论

相关推荐

    Pentaho源代码阅读报告

    Pentaho源代码阅读报告

    微信小程序 新闻资讯 新闻阅读器 (源代码+截图)

    微信小程序 新闻资讯 新闻阅读器 (源代码+截图)微信小程序 新闻资讯 新闻阅读器 (源代码+截图)微信小程序 新闻资讯 新闻阅读器 (源代码+截图)微信小程序 新闻资讯 新闻阅读器 (源代码+截图)微信小程序 新闻...

    Celerity C/C++源代码阅读和维护器

    迅捷是一个功能强大的c/c++源代码阅读和维护软件。可以处理数百万行的源程序代码。支持标准及k&r风格的c/c++。对每一个打开的源代码工程,通过建立一个包含丰富交叉引用关系的数据库,显示其所含的各种信息:所有的...

    学会阅读源代码

    在计算通信领域,写几段使人类同胞能够理解的文字,实在比敲几行不会使编译器或者解释器呕吐的软件代码要困难得多。 这就是为什么每当涉及到代码,几乎所有文档都弱爆了。因为写东西给人看,比写给机器看难得多,在...

    Android 文本阅读器源代码

    Android 文本阅读器源代码,直接导入Eclipse即可,参考价值高,通用性很强,本人亲测

    如何阅读源代码

    由于工作的关系,我常常需要读一些源代码,并在上面做一些... 在阅读大量源代码的时候,能够提高自己对大的软件的把握能力,快速了解脉络,熟悉细节,不仅仅是编程技巧,还能在程序的架构,设计方面提高自己的能力。

    Quake3 Arena 源代码

    在QuakeCon 2005大会上,John Carmack曾表示,《Quake 3》源代码将在近期发布,任何有兴趣的人都可以下载。现在,id Software兑现了自己的诺言:《Quake 3 Arena》完整源代码1.32b版(Quake 3 Arena Full Source Code...

    linux内存管理源代码导读

    linux内存管理源代码导读 pdf格式

    Android代码-文本阅读器源代码.zip

    文本阅读器源代码.zip

    微信小程序 阅读读书 阅享小程序(阅读评价类) (源代码+截图)

    微信小程序 阅读读书 阅享小程序(阅读评价类) (源代码+截图)微信小程序 阅读读书 阅享小程序(阅读评价类) (源代码+截图)微信小程序 阅读读书 阅享小程序(阅读评价类) (源代码+截图)微信小程序 阅读读书 ...

    微信小程序 阅读读书 新浪读书 (源代码+截图)

    微信小程序 阅读读书 新浪读书 (源代码+截图)微信小程序 阅读读书 新浪读书 (源代码+截图)微信小程序 阅读读书 新浪读书 (源代码+截图)微信小程序 阅读读书 新浪读书 (源代码+截图)微信小程序 阅读读书 新浪...

    c++ 源代码阅读心得

    源代码 阅读 心得 源代码 阅读 心得源代码 阅读 心得源代码 阅读 心得 源代码 阅读 心得

    清除c/c++代码中条件编译部分的程序,帮助阅读源代码,生成好的tags

    网上众多的开源C/C++代码,因为跨平台的需要,参杂了许多的条件编译语句,对阅读源代码造成了不方便,而且用ctags等工具生成源代码的tags文件时会有些妨碍,本工具就是用来预处理这些条件编译的,将未定义的区域自动...

    微信小程序 阅读读书 仿网易蜗牛读书 (源代码+截图)

    微信小程序 阅读读书 仿网易蜗牛读书 (源代码+截图)微信小程序 阅读读书 仿网易蜗牛读书 (源代码+截图)微信小程序 阅读读书 仿网易蜗牛读书 (源代码+截图)微信小程序 阅读读书 仿网易蜗牛读书 (源代码+截图)...

    (安卓APP项目源代码)阅读器.zip

    (安卓APP项目源代码)阅读器(安卓APP项目源代码)阅读器(安卓APP项目源代码)阅读器(安卓APP项目源代码)阅读器(安卓APP项目源代码)阅读器(安卓APP项目源代码)阅读器(安卓APP项目源代码)阅读器(安卓APP项目源代码...

    Excel源代码_VBA代码

    (2) 源代码中完整的例子以Excel文件的形式保存,代码片断以文本文件的形式保存。部分代码提供了2种格式,可以根据阅读需要选择使用。 (3) 以Excel文件保存的代码打开时需要启用宏。 (4) 源代码的函数名、模块名...

    Visual C++源代码 32 如何制作超星格式图书阅读器

    Visual C++源代码 32 如何制作超星格式图书阅读器Visual C++源代码 32 如何制作超星格式图书阅读器Visual C++源代码 32 如何制作超星格式图书阅读器Visual C++源代码 32 如何制作超星格式图书阅读器Visual C++源代码...

Global site tag (gtag.js) - Google Analytics