深度理解C语言的编译机制和语言标准,万物皆可C!

编程机制

编写程序时必须遵循确切步骤主要是取决于你的计算机环境。由于 C语言是能够移植的,因此它在许多环境中可用,其中包括 UNIX,Linux,Windows等等 。编程

不过,让咱们首先来看一看许多环境所共有的一些方面。你彻底没必要知道运行一个 C 程序后面的事情,但了解一点是一个很好的背景知识。它还能够帮助你理解为何编写一个 C 程序必须通过一些特定步骤。编程语言

用 C 语言编写一个程序时,你将编写的内容保存在一个被称为源代码文件的文本文件中。编辑器

大多数 的系统,都须要该文件的名称以 .c 结尾。例如,hello world.c 。名称中小点前的部分被称为基本名,小点后的部分被称为扩展名。所以,hello world 是一个基本名,c 是一个扩展名。组合在一块儿的 hello world.c 是文件名。模块化


 

这样,在咱们提到名称时内容就能够更具体,咱们假定有一个名为 hello world.c 的源文件,其源代码以下面所示。函数

#include工具

int main ()学习

{spa

printf("hello world! ");操作系统

return 0;命令行

}


 

目标代码文件、可执行文件和库

C语言编程的基本策略是使用程序将源代码文件转换为可执行文件,此文件包含能够运行机器语言代码。

它分两步完成这一工做:编译和连接。

编译器将源代码转换为中间代码,连接器将此中间代码与其余代码相结合生成可执行文件。C 使用被划分为两部分的这一方法使程序便于模块化。

你可分别编译各个模块,而后使用连接器将编译过的模块结合起来。这样,若是须要改变一个模块,则没必要从新编译全部其余的模块。同时,连接器将你的程序与预编译的库代码结合起来。

中间文件的形式有多种选择。最通常的选择,同时也是咱们这里讲述的实现方式所采起的选择,是将源代码转换为机器语言代码,将结果放置在一个目标代码文件中。

虽然目标文件包含机器语言代码,但该文件还不能运行。目标文件包含源代码的转换结果,但它还不是一个完整的程序。

目标代码文件中所缺乏的第一个元素是一种叫作启动代码(start-up code)的东西,此代码至关于你的程序和操做系统之间的接口。

例如,你能够在DOS或Linux下运行一个 IBM PC兼容机,在两种状况中硬件是相同的,因此会使用一样的目标代码,但DOS与Linux要使用不一样的启动代码,由于这两种系统处理程序的方式是不一样的。

所缺乏的第二个元素是库例程的代码。几乎全部C程序都利用标准C库中所包含的例程(称为函数)。

例如,前面的 concrete.c 使用了函数 printf()。目标代码文件不包含这一函数的代码,它只包含声明使用 printf()函数的指令。实际代码存储在另外一个称为“库”的文件中。库文件中包含许多函数的目标代码。

连接器的做用是将【目标代码】、【系统的标准启动代码】和【库代码】这3个元素结合在一块儿,并将它们存放在单个文件,便可执行文件中。对库代码来讲,连接器只从库中提取你所使用的函数所须要的代码,以下图中的简单示例:

简而言之,目标文件和可执行文件都是由机器语言指令组成的。但目标文件只包含你所编写的代码转换成的机器语言,而可执行文件还包含你所使用的库例程以及启动代码的机器代码。


 

Windows系统的集成开发环境

由于 C 编译器不是标准 Windows 包的一部分,因此须要得到并安装一个 C 编译器。

许多厂商都会提供基于 Windows的集成开发环境(IDE) 。

全部编译器都具备用来装配C程序的快速,集成的开发环境。关键的一点是,它们都具备内置的编辑器,可用来编写C程序。

这类开发环境通常都提供了让你能够命名和保存源代码文件的菜单,以及让你能够不离开IDE就能编译和运行程序的菜单。若是编译器发现任何错误,会返回到编辑器中,并且编辑器能够标出有问题的行,并将它们与相应的错误消息匹配起来,例如VC6.0、QT、Visual Studio(简称vs)。

Windows IDE最初可能让人有一点望而生畏,由于它们提供多种目标,也就是说,提供了多种可以让程序在其中运行的环境。

例如,它们可能提供16位Windows程序,32位Windows程序,动态连接库文件(DLL)等等让你选择。许多目标都须要引入Windows图形界面的支持。为了管理这些选项,一般须要建立一个项目,以便随后向其中添加将要使用的源代码文件名。

通常来讲,首先使用文件菜单来建立一个新的项目。重要的是选取正确的项目形式。本书中的例子是通常性的例子,设计目的是在一个简单的命令行环境中运行。

由于 Widnows IDE通常可处理 C 和 C++,因此你应该指明你须要一个C程序。在某些产品,可使用项目类型来指明但愿使用 C。

而在其余一些产品,如 Microsoft Visual C++中,可使用.c文件扩展名来指明但愿使用 C 而不是 C++。然而,大多数 C 程序也能够做为 C++程序运行。


 

可能你们在写完一个程序以后会遇到一个问题:显示程序执行的窗口在程序终止时忽然消失,也就是程序运行后窗口一闪而过。

若是遇到这种状况,那么可使程序暂停,直到按下 Enter键。要作到这一点,请在程序的末尾,刚好在 return 语句以前,添加下面的一行:

getchar();

该行读取一次按键,所以程序将暂停直到按下 Enter 键时。有时,根据程序函数的须要,可能已经有一个等待按键的指令。在这种状况下,须要使用 getchar()两次:

getchar();

getchar();

例如,若是程序最后作的事情是请你输入你的体重,那么就应当键入你的体重并按 Enter 键以输入数据。

程序将读取体重,第1个getchar()将读取 Enter键,第2个getchar()将致使程序暂停,直到再次按下 Enter键。若是如今你对此还不太理解,那么在学习更多关于 C 输入的知识后你就明白了。

虽然各类IDE都有许多共同的原则,但在细节方面会因产品而异,而在一个产品系列中,又会因版本而异。你必需要通过一些实践,才能知道编译器的正确工做方式。


 

语言标准

目前,有许多 C 实现方式可用。理想状况下,编写 C 程序时,假如该程序末使用机器特定的编程技能,则它在任何实现方式中的运行应该是相同的。要在实践中作到这一点,不一样的实现方式须要遵照一个公认的标准。

首先说明一点,C语言并无官方的标准。

不过,Brian Kernighan 和 Dennis Ritchie 编写的 The C Programming Language 第1版(1978)成为你们接受的标准,一般称为 K&R C 或经典 C。

第1个 ANSI/ISO C 标准

随着 C语言的发展和更加普遍地用于更多种类的系统上,使用 C 的群体意识到它须要一个更加全面,新颖和严格的标准。

为了知足这一要求,美国国家标准代组织(ANSI)在1983年设立了一个委员会以发展一个新的标准,该标准于1989年正式采用。

这个新标准(ANSI C)定义了语言和一个标准 C 库。国标标准化组织于1990年采用一个 C 标准 (ISO C )。

ISO C 和 ANSI C 实质上是同一个标准。ANSI/ISO标准最终版本一般被称为 C89 (由于 ANSI于1989年批准了该标准) 或 C90(由于 ISO 于1990年批准了该标准)。然而,由于 ANSI版本是首先出现的,因此人们一般使用ANSI C这一术语。


 

C99 标准

1994年,修订标准的工做开始了,这一努力的结果是产生了 C99标准。

一个联合 ANSI/ISO委员会签署了 C90标准的最初原则,包括保持言语短小而简单。他们的意图不是为语言添加新的特性,而是为了知足新的目标。

新目标之一是支持国际化编程。

例如,提供了处理国际字符集的方法。第二个目标是“整理现有的惯例以解决明显的缺点”。所以,在遇到须要将 C 移植到 64 位处理器时,委员会根据在真实生活中处理问题的人的经验来添加标准。第三个目标是针对科学和工程项目的重要数字计算改进 C 的适应能力。

国际化,修正其不足和改进计算的实用性这三点是主要的面向改变的目标。造成在关于更改的计划在性质上更加保守,例如,让与 C90 和 C++ 的不兼容性达到最小,让语言在概念上保持简单。肩带来讲就是但愿 C++成为重要的和强有力的语言。

结果是 C99 的修改保持了 C 的本质特性,C 继续是一种简短,清楚,高效的语言。

书中指出了 C99中的许多修改。由于目前大多数编译器没有彻底实现全部 C99的修改,因此你能够会发现一些修改在你的系统上不可用。或者你可能会发现,只有修改编译器的设置之后,才可以看到一些 C99 的特性。


 

总结

C 是一种强大,简洁的编程语言。之因此流行是由于它提供了有用的编程工具和对硬件良好的控制,还由于 C 程序在从一个系统向另外一个系统移植方面比大多数程序更容易。C 是一种须要编译的语言。C 编译器和连接器是将 C 语言源代码转换成可执行代码的程序。

用 C 编程可能很费力,困难并让你感到灰心,但这一工做也可能让你着迷,兴奋和感到满意。


 

最后,无论你是转行也好,初学也罢,进阶也可,若是你想学编程~

【值得关注】个人 C/C++编程学习交流俱乐部!【点击进入】

问题答疑,学习交流,技术探讨,还有超多编程资源大全,零基础的视频也超棒~

相关文章
相关标签/搜索