C语言的实现经过(C代码到CPU执行)

本文详细介绍了C语言从源代码到可执行文件的整个编译流程,包括C编辑器的选择与使用、预处理器的工作原理、编译器及优化器的作用、连接器的功能以及最终生成的可执行文件如何被CPU执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2018-01-05  创建人:Ruo_Xiao
2018-01-06  修改人:Ruo_Xiao
1、添加编辑器之后,预处理之前的编译器的操作。
2、添加对优化器的简单的说明。
2018-01-12  修改人:Ruo_Xiao
修正最后的逻辑总图,添加“源代码处理”。
2018-01-20  修改人:Ruo_Xiao
增加对编译器和连接器更详细的说明。

一、概括

C源代码 -> C编辑器 -> 源代码处理 -> 预处理器 -> C编译器 ->(优化器) -> 连接器 -> 可执行文件 -> CPU执行

二、C源代码

英文:Source Code。

三、C编辑器

  1. 用C语言编写的程序都存储在文本文件中,该文件被称为源代码文件(Source Code Files),大多数系统都以“.c”为扩展名。
    拓展:点号“.”前面的部分被称为基本名(Basename),点号后面的部分被称为扩展名(Extension),基本名和拓展名的组合被称为文件名。
  2. 常用的C编辑器有:
    (1)windows:记事本(notepad)。(需要修改扩展名)
    (2)Linux:Vi、Vim。
    (3)Unix:emacs、jove、Vi、X Window System文本编辑器。
  3. 有的C编辑器具有自动纠错功能,例如Vim。

四、源代码处理

1、编译器把源代码中出现的字符映射到源字符集,该过程处理多字节字符和三字符序列。
2、编译器定位每个反斜杠后面跟着换行符实例,并删除它们。也就是说把下面两个物理行(physical line):

printf("Hello,my\
        wife!/n");

转化为一个逻辑行(logical line)。

printf("Hello,my wife!/n");

3、编译器将文本划分成预处理记号序列、空白序列和注释序列(记号是由空格、制表符或换行符分隔的项)。这里,编译器将空白字符序列和注释序列用一个空格替换。所以下面代码

int/*我是注释!*/i = 0;

变成了

int i = 0;

五、预处理器

  1. 预处理器是在真正的编译开始之前由编译器调用的独立程序。
  2. 预处理器指令以#号开头标识,末尾不包含分号。
  3. 主要功能有文件包含、宏替换、条件编译等。
  4. 在编译的预处理阶段实现的功能:
    (1)将头文件加载到代码中。
    (2)对宏进行替换。等等
    再根据条件编译指令,最终生成新的源代码,传给编译器。

六、C编译器

  1. 英文: C Compiler。
  2. 是将经过预处理器处理之后的C代码翻译成对应于各种CPU能够执行的可执行代码的程序。
    拓展:可执行代码,用计算机的机器语言表示的代码,这种语言是由数字码表示的指令组成,即CPU的微指令。
  3. 编译器检查的是语法、函数与变量的声明是否正确。
  4. 存储编译器生成的可执行代码的文件被称为目标文件(Object file)。
    拓展:目标文件
    (1)扩展名:
    Unix/Linux:“.o”。
    Windows:“.obj”。
    (2)目标文件虽然包含机器语言代码,但是不能直接运行,原因如下:
    A、缺少启动代码(Startup Code),启动代码充当着程序和操作系统的之间的接口。
    B、缺少库函数代码,只是包含了库函数的指令。
  5. 种类
    (1)GNU编译器集合(GCC,其中包含GCC C 编译器),Linux和Unix下使用gcc即可调用GCC C 编译器。
    (2)GCC编译器在windows上的运行的软件是Cygwin和MinGW。
    (3)LLVM项目的Clang编译器,通过clang调用,应用于Linux和FreeBSD(默认)中。
    (4)VC和VS。
    (5)cc 是 Unix系统的 C Compiler,一个是古老的 C 编译器。

七、优化器

  1. 对目标代码进行进一步处理,使其效率更高。
  2. 只针对Release,Debug不进行处理。

八、连接器

  1. 将编译器生成的目标文件中的代码、系统的标准启动代码和库代码三者合并成一个文件,即可执行文件。
  2. 主要是链接函数和全局变量。链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error)。在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现,你需要指定函数的ObjectFile。

九、可执行文件

  1. windows:扩展名为“.exe”。
  2. Unix/Linux:扩展名“.out”。

十、CPU执行

  1. 能让CPU执行的只要其特有的微指令集。
  2. 可执行文件就是由微指令集中的指令构成,故在windows下,双击exe就可以让CPU开始按照C源代码中所设想的那样工作了。

十一、流程图

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值