使用说明
1.介绍
编译器是软件开发中的核心部件,其作用是其他任何软件所不能取代的。编译器在工作过程中,往往完成如下的任务:
- 读取源代码并且获得程序的结构描述
- 分析程序结构,并且生成相应的目标代码
- 将源代码文件分解为各种词汇(Lex)
- 找到这些词汇的组成方式(YACC)
编译器是软件开发中的核心部件,其作用是其他任何软件所不能取代的。编译器在工作过程中,往往完成如下的任务:
在程序开发中,如果说C/C++、汇编是程序的血肉的话,那么数据结构与算法可以说是程序的骨骼,正是不同的模块化的数据及其维护函数充当了整个程序内部整体的工作框架与协调基准。
在现代程序开发中,因为基本上每一个应用都非常复杂,我们不可能完全靠简单的语法拼凑完成各种功能,而需要首先需要面向对象用模型进行描述,也就是各种数据结构,然后根据模型抽象出对这些数据的宏观外部操作方法,让其他程序可以调用以完成所需要的任务,这就是算法。
我们可以想象,大型程序好比都是由许多个很大的箱子堆砌起来的,每一个箱子完成独立的功能,而箱子内部有着自己不为人知的运作机制,但是它对外总是能够魔术般的展示出它神秘的功能。
在下面笔者给出一个简单的面向类似磁盘文件系统管理的数据结构及其算法,虽然是非常原始的代码,但是实际上这是目前文件系统领域最前沿的B+树管理模式,下面我们贴出代码并进行介绍。
我们在第三章中介绍了一种通用Makefile的写法,但是那个Makefile仍然是最基础形式的,除了能按照需求完成简单的编译之外,不能自动的根据依赖关系更新目标文件。
在大多数 Linux 代码包中普遍采用了基于依赖关系的自动编译方法,当然依赖关系的具体实现方式也不同,有的采用 mkdepend 命令来实现,有的采用 gcc 的自动依赖生成来实现,在这里我们采用的是后者的方法。
同时,在使用上这个 Makefile 与第三章中所描述的没有太大的区别,唯一的区别就是多了一些代码,而这些代码不需要用户来进行维护。
为了尽量扩大这个Makefile的使用范围,笔者扩展了这个通用 Makefile 支持了更多的源代码格式:
所有的现代存储设备,都是靠物理效应来实现,反复的擦写某一块区域,会导致那一块区域的寿命严重下降。一般EEPROM只能反复烧写1000次,是最早期的可写存储,而用于优盘的,能反复烧写100,000次。实际上Flash ROM就是基于EEPROM增加寿命修改而来的,结构上非常类似。硬盘的数量则更高,一般上亿次左右,但是硬盘肯定也有寿命的。
我们经常删除文件,然后再创建文件,因为文件系统的分配方式必须是连续分配(磁头和碎片效率问题),这样同一个区域,一般在中部,被反复的写入、删除,再写入,导致这一块区域的寿命远低于其他区域,最终的结果就是因为局部寿命耗尽导致整个磁盘提前劳损。
磁头是连续的,如果分开存储,不连续的话,磁头得反复定位,导致磁盘效率下降,这就是碎片整理的目的。知道了这些基础之后,回到我们的话题,日志的目的,是什么呢?日志就是一张表,记录被管理的磁盘的每一个区块的写入次数,并且为分配模式提供参考,始终给新文件分配最少写入次数的区块。
之所以微软的文件系统没有日志概念,因为微软早在当初就申请了基于驱动的日志设计,在原始IO阶段就已经日志化了,因而上层的FS不需要日志。Linux之所以需要日志化文件系统,而不实现日志驱动,是因为为了避免侵权,但技术上走入了劣势,只能靠JFFS、EXT3这类的基于文件系统的日志系统提供保护。
日志,就是让你刚删掉的文件被保留,如果再创建文件,会分配整个磁盘写入最少的区域,往往是从未用过的硬盘区域。
然后再补充一下硬盘的工作原理,硬盘之所以有寿命,因为所有硬盘的盘面,都是铝做的,然后表面喷涂了一层矩磁性物质薄膜。去年的诺贝尔物理学奖获得者,就是研究矩磁性物质的。矩磁性物质,是指该物质的磁化曲线是矩形的,一旦超过某高斯磁场强度,区域就被磁化,从而记录下信息。要想到,磁化,就会有力的作用,大家见过墙上的油漆,拿橡皮锤砸几下没事,砸多了就掉皮,何况磁盘上喷涂的都是纳米级厚度的矩磁物质薄膜。所以磁盘物理损伤,拆看一看都是掉皮,都是因为写入过多导致。
在计算机技术发展的期初,并不存在处理器的概念,整个计算机都是由电子管组成的庞大的电路系统,处理功能、输入输出功能全部混杂在一起,形成简单的计算功能,速度也非常低。后来人们为了方便细致研究计算机系统的每一个部分,从功能上将计算机系统划分为了计算单元、输入输出接口、外接的附属设备系统。
计算机最开始的应用目的是完成科学家复杂的重复性计算,因而即使当今的计算机系统中最基本的处理单元也是基于会编码概念的机器码。期初,人们接口计算机、控制计算机的方式就是通过编写简单的汇编指令,由于计算机不能直接识别基于字符串形式存储的指令,因而将各种指令指派一个固定的十六进制数码,作为该指令的替代品用于计算单元来识别程序的含义。
随机数是数学上一个有趣的概念,它体现着宇宙的奥妙和不可预测,更体现着一种自由意志的存在,是有效的对命运论者的反证。在计算机上,我们经常需要一些随机数来模拟各种随机现象,然而计算机上真的存在随机数吗?
昨天在 www.cnbeta.com 新闻网上看到了期待已久的 Google 公司出品的 ChromeOS 操作系统,虽然到现在为止还没有亲自去编译以及用虚拟机模拟,不过出来的 Chrome OS 的功能与预料中的并没有太大的差异,里面主要的系统部件(或者说唯一的系统部件)是Chrome浏览器,然后其他一无所有,用户可以尽情的享用高效的上网速度、7秒钟的高速启动时间以外,并没有真正感觉到 Linux 系统的存在。
与网上随手便拿来的开源软件相比,商业软件的开发无论是品质定义,还是工作流程上都有着质的差别:
Doxygen 是 UNIX 上针对代码程序员提供的自动代码扫描与文档生成软件,下载地址为:
这个软件使得程序员仅仅需要添加很少的字符,就能自动生成高质量的代码文档,支持函数注释、类说明、代码交叉参考的生成等功能,额外的还可以提供 Latex 数学公式、DOT 图片的支持,当然,需要这些功能也需要安装对应的 Latex 和 Graphviz 软件包,它们的相应地址是:
Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com