程序员的自我修养——(2)编译与链接

本文详细介绍了程序员在构建过程中涉及的编译和链接步骤,包括预编译、编译、汇编和链接。编译阶段包括词法分析、语法分析、语义分析和优化,生成中间代码和目标代码。链接阶段解决不同模块间的符号引用,进行重定位,最终生成可执行文件。文章探讨了预处理的作用,如宏展开和处理#include,以及汇编器如何将汇编代码转换为机器指令。
摘要由CSDN通过智能技术生成

构建

构建build 是 ide里的词,构建 = 编译 + 链接。

一个gcc 1.c,其实是: 预处理 + 编译 + 汇编 + 链接

预编译

源文件,被预编译器cpp 编译成: .i文件。 gcc -E 1.c -o 1.i

  • 展开所有的#define宏定义
  • 将#include所引用的文件,插入到 这条执行的位置。(这个过程是递归的,因为可以多层引用include)
  • 删除所有的注释
  • 添加行号和文件名标识:#1 "1.cpp",以便编译器产生错误后 可以显示行号的错误信息。
  • 保留#prama指令!! 因为编译器要使用它。

编译

他大致有2个事情:

  • 代码的优化
  • 汇总所有的符号 到 符号表。符号表非常重要! 你编译出错的信息,就要依靠于他
    所有.data段 里的变量名 都会产生符号; .text段里的函数名 也会产生符号(局部变量不会产生符号)

.i文件,被编译成:.s汇编代码 gcc -S 1.i -o 1.s
进行:词法、语法、语义 分析,指令优化。

现在的gcc,会把预编译 和 编译,合为一个步骤。由名为cc1的程序 来完成。

这个程序,在c叫做cc1,在c++叫做cc1plus,在java叫做jc1

汇编

.s文件,被汇编成:.o机器指令目标文件 gcc -c 1.s -o 1.o
由: 汇编器as完成。

每一条汇编语句, 都对应一条机器指令。 所以,as的汇编过程 没有编译器复杂,不用做语义分析 指令优化等。
只需将 汇编指令 和 机器指令,一一对照翻译即可。

思考&

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值