高质量程序设计指南:C++/C语言
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.2 语言实现

虽然C++/C并没有提供对I/O的直接支持,但是由于类似的函数库和标准的类库对于实际开发工作太重要了,所以C++/C标准(ANSI/ISO C++/C)规定了这些库的标准接口,但是并没有提供其实现,因为这是语言实现的任务。

那么什么是语言实现呢?语言实现就是具体地实现一种语言的各种特征并支持特定编程模式的技术和工具。一般地讲,编程语言的实现就是编译器(compiler)和连接器(linker)(编译—连接模式)或者解释器(interpreter)(解释模式)的实现,即用来分析你的源代码并生成最终的可执行机器指令集合的技术和工具,以及一套标准库实现。

语言最终要表现为某个或某些具体的实现版本,但是语言实现并不就是语言本身,因为对于那些允许扩展的标准化语言,它们的实现往往会对那些可扩展的部分进行必要的修改和扩展,这就产生了方言(dialect)。C++/C就是允许扩展的语言,即它的标准规范文本中定义和说明了许多实现相关的及平台相关的特征细节,这就要求语言实现根据具体的平台环境和实现技术来修改或定义自己的解决办法。比如在C++/C标准规范中,程序的行为就有一种“实现定义的行为(即依赖于实现的行为)”,就是程序在运行时某些情况下的行为要靠具体的语言实现来定义,而标准规范不会强加定义。C++/C语言有许多的方言,如Turbo C++/C、Borland C++/C、Microsoft C++/C、GNU C++/C等,都是C++/C不同的实现版本。所以,要根据你所使用的C++/C语言实现来确定那些“实现定义的行为”的具体含义。

另外,语言标准可能会要求实现提供可用的标准化库(Standard Library)。库增加了语言的灵活性和可扩展性。各种库的实现方法可能不同,但是其接口必须是标准化的(一致的),否则会给用户带来不便。编译器开发商在提供语言实现的同时可能还会提供集成开发环境(IDE),不论是可视化的还是非可视化的IDE,其目的都是帮助程序员提高编程效率。

一个具体的语言实现必须支持语言规范所定义的核心特征,除此之外的特征和对核心特征的修改都属于扩展。例如,Microsoft C++/C就分别对ANSI/ISO C++/C进行了必要的扩展,具体表现在关键字、类型转换、单行注释、变长参数列表、作用域规则及增加的编译器选项等方面(详见其编译器文档)。此外,随着技术的发展,解决了一些问题,而到了需要对语言本身进行修订的时候,例如,增加一些新的特征和删除一些过时的特征,就需要对语言的核心进行扩展,当然语言的实现也要做出相应的修订。例如,C++希望将来能够增加对象持久性、并行处理等特征,而这些恐怕无法通过库来实现,必须对语言的核心特征进行必要的扩展才能解决,但是现在的技术水平还无法完成这个任务。

由于存在着“依赖于实现的行为”等诸多因素,不同语言实现之间可能并不完全兼容。这种不兼容包括代码的不兼容、特征实现的不兼容、库的不兼容、编译器和连接器的不兼容,以及它们生成的中间文件的不兼容(即二进制不兼容),等等。就拿标识符重命名(Name-Mangling)方案来说,Microsoft C++采用的方案就和Borland C++的不同(C++标准并没有规定这些,但是C标准规定了),从而导致一方编译生成的目标文件(.obj)拿到另一方的连接器上无法连接的问题,还有不能同时使用不同实现的库等问题。

虽然一种语言可能存在不同的实现,但是学好标准语言本身无疑是最重要的!过去经常听说“某某人在钻研Visual C++”,我不知道他是在学习C++语言还是在学习Visual C++的IDE和MFC或者兼而有之。有些人甚至错误地认为学会使用Visual C++ IDE就是学会了C++语言。这又是一个误区!

首先掌握语言的特征及其使用方法,再学习具体的语言实现才是语言学习的正道!

实际上,语言实现要解决的根本问题是如何才能高效地使用这种语言开发程序,这不仅包括对实现一个程序(编译—连接)的支持,还包括对程序开发设计活动的支持。比如C++/C头文件与实现文件的分离、多源文件程序的组织、单独编译技术、调试技术等都是特定的语言实现开发出来的标准技术,现在已经被广泛采用,它们并非作为语言的C++/C本身所关心的问题。

我们不能因为Bjarne说过那样的话就不去使用甚至不去学习C++/C的高级特性。你可能认为:即使不使用它们,也照样能够实现需要的功能。是的,你能够!因为任何问题都不可能只存在一种解决办法。但是能够做一件事情和做好一件事情是完全不同的两码事儿!你是否认真考虑过你这样做的代价和结果呢?

要想高效地使用一种语言,毫无疑问你首先必须了解它的各个特征和它们的使用方法,以及使用它们有什么样的利弊。此外,你还必须学习几种编程方法和编程模式,以及高效地和高质量地把它们组合起来的技巧,比如结构化编程、模块化编程及过程式编程是基本的编程方法和编程模式,而基于对象、面向对象、面向组件、泛型编程乃至事件驱动编程和基于规则的编程则是高级的编程模式。可以预见,模块化的面向对象程序设计模式、面向组件的程序设计模式、泛型编程都将是未来的主流模式。这还不够,最后你要学习各种编程环境和标准库或其他库的使用方法,要充分利用现有的资源而不要做重复劳动,这样才能用好一门语言,才能开发出高质量的程序。

【教你一招】: 你要学会在特定的平台下学习具体的语言实现,除了要了解其编译器手册和帮助外,你还可以编写一些简短的程序来测试C++/C的每一个特性,观察其输出结果(其他语言也是类似的方法)。

最后要说的是,仅仅学习一门程序设计语言是不够的,你必须至少学会两门语言并逐步培养运用它们解决实际问题的能力和水平,才能在实际工作中做到游刃有余。