加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动互联 > 正文

怎样阅读一份源代码?

发布时间:2019-03-25 02:32:38 所属栏目:移动互联 来源:佚名
导读:阅读源代码的手段算是措施员的一种底层基本手段之一,这个手段之以是重要,缘故起因在于: 不行停止的必要阅读可能接办他人的项目。好比调研一个开源项目,好比接办一个其他人的项目。 阅读优越的项目源码是进修他人优越履历的重要途径之一,这一点我本身深有
副问题[/!--empirenews.page--]

阅读源代码的手段算是措施员的一种底层基本手段之一,这个手段之以是重要,缘故起因在于:

  • 不行停止的必要阅读可能接办他人的项目。好比调研一个开源项目,好比接办一个其他人的项目。
  • 阅读优越的项目源码是进修他人优越履历的重要途径之一,这一点我本身深有领会。

然而,读代码比写代码照旧更难一些,缘故起因在于“写代码是在表达本身,读代码是在领略别人”。由于面临的项目多,项目标作者有各自的气魄沤背同领略起来必要耗费不少的精神。

怎样阅读一份源代码?

我从颐魅这些年泛读、精读过的项目源码不算少了,陆延续续的也写了一些代码说明的文章,本文中就简朴总结一下我的要领。

先跑起来

开始阅读一份项目源码的第一步,是先让这个项目可以或许通过你本身编译通过而且顺遂跑起来。这一点尤其重要。

有的项目较量伟大,依靠的组件多,搭建起一个调试情形并不轻易,以是并不见得是全部项目都能顺遂的跑起来。假如能本身编译跑起来,那么后头讲到的景象说明、加上调试代码、调试等等才有睁开的基本。

就我的履历而言,一个项目代码,是否能顺遂的搭建调试情形,服从大纷歧样。

跑起来之后,又要只管的精简本身的情形,镌汰调试进程中的滋扰信息。好比,Nginx行使多历程的方法处理赏罚哀求,为了调试跟踪Nginx的举动,我常常把worker数目配置为1个,这样调试的时辰就知道待跟踪的是哪个历程了。

总而言之,跑起来之后的调试服从能晋升许多,而在跑起来的条件之下又要只管精简情形。

调试本领

调试本领,概略分为以下两种:

  • 加调试语句。为了做到这一点,你必要先相识项目怎样加调试日记,也许必要修改项目标日记级别支持输出一些在调试级此外日记,等等。
  • 断点调试。并不是全部项目代码,跑起来之后都自带调试信息可以或许断点调试的。以是在本身的调试情形里必要先确定这一点。好比一些C相干的项目,根基都是”./configure & make”来编译,可是makefile中的编译flags行使了O2之类的优化选项,此时必要本身先手动修改成”-O0 -g”,即编译天生的二进制中不优化且带上调试信息。

总之,在可以或许搭建本身的调试情形之后,还必要想步伐确定一下怎样加上调试日记以及断点调试。

行使随手的器材

好的器材会让你事半功倍,这一点应该许多人都赞成。

我阅读Go代码的时辰,喜好行使IDEA,这个IDE器材可以美满的做到以下几点:

标记的定位、跳转、查找标记被引用的处所。

左边可以或许睁开一个源码文件中的全部标记。

反之,许多人推许的VSCode,我屡次实行行使用来阅读Go和C类代码,都认为不足随手,查找标记手段不可、也没有处所可以看到一个文件中呈现的标记。

CC++类的代码,在实行各类器材之后,照旧行使Vim+Ctags+Cscope来写C、C++代码。

景象说明

若是有了前面的基本,已经可以或许让项目顺遂在本身的调试情形跑起来了,那么就可以对项目代码举办景象说明白。

所谓的“景象说明”,我的领略就是本身结构一些景象,然后通过加断点、调试语句等说明在这些场景下的举动。

以我本身为例,在写《Lua计划与实现》时,讲授到Lua假造机指令的表明和执行进程中,必要针对每个指令做说明,此时用的就是景象说明的要领。我会模仿出来行使该指令的Lua剧本代码,然后在措施里断点调试这些场景下的举动。

我习用的做法,是在某个重要的进口函数上面加上断点,然后结构触发场景的调试代码,今世码在断点处停下,通过查察仓库、变量值等等来调查代码的举动。

景象说明的甜头在于:不会在一个项目中大海捞针似的查找,而是可以或许把题目缩小到一个范畴内睁开来领略。

“景象说明”这一观念不是我想出来的名词,好比有这么几天职析代码的书本,如:《Linux内核源代码景象说明》,《Windows内核景象说明》。

操作好测试用例

好的项目城市自带不罕用例,这范例的例子有:etcd、google出品的几个开源项目。

假如测试用例写的很细心,那么很值得好好去研究一下。缘故起因在于:测试用例每每是针对某个单一的场景,独自结构出一些数据来对措施的流程举办验证。以是,着实跟前面的“景象说明”一样,都是让你从大的项目转而存眷详细某个场景的本领之一。

厘清焦点数据布局之间的相关

固然说“措施计划=算法+数据布局”,然后我现实中的领会,数据布局越发重要。

由于布局界说了一个措施的架构,布局定下来了才有详细的实现。

Linus说: “烂措施员体谅的是代码。好措施员体谅的是数据布局和它们之间的相关。”

因此,在阅读一份代码时,厘清焦点的数据布局之间的相关尤其重要。这个时辰,必要行使一些器材来画一下这些布局之间的相关,我的源码说明类博客中有许多这样的例子,好比《Leveldb代码阅读条记》、《Etcd存储的实现》等等。

必要声名的是,景象说明、厘清焦点数据布局这两步并没有严酷的次序相关,不见得是先做某事再做某事,而是交互举办的。

好比,你假云云刻刚接办某个项目,必要简朴的相识一下项目,可以先阅读代码相识都有哪些焦点数据布局。领略了之后,假如不清晰某些景象下的流程,可以行使景象说明法。总而言之,瓜代举办直到解答你的疑问为止。

多问本身几个题目

进修的进程中离不开交互。

假如阅读代码只是输入(Input),那么还必要有输出(Output)。只有简朴的输入比如喂对象给你吃,而只有更好的消化才气变为本身的营养,而输出就是更好消化常识的重要本领。

其拭魅这个头脑很常见,好比门生上课(Input)了必要做操练功课(Output),好比学了算法(Input)必要本身编码操练(Output),等等。简而言之,输出是进修进程中的一种实时反馈,质量越高进修服从越高。

输出的本领有许多,在阅读代码时,较量提议的是本身可以或许多问本身一些题目,好比:

为什么选择这个数据布局来描写这个题目?相同的场景下,其他项目是怎么计划的?都有哪些数据布局做这样的工作?

假如由我来计划这样的项目,我会怎么做?

等等等等。越是主动起劲的思索,就越有更好的输出,输出质量与进修质量成正比相关。

写本身的代码阅读条记

我从开始写博客,就是写不少各类项目标代码解读类文章,网名“codedump”也源于想把“code内部的实现道理dump出来”之意。

前面提到进修质量与输出质量成正比相关,这是我本身的深刻领会。也由于云云,以是才要僵持阅读源码之后写本身的说明类条记。

写这类条记,有以下几个必要留意的处所。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读