设为首页 加入收藏

TOP

C语言的发展史(The Development of the C Language) (五)
2014-11-23 22:19:18 来源: 作者: 【 】 浏览:5
Tags:语言 发展史 The Development the Language
pointer->member而几乎不用考虑指针的类型;这样的表达式未受批判地,被当作到指针代表的内存区的引用,成员名字仅表示一个偏移量和一个类型。


尽管K&R第一版描述了,把C的类型结构带到当前形式的大部分规则,许多用旧式、更松散风格写的程序也被允许,所以编译器也要忍受它们。为了鼓励人们更多注意正式的语言规则,为了发现合法但不可信任的写法,以及帮助发现分离编译中,简单机制没有察觉的不匹配的接口,Steve Johnson改变他的pcc编译器产生了lint[Johnson 79b],来扫描一批文件并标记可疑的写法。


在使用中成长


我们在interdata 8/32的可移植性试验的成功,很快导致了Tom London和John Reiser在DEC VAX 11/780上的另一次成功。这种机器比Interdata变得更流行,并且Unix和C语言在AT&T公司内部和外面都开始快速传播。尽管在1970年代中期,Unix已经被用于贝尔系统和公司外的一小群以研究为目的的工业企业、学院和政府机构的各种项目,它的真正成长是在达到可移植性之后才开始。特别是AT&T的计算机系统部门基于其开发和研究小组的System III和System V版本系统,和加州大学伯克利分校继承自Bell实验室研究组的BSD系列的出现。


在1980年代,C语言的使用广泛传播,并且编译器出现在几乎每一种机器体系结构和操作系统;特别是它变成一种个人计算机上流行的编程工具,包括对这些机器的商业软件制造商和对编程有兴趣的终端用户。在那十年开始时,几乎每一种编译器都是基于Johnson的pcc;到1985年,有了许多成型的独立的编译器产品。


标准化


到1982年时,形势很明显,C需要正式的标准化。K&R第一版最近似一个标准,却不再反应真实使用中的语言;尤其是它都没有提及void和enum类型。但是它预示了通往结构的更新的方法,仅在语言对他们的赋值,将他们传递给函数和从函数接受他们,及将成员名字与包含它们的结构或union严格关联的支持被发表后。尽管AT&T发布的编译器包含了这些修改,大部分编译器供应商未基于pcc的编译器也加入了他们,对语言仍没有完整、权威性的描述。


K&R第一版在很多语言细节上也不够精确,对于pcc这个“参照编译器”来说,它日益显得不切实际;K&R甚至没有很好表达它索要描述的语言,把后续扩展仍到了一边。最后,C在早期项目中的使用受商业和政府合同支配,它意味着一个认可的正式标准是重要的。因此(在M. D. McIlroy的催促下),ANSI于1983年夏天,在CBEMA的领导下建立了X3J11委员会,目的是产生一个C标准。X3J11在1989年末提出了一个他们的报告[ANSI 89],后来这个标准被ISO接受为ISO/IEC 9899-1990。


一开始,X3J11委员会在语言扩展上采取了谨慎、保守的态度。他们认真对待他们的目标:“完善一个清晰、一致和无二义性的C程序设计语言标准,它规范C通用、现行的定义,以及促进用户程序在不同C语言环境的可移植性。”[ANSI 89] 委员会意识到,仅仅靠发布一个标准并不会改变这个世界。这超出了我的期望。


X3J11只向语言本身引入了一个真正重要的改变:它使用从C++[Stroustrup 86]借鉴的语法,把形式参数类型添加到函数类型签名中。用以前的风格,外部函数是这样声明的:


double sin();
它仅提及sin是一个返回一个double类型(即是double精度的浮点数)值的函数。在新的风格中,这个更好的声明


double sin(double);
使参数类型明显化并鼓励更好的类型检查和适当的转换。即使这个添加,尽管它产生一个明显更好的语言,也引起了困难。委员会有理由认为,简单的不合法的旧式风格函数定义和声明不可行,然而仍然同意新式更好。这种必然的妥协像它本应该的那样好,尽管允许两种形式使语言复杂化,并且可移植软件作者必须应付不符合标准的编译器。


X3J11也引入了一大堆较小的附加和修改,例如,类型限定词const和volatile,和稍微有些不同的类型提升规则。然而,标准化过程没有改变语言的特征。特别是,C标准没有尝试在形式上指定语言语义,所以在一些细微的地方上还可以存在争议;而且,它很好解释了自最初描述以来,在使用中的改变,并且它对与一个它的基本实现是足够精确的。


因此核心C语言经过标准化过程几乎未受损害,并且标准作为一个更好、仔细的条文出现了,而不是一次新发明。更多重要的改变发生在语言的环境中:预处理器和库。预处理器使用与其余部分语言截然不同的惯例执行宏替换。它和编译器的交互从未被很好描述,并且X3J11企图纠正这种情形。这种结果明显好于K&R第一版中的解释;除了变得更加易于理解,它提供像标记串联的操作,以前只在偶尔的实现中可用。


X3J11正确理解了一个完整和仔细的标准C描述,和它在语言本身上的工作一样重要。C语言本身没有提供输入——输出或任何其它与外界的交互,所以依赖一套标准方法。在出版K&R时,C主要是被当作Unix的系统编程语言;尽管我们提供了可被其它操作系统容易转换的库例程例子,Unix的底层支持是被隐含默认的。因此,X3J11委员会花了大量时间来设计和归档一套,对所有符合标准的实现都可用的库例程。


通过标准过程,X3J11委员会的当前活动被限制出版对现存标准进行的解释。然而,由Rex Jaeschke召集的作为NCEG(C数值扩展小组)的一个非正式组织,被正式接受为附属组X3J11.1,他们继续考虑对C的扩展。像这个名字隐含的那样,这些可能的扩展中的许多,是为了是语言在数值上的使用更合适:例如,边界动态决定的多维数组,加入IEEE算术处理方式,及使语言在具有向量和其它高级结构特征的机器上更有效。并非所有这些可能的扩展都是数值相关的;他们添加了一个结构字面值符号。


后来者


C和B有一些直接的后代,尽管他们不能与Pascal在产生后代上竞争。很早有发展了一个分支。当Steve Johnson在1972年休假期间访问滑铁卢大学时,他带来了B。它在那儿的Honeywell机器上变得流行。后来产生了Eh和Zed(加拿大人对“B之后是什么?”的答案)。当Johnson在1973年返回贝尔实验室时,让他感到惊慌的是,那个他在加拿大播种的语言,在他回来后在家里得到了发展;甚至他自己的yacc程序已经由Alan Snyder用C重写了。


更多近代的C的后代可能包括并发C[Gehani 89]、对象C[Cox 86]、C*[Thinking 90]、尤其是C++[Stroustrup 86]。这个语言也被广泛用于各种各样编译器的中间表示(基本上是当作一种可移植汇编语言),对直接后代C++,以及类似Modula 3[Nelson 91]和Eiffel[Meyer 88]的独立语言。


批评


C在它那类语言中的两个最具特征的思想是:数组和指针的关系,声明语法模拟表达式语法。它们也列入它最为常受批评的特征中,并且也常成为初学者的绊脚石。历史的偶然和错误,在这两种情形中,更加剧了它的困难。这些其中最重要的是C编译器对类型错误的容忍。上述历史中应该清楚的是,C由无类型语言进化而来。它不是陡然以一个全新的语言,带着它本身的规则,出现在它

首页 上一页 2 3 4 5 6 7 8 下一页 尾页 5/8/8
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言中异常处理的两个函数 下一篇位运算超强总结

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: