《2022年教你如何读懂源代码.docx》由会员分享,可在线阅读,更多相关《2022年教你如何读懂源代码.docx(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精品学习资源分析源代码方法如何看懂源代码 -分析源代码方法 欢迎下载精品学习资源我们在写程序时,有不少时间都是在看别人的代码;例如看小组的代码,看小组整合的守就,如一开头没规划怎么看,就会“噜看噜苦 台语) ”不管是参考也好,从开源抓下来讨论也好,为了明白箇中含意,在有限的时间下,不免会对巨大的源代码解读感到压力;网路上有一篇关于分析看代码的方法,做为程序设计师的您,不妨参考看看,换个角度来分析;也能更有效率的解读你想要的程序码片段;六个章节: 1 )读懂程序码,使心法皆为我所用; 2 )摸清架构,便可轻松把握全貌; 3 ) 优质工具在手,读懂程序非难事; 4 )望文生义,进而推敲组件的作用;
2、 5 )找到程序入口, 再由上而下抽丝剥茧; 6 )阅读的乐趣,透过程序码熟识作者;阅读他人的程序码 1 ) - 读懂程序码,使心法欢迎下载精品学习资源皆为我所用程序码是别人写的,只有原作者才真的明白程序码的用途及涵义;很多程序人心里都有一种不自觉的惧怕感,深怕被迫去碰触其他人所写的程序码;但是,与其抗拒接收别人的程序码,不如完全明白相关的语言和惯例,当成是培育自我实力的基石;对大多数的程序人来说,撰写程序码或许是令人高兴的一件事情,但我信任,有更多人视阅读他人所写成的程序码为畏途;很多人宁可自己重新写过一遍程序码,也不情愿接收别人的程序码, 进而修正错误,保护它们,甚至加强功能;这其中的关键
3、到底在何处呢?如是一语道破,其实也很简洁,程序码是别人写的,只有原作者才真的明白程序码的用途及涵义;很多程序人心里都有一种不自觉的惧怕感,深怕被迫去碰触其他人所写的程序码;这是来自于人类内心深处对于生疏事物的原始惧怕;读懂别人写的程序码,让你收成满满不过,基于很多现实的缘由,程序人经常受迫要去接收别人的程序码;例如,同事离职了,必需接手他遗留下来的工作,也有可能你是刚进部门欢迎下载精品学习资源的菜鸟,而同事体会值够了,升级了,风水轮番转,一代菜鸟换菜鸟;甚至,你的公司所承接的专案,必需接手或是整合客户前一个厂商所遗留下来的系统,你们手上只有那套系统的原始码 运气好时,仍有数量不等的文件) ;诸
4、如此类的故事,其实经常在程序人身边或身上连续上演着;很多程序人都将接手他人的程序 码,当做一件凄惨的事情;每个人都不想接手别人所撰写的程序码,由于不想花时间去探究,宁可将生产力花在产生新的程序码,而不是耗费在明白这些程序码上;很遗憾的是,上述的情形对程序人来说很难避 免;我们总是必需碰触到其他人所写成的程序 码,甚至必需明白它,加以修改;对于这项需 求,在现今开放原始码的风气如此盛行的今日,正如之前的 “程序设计 2.0”文中所提到的,你可以透过开放原始码学习到新的技术,学习到高手的 架构设计,大幅提高学习的效率及成效;你甚至 可以直接自开放原始码专案中抽取,提炼出自己 所需的程序码,站在巨人
5、的肩膀上,直接由彼端 获得所需的生产力;从这个观点来看,读懂别人欢迎下载精品学习资源所写的程序码,就不再只是从负面观点的“被迫接收”,而是极具正面价值的 “吸取养份; ”先明白系统架构与行为模式,再细读假如撰写程序码是程序人的重要技艺之一,那么读懂别人的程序码,接着加以修改,也势必是另一个重要的技艺;假如你不能熟识这项工作,不仅在遭逢你所不愿面对的局面时,无法解决眼前接手他人程序码的难题,更重要的是,当你看着眼前现成的程序 码,却不知如何从中撷取自己所需,导致最终只能入宝山空手回,望之兴叹;接触他人的程序码,大致上可以分为三种程度: 一,明白,二,修改,扩充,三,抽取,提炼; 明白别人的程序码
6、是最基础的工作,假如不能了 解自己要处理的程序码,就甭论修改或扩充,更 不行能去芜存菁,从中萃取出自己所需,回收再 利用别人所撰写的程序码;虽说是“阅读 ”,但程序码并不像文章或小说一样,透过这种做法,便 能够获得肯定程度的明白;阅读文章或小说时, 几乎都是循序地阅读,你只消翻开第一页,一行欢迎下载精品学习资源行阅读下去即可;但是,有很多程序人在试着阅读其他人的程序码时,却往往有不知如何读起的困难;或许找到系统的第一页 也就是程序码执行的启始点)并不难,但是复杂度高的系统,有时非常庞 大,有时千头万绪;从程序码的启始点开头读起,一来要循序读完全部的程序码旷日费时,二来透过这种方式来明白系统,很
7、难在脑中构建出系统的面貌,进而明白到系统真正的行为;所以,阅读程序码的重点, 不在于读完每一行程序码,而是在于有效率地透过探究及阅读,从而明白系统的架构及行为模 式;以便在你需要明白任何片段的细节实作时, 能够很快在脑上对映到详细的程序码位置,直到那一刻,才是细读的时机;熟识沟通语言与惯例用语不论如何,有些基本的预备,是阅读他人程序码时必需要有的;第一,你最好得明白程序码写成的程序语言;想欢迎下载精品学习资源要读懂法文写成的小说,总不能连法文都不懂 吧;有些情形就很特别;我们虽然不懂该程序码撰写所用的语言,但是由于现代语言的高阶化, 而且流行的程序语言多半都是血统相近,所以即使不那么熟识,有时
8、也可勉力为之;除了熟识所用语言之外,再来就是要先确认程序 码所用的命名惯例 命名惯例) ;明白命名惯例很重要,不同的程序人或开发团队,差异可能很 大;这命名惯例涵盖的范畴通常包括了变数的名称,函式的名称,类别 假如是物件导向的话)的名称,原始码档案,甚至是专案建构目录的名称;假如使用了像设计模式之类的方法,这些名称更有一些详细的表述方式;命名惯例有点像是程序人在程序语言之上,另行建构的一组沟通行话;程序人会透过共通约束, 遵守的命名惯例,来表达一些较高阶的概念;例如,出名的匈牙利式命名法,便将变数名称以属性,型别,说明合并在一起描述;对程序人来 说,这种方式能够供应更丰富的资讯,以明白该变数的
9、作用及性质;欢迎下载精品学习资源对程序码阅读来说,熟识这个做法之所以重要, 是由于当你明白整个系统所采纳的惯例时,你便能试着以他们所共同操用的语汇来进行懂得;假如,不能明白其所用的惯例,那么这些额外供应的资讯,就无法为你所用;像以设计模式写成的程序码,同样到处布满着模式的名称,诸如:工厂,门面,代理等等;以这些名称指涉的类别, 也直接透过名称,表达了它们自身的作用;对于懂得这命名惯例的读者来说,不需要深化探究, 也能很快捕获到这些类别的意义;当你拿到一套必需阅读的程序码时,最好先取得命名惯例的说明文件;然而,并不是每套程序码都附有此类的说明文件;另一个方式,就是自己到程序码中,大略浏览一遍,有
10、体会的程序人可以轻易挖掘出该系统所用的命名惯例;常见的命名方式不脱那几类,这时候体会就很重要,假如你知道的惯例越多,就越能轻易识别他人所用的惯例;假如运气很糟,程序码所用的惯例是前所未见的,那么你也得花点时间归纳,凭自己的力气找出这程序码命名上的规章;欢迎下载精品学习资源把握程序码撰写者的心态与习惯大多数的程序码,基本上都依循一样的命名惯 例;不过运气更差的时候,一套系统中可能会充斥着多套命名惯例;这有可能是由于开发团队由多组人马所构成,每组人马都有不同的文化,而在专案开发治理又没有管控得宜所造成;最糟的情形,程序码完全没有明显的惯例可言,这时候阅读的难度就更高了;想要阅读程序码,得先试着体会
11、程序码作者的 “心”;想要这么做,就得多明白对方所使用的语言, 以及惯常运用的语汇;在下一回中,我们将连续探讨阅读程序码的相关议题;阅读他人的程序码 2 ) -摸清架构,便可轻松把握全貌在本文中,我们的重点放在:要明白一个系统, 最好是实行由上至下的方式;先试着捕获系统架构性的观念,不要过早钻进细节,由于那通常对于你明白全貌,没有多大的帮忙;阅读程序码不需要从第一行读起,我们的目的并不是在于读遍每一段程序码;欢迎下载精品学习资源基于很多缘由,程序人需要阅读其他人所写成的程序码;而对程序设计 2.0 时代的程序人来说, 最正面的价值在于,能读懂别人程序的人,才有才能从中萃取自己所需的程序,借以提
12、高生产 力;阅读程序码的目的,在于明白全貌而非细节想要读懂别人程序码的根本基础,便是明白对方所用的程序语言及命名惯例;有了这个基础之 后,才算是具备了基本的阅读才能;正如我之前提到的 想要读懂法文写成的小说,总不能连法文都不懂吧;阅读程序码和阅读文学作品,都需 要明白撰写所用的语言及作者习用的语汇;但我们在阅读文学作品通常是采循序的方式,也就是从第一页开头,一行一行地读下去,依循作者为你铺陈的步调,逐步进到他为你预备好的世界里;阅读程序码却大大不同;我们很少从第一行开头读起,由于除非它是很简洁的单执行绪程序,否就很少这么做;由于要是这么做,就很难明白整个系统的全貌;是的,我们这边提到了一个重点
13、,阅读程序码的目的在于明白系统的全 貌,而不是在于只是为了地毯式的读遍每一段程欢迎下载精品学习资源序码;就拿物件导向程序语言所写成的系统来说,整个系统被拆解,分析成为一个个独立的类别;阅读个别类别的程序码,或许可以明白每项类别物件个别的行为;但对于各类别物件之间如何交互影响,如何协同工作,又很简洁陷入盲人摸象的困境;这是由于各类别的程序码,只描述个别物件的行为,而片段的阅读就只能造就片面的熟识;由上而下厘清架构后,便可轻易懂得组成关系 假如你想要跳脱困境,不想铺张大量时间阅读程序码,却始终只能捕获到对系统片段熟识,就必需转换到另一种观点来看待系统;从个别的类别行为着手,是由下至上 自下而上)的
14、方法;在阅读程序码时,却应当先采由上至下自上而下)的方式;对程序码的阅读来说,由上至下意谓着,你得先明白整个系统架构;系统的架构是整个系统的骨干,支柱;它表现出系统最突出的特点;知道系统架构到底属于那一种类型,通常大大有益于明白系统的个别组成之间的静态及动态关系;有些系统由于所用的技术欢迎下载精品学习资源或框架的关系,打算了最上层的架构;例如,采 用的 Java Servlet的/ JSP 的技术的应用系统,最外层的架构便是以J2EE 的或起码的 J2EE 中的Web 容器)为根本;使用的 Java Servlet的/ JSP 的技术时,打算了某些组成之间的关系;例如,Web 容器依据 web
15、.x ml 中的内容载入全部的 Servlets ,听众,以及过滤器;每当语境发生大事例如初始化)时,它便会通知监听类别;每当它收到来自客户端的恳求时,便会依循设定的全部过滤器链,让每个过滤器都有机会检查并处理此一恳求,最终再将恳求导至用来处理该恳求的 Servlet 的;当我们明白某个系统采纳这样的架构时,便可以 很简洁地知道各个组成之间的关系;即使我们仍 不知道到底有多少Servlets ,但我们会知道,每当收到一个恳求时,总是会有个相对应的服务器 来处理它;当想要关注某个恳求如何处理时,我 应当去找出这个恳求对应的服务器;明白架构,必需要加上层次感同样的,以爪哇写成的网页应用程序中,或许
16、会欢迎下载精品学习资源应用诸如 Struts 的之类的的 MVC 框架,以及像 H ibernate 的这样的资料存取框架;它们都可以视为最主要的架构下的较次级架构;而各个应用系统,甚至有可能在Struts 的及休眠之下,建立自有的更次级的架构;也就是说,当我们谈到 “架构 ”这样的观念时,必需要有层次感;而不论是那一层级的架构,都会定 义出各自的角色,以及角色间的关系;对阅读者 来说,相较于直接切入最微小的单一角色行为, 不如明白某个特定的架构中,到底存在多少角色,以及这些角色之间的互动模式,比较能够帮助我们明白整个系统的运作方式;这是一个很重要的关键,当你试着进到最细节处 之前,应当先试着
17、找出参加的角色,及他们之间 的关系;例如,对大事驱动式的架构而言,有3个很重要的角色;一个是大事处理的分派器大事调度) ,一个是大事产生者 大事发生器) ,另一个就是大事处理器 大事处理程序) ;大事产生器产生大事,并送至大事分派器,而大事分派器负责找出各大事相对应的大事处理器,欢迎下载精品学习资源并且转交该大事,并命令大事处理器加以处理; 像的图形用户界面的 Windows 应用程序,便是采纳大事驱动式的架构;当你知道此类的应用程序皆为大事驱动式的架构时,你便可以进一步得知,在这样的架构下会有3种主要的角色;虽然或许仍不清晰整个系统中, 到底会需要处理多少大事的类型,但对你而言, 已经建立了
18、对系统全貌最概观的熟识;虽然你仍不清晰全部的细节,但诸如准确会有那些大事类型之类的资讯,在此刻仍不重要 不要忘了,我们实行的是由上而下的方式,要先摸清楚主建筑结构,至于壁纸的花色怎么处理,那是到了尾声时才会做的事;探究架构的第一件事:找出系统如何初始化有体会的程序人,对于经常被运用的架构都很熟识;经常只需要瞧上几眼,就能明白一个系统所用的架构,自然就能够直接联想到其中会存在的角色,以及角色间的关系;然而,并不是每个系统所用的架构,都是大众所熟识,或是一眼能够望穿的;这时候,你需要探究;目标同样要放在欢迎下载精品学习资源界定其中的角色,以及角色间的静态,动态关系;不论某个系统所采纳的架构是否为大
19、部分人所熟 知的,在试着探究一个系统的长相时,我们应当 找出来几个答案,明白在它所用的架构下,以下 这件事是如何被完成的:一,系统如何初始化, 二,与这个系统相接的其他系统 或使用者)有那些,而相接的介面又是什么;三,系统如何反应 各种大事,四,系统如何处理各种反常及错误;系统如何初始化是很重要的一件事,由于初始化 是为了接下来的全部事物而做的预备;从初始化 的方式,内容,能知道系统做了什么预备,对于 系统会有什么行为呈现,也就能得窥一二了;之 所以要明白与系统相接的其他系统或使用者),为的是要界定出系统的边界;其他的系统可能会供应输入给我们所探究的系统,也可能接收来自这系统的输出,明白这边界
20、所在,才能确定系统的外观;而系统所反应的大事类型,以及如何反应,基本上就代表着系统本身的主要行为模式;最终,我欢迎下载精品学习资源们必需明白系统处理反常及错误的方式,这同样也是系统的重要行为,但简洁被忽视;之前,我们提到必需先具备一个系统的语言基础,才能够进一步加以阅读,而在本文中,我们的重点放 在:要明白一个系统,最好是实行由上至下的方式;先试着捕获系统架构性的观念,不要过早钻进细节,由于那通常对于你明白全貌,没有多大的帮忙;阅读他人的程序码 3 ) -优质工具在手,读懂程序非难事系统的复杂度往往超过人脑的负荷;阅读程序码 的时候,你会需要更多工具供应帮助;使用好的 整合式开发环境 IDE
21、)的或文字编辑器,就能供应最基本的帮忙;阅读程序码的动作,可以是很原始的,利用最简洁的文字编辑器,逐一开启原始码,然后凭借着一己的组织才能,在不同的程序码间跳动,拼凑出脑中想要构建的图像;不过,系统的复杂度往往超过人脑的负荷;阅读程序码的时候,你会需要更多工具供应帮助;使 用好的整合式开发环境 IDE )的或文字编辑器,欢迎下载精品学习资源就能供应最基本的帮忙;善用文字编辑器或 IDE 中,加速解读程序码很多文字编辑器供应了常见程序语言的语法及关键字标示功能;这对于阅读来说,肯定能够起很大的作用;有些文字编辑器 例如我常用的编辑器及偶而使用的记事本 + + ) ,甚至能够自动列出某个原始档中全
22、部定义的函式清单,更答应你直 接从清单中挑选函式,直接跳动到该函式的定义 位置;这对于阅读程序码的人来说,就供应了极 佳的便利性;由于在阅读程序码时,最常做的事,就是随着程序中的某个掌握流,将阅读的重心,从某个函式移至它所呼叫的另一个函式;所以对程序人来 说,阅读程序码时最常做的事之一就是:找出某个函式位在那一个原始档里,接着找到该函式所在的位置;好的的 IDE 能够供应的帮助就更多了;有些能够自动出现一些额外的资讯,最有用的莫过于函式 的原型宣告了;例如,有些的IDE 支援当游标停留在某函式名称上一段时间后,它会以提示的方 式显示该函式的原型宣告;欢迎下载精品学习资源对阅读程序码的人来说,在
23、看到程序码中呼叫到某个函式时,可以直接利用这样的支援,立刻取得和这个函式有关的原型资讯,立刻就能知道呼叫该函式所传入的各个引数的意义,而不必等到将该函式的定义位置找出后,才能明白这件事;grep 按读者:举荐来源透视)是一个基本而极为有用的工具除了选用好的文字编辑器或的IDE 之外,仍有一个基本,但却极为有用的工具,它就是grep 按;熟识的 Unix 作业系统的程序人,对 grep 按这个公用程序多半都不生疏;grep 按最大的用途,在于它答应我们搜寻某个目录 包括递回进入全部子目录)中全部指定档案,是否有符合指定条件常数字串或正规表示式)档案;假如有的话,就能帮你指出所在的位置;这在阅读程
24、序码时的作用极大;当我们随着阅读的脚 步,遇上了任何一个不熟识,但自认为重要的类别,函式,资料结构定义或变数,我们就得找出它到底位在这茫茫程序码海中的何处,才能将这个图块从未知变为已知;欢迎下载精品学习资源grep 按之所以好用,就是在于当我们发觉某个未知的事物时,可以轻易地利用它找出这个未知的 事物到底位在何方;此外,虽说grep 按是 Unix 系统的标准公用程序之一,但是像视窗这样子的 平台,也有各种类型的 grep 按程序;对于在视窗环境工作的程序人来说,可以自行选用觉得称手 的工具;gtags可建立索引,让搜寻更有效率grep 按虽然好用,但是仍旧有一些不足之处;第一个缺点在于它并不
25、会为所搜寻的原始码档案索引;每当你搜寻时,它都会逐一地找出全部的档案,并且读取其中的全部内容,过滤出满意指定条件的档案;当专案的原始码数量太大时,就会产生搜寻效率不高的问题;其次个缺点是它只是一个单纯的文字档搜寻工 具,本身并不会剖析原始码所对应的语言语法;当我们只想针对 “函式”名称进行搜寻时,它有可能将注解中含有该名称的原始码,也一并找了出来;针对 grep 按的缺点,准备阅读他人程序码的程序欢迎下载精品学习资源人,可以考虑使用像是 gtags 这样子的工具; gta gs 是源代码的 GNU 全局标记系统,它不只搜寻文字层次,而且由于具备了各种语言的语法剖析器,所以在搜寻时,可以只针对和
26、语言有关的元素,例如类别名称,函式名称等;而且,它能针对原始码的内容进行索引,这意谓一旦建好索引之后,每次搜寻的动作,都毋需重新读取全部原始码的内容并逐一搜寻;只需要以现成的索引结构为基础,即可有效率的查找关键段落;gtags 供应了基于命令列的程序,让你指定原始码所在的目录执行建立索引的动作;它同时也供应 程序让你得犹如操作 grep 按一般,针对索引结构进行搜寻及检索;它供应了很多有用的检索方式,例如找出专案中定义某个资料结构的档案及定义所在的行号,或者是找出专案中全部引用某资料结构的档案,以及引用处的行号;这么一来,你就可以轻易地针对阅读程序码时的 需求予以检索;相较于 grep 按所能
27、供应的支援, gtags 这样的工具,简直是强大很多;欢迎下载精品学习资源再搭配 htags制作的 HTML 文件,更是如虎添翼仍有一个肯定需要一提的工具;这个叫做htags 的工具,能够帮你将已制作完成的索引结构,制 作成为一组相互参考的的HTML 文件;基本上, 利用这样的的 HTML 文件阅读程序码,比起单纯地直接阅读原始码,来得更有结构;缘由是阅读 程序码时,这样的的 HTML 文件,已经为你建立起在各个原始码档案片段间跳动的链结;例如,图一是针对一个出名的开放原始码专案ffmpeg , 由 gtags 所产生出来的的 HTML 文件首页的一部分;htags 工具第一为你找出全部定义的Main )函式的档案,并且列出所在的函式;找出的Main )函式,经常是阅读程序码的第一步,由于主要 )函式是程序的主要入口点,全部的动作皆由此启动,它是一切事物的源头;凭借 htags 制作的的 HTML 文件,你可以轻易地欢迎下载精品学习资源点击超连结,直接进到的Main )函式所在的程序码片段,如图二;当我们检视上述原始码时,发觉av_register_all )是个生疏,无法明白的事物,而想要搞懂它到底是什么,可以再连续点击这个函式,如图三;这真是太便利了!阅读至此,你会猛然发觉,gta gs 似乎就是为了阅读程序码而特地量身打造的利器;欢迎下载精品学习资源欢迎下载