编程机制
2021-1-16
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 

源文件

用C语言编写程序时,编写的内容被储存在文本文件中,该文件被称为源代码文件。大部分C系统,都要求文件名以.c结尾。在文件名中,点号(.)前面的部分称为基本名,点号后面的部分称为扩展名,基本名与扩展名的组合就是文件名。文件名应该满足特定计算机操作系统的特殊要求。例如,MS-DOS是IBM PC及其兼容机的操作系统,比较老旧,它要求基本名不能超过8个字符。有些UNIX系统限制整个文件名不超过14个字符,而有些UNIX系统则允许使用更长的文件名,最多255个字符。Linux、Windows和Macintosh OS都允许使用长文件名。
 
每种编程语言的源文件都有特定的后缀,以方便被编译器识别,被程序员理解。源文件后缀大都根据编程语言本身的名字来命名
  • C语言源文件的后缀是.c
  • C++语言源文件的后缀是.cpp
  • Java 源文件的后缀是.java
  • Python 源文件的后缀是.py
  • JavaScript 源文件后缀是.js
源文件其实就是纯文本文件,它的内部并没有特殊格式。后缀仅仅是为了表明该文件中保存的是某种语言的代码,这样程序员容易区分,编译器也更加容易识别,它并不会导致该文件的内部格式发生改变。
 

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

C编程的基本策略是,用程序把源代码文件转换为可执行文件(其中包含可直接运行的机器语言代码)。
 
典型的C实现通过编译链接两个步骤来完成这一过程。编译器把源代码转换成中间代码,链接器把中间代码和其他代码合并,生成可执行文件。C 使用这种分而治之的方法方便对程序进行模块化,可以独立编译单独的模块,稍后再用链接器合并已编译的模块。通过这种方式,如果只更改某个模块,不必因此重新编译其他模块。另外,链接器还将程序和预编译的库代码合并。 中间文件有多种形式。这里描述的是最普遍的一种形式,即把源代码转换为机器语言代码,并把结果放在目标代码文件中。虽然目标文件中包含机器语言代码,但是并不能直接运行该文件。因为目标文件中储存的是编译器翻译的源代码,这还不是一个完整的程序。 目标代码文件缺失启动代码。启动代码充当着程序和操作系统之间的接口。例如可以在MS Windows或Linux系统下运行IBM PC兼容机。这两种情况所使用的硬件相同,所以目标代码相同,但是Windows和Linux所需的启动代码不同,因为这些系统处理程序的方式不同。目标代码还缺少库函数。几乎所有的C程序都要使用C标准库中的函数。例如,上述程序中就使用了 printf()函数。目标代码文件并不包含该函数的代码,它只包含了使用 printf()函数的指令。printf()函数真正的代码储存在另一个被称为库的文件中。库文件中有许多函数的目标代码。 链接器的作用是,把你编写的目标代码、系统的标准启动代码和库代码这 3 部分合并成一个文件,即可执行文件。对于库代码,链接器只会把程序中要用到的库函数代码提取出来。
notion image
简而言之,目标文件和可执行文件都由机器语言指令组成的。然而,目标文件中只包含编译器为你编写的代码翻译的机器语言代码,可执行文件中还包含你编写的程序中使用的库函数和启动代码的机器代码。链接其实就是一个“打包”的过程,它将所有二进制形式的目标文件和系统组件组合成一个可执行文件。完成链接的过程也需要一个特殊的软件,叫做链接器。 在有些系统中,必须分别运行编译程序和链接程序,而在另一些系统中,编译器会自动启动链接器,用户只需给出编译命令即可。
  • 在UNIX系统上编译
    • 以前,UNIX C编译器要调用语言定义的cc命令。但是,它已经退出了历史舞台。但是,UNIX系统提供的C编译器通常来自一些其他源,然后以cc命令作为编译器的别名。因此,虽然在不同的系统中会调用不同的编译器,但用户仍可以继续使用相同的命令。 编译inform.c,要输入以下命令:
       
      几秒钟后,会返回 UNIX 的提示,告诉用户任务已完成。如果程序编写错误,可能会看到警告或错误消息,但我们先假设编写的程序完全正确(如果编译器报告void的错误,说明你的系统未更新成ANSI C编译器,只需删除void即可)。如果使用ls命令列出文件,会发现有一个a.out文件。该文件是包含已翻译(或已编译)程序的可执行文件。要运行该文件,只需输入: a.out 输出内容如下: A .c is used to end a C program filename.
      如果要储存可执行文件(a.out),应该把它重命名。否则,该文件会被 下一次编译程序时生成的新a.out文件替换。
  • GNU编译器集合和LLVM项目
    • GNU项目始于1987年,是一个开发大量免费UNIX软件的集合(GNU的意思是“GNU’s Not UNIX”,即GNU不是UNIX)。GNU编译器集合(也被称为GCC,其中包含GCC C编译器)是该项目的产品之一。GCC在一个指导委 员会的带领下,持续不断地开发,它的C编译器紧跟C标准的改动。GCC有各种版本以适应不同的硬件平台和操作系统,包括UNIX、Linux和Windows。用gcc命令便可调用GCC C编译器。许多使用gcc的系统都用cc作为gcc的别名。
      LLVM项目成为cc的另一个替代品。该项目是与编译器相关的开源软件集合,始于伊利诺伊大学的2000份研究项目。它的 Clang编译器处理 C代码,可以通过 clang调用。有多种版本供不同的平台使用,包括Linux。2012年,Clang成为FreeBSD的默认C编译器。Clang也对最新的C标准支持得很好。 GNU和LLVM都可以使用-v选项来显示版本信息,因此各系统都使用cc别名来代替gcc或clang命令。以下组合: cc -v 显示你所使用的编译器及其版本。 gcc和clang命令都可以根据不同的版本选择运行时选项来调用不同C标准。 gcc -std=c99 inform.c gcc -std=c1x inform.c gcc -std=c11 inform.c
      第1行调用C99标准,第2行调用GCC接受C11之前的草案标准,第3行调用GCC接受的C11标准版本。Clang编译器在这一点上用法与GCC相同。
  • Linux系统
    • Linux是一个开源、流行、类似于UNIX的操作系统,可在不同平台上运行。在Linux中准备C程序与在UNIX系统中几乎一样,不同的是要使用GNU提供的GCC公共域C编译器。编译命令类似于:
      注意,在安装Linux时,可选择是否安装GCC。如果之前没有安装GCC,则必须安装。通常,安装过程会将cc作为gcc的别名,因此可以在命令行中使用cc来代替gcc。
  • PC的命令行编译器
    • C编译器不是标准Windows软件包的一部分,因此需要从别处获取并安装C编译器。可以从互联网免费下载Cygwin和MinGW,这样便可在PC上通过命令行使用GCC编译器。Cygwin在自己的视窗运行,模仿Linux命令行环境,有一行命令提示。MinGW在Windows的命令提示模式中运行。这和GCC的最新版本一样,支持C99和C11最新的一些功能。Borland的C++编译器5.5也可以免费下载,支持C90。
      notion image
       
      通常,C编译器生成的中间目标代码文件的扩展名是.obj(也可能是其他扩展名)。与UNIX编译器不同,这些编译器在完成编译后通常不会删除这些中间文件。有些编译器生成带.asm扩展名的汇编语言文件,而有些编译器则使用自己特有的格式。一些编译器在编译后会自动运行链接器,另一些要求用户手动运行链接器。在可执行文件中链接的结果是,在原始的源代码基本名后面加上.exe扩展名。例如,编译和链接concrete.c源代码文件,生成的是concrete.exe文件。 可以在命令行输入基本名来运行该程序:
      C>concrete
       
       
  • C
  • 编译器C语言标准
    目录