如何读源代码

合集下载

java源码阅读技巧

java源码阅读技巧

java源码阅读技巧
阅读Java源码是每个Java程序员都应该具备的重要技能,以
下是一些阅读Java源码的技巧:
1. 理清目的,在阅读Java源码之前,首先要明确自己的阅读
目的是什么,是为了理解某个特定功能的实现,还是为了学习优秀
的编程实践和设计模式。

2. 选择合适的版本,Java的版本更新很快,不同版本的源码
可能会有一些差异,因此要根据自己的需要选择合适的版本进行阅读。

3. 从入口开始,通常情况下,阅读Java源码应该从入口开始,比如某个类或者某个方法,然后根据需要逐步深入。

4. 注重关键类和方法,Java源码非常庞大,不可能一下子全
部理解,因此要有选择地关注一些关键的类和方法,比如常用的集
合类、IO类等。

5. 结合文档,阅读Java源码时,要结合官方文档,了解每个
类和方法的作用和用法,这样能更好地理解源码的含义。

6. 调试和实践,阅读Java源码不仅仅是 passively reading,更重要的是要结合自己的实际项目进行调试和实践,这样能更深入
地理解源码的运行逻辑和细节。

7. 查阅其他资料,有时候Java源码本身并不能完全解答你的
疑惑,这时候可以查阅一些权威的书籍或者网络资料,加深自己的
理解。

总的来说,阅读Java源码需要耐心和细心,要有一颗渴望探索
的心态,同时要善于总结和归纳,不断地积累经验和知识。

希望以
上技巧对你有所帮助。

如何看懂源代码

如何看懂源代码

如何看懂源代码我们在写程式时,有不少时间都是在看别人的代码。

例如看小组的代码,看小组整合的守则,若一开始没规划怎么看,不管是参考也好,从开源抓下来研究也好,为了了解箇中含意,在有限的时间下,不免会对庞大的源代码解读感到压力。

六个章节:( 1 )读懂程式码,使心法皆为我所用。

( 2 )摸清架构,便可轻松掌握全貌。

( 3 )优质工具在手,读懂程式非难事。

( 4 )望文生义,进而推敲组件的作用。

( 5 )找到程式入口,再由上而下抽丝剥茧。

( 6 )阅读的乐趣,透过程式码认识作者。

阅读他人的程式码(1 )---读懂程式码,使心法皆为我所用程式码是别人写的,只有原作者才真的了解程式码的用途及涵义。

许多程式人心里都有一种不自觉的恐惧感,深怕被迫去碰触其他人所写的程式码。

但是,与其抗拒接收别人的程式码,不如彻底了解相关的语言和惯例,当成是培养自我实力的基石。

对大多数的程式人来说,撰写程式码或许是令人开心的一件事情,但我相信,有更多人视阅读他人所写成的程式码为畏途。

许多人宁可自己重新写过一遍程式码,也不愿意接收别人的程式码,进而修正错误,维护它们,甚至加强功能。

这其中的关键究竟在何处呢?若是一语道破,其实也很简单,程式码是别人写的,只有原作者才真的了解程式码的用途及涵义。

许多程式人心里都有一种不自觉的恐惧感,深怕被迫去碰触其他人所写的程式码。

这是来自于人类内心深处对于陌生事物的原始恐惧。

读懂别人写的程式码,让你收获满满不过,基于许多现实的原因,程式人时常受迫要去接收别人的程式码。

例如,同事离职了,必须接手他遗留下来的工作,也有可能你是刚进部门的菜鸟,而同事经验值够了,升级了,风水轮流转,一代菜鸟换菜鸟。

甚至,你的公司所承接的专案,必须接手或是整合客户前一个厂商所遗留下来的系统,你们手上只有那套系统的原始码(运气好时,还有数量不等的文件)。

诸如此类的故事,其实时常在程式人身边或身上持续上演着。

许多程式人都将接手他人的程式码,当做一件悲惨的事情。

RIDE源码阅读方法

RIDE源码阅读方法
同理,3次点击的第二次点击数据结构如下:
如上,红色部分,表名用户点击的是测试用例节点。
同理,3次点击的第3次点击数据结构如下:
如上,红色圈标记的是用户点击了用户关键字的节点。
步骤
深入研究步骤1是关键数据结构,下一步是关键函数。这里主要关心用户点击3种tree节点,GUI自动发生了一些变化,这些变化对应的源码在哪,以及触发原理是怎样的。
【关键词】
阅读源码
一、问题的提出
如何有效的阅读较大型项目源码?
二、解决思路
通过记录一次活动来具体阐述。本文的主题是分析“研发软件自动化测试平台”的GUI的一次点击tree事件,看看源码是怎么样风云变幻、暗潮涌动的。
三、实践情况
点击
我们点击了3次按钮事件,“研发软件自动化测试平台”的GUI发生了如下的变化:
3、确信自己理解所有Байду номын сангаас需的结构
如果碰到不熟悉的结构,你下一步就走不远,你应当深入查看,花一点时间来阅读代码。
4、深入研究
逐行查看函数或类。
5、测试代码
验证你理解代码了。比较奇特的代码,提取为单独的程序消化、吸收。
步骤
由于我们是测试平台科,自动化软件开发工程师,我们的工程从svn上下载下来,库的依赖、path路径全部自动获取(自动部署),所以一键就可以运行代码。此过程简单。
我们知道单击tree节点,GUI自动发生了一些变化,对应代码的函数是publish。
我们跟踪publish到这里,listener。跟进listener,我们找到GUI自动改变的第一个部分:_set_label
如上,再次跟进listener函数,我们发现了GUI自动改变的其它部分:编辑框自动发生切换。
如下,附上观察者模式的简介:

Linux源代码阅读方法

Linux源代码阅读方法

最后,我还想说的是,如果你有时间的话,可以阅读一下近期的内核版本中的相应的文件,看看有什么变化,这样会加深对linux内核的理解!
然后,我们就可以开始我们的阅读源代码的激动人心的时刻了!但是应该注意的是,我们阅读源代码应该有一个固定的顺序。而不应该翻到那儿看到那儿!一般按照书上的顺序就可以了。但是很不幸,好像每本书的顺序都是不一样的!这样我们就应该按照我们自己的具体情况来选择一种。我的建议是:如果你的数据结构学的很好的话,你就先读那些内核数据结构,例如进程控制块等等。但是,如果很不幸数据结构学的不怎么样,甚至根本就是不怎么地,那么就以引导程序开始阅读,以系统的引导为主线一直读下去。读boot文件夹里的文件,应该注意的是,你应该有一定的汇编语言的知识,不然你很难能真正理解里面的内容。我读这儿的时候就专门补习的汇编语言的知识。然后是init里面的 main.c文件,这儿是一个汇聚点。这个文件就好像一栋大楼的大厅,我们要从这儿走到这栋楼的个个部分。我们下一步就是按照main中的顺序来阅读整个 linux内核的个个部分,这些部分包括了linux源代码的绝大部分内容。我就是按照后者来阅读的,因为我的数据结构基本上就是白板。很不幸,直到现在我还没有完全阅读完linux内核早期版本的源代码。也就是说,我对于linux内核源代码的阅读方法的经验就只有这些了。
接下来,我并没有直接去仔细的去研究这两本书,而是先花了一段时间通读了一遍。这样做的目的就是对linux有一个整体的认识。我在这一步里,大体上了解了 linux源代码中大多数文件的作用。这样做会对以后的阅读有很大的帮助。如果这一步做不好,你在以后的阅读中会感觉到很大的困难,这种困难可能会使你丧失阅读下去的信心。因为,你会发现你根本不知道他在讲些什么,即使有书籍的帮助。
Linux源代码阅读方法 Linux的源代码是很庞大的,如果没有一个好的方法是很难能够有一个比较高的效率的。所以我首先要写的就是我在阅读linux源代码的时候所采用我找了几本分析linux源代码的书。有一本关于linux源代码分析的书是必须的,因为没有人能在第一次阅读linux源代码的时候能够很好的理解他,甚至有了书籍也不一定能很好的理解他。我找到了《linux源代码完全注释》和《linux源代码情景分析》。其中,《linux源代码完全注释》是一个对早期的linux内核源代码的分析,而《linux源代码情景分析》是对2。4版的内核源代码进行了分析。实际上很长一段时间我只是在看这两本书。

汇编语言文件的读写源代码

汇编语言文件的读写源代码

汇编语言文件的读写源代码一、概述汇编语言是一种低级语言,可以直接操作计算机的硬件资源。

在使用汇编语言编程时,文件的读写是非常常见的操作。

本文将介绍如何使用汇编语言进行文件的读写操作,并给出相应的源代码示例。

二、文件读取1. 打开文件在进行文件读取操作之前,首先需要打开待读取的文件。

以下是一个打开文件的汇编语言源代码示例:```assemblysection .datafilename db 'example.txt', 0mode db 'r', 0file dd 0section .textglobal _start_start:; 打开文件mov eax, 5mov ebx, filenamemov ecx, modeint 0x80mov [file], eax; ...```在上述示例中,首先定义了一个变量 `filename` 用于存储待读取文件的文件名,变量 `mode` 用于指定打开文件的模式。

然后使用系统调用 `int 0x80` 进行文件打开操作,并将返回的文件描述符保存在变量`file` 中。

2. 读取文件内容文件打开之后,就可以开始读取文件的内容了。

以下是一个读取文件内容的汇编语言源代码示例:```assemblysection .bssbuffer resb 1024section .text; ...; 读取文件内容mov eax, 3mov ebx, [file]mov ecx, buffermov edx, 1024int 0x80; ...```在上述示例中,定义了一个缓冲区变量 `buffer` 来存储读取的文件内容,并使用系统调用 `int 0x80` 进行文件读取操作。

读取的文件内容将被存储到缓冲区变量 `buffer` 中。

三、文件写入1. 创建文件在进行文件写入操作之前,有时需要先创建一个新的文件。

以下是一个创建文件的汇编语言源代码示例:```assemblysection .datafilename db 'output.txt', 0mode db 'w', 0file dd 0section .textglobal _start_start:; 创建文件mov eax, 8mov ebx, filenamemov ecx, modemov edx, 0777int 0x80mov [file], eax; ...```在上述示例中,首先定义了一个变量 `filename` 用于存储待创建文件的文件名,变量 `mode` 用于指定创建文件的模式。

idea阅读源码技巧

idea阅读源码技巧

idea阅读源码技巧
1、了解项目背景及设计架构
在学习阅读源代码之前,首先应该尽可能详细地了解整个项目的背景及设计架构。

例如,对于某个项目,其结构可能如下:数据层(存储模块)、业务层(服务模块)、表示层(运行界面)、用户接口层(API调用)等。

通过了解该项目的整体设计架构,可以帮助我们更快地定位和解决代码问题,也有助于更好地理解源码。

2、查看类与函数的详细信息
接下来,我们使用IDE(例如IntelliJ IDEA)在项目的理解和调试方面帮助,并仔细检查每个类和函数的详细信息:什么参数输入,什么参数输出?什么事件会被触发?当什么参数传入时,什么结果会产生?这些解决方案可以帮助我们轻松理解代码,记住小心细节!
3、熟悉代码框架
在了解了整个项目框架之后,需要了解项目中使用的代码框架。

例如,如果是面向对象编程语言,则可以了解类和接口的使用方法;如果是函数式编程语言,则可以深入掌握函数、流式编程等概念;如果是脚本语言,则可以深入了解语法规则、变量作用域等。

熟悉常用的代码框架可以帮助我们阅读源码时更快捕捉关键点。

4、利用注释和文档积累经验
在阅读代码时,要格外注意代码中出现的注释和文档,仅通过注释和文档就可以大致了解代码的功能和思路,并在遇到问题时积累经验,帮助自己解决问题。

5、精心设计模块
最后,在阅读完每个模块后,要尽可能精心设计模块,充分利用继承或接口的优势,使代码实现的功能更高效、更便捷地完成。

这样,既可以加快阅读源码的效率,又可以减少调试过程中的坑,在阅读源码时综合利用以上方法有助于加深各位理解源码的能力。

Source Insight:Linux源代码阅读的利器

Source Insight:Linux源代码阅读的利器

阅读源代码是钻研技术的最佳手段,而Linux提供了一个庞大的源代码库,但是,由于缺乏良好的源代码阅读工具,使得阅读Linux源代码尤其是内核源代码十分困难,在本文中,笔者向大家推荐一个优秀的源代码阅读工具,并介绍了它的使用方法。

作为一个开放源代码的操作系统,Linux附带的源代码库使得广大爱好者有了一个广泛学习、深入钻研的机会,特别是Linux内核的组织极为复杂,同时,又不能像windows平台的程序一样,可以使用集成开发环境通过察看变量和函数,甚至设置断点、单步运行、调试等手段来弄清楚整个程序的组织结构,使得Linux内核源代码的阅读变得尤为困难。

当然Linux下的vim和emacs编辑程序并不是没有提供变量、函数搜索,彩色显示程序语句等功能。

它们的功能是非常强大的。

比如,vim和emacs就各自内嵌了一个标记程序,分别叫做ctag和etag,通过配置这两个程序,也可以实现功能强大的函数变量搜索功能,但是由于其配置复杂,linux附带的有关资料也不是很详细,而且,即使建立好标记库,要实现代码彩色显示功能,仍然需要进一步的配置(在另一片文章,我将会讲述如何配置这些功能),同时,对于大多数爱好者来说,可能还不能熟练使用vim和emacs那些功能比较强大的命令和快捷键。

为了方便的学习Linux源程序,我们不妨回到我们熟悉的window环境下,也算是“师以长夷以制夷”吧。

但是在Window平台上,使用一些常见的集成开发环境,效果也不是很理想,比如难以将所有的文件加进去,查找速度缓慢,对于非Windows平台的函数不能彩色显示。

于是笔者通过在互联网上搜索,终于找到了一个强大的源代码编辑器,它的卓越性能使得学习Linux内核源代码的难度大大降低,这便是Source Insight3.0,它是一个Windows平台下的共享软件,可以从/上边下载30天试用版本。

也可以在/index.php?option=com_remository&Itemid=67&func=fileinfo&parent=folder&filecatid=3由于Source Insight是一个Windows平台的应用软件,所以首先要通过相应手段把Linux系统上的程序源代码弄到Windows平台下,这一点可以通过在linux平台上将/usr/src目录下的文件拷贝到Windows平台的分区上,或者从网上光盘直接拷贝文件到Windows平台的分区来实现。

如何通过阅读源代码来提升编程技能

如何通过阅读源代码来提升编程技能

如何通过阅读源代码来提升编程技能通过阅读源代码来提升编程技能源代码是程序编写的原始版本,它被翻译成可执行文件或二进制文件,从而实现不同软件和应用的功能。

阅读源代码是提高编程技能和理解代码的重要方法之一。

本文将介绍如何通过阅读源代码来提升编程技能的几个方面。

一、选择适合自己的项目及语言1.了解自己的编程水平和兴趣:选择适合自己水平和兴趣的项目,能更好地激发学习的动力。

2.选择常用的编程语言:例如Python,Java,C++等。

这些语言都有广泛的应用,并且有大量的优秀源代码可供学习。

二、充分了解项目的背景和功能1.查找项目的官方文档和相关资料:了解项目的背景和功能,帮助你对源代码的理解。

2.了解项目的架构和设计思想:阅读源代码前,先了解项目的整体结构和设计思想,有助于理解代码的组织和模块之间的关系。

三、从整体到细节逐步阅读源代码1.浏览整个项目的目录结构:先大致了解项目的目录结构和各个文件的作用,有助于了解代码的组织方式。

2.从主文件开始阅读:找到项目的主文件,从这里开始逐个追踪调用关系和函数实现。

3.关注核心功能和关键代码:在阅读源代码时,重点关注项目的核心功能和关键代码部分,深入理解其实现原理。

四、与他人交流与探讨1.参与开源社区或论坛:多与其他开发者交流,分享自己的阅读心得和问题,从中获得反馈和指导。

2.借鉴他人的优秀代码:在开源社区中,有很多优秀的开源项目和源代码可供学习。

通过阅读这些代码,借鉴其中的设计思想和优秀实践方式。

五、练习并输出自己的代码1.将所学应用到实践中:通过阅读源代码,将所学知识应用到自己的项目中,不断练习并提升编程能力。

2.输出自己的优秀源代码:通过编写高质量的源代码,并将其开源共享,从中获得反馈和改进,不断提高自己的编码能力。

六、利用工具和资源辅助阅读源代码1.使用调试器:通过调试器可以逐步跟踪代码执行过程,观察变量的值和函数的调用过程,帮助理解程序的执行流程。

2.使用代码注释和文档生成工具:通过添加注释和生成文档,提高自己代码的可读性,便于他人理解和维护。

如何快速阅读源代码

如何快速阅读源代码

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

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

3、在阅读程序的同时,最好能够把程序存入到cvs之类的版本控制器中去,在需要的时候可以对源代码做一些修改试验,因为动手修改是比仅仅是阅读要好得多的读程序的方法。

在你修改运行程序的时候,可以从cvs中把原来的代码调出来与你改动的部分进行比较(diff命令), 可以看出一些源代码的优缺点并且能够实际的练习自己的编程技术。

4、从makefile文件入手,分析源代码的层次结构,找出哪个是主程序,哪些是函数包。

这对于快速把握程序结构有很大帮助。

5、分析函数包(针对C程序),要注意哪些是全局函数,哪些是内部使用的函数,注意extern关键字。

对于变量,也需要同样注意。

先分析清楚内部函数,再来分析外部函数,因为内部函数肯定是在外部函数中被调用的。

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

7、从main函数入手,一步一步往下阅读,遇到可以猜测出意思来的简单的函数,可以跳过。

但是一定要注意程序中使用的全局变量(如果是C程序),可以把关键的数据结构说明拷贝到一个文本编辑器中以便随时查找。

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

如何在Eclipse下查看JDK源代码以及java源代码阅读方法(转载)

如何在Eclipse下查看JDK源代码以及java源代码阅读方法(转载)

如何在Eclipse下查看JDK源代码以及java源代码阅读⽅法(转载)不会看JDK源代码,相当于没学过Java。

⽹上不容易找到⼀篇帮助我解决了如何在Eclipse下查看JDK源代码的⽂章。

核⼼提⽰:在Eclipse中查看JDK类库的源代码设置: 1.点 window- Preferences - Java - Installed JRES 2.此时Installed JRES右边是列表窗格,列出了系统中的 JRE 环境,选择你的JRE,然后点边上的 Edit...,会出现⼀个窗⼝(Edit JRE) 3.选中rt.jar⽂件的这⼀项在Eclipse中查看JDK类库的源代码设置:1.点 “window”-> "Preferences" -> "" -> "Installed JRES"2.此时"Installed JRES"右边是列表窗格,列出了系统中的 JRE 环境,选择你的JRE,然后点边上的 "Edit...",会出现⼀个窗⼝(Edit JRE)3.选中rt.jar⽂件的这⼀项:“c:\program files\java\jre_1.5.0_06\lib\rt.jar”点左边的“+” 号展开它,4.展开后,可以看到“Source Attachment:(none)”,点这⼀项,点右边的按钮“Source Attachment...”, 选择你的JDK⽬录下的 “src.zip”⽂件5.⼀路点"ok",结束。

dt.jar是关于运⾏环境的类库,主要是swing的包tools.jar是关于⼀些⼯具的类库rt.jar包含了jdk的基础类库,也就是你在doc⾥⾯看到的所有的类的class⽂件使⽤:可以在 Java 源代码编辑器或代码⽚段编辑窗中选择类型、⽅法或字段的名称,然后对元素的定义打开编辑器。

FatFS源代码阅读分析

FatFS源代码阅读分析

一、概述1、目的在移植之前,先将源代码大概的阅读一遍,主要是了解文件系统的结构、各个函数的功能和接口、与移植相关的代码等等。

2、准备工作在官方网站下载了0.07c版本的源代码,利用记事本进行阅读。

二、源代码的结构1、源代码组成源代码压缩包解压后,共两个文件夹,doc是说明,src里就是代码。

src文件夹里共五个文件和一个文件夹。

文件夹是option,还有00readme.txt、diskio.c、diskio.h、ff.c、ff.h、int eger.h。

对比网上的文章,版本已经不同了,已经没有所谓的tff.c和tff.h了,估计现在都采用条件编译解决这个问题了,当然文件更少,可能编译选项可能越复杂。

2、00readme.txt的说明Low level disk I/O module is not included in this archive because the FatFsmodule is only a generic file system layer and not depend on any spe cificstorage device. You have to provide a low level disk I/O module that writtento control your storage device.主要是说不包含底层IO代码,这是个通用文件系统可以在各种介质上使用。

我们移植时针对具体存储设备提供底层代码。

接下来做了版权声明-可以自由使用和传播。

然后对版本的变迁做了说明。

3、源代码阅读次序先读integer.h,了解所用的数据类型,然后是ff.h,了解文件系统所用的数据结构和各种函数声明,然后是diskio.h,了解与介质相关的数据结构和操作函数。

再把ff.c和diskio.c两个文件所实现的函数大致扫描一遍。

最后根据用户应用层程序调用函数的次序仔细阅读相关代码。

怎样读Linux内核源代码

怎样读Linux内核源代码

Linux内核分析方法2010-9-12Linux的最大的好处之一就是它的源码公开。

同时,公开的核心源码也吸引着无数的电脑爱好者和程序员;他们把解读和分析Linux的核心源码作为自己的最大兴趣,把修改Linux 源码和改造Linux系统作为自己对计算机技术追求的最大目标。

Linux内核源码是很具吸引力的,特别是当你弄懂了一个分析了好久都没搞懂的问题;或者是被你修改过了的内核,顺利通过编译,一切运行正常的时候。

那种成就感真是油然而生!而且,对内核的分析,除了出自对技术的狂热追求之外,这种令人生畏的劳动所带来的回报也是非常令人着迷的,这也正是它拥有众多追随者的主要原因:•首先,你可以从中学到很多的计算机的底层知识,如后面将讲到的系统的引导和硬件提供的中断机制等;其它,象虚拟存储的实现机制,多任务机制,系统保护机制等等,这些都是非都源码不能体会的。

等等,这些都是非读源码不能体会的。

•同时,你还将从操作系统的整体结构中,体会整体设计在软件设计中的份量和作用,以及一些宏观设计的方法和技巧:Linux的内核为上层应用提供一个与具体硬件不相关的平台;同时在内核内部,它又把代码分为与体系结构和硬件相关的部分,和可移植的部分;再例如,Linux虽然不是微内核的,但他把大部分的设备驱动处理成相对独立的内核模块,这样减小了内核运行的开销,增强了内核代码的模块独立性。

•而且你还能从对内核源码的分析中,体会到它在解决某个具体细节问题时,方法的巧妙:如后面将分析到了的Linux通过Botoom_half机制来加快系统对中断的处理。

•最重要的是:在源码的分析过程中,你将会被一点一点地、潜移默化地专业化。

一个专业的程序员,总是把代码的清晰性,兼容性,可移植性放在很重要的位置。

他们总是通过定义大量的宏,来增强代码的清晰度和可读性,而又不增加编译后的代码长度和代码的运行效率;他们总是在编码的同时,就考虑到了以后的代码维护和升级。

甚至,只要分析百分之一的代码后,你就会深刻地体会到,什么样的代码才是一个专业的程序员写的,什么样的代码是一个业余爱好者写的。

如何查看 linux 内核源代码

如何查看 linux 内核源代码

arch 这个子目录包含了此核心源代码所支持的硬件体系结构相关的核心代码。如对于X86平台就是i386。
include 这个目录包括了核心的大多数include文件。另外对于每种支持的体系结构分别有一个子目录。
init 此目录包含核心启动代码。
mm 此目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下,如对应于X86的就是arch/i386/mm/fault.c 。
kernel 主要核心代码。同时与处理器结构相关代码都放在arch/*/kernel目录下。
net 核心的网络部分代码。里面的每个子目录对应于网络的一个方面。
lib 此目录包含了核心的库代码。与处理器结构相关库代码被放在arch/*/lib/目录下。
scripts此目录包含用于配置核心的脚本文件。
Documentation 此目录是一些文档,起参考作用。
俗话说:“工欲善其事,必先利其器”。 阅读象Linux核心代码这样的复杂程序令人望而生畏。它象一个越滚越大的雪球,阅读核心某个部分经常要用到好几个其他的相关文件,不久你将会忘记你原来在干什么。所以没有一个好的工具是不行的。由于大部分爱好者对于Window平台比较熟悉,并且还是常用Window系列平台,所以在此我介绍一个Window下的一个工具软件:Source Insight。这是一个有30天免费期的软件,可以从下载。安装非常简单,和别的安装一样,双击安装文件名,然后按提示进行就可以了。安装完成后,就可启动该程序。这个软件使用起来非常简单,是一个阅读源代码的好工具。它的使用简单介绍如下:先选择Project菜单下的new,新建一个工程,输入工程名,接着要求你把欲读的源代码加入(可以整个目录加)后,该软件就分析你所加的源代码。分析完后,就可以进行阅读了。对于打开的阅读文件,如果想看某一变量的定义,先把光标定位于该变量,然后点击工具条上的相应选项,该变量的定义就显示出来。对于函数的定义与实现也可以同样操作。别的功能在这里就不说了,有兴趣的朋友可以装一个Source Insight,那样你阅读源代码的效率会有很大提高的。怎么样,试试吧!

查看源代码快捷键

查看源代码快捷键

查看源代码快捷键引言:在编程和网页开发过程中,查看源代码是一个常见的需求。

查看源代码可以帮助开发者了解网页的结构和布局,发现隐藏的功能以及学习其他的编程技巧。

然而,在大多数情况下,我们必须使用鼠标右键点击网页然后选择“查看源代码”来实现这一目标。

但是,许多开发者并不知道还有更快捷的方法来查看网页的源代码。

在本文中,我们将介绍一些常用的快捷键来帮助您快速查看网页的源代码。

快捷键是一种在键盘上的组合键,用于执行特定的功能或操作。

使用快捷键可以大大提高工作效率,减少不必要的鼠标操作。

查看源代码快捷键是一些被广泛接受和应用的快捷键组合,可以在不离开当前页面的情况下快速查看源代码。

一、常见的查看源代码快捷键1. Windows 系统快捷键在 Windows 系统中,常用的查看源代码快捷键是使用 Ctrl+U 组合键。

要查看当前网页的源代码,在打开的网页上按住 Ctrl 键,然后按 U 键。

这将立即打开网页的源代码,供您分析和学习。

2. macOS 系统快捷键在 macOS 系统中,可以使用 Command+Option+U 组合键快速查看源代码。

打开网页后,按住 Command 和 Option 键,然后按U 键即可打开源代码。

二、使用浏览器的开发者工具除了快捷键之外,现代浏览器通常提供了一种更强大的工具来查看和分析网页的源代码,即开发者工具。

几乎所有的主流浏览器,包括谷歌浏览器、火狐浏览器、Safari 等,都有内置的开发者工具。

要打开开发者工具,您只需要按下 F12 键。

一旦开发者工具打开,您可以在其中找到“Elements”(元素)或类似的选项卡,里面包含了网页的 HTML 结构和 CSS 样式。

您可以轻松地在开发者工具中导航和查看网页的源代码。

此外,开发者工具还提供了许多其他有用的功能,例如网络监控、调试器和性能分析工具等,这些工具可以帮助开发者更好地分析和优化网页。

三、通过命令行查看源代码对于一些高级用户和开发者来说,可以通过命令行实现快速查看网页源代码的目的。

如何阅读和理解他人的代码

如何阅读和理解他人的代码

如何阅读和理解他人的代码代码是计算机程序的基础,也是开发者之间交流和合作的重要方式。

然而,阅读和理解他人的代码并不容易。

不同的开发者有不同的编码风格和思维方式,理解他们的代码需要一定的技巧和经验。

本文将介绍一些有效的方法,帮助读者更好地阅读和理解他人的代码。

1. 注重代码结构和命名规范在阅读代码之前,首先要注意代码的结构和命名规范。

一个良好的代码结构能够使代码更易于理解和阅读。

因此,在阅读代码之前,可以先浏览代码的目录结构,查看代码组织是否清晰。

此外,代码中的命名规范也是关键。

开发者应该使用有意义的变量名、函数名和类名,以提高代码的可读性。

读者可以根据命名规范来推测代码的功能和作用,从而更好地理解代码。

2. 弄清上下文和功能在阅读代码时,要先弄清楚代码的上下文和功能。

可以阅读代码所在的文件和目录,查找相关的注释或文档,了解代码所在的项目和模块。

此外,还可以查看代码的版本控制记录,了解代码的修改历史和背景信息。

通过这些方式,读者可以更好地理解代码所处的环境和功能。

3. 逐步调试和运行代码阅读他人的代码时,可以尝试逐步调试和运行代码。

通过运行代码,可以观察代码的输出和行为,验证代码的正确性。

此外,借助调试器等工具,可以逐步跟踪代码的执行过程,了解代码的逻辑和控制流程。

通过调试和运行代码,读者可以更直观地理解代码的具体实现方式和运行机制。

4. 注重代码的注释和文档在阅读代码时,注释和文档是宝贵的资源。

好的注释可以解释代码的关键逻辑、算法和设计思路,帮助读者理解代码的含义和目的。

因此,在阅读代码时,要注意查找和阅读注释。

此外,如果有文档或说明文件,也应该仔细阅读。

文档可以提供代码的使用方法和注意事项,指导读者更好地理解和利用代码。

5. 利用工具和资源为了更好地阅读和理解他人的代码,可以利用各种工具和资源。

例如,代码编辑器可以提供代码高亮、自动补全等功能,提高代码的可读性。

代码分析工具可以帮助检测代码中的潜在错误和问题。

golang 源码阅读技巧

golang 源码阅读技巧

golang 源码阅读技巧
阅读 Golang 源码是提高自己编程能力和理解 Golang 语言设
计的重要途径。

以下是一些阅读 Golang 源码的技巧:
1. 深入理解 Golang 的设计哲学,Golang 的设计注重简洁、
清晰和高效,阅读源码前先了解其设计哲学有助于更好地理解源码。

2. 从入口开始,从 main 函数开始,追踪程序的执行流程,了
解整个程序的启动过程。

3. 关注核心模块,关注 Golang 的核心模块,比如运行时、调
度器、垃圾回收器等,这些模块是 Golang 语言运行的基础。

4. 阅读注释和文档,Golang 的源码注释和文档非常详尽,阅
读注释和文档可以帮助理解代码的意图和实现细节。

5. 调试和测试,通过调试和测试 Golang 源码,可以更好地理解源码的执行过程和内部逻辑。

6. 参与社区讨论,加入 Golang 社区,参与讨论和交流,可以
从其他开发者的经验中学习到更多关于阅读 Golang 源码的技巧和经验。

希望以上技巧能帮助您更好地阅读和理解 Golang 的源码。

祝您阅读愉快!。

pyd源代码的提取方法

pyd源代码的提取方法

pyd源代码的提取方法本文将介绍如何从PYD源代码中提取数据。

PYD是Python扩展模块的一种格式,通常用于将C或C++代码集成到Python中。

提取PYD源代码中的数据可能涉及到从源代码文件中读取数据、解析数据和编写代码以提取数据的过程。

第一步:了解PYD源代码的结构PYD源代码通常包含C或C++代码,用于定义Python扩展模块的功能。

了解PYD源代码的结构非常重要,以便能够知道数据存储在哪里以及如何提取它。

第二步:读取PYD源代码文件首先,我们需要将PYD源代码文件加载到内存中以方便处理。

可以使用Python的内置文件操作功能或第三方库来完成此任务。

下面是一个使用内置功能的例子:pythonwith open('source_code.pyd') as file:code = file.read()在这个例子中,我们使用了`open`函数来打开PYD源代码文件,然后使用`read`方法将文件的内容读取到`code`变量中。

第三步:解析PYD源代码接下来,我们需要解析PYD源代码以找到我们想要提取的数据。

由于PYD 源代码的结构复杂且多样化,我们可能需要使用正则表达式或其他文本处理技术来解析代码。

例如,假设我们要提取PYD源代码中的所有函数名。

我们可以使用正则表达式来匹配函数定义语句,并提取函数名。

下面是一个使用正则表达式的例子:pythonimport repattern = r'def (\w+)\('functions = re.findall(pattern, code)在这个例子中,我们使用了正则表达式`def (\w+)\(`来匹配函数定义语句,并通过`findall`函数找到所有匹配项。

提取的函数名将存储在`functions`列表中。

第四步:编写代码以提取数据最后,我们需要编写代码以提取我们想要的数据。

这将取决于我们要提取的具体数据类型和其在PYD源代码中的表示方式。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如何阅读源代码--转自CSDN_oncoding+++++++++++第一章: 导论++++++++++++1.要养成一个习惯, 经常花时间阅读别人编写的高品质代码.2.要有选择地阅读代码, 同时, 还要有自己的目标. 您是想学习新的模式|编码风格|还是满足某些需求的方法.3.要注意并重视代码中特殊的非功能性需求, 这些需求也许会导致特殊的实现风格.4.在现有的代码上工作时, 请与作者和维护人员进行必要的协调, 以避免重复劳动或产生厌恶情绪.5.请将从开放源码软件中得到的益处看作是一项贷款, 尽可能地寻找各种方式来回报开放源码社团.6.多数情况下, 如果您想要了解"别人会如何完成这个功能呢?", 除了阅读代码以外, 没有更好的方法.7.在寻找bug时, 请从问题的表现形式到问题的根源来分析代码. 不要沿着不相关的路径(误入歧途).8.我们要充分利用调试器|编译器给出的警告或输出的符号代码|系统调用跟踪器|数据库结构化查询语言的日志机制|包转储工具和Windows的消息侦查程序, 定出的bug的位置.9.对于那些大型且组织良好的系统, 您只需要最低限度地了解它的全部功能, 就能够对它做出修改.10.当向系统中增加新功能时, 首先的任务就是找到实现类似特性的代码, 将它作为待实现功能的模板.11.从特性的功能描述到代码的实现, 可以按照字符串消息, 或使用关键词来搜索代码.12.在移植代码或修改接口时, 您可以通过编译器直接定位出问题涉及的范围, 从而减少代码阅读的工作量.13.进行重构时, 您从一个能够正常工作的系统开始做起, 希望确保结束时系统能够正常工作. 一套恰当的测试用例(test case)可以帮助您满足此项约束.14.阅读代码寻找重构机会时, 先从系统的构架开始, 然后逐步细化, 能够获得最大的效益.15.代码的可重用性是一个很诱人, 但难以理解与分离, 可以试着寻找粒度更大一些的包, 甚至其他代码.16.在复查软件系统时, 要注意, 系统是由很多部分组成的, 不仅仅只是执行语句. 还要注意分析以下内容: 文件和目录结构|生成和配置过程|用户界面和系统的文档.18.可以将软件复查作为一个学习|讲授|援之以手和接受帮助的机会.++++++++++++++++++++第二章: 基本编程元素++++++++++++++++++++19.第一次分析一个程序时, main是一个好的起始点.20.层叠if-else if-...-else序列可以看作是由互斥选择项组成的选择结构.21.有时, 要想了解程序在某一方面的功能, 运行它可能比阅读源代码更为恰当.22.在分析重要的程序时, 最好首先识别出重要的组成部分.23.了解局部的命名约定, 利用它们来猜测变量和函数的功能用途.24.当基于猜测修改代码时, 您应该设计能够验证最初假设的过程. 这个过程可能包括用编译器进行检查|引入断言|或者执行适当的测试用例.25.理解了代码的某一部分, 可能帮助你理解余下的代码.26.解决困难的代码要从容易的部分入手.27.要养成遇到库元素就去阅读相关文档的习惯; 这将会增强您阅读和编写代码的能力.28.代码阅读有许多可选择的策略: 自底向上和自顶向下的分析|应用试探法和检查注释和外部文档, 应该依据问题的需要尝试所有这些方法.29.for (i=0; i30.涉及两项不等测试(其中一项包括相等条件)的比较表达式可以看作是区间成员测试.31.我们经常可以将表达式应用在样本数据上, 借以了解它的含义.32.使用De Morgan法则简化复杂的逻辑表达式.33.在阅读逻辑乘表达式时, 问题可以认为正在分析的表达式以左的表达式均为true; 在阅读逻辑和表达式时, 类似地, 可以认为正在分析的表达式以左的表达式均为false.34.重新组织您控制的代码, 使之更为易读.35.将使用条件运行符? :的表达式理解为if代码.36.不需要为了效率, 牺牲代码的易读性.37.高效的算法和特殊的优化确实有可能使得代码更为复杂, 从而更难理解, 但这并不意味着使代码更为紧凑和不易读会提高它的效率.38.创造性的代码布局可以用来提高代码的易读性.39.我们可以使用空格|临时变量和括号提高表达式的易读性.40.在阅读您所控制的代码时, 要养成添加注释的习惯.41.我们可以用好的缩进以及对变量名称的明智选择, 提高编写欠佳的程序的易读性.42.用diff程序分析程序的修订历史时, 如果这段历史跨越了整体重新缩排, 常常可以通过指定-w选项, 让diff忽略空白差异, 避免由于更改了缩进层次而引入的噪音.43.do循环的循环体至少执行一次.44.执行算术运算时, 当b=2n-1时, 可以将a&b理解为a%(b+1).45.将a<<n理解为a*k, k=2n.46.将a>>n理解为a/k, k=2n.47.每次只分析一个控制结构, 将它的内容看作是一个黑盒.48.将每个控制结构的控制表达式看作是它所包含代码的断言.49.return, goto, break和continue语句, 还有异常, 都会影响结构化的执行流程. 由于这些语句一般都会终止或重新开始正在进行的循环,因此要单独推理它们的行为.50.用复杂循环的变式和不变式, 对循环进行推理.51.使用保持含义不变的变换重新安排代码, 简化代码的推理工作.+++++++++++++++++++第三章: 高级C数据类型+++++++++++++++++++52.了解特定语言构造所服务的功能之后, 就能够更好地理解使用它们的代码.53.识别并归类使用指针的理由.54.在C程序中, 指针一般用来构造链式数据结构|动态分配的数据结构|实现引用调用|访问和迭代数据元素|传递数组参数|引用函数|作为其他值的别名|代表字符串|以及直接访问系统内存.55.以引用传递的参数可以用来返回函数的结果, 或者避免参数复制带来的开销.56.指向数组元素地址的指针, 可以访问位于特定索引位置的元素.57.指向数组元素的指针和相应的数组索引, 作用在二者上的运算具有相同的语义.58.使用全局或static局部变量的函数大多数情况都不可重入(reentrant).59.字符指针不同于字符数组.60.识别和归类应用结构或共用体的每种理由.61.C语言中的结构将多个数据元素集合在一起, 使得它们可以作为一个整体来使用, 用来从函数中返回多个数据元素|构造链式数据结构|映射数据在硬件设备|网络链接和存储介质上的组织方式|实现抽象数据类型|以及以面向对象的方式编程.62.共用体在C程序中主要用于优化存储空间的利用|实现多态|以及访问数据不同的内部表达方式.63.一个指针, 在初始化为指向N个元素的存储空间之后, 就可以作为N个元素的数组来使用.64.动态分配的内在块可以电焊工地释放, 或在程序结束时释放, 或由垃圾回收器来完成回收; 在栈上分配的内存块当分配它的函数退出后释放.65.C程序使用typedef声明促进抽象, 并增强代码的易读性, 从而防范可移植性问题, 并模拟C++和Java的类声明行为.66.可以将typedef声明理解成变量定义: 变量的名称就是类型的名称; 变量的类型就是与该名称对应的类型.+++++++++++++++第四章: C数据结构+++++++++++++++67.根据底层的抽象数据类型理解显式的数据结构操作.68.C语言中, 一般使用内建的数组类型实现向量, 不再对底层实现进行抽象.69.N个元素的数组可以被序列for (i=0; i70.表达式sizeof(x)总会得到用memset或memcpy处理数组x(不是指针)所需的正确字节数.71.区间一般用区间内的第一个元素和区间后的第一个元素来表示.72.不对称区间中元素的数目等于高位边界与低位边界的差.73.当不对称区间的高位边界等于低位边界时, 区间为空.74.不对称区间中的低位边界代表区间的第一个元素; 高位边界代表区间外的第一个元素.75.结构的数组常常表示由记录和字段组成的表.76.指向结构的指针常常表示访问底层记录和字段的游标.77.动态分配的矩阵一般存储为指向数组列的指针或指向元素指针的指针; 这两种类型都可以按照二维数组进行访问.78.以数组形式存储的动态分配矩阵, 用自定义访问函数定位它们的元素.79.抽象数据类型为底层实现元素的使用(或误用)方式提供一种信心的量度.80.数组用从0开始的顺序整数为键, 组织查找表.81.数组经常用来对控制结构进行高效编码, 简化程序的逻辑.82.通过在数组中每个位置存储一个数据元素和一个函数指针(指向处理数据元素的函数), 可以将代码与数据关联起来.83.数组可以通过存储供程序内的抽象机(abstract machine)或虚拟机(virtual machine)使用的数据或代码, 控制程序的运作.84.可以将表达式sizeof(x) / sizeof(x[0])理解为数组x中元素的个数.85.如果结构中含有指向结构自身|名为next的元素, 一般说来, 该结构定义的是单向链表的结点.86.指向链表结点的持久性(如全局|静态或在堆上分配)指针常常表示链表的头部.87.包含指向自身的next和prev指针的结构可能是双向链表的结点.88.理解复杂数据结构的指针操作可以将数据元素画为方框|指针画为箭头.89.递归数据结构经常用递归算法来处理.90.重要的数据结构操作算法一般用函数参数或模板参数来参数化.91.图的结点常常顺序地存储在数组中, 链接到链表中, 或通过图的边链接起来.92.图中的边一般不是隐式地通过指针, 就是显式地作为独立的结构来表示.93.图的边经常存储为动态分配的数组或链表, 在这两种情况下, 边都锚定在图的结点上.94.在无向图中, 表达数据时应该将所有的结点看作是等同的, 类似地, 进行处理任务的代码也不应该基于它们的方向来区分边.95.在非连通图中, 执行遍历代码应该能够接通孤立的子图.96.处理包含回路的图时, 遍历代码应该避免在处理图的回路进入循环.97.复杂的图结构中, 可能隐藏着其他类型的独立结构.+++++++++++++++++第五章: 高级控制流程+++++++++++++++++98.采用递归定义的算法和数据结构经常用递归的函数定义来实现.99.推理递归函数时, 要从基准落伍测试开始, 并认证每次递归调用如何逐渐接近非递归基准范例代码.100.简单的语言常常使用一系列遵循该语言语法结构的函数进行语法分析. 101.推理互递归函数时, 要基于底层概念的递归定义.102.尾递归调用等同于一个回到函数开始处的循环.103.将throws子句从方法的定义中移除, 然后运行Java编译器对类的源代码进行编译, 就可以容易地找到那些可能隐式地生成异常的方法.104.在多处理器计算机上运行的代码常常围绕进程或线程进行组织.105.工作群并行模型用于在多个处理器间分配工作, 或者创建一个任务池, 然后将大量需要处理标准化的工作进行分配.106.基于线程的管理者/工人并行模型一般将耗时的或阻塞的操作分配给工人子任务, 从而维护中心任务的响应性.107.基于进程的管理者/工人并行模型一般用来重用现有的程序, 或用定义良好的接口组织和分离粗粒度的系统模块.108.基于流水线的并行处理中, 每个任务都接收到一些输入, 对它们进行一些处理, 并将生成的输出传递给下一个任务, 进行不同的处理.109.竞争条件很难捉摸, 相关的代码常常会将竞争条件扩散到多个函数或模块; 因而, 很难隔离由于竞争条件导致的问题.110.对于出现在信号处理器中的数据结构操作代码和库调用要保持高度警惕. 111.在阅读包含宏的代码时, 要注意, 宏既非函数, 也非语句.112.do…while(0)块中的宏等同于控制块中的语句.113.宏可以访问在它的使用点可见的所有局部变量.114.宏调用可改变参数的值115.基于宏的标记拼接能够创建新的标记符.+++++++++++++++++第六章: 应对大型项目+++++++++++++++++116.我们可以通过浏览项目的源代码树—包含项目源代码的层次目录结构, 来分析一个项目的组织方式. 源码树常常能够反映出项目在构架和软件过程上的结构.117.应用程序的源代码树经常是该应用程序的部署结构的镜像.118.不要被庞大的源代码集合吓倒; 它们一般比小型的专门项目组织得更出色.119.当您首次接触一个大型项目时, 要花一些时间来熟悉项目的目录树结构.120.项目的源代码远不只是编译后可以获得可执行程序的计算机语言指令; 一个项目的源码树一般还包括规格说明|最终用户和开发人员文档|测试脚本|多媒体资源|编译工具|例子|本地化文件|修订历史|安装过程和许可信息.121.大型项目的编译过程一般声明性地借助依赖关系来说明. 依赖关系由工具程序, 如make及其派生程序, 转换成具体的编译行动.122.大型项目中, 制作文件常常由配置步骤动态地生成; 在分析制作文件之前, 需要先执行项目特定的配置.123.检查大型编译过程的各个步骤时, 可以使用make程序的-n开关进行预演.124.修订控制系统提供从储存库中获取源代码最新版本的方式.125.可以使用相关的命令, 显示可执行文件中的修订标识关键字, 从而将可执行文件与它的源代码匹配起来.126.使用修订日志中出现的bug跟踪系统内的编号, 可以在bug跟踪系统的数据库中找到有关的问题的说明.127.可以使用修订控制系统的版本储存库, 找出特定的变更是如何实现的.128.定制编译工具用在软件开发过程的许多方面, 包括配置|编译过程管理|代码的生成|测试和文档编制.129.程序的调试输出可以帮助我们理解程序控制流程和数据元素的关键部分.130.跟踪语句所在的地点一般也是算法运行的重要部分.131.可以用断言来检验算法运作的步骤|函数接收的参数|程序的控制流程|底层硬件的属性和测试用例的结果.132.可以使用对算法进行检验的断言来证实您对算法运作的理解, 或将它作为推理的起点.133.对函数参数和结果的断言经常记录了函数的前置条件和后置条件.134.我们可以将测试整个函数的断言作为每个给定函数的规格说明.135.测试用例可以部分地代替函数规格说明.136.可以使用测试用例的输入数据对源代码序列进行预演.+++++++++++++++++++第七章: 编码规范和约定+++++++++++++++++++137.了解了给定代码库所遵循的文件组织方式后, 就能更有效率地浏览它的源代码.138.阅读代码时, 首先要确保您的编辑器或优美打印程序的tab设置, 与代码遵循的风格规范一致.139.可以使用代码块的缩进, 快速地掌握代码的总体结构.140.对编排不一致的代码, 应该立即给予足够的警惕.141.分析代码时, 对标记为XXX, FIXME和TODO的代码序列要格外注意: 错误可能就潜伏在其中.142.常量使用大写字母命名, 单词用下划线分隔.143.在遵循Java编码规范的程序中, 包名(package name)总是从一个顶级的域名开始(例如, org, com), 类名和接口名由大写字母开始, 方法和变量名由小写字母开始.144.用户界面控件名称之前的匈牙利记法的前缀类型标记可以帮助我们确定它的作用.145.不同的编程规范对可移植构造的构成有不同的主张.146.在审查代码的可移植性, 或以某种给定的编码规范作为指南时, 要注意了解规范对可移植性需求的界定与限制.147.如果GUI功能都使用相应的编程结构来实现, 则通过代码审查可以轻易地验证给定用户界面的规格说明是否被正确地采用.148.了解项目编译过程的组织方式与自动化方式之后, 我们就能够快速地阅读与理解对应的编译规则.149.当检查系统的发布过程时, 常常可以将相应发行格式的需求作为基准.++++++++++++第八章:文档++++++++++++150.阅读代码时, 应该尽可能地利用任何能够得到的文档.151.阅读一小时代码所得到的信息只不过相当于阅读一分钟文档.152.使用系统的规格说明文档, 了解所阅读代码的运行环境.153.软件需求规格说明是阅读和评估代码的基准.154.可以将系统的设计规格说明作为认知代码结构的路线图, 阅读具体代码的指引.155.测试规格说明文档为我们提供可以用来对代码进行预演的数据.156.在接触一个未知系统时, 功能性的描述和用户指南可以提供重要的背景信息,从而更好地理解阅读的代码所处的上下文.157.从用户参考手册中, 我们可以快速地获取, 应用程序在外观与逻辑上的背景知识, 从管理员手册中可以得知代码的接口|文件格式和错误消息的详细信息. 158.利用文档可以快捷地获取系统的概况, 了解提供特定特性的代码.159.文档经常能够反映和提示出系统的底层结构.160.文档有助于理解复杂的算法和数据结构.161.算法的文字描述能够使不透明(晦涩, 难以理解)的代码变得可以理解. 162.文档常常能够阐明源代码中标识符的含义.163.文档能够提供非功能性需求背后的理论基础.164.文档还会说明内部编程接口.165.由于文档很少像实际的程序代码那样进行测试, 并受人关注, 所以它常常可能存在错误|不完整或过时.166.文档也提供测试用例, 以及实际应用的例子.167.文档常常还会包括已知的实现问题或bug.168.环境中已知的缺点一般都会记录在源代码中.169.文档的变更能够标出那些故障点.170.对同一段源代码重复或互相冲突的更改, 常常表示存在根本性的设计缺陷, 从而使得维护人员需要用一系列的修补程序来修复.171.相似的修复应用到源代码的不同部分, 常常表示一种易犯的错误或疏忽, 它们同样可能会在其他地方存在.172.文档常常会提供不恰当的信息, 误导我们对源代码的理解.173.要警惕那些未归档的特性: 将每个实例归类为合理|疏忽或有害, 相应地决定是否应该修复代码或文档.174.有时, 文档在描述系统时, 并非按照已完成的实现, 而是系统应该的样子或将来的实现.175.在源代码文档中, 单词gork的意思一般是指”理解”.176.如果未知的或特殊用法的单词阻碍了对代码的理解, 可以试着在文档的术语表(如果存在的话)|New Hacker’s Dictionary[Ray96]|或在Web搜索引擎中查找它们.177.总是要以批判的态度来看待文档, 注意非传统的来源, 比如注释|标准|出版物|测试用例|邮件列表|新闻组|修订日志|问题跟踪数据库|营销材料|源代码本身. 178.总是要以批判的态度来看待文档; 由于文档永远不会执行, 对文档的测试和正式复查也很少达到对代码的同样水平, 所以文档常常会误导读者, 或者完全错误.179.对于那些有缺陷的代码, 我们可以从中推断出它的真实意图.180.在阅读大型系统的文档时, 首先要熟悉文档的总体结构和约定.181.在对付体积庞大的文档时, 可以使用工具, 或将文本输出到高品质输出设备上, 比如激光打印机, 来提高阅读的效率.++++++++++++++第九章: 系统构架++++++++++++++182.一个系统可以(在重大的系统中也确实如此)同时出多种不同的构架类型. 以不同的方式检查同一系统|分析系统的不同部分|或使用不同级别的分解, 都有可能发现不同的构架类型.183.协同式的应用程序, 或者需要协同访问共享信息或资源的半自治进程, 一般会采用集中式储存库构架.184.黑板系统使用集中式的储存库, 存储非结构化的键/值对, 作为大量不同代码元件之间的通信集线器.185.当处理过程可以建模|设计和实现成一系列的数据变换时, 常常会使用数据流(或管道—过滤器)构架.186.在批量进行自动数据处理的环境中, 经常会采用数据流构架, 在对数据工具提供大量支持的平台上尤其如此.187.数据流构架的一个明显征兆是: 程序中使用临时文件或流水线(pipeline)在不同进程间进行通信.188.使用图示来建模面向对象构架中类的关系.189.可以将源代码输入到建模工具中, 逆向推导出系统的构架.190.拥有大量同级子系统的系统, 常常按照分层构架进行组织.191.分层构架一般通过堆叠拥有标准化接口的软件组件来实现.192.系统中每个层可以将下面的层看作抽象实体, 并且(只要该层满足它的需求说明)不关心上面的层如何使用它.193.层的接口既可以是支持特定概念的互补函数族, 也可以是一系列支持同一抽象接口不同底层实现的可互换函数.194.用C语言实现的系统, 常常用函数指针的数组, 表达层接口的多路复用操作.195.用面向对象的语言实现的系统, 使用虚方法调用直接表达对层接口的多嘴复用操作.196.系统可以使用不同的|独特的层次分解模型跨各种坐标轴进行组织.197.使用程序切片技术, 可以将程序中的数据和控制之间依赖关系集中到一起.198.在并发系统中, 一个单独的系统组件起到集中式管理器的作用, 负责启动|停止和协调其他系统进程和任务的执行.199.许多现实的系统都会博采众家之长. 当处理此类系统时, 不要徒劳地寻找无所不包的构架图; 应该将不同构架风格作为独立但相关的实体来进行定位|识别并了解.200.状态变迁图常常有助于理清状态机的动作.201.在处理大量的代码时, 了解将代码分解成单独单元的机制极为重要.202.大多数情况下, 模块的物理边界是单个文件|组织到一个目录中的多个文件或拥有统一前缀的文件的集合.203.C中的模块, 由提供模块公开接口的头文件和提供对应实现的源文件组成. 204.对象的构造函数经常用来分配与对象相关的资源, 并初始化对象的状态. 函数一般用来释放对象在生命期中占用的资源.205.对象方法经常使用类字段来存储控制所有方法运作的数据(比如查找表或字典)或维护类运作的状态信息(例如, 赋给每个对象一个标识符的计数器).206.在设计良好的类中, 所有的字段都应在声明为private, 并用公开的访问方法提供对它们的访问.207.在遇到friend声明时, 要停下来分析一下, 看看绕过类封装在设计上的理由. 208.可以有节制地用运算符增强特定类的可用性, 但用运算符重载, 将类实现为拥有内建算术类型相关的全部功能的类实体, 是不恰当的.209.泛型实现不是在编译期间通过宏替换或语言所支持的功能(比如C++模板和Ada的泛型包)来实现, 就是在运行期间通过使用数据元素的指针和函数的指针|或对象的多态性实现.210.抽象数据类型经常用来封装常用的数据组织方案(比如树|列表或栈), 或者对用户隐藏数据类型的实现细节.211.使用库的目的多种多样: 重用源代码或目标代码, 组织模块集合, 组织和优化编译过程, 或是用来实现应用程序各种特性的按需载入.212.大型的|分布式的系统经常实现为许多互相协作的进程.213.对于基于文本的数据储存库, 可以通过浏览存储在其中的数据, 破译出它的结构.。

相关文档
最新文档