编译原理的学习总结(默认编译c语言)

本文详述了从C源代码(.c文件)到可执行文件的四大步骤:预处理、编译、汇编与链接。预处理消除条件编译、宏定义及注释,编译将处理后的代码转化为汇编语言,汇编则将其转化为机器代码,最后链接解决函数调用等问题。

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

第一章 编译流程
.c文件 到可执行文件的第一步
1: 预处理过程
使源程序.c文件 没有条件编译 (即去除某一段不符合条件的代码块)
进行宏替换(将所有的宏定义 全部替换为确认值 或者函数)
头文件 的所有代码全部复制粘贴到.c文件中
忽略注释

预处理过程后 整个源程序文件 没有头文件 没有宏替换 没有条件编译 没有注释 只有纯粹的 语句或者理解为语句的语法

2:编译过程
这个过程的输入 就是 预处理过程中的 只有语法语句的文件 这个描述的是一个过程 指的是 将这个输入文件 ----->汇编语句或者是机器代码的过程 称为编译
将这个(预处理后的)文件 从左向右依次读取每一个字符 形成一个字符流 这个字符流作为下一个阶段的输入
由于编译过程非常复杂 这里阐述大致过程

总之编译结束后生成一个全是汇编代码的文件(obj 感觉上是对象文件 或者是 目标文件) 这个代码文件与操作系统无关也不是用来执行的 也是作为生成可执行文件的一个输入

3:汇编过程
这个过程就是将上一个阶段生成的汇编源代码 借助汇编指令转化为一个可重定位的机器代码
(注: 可重定位 在内存中的起始地址不固定 使得代码可以移植)

4:链接 / 加载
上一阶段生成的文件 如果是顺序执行的话 没有任何调用 比如全是声明变量语句或者是加减乘除 那么这一步 不要也可以 这一步解决的就是函数调用,引用其他文件 之类的 “引用问题” 你在某一个地方调用了某个函数 这个函数的定义在哪里? 这些事通过加载器 在可执行文件中增加 “指向” 函数定义的信息

这里将多个可重定位的机器代码文件(包括库文件 动态库DLL) 将修改后的指令和数据 加载到内存中去 可执行文件中只保留动态库的 “指针” ,只有调用信息
如此经历这四个转换过程 源代码文件可以被计算机识别成为一个可执行文件

以上全是个人理解 如果道友疑惑 欢迎讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值