没有合适的资源?快使用搜索试试~ 我知道了~
预备工作实验报告1
需积分: 0 0 下载量 61 浏览量
2022-08-08
23:18:00
上传
评论
收藏 583KB DOCX 举报
温馨提示
试读
13页
(a) (b) (c)图1 simple.c的CFG, (a)原始CFG,(b)SSA后的CFG,(c)完全优化后的CFG由于该程序较为简单,优化前后代码流程不
资源详情
资源评论
资源推荐
实验预备工作实验报告
徐云凯 1713667
摘要
GCC 编译器是使用最广泛的 C/C++编译器。GCC 编译器编译 C 语言程序主要分为
预处理、编译、汇编、链接 4 个主要阶段。本预备工作通过使用 GCC 编译 3 个自
己编写的简单 C 语言程序,在分步骤编译和逐步尝试各种参数的过程中探索 GCC
编译器的技术细节,为之后自己制作编译器打下基础。
关键词:编译原理 GCC 编译器 编译优化
预备工作实验报告 徐云凯
1
一、 引言
编译器对代码的处理主要分为预处理、编译、汇编、链接几个部分。其中预处理器
去除注释,将#include、#define、#ifdef 等预处理指令替换为相应的代码块,该步骤不进
行代码优化调整。编译器进行词法分析、语法分析、语义分析、中间代码生成、代码优
化与代码生成等步骤后,将高级语言翻译为汇编代码,该步骤可以借助 AST 树分析语
法结构,检查类型错误等语法错误;借助 CFG 图等结构优化程序流程,进行代码优化。
汇编器将汇编代码转化为对应平台的机器指令。链接器将机器指令进行连接,形成完整
的可执行文件。
在探索过程中,通过由简单到复杂的顺序。先后构建不含 include 语句的最简单程
序,查看编译各个阶段输出的文件,以了解编译输出文件含义。随后构建具有 include
语句,代码流程有优化空间的代码,运行并测试在不同优化条件,不同参数下的输出结
果。
二、 编译流程分析
2.1. 使用不含 include 语句的简单程序探索输出文件含义
当文件中包含 include 时,预处理之后代码会加入大量 c 语言库文件,从而变得极
其复杂难以分析其具体含义。这里先编写了一段简单的不包含头文件的程序初步探索编
译器各个部分的作用。
1 // simple.c
2 void main() {
3 int n = 100;
4 while(n > 0)
5 n--;
6 }
此段代码经过预处理后可以得到如下 simple.i 文件# 1 "simple.c"
1 # 1 "<built-in>"
2 # 1 "<command-line>"
3 # 31 "<command-line>"
4 # 1 "/usr/include/stdc-predef.h" 1 3 4
5 # 32 "<command-line>" 2
6 # 1 "simple.c"
7 void main() {
预备工作实验报告 徐云凯
2
8 int n = 100;
9 while(n > 0)
10
11 n--;
12 }
13
由于没有#include <stdio.h>,这里预处理器做的基础操作变得简单明了。预处理器删
除注释代码,替换宏定义等预处理指令(这里不涉及),在文件头添加了一些以“#”开
头的行同步指令,它们帮助 gcc 为#included 文件中的错误提供正确的错误消息。其含义
如下:
# line-number "source-file" [flags]
flags
标志的含义(空格分隔):
1 -
开始新文件
2 -
返回上一个文件
3 -
以下文本来自系统头文件(
#include <> vs #include
“”)
4 -
以下文本应被视为包含在隐式
extern
“
C
”块中。
在探索预处理器的过程中,有一些有意思的发现。一些诸如 unix,vax,linux 等字
符串,即便没有任何#define 语句,没有#include 任何文件,它们在 gcc 编译器中都会被
默认认为是宏。比如 linux 会被 gcc 的预处理器自动替换为 1。这是由于早期的 C 语言
(1989 年 ANSI C 标准出台前)对于编译目标平台的标记方式没有严格约束,GNU 编
译器的实现方式是将对应平台字符串作为宏定义进入预处理器,并且默认开发者会避开
这些字符串。而在 1989 年 ANSI C 标准出台后,限制了编译器对符号的使用,编译器中
预定义宏的符号只能以两个下划线开头,或者一个下划线后紧接着大写字母。目前在 gcc
中想要避免这些字符串被替换,应当在编译时使用-std=c90 -pedantic 参数明确 C 语言标
准。
随后,对源码进行语法分析,并绘制控制流程图。
使用“-fdump-tree-original-raw”参数生成抽象语法树如下(simple.c.003t.original)
1 ;; Function main (null)
2 ;; enabled by -tree-original
3
4 @1 bind_expr type: @2 vars: @3 body: @4
5 @2 void_type name: @5 algn: 8
6 @3 var_decl name: @6 type: @7 scpe: @8
剩余12页未读,继续阅读
史努比狗狗
- 粉丝: 25
- 资源: 318
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0