C语言 程序环境 编译和链接

目录

1.程序的翻译环境和执行环境

2.详解C语言程序的编译和链接

2.1翻译环镜

2.2翻译的几个阶段

2.2.1预编译

2.2.2编译

词法分析

符号汇总

2.2.3汇编

生成符号表

2.3链接

1.合并段表

2.合并符号表和重定位

2.4运行环境


1.程序的翻译环境和执行环境

在ANSI C的任何一种实现环境中,存在两个不同的环境

  • 第一种是翻译环境,在这个环境中源代码被转换为可执行的机器指令
  • 第二种是执行环境,它用于实际执行代码

C语言 程序环境 编译和链接_第1张图片

C语言 程序环境 编译和链接_第2张图片

2.详解C语言程序的编译和链接

C语言 程序环境 编译和链接_第3张图片

2.1翻译环镜

C语言 程序环境 编译和链接_第4张图片

  • 组成一个程序的每个源文件通过编译过程分别抓换成目标代码(object code)
  • 每个目标文件文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序
  • 链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也 链接到程序中

2.2翻译的几个阶段

C语言 程序环境 编译和链接_第5张图片

C语言 程序环境 编译和链接_第6张图片

2.2.1预编译

预编译的过程:

  1. 注释的替换(删除) 注释被替换成一个空格
  2. 头文件的包含  #include < >
  3. #define 符号的替换

所有的预处理指令都是在预编译阶段处理的 (文本操作)

2.2.2编译

词法分析

假如有下面一段代码

array[index] = (index+4)*(2+6) 

将源代码程序输入扫描器,扫描器的任务就是简单的进行词法分析,把代码中的字符分割成一系列的记号(关键字、标识符、字面量、特殊字符等)

上面程序进行词法分析后得到了16个记号:

C语言 程序环境 编译和链接_第7张图片

生成一棵语法树

C语言 程序环境 编译和链接_第8张图片

符号汇总

一个工程中可以包含多个.c文件,如何在一个.c文件中调用另一个.c文件中的函数呢

这里我们了解一个概念叫做符号汇总

假设有这样的代码

C语言 程序环境 编译和链接_第9张图片

进行符号汇总

C语言 程序环境 编译和链接_第10张图片

注意:符号汇总只能汇总全局变量

2.2.3汇编

把汇编代码翻译成了二进制的指令,生成了.o文件(目标文件)

生成符号表

假设给汇总的符号给上地址,生成一个符号表

C语言 程序环境 编译和链接_第11张图片

2.3链接

1.合并段表

C语言 程序环境 编译和链接_第12张图片

2.合并符号表和重定位

C语言 程序环境 编译和链接_第13张图片

2.4运行环境

程序执行的过程:

  1. 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成
  2. 程序的执行便开始。接着便调用main函数
  3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程中一直保留他们的值
  4. 终止程序。正常终止main函数;也有可能是意外终止

你可能感兴趣的:(c语言,开发语言)