作者:empty 页数:307 出版社:empty |
听上去有些荒谬,C语言的产生竟然源于一个失败的项日.1969年,通用电气、麻省理工学院和贝尔实验室联合创立了一个庞大的项目—Mu tics工程, 该项日的目的是创建一个操作系统,但显然遇到了麻烦:它不但无法交付原先所承诺的快速而便捷的在线系统,甚至连一点有用的东西都没有出来。虽然开发小组最终勉强让Multics开动起来, 但他们还是陷入了泥淖, 就像IBM在OS/360上面一样。他们试图建立一个非常巨人的操作系统, 能够应用于规模很小的硬件系统中。Mult cs成了总结工程教训的宝库, 但它同时也为C语言体现“小即是美”铺平了道路,当心灰意冷的贝尔实验室的专家们撤离Multics工程后, 他们又去寻找其他任务。其中位名叫Ken Thompson[的研究人员对另一个操作系统很感兴趣, 他为此好儿次向贝尔管理层提议, 但均遭否决。在等待官方批准时, Thompson和他的同事Dennis R it chic自娱自乐,把Thompson的“太空旅行”软件移植到不太常用的PDP-7系统上。太空旅行软件模拟太阳系的主要星体,把它们显示在图形屏幕上,并创建了一架航天飞机,它能够飞行并降落到各个行星上。与此同时, Thompson加紧工作, 为PD-7编写了一个简易的新型操作系统。它比Mul ics简单得多, 也轻便得多。整个系统都是用汇编语言编写的。Brian Kemi ghan在1970年给它取名为UNIX, 自嘲地总结了从Multics中获得的那些不应该做的教训。图1-1描述了早期C、UNIX和相关硬件系统的关系。
是先有C语言还是先有UNIX呢?说起这个问题, 人们很容易陷入先有鸡还是先有蛋的套套中。确切地说, UNIX比C语言出现得早(这也是为什么UNIX的系统时间是从1970年1月1日起按秒计算的,它就是那时候产生的啊)。然而,我们这里讨论的不是家禽趣闻,而是编程故事, 用汇编请言编写UNIX显得很笨拙, 在编制数据结构时浪费了大量的时间,而且系统难以调试, 理解起来也很困难。Thompson想利用高级语言的·些优点, 但又不您像PL/'那样效率低下, 也不想碰见在Mults中曾遇到过的复杂问题。在用Fortran进行了--番简短而义不成功的尝试之后, Thompson创建了B语言、他把用于研究的语言BCPL作了简化, 使B的解释器能常于PDP-7只有8KB大小的内存中。B语言从米不曾真正成功过,因为硬件系统的内存限制,它只允许放置解释器,而不是编详器,由此产生的低效阻码了使用B语言进行UNIX自身的系统编程。学球、使用和实现PLI的困难便一电序员写了这样一打油译; “IBM有个PU.语动比JOSS上糟糕, 到处都从它踪,实实在在楚域圾。JOSS足个老古素, 它可不是因简单面闻名。·“BCPL:AToalforComplerWiigandSysemPogrmmng(BCPL,编器斗和系统编程的T具), Mari Rican.hoc.API PSSprigJoiCoputerCoeece 14(196) pp 57566.BCPL井非*BeoeCPrgammiagLangunpa(C游身编1的首字缩。尽管这个有趣的巧合, 它的稍切赢思是 BCohnedPogumtigLgue(基本组合编,basc的思是“不花哨”, 它处由婆国伦敦大学和剑桥大学的研究人员合作发的。Malis实现了一种ACP 5.编译器
编译器设计者的金科玉律:效率(几乎)就是一切除了一些开发和学习环境之外,运行效率起决定性作用,在编译器中,效率几乎就是一切,当然还有一些他需要关心的东西,如有意义的错误有根多编译优化措施会延长编译时间,但却能缩短运行时间.还有一些优化措施(如清除无用代码和忽略运行时检查等)即能缩短编译时间,又能减少运行时间,同时还能减少内存的使用量,这些优化措施的不利之处在于可能无法发现程序中无效的运行结果。优化措施本身在转换代码时是非常谨慎的,但如果程序员编写了无效的代码(如:越过数组边界引用对象,因为他们“知道”附近有他们需要的变量)就可能引发错误的结果,这就是为什么说效率几乎就是一切但也并不是绝对的道理,如果得到的结果是不正确的,那么效率再高又有什么意义呢?编译器设计者通常会提供一些编译器选项,这样,每个程序员可以选择自己想要的优化措施, B语言不算成功, 而Dennis Ritchie所创造的注重效率的“New B 却获捋了成功, 充分证明了编译器设计者的这条金科玉律B语言通过省略一些寺性(如嵌套过程和一些循环结构) , 对BCPL语言作了简化, 并发扬了“引用数组元素相当十对指针加上偏移量的引用”这个想法。B语言同时保持了BCPL语言无类型这个特点, 它义有的操作数就是机器的。Thom pos on发明了++和--操作符, 并把它加入到PDP-7的B编译器中。它们在C语言中依然存在, 很多人天真地以为这是由于PDP-11存在对应的自动增/减地址模型, 这种想法是错误的!自动增/减机制的出现早于PDP-11硬件系统的出现。尽管在C语言中, 拷贝字符半中的一个字符的语句:
第1章C:穿越时空的迷.
1.C语言的史前阶段.
1.c讲言的早期体.
标准/O库和C预处理器.
它很棒,但它符合标准吗…
.编译限.
ANSIC标准的构.
1.9阅读ANSIC标准, 寻找乐趣和裨益.…
1.10“安静的改变”究竟有多少安静.….
第2章
轻松一下——山编详器定义的Pragmas效.果.
这不是Bug, 而是语言特.
3.6typedefintx[10] 和#deine x int[10] 的区别.
轻松―下——驱动物理实体的软.
产生链接器报告文.
a.out及其传说….
这关语言特性何事, 在Fortran毕这就是Bug呀.….
多做之过.….
2.3误做之过.
2.4少做之.
轻松一下——有些特性确实就是Bug.
参考文献.-
第3章分析C语言.
3.只有编译器才会喜欢的语法.
3.2声明是如何形.
.优先级规.
3.4通过图表分析C语言的声.
3.5typedef可以成为你的朋友.
3.7typedef struct foo.foo; ] 的含义.
3.8理解所有分析过程的代码段.
第4章令人震惊的事实:数组和指针并不相同.….
4.数组并非指.
4.2我的代码为什么无法运行.
4.3什么是声明,什么是定义…
4.4使声明与定义相D配……
4.数组和指针的其他区别…
4.6轻松下—回文的乐趣…
第5章对链接的思考.
5.闲数库、链接和载入…
5.2动态链接的优.
5.3函数库链接的5个特殊秘密.
5.4警惕Inter posit in.
5.6轻松一下—一看看谁在说话:挑战Turing测.
第6章运动的诗章:运行时数据结构.
6.3操作系统在a.out文件里干了些什么……
6.4C语言运行时系统在a.out里丁了些什.
当阐数被调用时发生了什么:过程活动记录.…….
au lo和static关键了.…
.控制线.
6.8setjmp和l long.m.
6.9
UNIX中的堆栈段…-
6.10MS-DOS小的栈段.….
7.4 Cache存储器.
8.1Portzebie度量衡系.
有用的C.
不需要按间车键就能得到一个字符…
用C语言实现有限状念.
多维数组的内有布局…
指针数就是I if fe向量.….
在齿状数组上使用指.
使用指针创建和使用动态数组…
初识.