程序环境--翻译+执行
创始人
2024-05-24 15:44:02
0

ANSI C标准下,有两种程序环境。

第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。

翻译环境包括:预处理(预编译)+编译+汇编+链接。四个步骤。
第2种是执行/运行环境,它用于实际执行代码。

链接库分为动态和静态链接库,库(Library)其实是库文件,库文件中是常用的函数或者类,#include<>包含的是库函数,二者不是完全相同的。

链接库,是将开源的库文件进行编译链接后得到的二进制文件,不能独立运行,必须等到其它程序调用,才会被载入内存。这里不详细讲述库的知识。

VS中,编译器--cl.exe      链接器--link.exe

 预处理只会处理#开头的语句,编译阶段只校验语法,链接时才会去找实体。

预处理:

相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有头文件(都已经被展开了)、宏定义(都已经替换了),没有条件编译指令(该屏蔽的都屏蔽掉了),没有特殊符号的输出文件,没有注释,这个文件的含义同原本的文件无异,只是内容上有所不同。(都是文本操作)

即非二进制指令。

生成.i文件。

编译:

将预处理完的文件逐一进行一系列词法分析、语法分析、语义分析及优化后,产生相应的汇编代码文件。编译是针对单个文件编译的,只校验本文件的语法是否有问题,不负责寻找实体。

符号汇总。

生成.s文件。

汇编:

把汇编指令变成二进制机器指令

形成符号表。符号+对应地址。(符号表为后续链接寻址做准备)

生成.o文件。elf格式,一个文件形成几个不同的段,使用readelf工具。   

链接:

通过链接器将一个个目标文件(或许还会有库文件)链接在一起生成一个完整的可执行程序。 链接程序的主要工作就是将有关的目标文件彼此相连接,也就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。在此过程中会发现被调用的函数未被定义。需要注意的是,链接阶段只会链接调用了的函数/全局变量,如果存在一个不存在实体的声明(函数声明、全局变量的外部声明),但没有被调用,依然是可以正常编译执行的。

1、合并段表   2、符号表的合并和重定位。3、寻址(通过符号表寻址)

对调用的进行寻址,重定位,只声明的可以正常编译,执行

链接寻址时若找不到某调用的函数,则之后也找不到了,就会发生错误。

生成.exe文件。

声明外部没有的符号,可以正常执行,没有警告或报错。 

参考书籍《程序员的自我修养》

 运行/执行环境

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

目录

预处理:

编译:

汇编:

链接:

 运行/执行环境


相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...