从源程序到可执行文件的四个过程

news/2024/11/30 6:35:14/

这里写目录标题

  • 预处理
  • 编译
  • 汇编
  • 链接

程序要运行起来,必须要经过四个步骤:预处理、编译、汇编和链接,如下图所示:
在这里插入图片描述

-E选项:提示编译器执行完预处理就停下来,后边的编译、汇编、链接就先不执行了。
-S选项:提示编译器执行完编译就停下来,不去执行汇编和链接了。
-c选项:提示编译器执行完汇编就停下来。
-o选项:生成可执行文件。

预处理

预处理之后的文件仍然是一个C++文件,预处理过程进行的操作如下:

  • 将所有的“#define”删除,并且展开所有的宏定义
  • 处理所有的条件编译指令,比如“#if”、“#ifdef”、“#elif”、“#else”、“#endif”
  • 处理“#include”指令,将被包含的头文件插入到该指令的位置。(这个过程是递归进行的,因为被包含的文件可能还包含了其他文件)
  • 删除所有的注释“//”和“/* */”。
  • 添加行号。

编译

编译过程主要包括词法分析、语法分析、语义分析等操作。编译完成后生成一个 .s 文件,即汇编文件

词法分析
词法分析是使用一种叫做lex的程序实现词法扫描,它会按照用户之前描述好的词法规则将输入的字符串分割成一个个记号。产生的记号一般分为:关键字、标识符、字面量(包含数字、字符串等)和特殊符号(运算符、等号等),然后他们放到对应的表中。

语法分析
语法分析器根据用户给定的语法规则,将词法分析产生的记号序列进行解析,然后将它们构成一棵语法树。对于不同的语言,只是其语法规则不一样。

语义分析
语法分析完成了对表达式语法层面的分析,但是它不了解这个语句是否真正有意义。有的语句在语法上是合法的,但是却是没有实际的意义,比如说两个指针的做乘法运算,这个时候就需要进行语义分析,但是编译器能分析的语义也只有静态语义。

  • 静态语义:在编译期就可以确定的语义。通常包括声明与类型的匹配、类型的转换。比如当一个浮点型的表达式赋值给一个整型的表达式时,其中隐含一个从浮点型到整型的转换,而语义分析就需要完成这个转换,再比如,将一个浮点型的表达式赋值给一个指针,这肯定是不行的,语义分析的时候就会发现两者类型不匹配,编译器就会报错。

  • 动态语义:只有在运行期才能确定的语义。比如说两个整数做除法,语法上没问题,类型也匹配,听着好像没毛病,但是,如果除数是0的话,这就有问题了,而这个问题事先是不知道的,只有在运行的时候才能发现他是有问题的,这就是动态语义。

汇编

汇编对应生成的文件是目标文件,目标文件由机器码写成

链接

目标文件经过链接可以形成一个可执行文件。链接过程主要包括了符号决议和重定位。

符号决议
有时候也被叫做符号绑定、名称绑定、名称决议、或者地址绑定,其实就是指用符号来去标识一个地址。比如说 int a = 6,这样一句代码,用a来标识一个块4个字节大小的空间,空间里边存放的内容就是6。

重定位
重新计算各个目标的地址过程叫做重定位,重定位分为以下两步:

  1. 合并相同类型的节,然后链接器将运行时的内存地址赋给新的聚合节。这一步完成,程序中的每条指令和全局变量都有唯一的运行时内存地址了。
  2. 链接器修改代码节和数据节中对于每个符号的引用,使得他们指向正确的运行时地址。

http://www.ppmy.cn/news/112715.html

相关文章

c语言源程序最多可能由组成,一个c语言源程序是由什么组成_后端开发

golang的优势是什么?_后端开发 golang的优势:可直接编译成机器码,不依赖其他库,glibc的版本有一定要求,部署就是扔一个文件上去就完成了;丰富的标准库,Go目前已经内置了大量的库,特别…

mmaction2行为识别综述

行为识别综述 目前行为识别领域的最佳模型还没有一个统一的标准。不同的数据集和任务需要不同的模型来进行处理,而且不同的模型都有其优缺点。以下列出一些在行为识别领域中常用的模型: 二维卷积神经网络(2D CNN):在…

使用Eclipse统计自己项目程序代码量【实测可用】

使用Eclipse统计项目代码量 最近在申请软著,在填写申请表的时候有一栏要填项目代码量,自己之前从未统计过,心血来潮开始各种找统计代码量的方法 因为项目使用的Eclipse开发的,所以第一时间找插件,但是发现人家Eclipse自…

c语言源程序的基础单位,c源程序的基本单位是什么

c源程序的基本单位是函数. C语言源程序是由:数据类型、常量与变量、数组、指针、字符串、文件输入/输出、运算构成。 1、数据类型 C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和…

软件著作权统计源程序量,统计php代码行数

echo <pre>; // 统计php代码行数 function countLine($dir) {$count 0;if (is_dir($dir)) { $files scandir($dir);foreach ($files as $file) {if ($file[0] .) continue;$file $dir . "/" . $file;if (is_dir($file)) {$count countLine($file);} else …

申请软著源程序量一般填多少

一、申请软著源程序量一般填多少   综上所述小编提醒您&#xff0c;所以伪造病历不仅违反了病历书写规范的要求&#xff0c;而且在医疗纠纷中是作为证据使用的&#xff0c;如有证据证明&#xff0c;医院伪造病历&#xff0c;可以认定医院在医疗纠纷中存在过错&#xff0c;医院…

搭建一个vuepress静态网站及配置

搭建一个vuepress静态网站及配置 一、搭建一个vuepress网站1、创建并进入一个新目录2、初始化3、安装依赖4、创建文档5、配置启动命令及启动6、展示效果 二、配置及丰富vuepress网站1、增加配置文件2、配置侧边栏目录3、使用部分markdown语法完善页面 一、搭建一个vuepress网站…

Xftp Xshell 绿色版中文直接下载

链接&#xff1a;点赞获取谢谢 提取码&#xff1a;vsd1