揭秘程序编译过程

过程

在这里插入图片描述

预处理

处理代码中存在的所有预处理程序指令。这些指令以#开头

首先从代码中删除了所有注释(出于人类可读性)
找到所有的#命令,并执行命令所说的内容

编译

编译器从预处理器获取输出,并负责执行以下重要任务。

  • 将输出传递给词法分析器,以识别文件中存在的各种标记。令牌只是程序中存在的文字,例如“ int”,“ return”,“ void”,“ 0”等。词法分析器还将令牌的类型与每个令牌相关联,无论令牌是字符串文字,整数,浮点数,if令牌等。

  • 将词法分析器的输出传递到语法分析器,以检查程序是否以满足程序所用语言的语法规则的方式编写。例如,在分析此行代码时,它将引发语法错误,

  • 将语法分析器的输出传递给语义分析器,该语义分析器将检查程序是否满足语言的语义,例如类型检查和变量在首次使用之前就已声明,等等。

  • 如果程序在语法上是正确的,则源代码将转换为指定目标体系结构的汇编指令。默认情况下,它会为其运行的计算机生成程序集。但是假设您正在为嵌入式系统构建程序,那么您可以传递目标计算机的体系结构,gcc将为该计算机生成程序集。

汇编

将程序集文件转换为目标文件(二进制文件)
得到 .o文件

链接

每个源代码文件都不会孤立地编写。它们必须具有某些函数,这些全局变量必须在某个文件中定义,并在其他文件的不同位置使用。

链接器的工作是收集所有目标文件,遍历每个目标文件并跟踪每个文件定义的符号以及使用的符号。它可以在每个目标文件的符号表中找到所有这些信息。收集了所有这些信息之后,链接器将创建一个目标文件,将每个目标文件中的所有部分组合到相应的部分中,并重新放置所有可以解析的符号。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值