问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何读源代码

发布网友 发布时间:2022-04-06 02:25

我来回答

5个回答

懂视网 时间:2022-04-06 06:47

相关学习推荐:javascript

我喜欢编程,它也是我的工作,而且我很高兴能够将大部分的时间都花在开发软件上。像许多程序员一样,我既着迷但又困惑的是,我写的代码到底怎么样,以及如何写得更好。

多年来,我已经阅读了许多有关软件开发的文章和书籍。其中不乏有许多墨宝(书上的或者网上的)告诉你如何提高编程,并成为一个像忍者一样的受过专业训练的编程高手!这些建议大多有一些共性,其中之一就是阅读源码。然而相比于其它建议,阅读源码通常也就是简单的一句话来概括:找一些很棒的开源软件,或是任何你喜欢的软件,打开它们(或打印出来)然后阅读它们。虽然总的来说,这确实是个很好的建议,但纸上得来终觉浅,实际去实践的时候才发现问题多多。在这篇文章中,我会尝试给出一些阅读源码的实用建议,但在这之前,首先让我们列举一下都有哪些问题。

对阅读源码的误解

别人一说阅读源码,给你的一般印象似乎他们就像编程大师一样,可以单纯地坐在椅子上,然后像看小说一样读着手上的代码。好吧,我敢肯定,确实有一些精湛的程序员,他们可以很享受地一边喝着咖啡、一边看着一堆类似英语句子的神秘符号,并且还能够在脑海里构建整个类的层次和体系结构。显然这篇文章并不是给他们看的,它的受众是像我一样的,觉得盯着一堆源码看就好比看一些无聊没有意义的练习题的人。当然,有人会争辩说,可以从一个完整项目里一点一点地看单个类或者单个函数来学习,但在我看来,除非是最简单的问题,大多数软件内部都是相互依赖的。在不了解系统其余部分的情况下,通常不可能理解一个特定函数或者类背后的设计思想和原理。

下一个问题是从哪里获得可以读的源码(当然,在此之前,你得能够鉴别哪些源码值得一读)。优秀的软件很多,既有开源软件可以免费获得,也有闭源软件需要授权。开源仓库有譬如 Sourceforge 和 GitHub 。如果你在软件开发公司工作,那么可以访问源代码库中的专有代码。第三种常见途径是软件开发书籍附带的程序,或者作为教育资源而提供的程序( Minix 是典型的例子)。确实,众多的选项使我们难以抉择,因此从茫茫代码世界中找出适合我们阅读的是一项艰巨而必不可少的任务。

另一个问题是程序所用的编程语言,读他人的代码已经足够困难了,如果同时还需要去熟悉一门夹杂着奇葩语法的新语言,它所带来的负担,在我看来简直就是个会带来极大挫败感的灾难。所以你需要找到用你熟悉的语言所编写的代码。但如果你要看的代码是来自书本上或作为教育资源所提供的,那懂不懂这门新语言并无关紧要,因为有导师可以解释上下文。倘若你明知山有虎偏向虎山行,在没有书或者导师指引下,去阅读一门并不熟悉的编程语言,那我建议你至少需要学习,并达到可以写出自己的程序的程度(Hello World 就不算了哈)。

前文有关上下文的问题使我想到了下一个问题,如果你不熟悉软件本身,弄清楚代码在做什么就困难得多。例如,如果你不是每天都在使用 Linux 并知晓 Linux 启动顺序,那么就很难在看一边 Linux 代码后弄清楚运行级别是什么。使用某个软件获得的经验、知识能够帮助我们更好地阅读它的源码,这包括常用的术语、软件的功能和特性,甚至包括你遇到的各种错误本身。

理解源码

对我而言,我意识到 “阅读源码” 并不能准确描述我所从事的活动,用 “理解源码” 来表述会更合适。对我来说,坐在笔记本屏幕前(或打印成纸),只是单纯地读满屏的代码是非常困难的。我需要代码之外其它的东西,比如我喜欢翻一翻文档,玩一玩这个软件,单步运行代码甚至写测试代码去跑一跑,然后才能真正欣赏它。因为我会为此投入非常大的时间和精力,所以我必须要精挑细选,寻找我要 “阅读”(理解)的软件。

我的第一层过滤是通过编程语言进行筛选,对我来说,我只阅读由 C#、VB.NET、Python 和 Javascript 编写而成的程序的代码(尽管我也熟悉 C++、Ruby 和 F#,但我并不认为自己有水平来理解其他人的代码)。接下来是寻找我使用过的软件,这会让我有种已经上车的感觉,因为我知道代码的意图,以及它不能做的事情还有它的局限性(如果我足够熟悉的话)。每天都在使用的开源软件正是优秀的候选项(比如,我使用用 C# 编写的开源工具 Cruise Control.NET、NANT 和 NUnit)

碰巧我在一家软件产品公司(一家微软的公司)工作,所以我阅读的源码选择项之一是我们公司在源代码库中的代码。如果碰巧你也在一家软件公司工作,你可以查看其他的项目,甚至你着手项目的较早期版本。这样,除了可以获得更深层次的代码理解之外,你还可以很好地了解之前和之后都曾尝试过哪些东西。不过有一些警告需要注意:

  • 首先,如果你没有权限访问其他项目,则需要征得许可,因为一些公司对其 “知识产权” 非常看重。
  • 其次,这些软件的质量可能没有你想像的那么高,因为通常情况下,专有代码没有经过像开源代码那样严格的代码走查。需要注意的是,如果缺乏常规的代码审查,那么代码的质量可能不佳。
  • 第三(这一点是从我的朋友提供的反馈中得到启发的),如果你的公司开发的是商业软件(HR、财务、ERP 等),则需要首先理解很多业务关系。而且,由于大多数代码受业务功能因素的影响,因此通常模块化程度不如应用程序或 API 高。
  • 寻找文档齐全的项目(这适用于开源以及专有代码)。我的意思是说,这样的文档应该突出总体设计,并说明代码背后的原理。如果只是简单地自动生成的 Java Doc 类型文档,则不能视之为我所描述的文档 :-)。其中一种寻找途径是利用为教育而创造的软件(例如 Minix)。由于它们的目的是通过软件进行教学,因此通常会有非常清晰的文档记录下来,并且有大量资料解释代码背后的设计原理。

    总结

    那么,现在你已经确定了要阅读源码的软件并下载了它的源代码和文档,让我们一步步阅读并理解它:

  • 浏览设计文档,并尝试了解代码的构建方式。好的软件项目遵循某些架构模式,这些决定了代码的组织。一旦掌握了这一点,理解代码就变得容易了很多。如果你还能画出类图,就能更好地了解整体布局。
  • 接下来要做的是编译并运行它。根据项目及其文档循序渐进,这可能很简单也可能很困难。
  • 现在是时候打开你喜欢的 IDE 并开始探索了。一个好的探索起点是,尝试一步步浏览你熟悉的功能的代码。这样一来,你可以遍历各个层和子系统,并了解它们之间的关联。例如,当我探索 NUnit 时,我首先编写了一个测试用例,然后查看涉及到的类。
  • 尝试确定代码中使用的设计模式。如果你还不知道什么是设计模式,那么立刻马上停止看本文,转去阅读设计模式的经典书籍。熟悉设计模式,它们是识别和理解优秀代码中所包含的设计的好方法。熟悉之后就可以更轻松地在阅读代码时将其牢记在心。它还可以帮助你更轻松地识别代码作者在原有设计模式上所做的细微调整和魔改。
  • 尝试为代码编写测试用例以完全理解它,这是理解代码不同部分之间的依赖关系的一种非常有用的方法。写测试用例之前,首先需要满足所有的依赖。接下来,了解代码的可能的入口点和返回值。这可以增进你对代码的理解,助你更上一层楼。
  • 最后,尝试重构代码。在这一步,你已经从单纯地理解代码迈向足够熟悉以能够对其进行修改。随着重构复杂程度的提高,你的理解也将随之增加。此时,如果需要,你可以为项目贡献自己的代码。
  • “源码阅读”在我看来,不仅仅是阅读,它是一组独特的活动,共同帮助人们理解代码。这似乎比简单的 “阅读代码” 更令人生畏,但它值得付出努力。

    现在,你可以更加轻松,快乐地“阅读源码”了吗?

    想了解更多编程学习,敬请关注php培训栏目!

    热心网友 时间:2022-04-06 03:55

    我以前,读代码一般是先看看程序包含哪些头文件,接着作者又定义了哪些宏,声明了哪些全局变量。(注意,除了头文件几乎每个程序都有之外,其他两项不一定都有。)
    之后看自定义函数的原型,了解它们各是负责什么工作的(可以猜一猜)。对于具体的实现,先不看。(一般在主函数之后或其他文件里实现)
    然后进入主函数,采用“逐行扫描”的阅读方式。直到主函数结束。
    最后才去看那些自定义函数的具体实现。
    另外,如果程序中还有“类”的话,那我会先去看一看类的接口,就是它能提供哪些操作。具体的实现都是读完主函数之后才看的。
    当然这是我的习惯,我想各人有各自的习惯,所以仅供楼主参考,你应该有自己的习惯。

    C++程序一般分为几个文件存放。我喜欢先看一看.h头文件里都声明了些什么。特别注意类的接口。然后进入主函数所在的.cpp源文件,从头到尾“逐行扫描”。最后才去看类的接口及自定义函数是如何实现的。

    热心网友 时间:2022-04-06 05:13

    很少读代码,一般都是自己写或者弄人家已经封装写好的,较容易调用的代码^_^

    不过个人认为,首先要知道程序是干什么的,如果有文档,看看文档

    这样会容易看很多

    对了,VC有个功能可以帮助你看别人的代码。选中变量,右击菜单里有个“转到定义”和“转到参考”的菜单项,点击后会快速跳到变量的定义和使用的代码

    参考资料:关注

    热心网友 时间:2022-04-06 06:47

    VC++程序不太好读,不象VB有逻辑性和结构性,有时你即使读过了所有的头文件和程序文件,你都不知道它在讲些什么。所以要读VC++程序,最好从最简单的hello程序读起,内容不多,麻雀虽小,却基本包含了VC++所有的文件结构,在熟悉和熟练掌握了基本环境结构之后,再读其他复杂的VC++程序,就会觉得有源可寻、很容易读懂的。

    热心网友 时间:2022-04-06 08:39

    把C++先学通,再读就容易了
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    “笑指旧山归路长”的出处是哪里 PCB为什么要拼板,PCB拼板打样有哪些好处? 绘制紫外吸收光谱时,我发现最大吸收波长是333nm,此时吸光度为4.01 对吸光度测量值有何影响? 陆垚知马俐的歌词是什么? 玫瑰花水中的养殖方法 陈年柚子茶如何做 陈年柚子茶的制作方法 在答题卡上改题号是指那一道题扣分还是整个卷子都没? ...考试时我写到了卷子上,会怎么样?会不会按抄袭 高考时在卷子上不小心画了道怎么办? 如何阅读程序源代码 airpods pro 空间音频是随时都有吗 空间音频不支持怎么办 airpods pro怎么关闭立体声 现在哪一种浏览器最安全 什么浏览器最安全最好用 最安全的浏览器 目前最好用最安全的一款浏览器是什么? 现在什么浏览器最好用?最安全? 什么浏览器是最好最快最安全的呢? 大家觉得那个浏览器最好啊,速度最快 什么浏览器最好用,速度最快? 哪个浏览器最好用?要速度快的,安全性强的, 苹果手机用app老闪退 iosapp老是闪退怎么办 airpods pro怎么在ipad和iphone之间切换 airpods2如何在iphone和ipad切换 ios14和ios15用airpods3的区别 airpods pro怎么无缝从iphone切换到ipad 什么浏览器速度快而且占内存小? 如何精读或泛读别人编写的程序源代码? 如何正确的阅读源代码 如何阅读源码包 如何阅读别人的代码 如何阅读别人的代码? 如何阅读原代码 如何去阅读并学习一些优秀的开源框架的源码 为什么以及如何阅读源码 一个完全入门初学者如何学代码,读代码和写代码,,我想学代码不知道方向谁能给我指明一个方向? 谷歌浏览器怎么才能使用谷歌搜索引擎 谷歌浏览器怎么添加搜索框? 关于Chrome浏览器,怎么不能直接搜索了? 谷歌浏览器怎么调用ie内核 怎么让谷歌浏览器使用IE内核 谷歌浏览器装上的 ie tab插件怎么用 详细介绍如何设置谷歌浏览器的代理问题,可以设置成IE内核吗? 请问chrome如何调用IE9的内核?IE TAB有该选项,但用后发现还是IE7的内核。实在舍不得chrome的插件啊~~ 谷歌浏览器怎么设置啊? 如何让ie调用chrome内核 如何使chrome总是保持IE tab?