zoukankan      html  css  js  c++  java
  • 深度理解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 ()

    {

    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++编程学习交流俱乐部!【点击进入】

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

  • 相关阅读:
    文件共享服务之FTP
    通过rsycn实现数据同步
    rsync命令的使用
    Linux之ssh服务
    跳板机的工作原理和简单的跳板机实现
    Linux进程管理
    javaweb图片上传 tomcat重新部署 图片消失
    KindEditor 上传文件
    PL/SQL通过修改配置文件的方式实现数据库的连接
    PermGen space
  • 原文地址:https://www.cnblogs.com/huya-edu/p/14216526.html
Copyright © 2011-2022 走看看