程序环境--翻译+执行

news/2025/2/21 6:58:55/

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函数;也有可能是意外终止

目录

预处理:

编译:

汇编:

链接:

 运行/执行环境



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

相关文章

【PyTorch】教程:Transfer learning

Transfer learning 实际工作中&#xff0c;只有很少的人从头开始训练 CNN&#xff0c;因为很难获得大量的样本。一般情况下&#xff0c;会通过调用预训练模型&#xff0c;例如 ConvNet 在 ImageNet&#xff08;1.2 M 图像 1000 个类别&#xff09;,可以用 ConvNet 初始化&#…

每日go语言面试题一

1.Redis Multi实现原理 redis中的multi是为了实现redis独特的事务而存在的&#xff0c;底层是有一个队列&#xff0c;将Multi后面的命令先进先出的顺序加入队列&#xff0c;在执行exce命令&#xff0c;将队列中的命令取出执行。配合redis完成事务的命令还有watch&#xff08;会…

并发线程、锁、ThreadLocal

并发编程并发编程Java内存模型&#xff08;JMM&#xff09;并发编程核心问题—可见性、原子性、有序性volatile关键字原子性原子类CAS(Compare-And-Swap 比较并交换)ABA问题Java中的锁乐观锁和悲观锁可重入锁读写锁分段锁自旋锁共享锁/独占锁公平锁/非公平锁偏向锁/轻量级锁/重…

08讲 | 基于STM32单片机NBIOT定位实战项目

前言 绘制基于 STM32 单片机的 NBIOT 实战开发板。 文章目录前言一、原理图1、绘制1&#xff09;电源供电a、USB 转 TTL 电路b、锂电池充电管理电路c、3.3V电压转换电路d、一键开关机电路2&#xff09;单片机最小系统3&#xff09;ADC电压转换电路4&#xff09;NBIOT 模组串口电…

【C++】类和对象(第一篇)

文章目录1. 面向过程和面向对象初步认识2.类的引入3.类的定义3.1 类的两种定义方式3.2 成员变量命名规则建议4. 类的访问限定符及封装4.1 访问限定符4.2 封装5. 类的作用域6. 类的实例化7. 类对象模型7.1 类对象大小的计算7.2 类对象的存储方式猜测7.3 结构体内存对齐规则复习8…

python(15)--函数设计

前言 函数是可重用的程序代码块。 函数的作用&#xff0c;不仅可以实现代码的复用&#xff0c;还可以保证修改函数的代码时&#xff0c;所有调用该函数的地方都能得到体现。目前我已知函数的作用是&#xff1a;对代码实现了封装、函数调用、传递参数、返回计算结果等。 正文 …

软件测试标准流程

软件测试的基本流程大概要经历四个阶段&#xff0c;分别是制定测试计划、测试需求分析、测试用例设计与编写以及测试用例评审。因此软件测试的工作内容&#xff0c;远远没有许多人想象的只是找出bug那么简单。准确的说&#xff0c;从一个项目立项以后&#xff0c;软件测试从业者…

shell的变量和引用

文章目录二、变量和引用2.1 什么是变量2.2变量的命名2.3 变量的类型2.3.1 根据数据类型分类2.3.2 根据作用域分类2.4 变量的定义2.5 shell中的引用2.6 变量的运算练习&#xff1a;二、变量和引用 在程序设计语言中&#xff0c;变量是一个非常重要的概念。也是初学者在进行Shel…