C语言编译过程 || 4 stages of compiling a C program

C语言作为编译语言,用来向计算机发出指令,代码会经过4个环节,形成最终的文件

预处理
编译
汇编
链接
file.c
file.i
file.s
file.o
a.out
  1. 预处理
    展开头文件/宏替换/去掉注释/条件编译 >> test.i main.i
    编译预处理,也称预编译,g++ -E test.ii

  2. 编译
    检查语法,生成汇编 >> test.s main.s
    生成汇编 g++ -S target.s

  3. 汇编
    汇编代码转换成机器码 >> test.o main.o
    汇编 g++ -c target.o

  4. 链接
    链接生成可执行文件 >> a.out
    链接 g++ -o target

通过添加g++ --save-temps参数,保存编译过程中生成的所有中间文件

预处理

预处理命令:
在这里插入图片描述
以及预处理宏:

LINE 表示正在编译的文件的行号
__FILE__表示正在编译的文件的名字__DATE__表示编译时刻的日期字符串,例如: “25 Dec 2007”
TIME 表示编译时刻的时间字符串,例如: “12:30:55”
STDC 判断该文件是不是定义成标准 C 程序 我的vs2013不是定义的标准c语言

宏函数很好用,是直接展开,在这我顺便说一下宏的好处和坏处。
宏优点1代码复用性2提高性能
宏缺点1 不可调试(预编译阶段进行了替换),2无类型安全检查3可读性差,容易出错
在这里插入图片描述
宏函数很皮,#define定义一个比如判断大小,替换常量,很是方便。

不过我现在也就用下,#define ERROR_POWEROFF -1,#define _CRT_SECURE_NO_WARNINGS 1这样的和编译器有关的东西,不会去写宏函数,宏函数这东西,可读性特别差,在c++中,一般用const/枚举/内联去替代宏。
但是,define宏在某些方面真的是非常好用,我很推荐

添加链接描述

在Java中构建一个简单的C语言编译系统,基于管道和过滤器(Pipeline and Filter),可以分为以下几个步骤: 1. **设计架构**:该系统通常包含几个核心组件,如词法分析器、语法分析器(解析器)、优化器、汇编器和链接器。每个组件都可以看作是一个独立的Java进程或线程。 2. **管道通信**:通过Java的`ProcessBuilder`和`PipedInputStream/PipedOutputStream`等API,创建管道连接。例如,词法分析器将输出结果到输入流,供语法分析器处理。 3. **过滤器模式**:每个组件都是一个过滤器,它读取输入数据,执行特定任务并生成新的数据。数据在管道之间逐级传递,直到最后一个组件完成编译过程4. **错误处理**:Java进程需要能够捕获和处理错误,例如通过标准错误流(stderr)来报告编译错误。 5. **接口和抽象**:为了支持不同的编译阶段,你可以定义一些公共接口,让各个组件按照这些接口操作。 ```java // 概念性示例(简化版) public abstract class CompilerStage { public abstract void process(PipedOutputStream outputStream, PipedInputStream inputStream); } class LexicalAnalyzer extends CompilerStage { @Override public void process(...) { // 实现词法分析... } } class SyntaxAnalyzer extends CompilerStage { @Override public void process(...) { // 实现语法分析... } } // 简化编译流程 List<CompilerStage> stages = Arrays.asList(new LexicalAnalyzer(), new SyntaxAnalyzer()); for (CompilerStage stage : stages) { try (PipedInputStream input = new PipedInputStream(); PipedOutputStream output = new PipedOutputStream()) { stage.process(output, input); // 数据从上一阶段传递到当前阶段 } catch (IOException e) { handleException(e); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值