天天看点

《C语言编程魔法书:基于C11标准》——1.2 用C语言编程的基本注意事项

本节书摘来自华章计算机《c语言编程魔法书:基于c11标准》一书中的第1章,第1.2节,作者: 陈轶 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

c语言的发明其实基于unix操作系统。当时在c语言未面世之前,dennis ritchie所在的at&t贝尔实验室用的unix系统是完全用汇编语言写的。汇编语言的优势是直接面向处理器本身,能直接对底层硬件进行控制,充分发挥处理器的硬件能力。然而,它的缺陷也是显而易见的。

1.汇编语言的不足

首先,不可移植性。每种处理器,其指令集都大相径庭,比如arm有arm的指令集架构(isa),intel x86有x86的isa,还有mips、power(原来为powerpc),motorola 68000等;再加上各类微控制器单元(micro-controller unit,mcu)、各类数字信号处理器(digital signal processor,dsp),每种isa都有其相应的汇编语言。那么多处理器如果对每一种都使用不同的汇编语言来实现同一个操作系统,那操作系统的开发人员真要崩溃了……而且即便实现出来,可能各个处理器上的实现也会有所不同,标准也很难被统一起来。

其次,汇编语言本身要比高级语言精密。因为汇编语言面对的都是寄存器、存储器以及各类底层硬件,而不是一种抽象的数据模型,所以代码编写时需要非常谨慎,而且调试程序也十分麻烦,且非常容易出错。所以,如果有一种既能面向底层硬件,又能对数据以及程序进行抽象的高级语言出现,那势必既能不太影响程序执行效率,又能大大提升程序的可执行性、可读性以及编写的效率,这将是非常伟大的贡献。c语言也就是在这种背景下诞生的。

如果说,汇编语言面向的是底层硬件、一种过程化的编程风格的话,那么c语言就是面向数据流和算法、一种结构化的编程风格。c语言是一种结构化的、静态类型的编译型编程语言。也就是说,用c语言编写了源代码之后,需要通过c语言编译器进行编译,构建为相应的处理器能直接执行的机器码,然后处理器可以对生成出来的机器码进行执行。所以在各个处理器上,处理器厂商或第三方只需要为当前处理器写一个对应的c语言编译器即可。然后任何符合c语言标准的程序都能在上面编译后执行,除了需要支持某些机器特定的功能和特性外(后面会介绍)。

2.c语言编写程序要注意什么

那么我们在用c语言写程序的时候应该注意哪些方面呢?

1)可移植性:c语言被设计出来的一大初衷就是为了能将同一个源代码放到各个不同的平台上编译运行。因此,如果我们的代码要在多种不同架构的处理器上运行的话,我们就得注意c语言标准规定了哪些特性是编译器必须遵守的,哪些特性是平台或编译器自己实现的。我们要尽量使用标准中已明文规定的编程规范,尽可能避免在不同平台可能会产生不同行为的语法特性。当然,由于上面提到的处理器种类太过多样,尤其在嵌入式开发领域,很多mcu用的还都是8位处理器,这种情况下c源代码就很难被移植到32位或64位系统下了。本书后面将会指出大部分主流平台对c语言标准中所提到的“实现定义”行为的区别。另外,也会提到一些技巧来应对不同的平台

特性。

2)可维护性:可维护性在实际工程项目的研发中非常重要。它体现在最初工程架构的设计、对各个功能模块的划分、相应的开发人员安排,还有后期的测试。一般来说,现在一个工程如果是从无到有进行开发的话会采用螺旋式开发模型。也就是说,一个项目启动后,可以先做一个功能简单但能正常工作的产品原型。然后在此基础上不断地为它增加更多功能,或对之前的功能进行修改。在此期间,我们如何对整个工程进行模块化划分,从而能安排不同开发人员针对不同功能模块进行开发就变得尤为重要。另外,在工程开发过程中,如果有人员流动,那么如何将即将离职的开发人员手中的工作交付给新人也关系到整个项目的进展。因此,一个良好的c语言代码应该具有可读性、良好的文档化注释风格,以及较详细的设计文档。对于一个较大的工程项目来说,开发人员不仅仅需要把自己的代码写好,而且要写得能让别人看懂,并且要做好详细的设计文档,这样才能把项目风险降低。

3)可延展性:大家或许已经知道,像微软的windows操作系统由数千名工程师合作研发;linux操作系统对外开源,参与其中的研发人员也有数百上千人。如果我们在一个开发团队中负责一个需要由多人合作开发的工程项目,那么我们写的功能模块需要与其他人写的功能模块进行对接。所以,我们在开发一个较大工程项目时,需要协调好各自对外的模块接口(application program interface,api)。由于c语言没有全局名字空间(namespace)这个概念,所以命名一个对外接口也是非常重要的,否则可能会与其他功能模块的接口名发生冲突。本书后面会对c语言函数命名以及符号连接做进一步介绍。

4)性能:性能是提升程序使用者效率和生产力的体现。一个应用程序的性能越高,那么计算一个任务所花费的时间越短,也越节省计算机的耗电。而对于如何提升性能,一方面需要程序员对处理器架构、硬件特性有一定了解;另一方面需要程序员拥有比较丰富的算法知识,能针对实际需求灵活采用高效的算法。而像c语言这种十分接近硬件底层的高级编程语言,能极大限度地发挥处理器的特长,从而达到高效的运行性能。

继续阅读