【实验】编译原理——编译器认知实验
系列文章目录
学习笔记
【学习笔记】编译原理——第一章 编译引论
【学习笔记】编译原理——第二章 词法分析
实验
【实验】编译原理——编译器认知实验
文章目录
- 系列文章目录
- 学习笔记
- 实验
- 一、实验目的
- 二、实验内容
- 三、实验步骤
- 实验结果
- 4.1 G++
- 4.2 LLVM
- 4.3 G++编译器优化
- 4.4 LLVM编译器优化
- 4.5 G++和LLVM优化对比
- 五、实验心得
一、实验目的
本实验的目的是了解工业界常用的编译器 GCC 和 LLVM,熟悉编译器的安装 和使用过程,观察编译器工作过程中生成的中间文件的格式和内容,了解编译器 的优化效果,为编译器的学习和构造奠定基础。
二、实验内容
本实验主要的内容为在 Linux 平台上安装和运行工业界常用的编译器 GCC 和 LLVM,如果系统中没有安装,则需要首先安装编译器,安装完成后编写简单的测 试程序,使用编译器编译,并观察中间输出结果。
对于 GCC 编译器,完成编译器安装和测试程序编写后,按如下步骤完成:
查看编译器的版本
使用编译器编译单个文件
使用编译器编译链接多个文件
查看预处理结果:g++ -E hello.c -o hello.i
查看语法分析树:g+±fdump-tree-all hello.c
查看中间代码生成结果:Code generation result: g+±fdump-rtl-all hello.c
查看生成的目标代码(汇编代码):g++–S hello.c –o hello.s
对于 LLVM 编译器,完成编译器安装和测试程序编写后,按如下步骤完成:
查看编译器的版本
使用编译器编译单个文件
使用编译器编译链接多个文件
查看编译流程和阶段:clang -ccc-print-phases test.c -c
查看词法分析结果:clang test.c -Xclang -dump-tokens
查看词法分析结果 2:clang test.c -Xclang -dump-raw-tokens
查看语义分析结果:clang test.c -Xclang -ast-dump
查看语义分析结果 2:clang test.c -Xclang -ast-view
查看编译优化的结果:clang test.c -S -mllvm -print-after-all
查看生成的目标代码结果: clang test.c –S
三、实验步骤
- 编译器安装
在Linux系统下安装GCC、Clang、LLVM。sudo apt-get install Clang sudo apt-get install LLVM
- 编写测试程序
需要注意的是,不但要求对单个 C 文件进行编译,还要求对多个 C 文件一起编译和链接。 - 运行编译器进行观测
分别运行 GCC 和 LLVM 编译器,首先要学习编译器的基本使用方法,其次要通过编译选项查看分析编译器的中间结果,及其与输入源码之间的对应关系,最后使用-O0、-O1、-O2 和-O3 分别使用两个编译器对输入程序进行优化编译,并对比 GCC 和 LLVM 优化后程序的运行效率。 - 编写实验报告
根据观测结果编写实验报告。
实验结果
4.1 G++
①查看编译器版本
在Visual Studio Code中查看G++编译器版本
②编译单个文件
③编译链接多个文件
④查看预处理结果:g++ -E hello.cpp -o hello.i
⑤查看语法分析树:g+±fdump-tree-all hello.cpp
在hello.cpp.001t.tu中生成相关语法树,部分文件内容
⑥查看中间代码生成结果: g++ -fdump-rtl-all hello.cpp
编译生成如下文件:
在hello.cpp.192r.expand文件中可以看到如下代码,目的是使得内存边界对齐。
⑦查看生成的目标代码(汇编代码):g++ -S hello.cpp -o hello.s
运行命令生成hello.s文件,虽然目前还未学过汇编代码,但是能够看到我们在源码中定义的变量name和number均以.string的形式在汇编代码中出现。
4.2 LLVM
①查看编译器的版本
运行clang –version 和clang++ --version都能查看到编译器的版本。
②使用编译器编译单个文件
略
③使用编译器编译链接多个文件
略
④查看编译流程和阶段:clang++ -ccc-print-phases hello.cpp -c
⑤查看词法分析结果:clang++ -c hello.cpp -Xclang -dump-tokens
Loc=XXXX 表示该字符或字符串所对应的行数及位置
Int ‘int’ , 表⽰ int 代表整型
Identifier ‘main’, 表⽰ main 是⼀个标识符
numeric_constant ‘XXXXXX’,表⽰数值常量
l_paren ‘(‘ , 表示左括号
⑥查看词法分析结果 2:clang test.c -Xclang -dump-raw-tokens
可以看到词法分析2比词法分析1更加详细,比如对空格‘ ’也同样进行了分析。
⑦查看语义分析结果:clang test.c -Xclang -ast-dump
语义分析部分终端显示较多,以下截取部分进行展示:
可以看到,从命名空间开始分析
UsingDirectiveDecl 0x35e7158 <hello.cpp:4:1, col:17> col:17 Namespace 0x2fa7ab8 ‘std’
再到分析函数,FunctionDecl 0x35e71c8 <line:6:1, col:16> col:5 BubbleSort ‘int (void)’
层层分析,最后到定义的字符串
StringLiteral 0x35e73a8 col:19 ‘const char [12]’ lvalue “XXXXXX”
⑧查看编译优化的结果:
部分代码如图所示:
⑨查看生成的目标代码结果: clang++ hello.cpp –S
查看生成的汇编代码:
4.3 G++编译器优化
⽤编写的100*100矩阵相乘的C++代码,使用G++编译器并⽤不同编译优化选项,如分别运行以下命令:
g++ matrix.cpp -O0 -o matrix0
g++ matrix.cpp -O1 -o matrix1
g++ matrix.cpp -O2 -o matrix2
g++ matrix.cpp -O3 -o matrix3
运行结果如图所示:
时间对比如下:
可以看出 O1,O2,O3 三种优化选择能够明显提升矩阵乘法运算的效率。
4.4 LLVM编译器优化
⽤编写的100*100矩阵相乘的C++代码,使用LLVM编译器并⽤不同编译优化选项,如分别运行以下命令:
clang++ matrix.cpp -o clang_matrix
clang++ matrix.cpp -O0 -o clang_matrix0
clang++ matrix.cpp -O1 -o clang_matrix1
clang++ matrix.cpp -O2 -o clang_matrix2
clang++ matrix.cpp -O3 -o clang_matrix3
运行结果如下图所示:
时间对比如下:
可以看出 O1,O2,O3 三种优化选择能够明显提升矩阵乘法运算的效率。
4.5 G++和LLVM优化对比
由上述柱状图可以看出,在矩阵乘法这个程序上,在相同规模的情况下,在⽆优化,和 -O0 优化的编译情况下,G++编译器的运行时间小于LLVM编译器。在 O2,O3 优化的编译情况下,两者的效率不分上下。但是在O1优化情况下G++效率比LLVM大得多,程序运行时间更短。
五、实验心得
①通过本实验,我了解了编译过程中的每个过程⽣成的⽂件,
②了解了编译器的常⽤选项,包括⼀些优化参数
③通过使用不同的编译器,调用不同的优化参数,体会到这些参数对程序运行带来的不同影响
【实验】编译原理——编译器认知实验相关推荐
- 编译原理实验二、 编译器认知实验报告
目录 一.实验目的 二.实验内容 三.实验环境 四.数据准备 五.实验过程描述
- 编译原理:词法分析实验报告
词法分析实验报告 文章目录 词法分析实验报告 一.实验目的 二.实验原理 三.实验要求 四.实验步骤(利用Java语言来进行词法分析) ① 待分析的语言词法 ② 单词符号对应的种别码 ③ 词法分析程序 ...
- 【编译原理】【实验】利用子集法构造DFA
利用子集法构造DFA 一.实验目的 二.实验要求.内容 三.实验设备 四.实验原理(或程序框图)及步骤 五.程序源代码 六.实验数据.结果分析 七.存在的问题与体会 附录 一.实验目的 掌握将非确定有 ...
- 算符优先文法编写java语法分析器,编译原理课程设计实验报告——基于算符优先分析方法的表达式语法分析器...
内容简介: 一.设计目的 了解用算符优先法对表达进行语法分析的方法,掌握自顶向下的预测语法分析程序的手工构造方法. 二.设计内容 对简单表达式文法构造算符优先分析器. 三.设计要求 1.对下列简单表达 ...
- 【编译原理】课程实验——基于Java的词法分析与语法分析
⭐⭐⭐⭐⭐⭐ Github主页
- 编译原理语法分析器实验报告
编号: 实习 一 二 三 四 五 六 七 八 九 十 总评 教师签名 成绩 第一部分 语言语法规则 Mini语言包含程序设计所需要的最基本语言成分,包括 程序定义语句 :以 program 开头 en ...
- 编译原理 —— 编译器各阶段工作
1. 词法分析 词法分析器根据词法规则识别出源程序中的各个记号(token),每个记号代表一类单词(lexeme).源程序中常见的记号可以归为几大类:关键字.标识符.字面量和特殊符号.词法分析器的输入 ...
- 编译原理SNL语言编译器实验报告
完成实验内容 实验要求: (1)设计并实现SNL程序设计语言的编译程序 (2)四个必做: 词法分析模块 语法分析模块(递归下降方法) 语法分析模块(LL(1)方法) 语义分析模块 (3)编程语言不限 ...
- 编译原理实验:自上而下语法分析
编译原理实验:自上而下语法分析 1. 实验题目:自上而下语法分析 实验目的 实验内容 实验要求 输入输出 2. 设计思想 3. 算法流程 4. 源程序 5. 调试数据 1. 实验题目:自上而下语法分析 ...
最新文章
- python ~ not 的区别 :前者按位取反,后者是逻辑‘与或非’的‘非’
- cnblogs第一篇
- 数据库mongodb和mysql对比
- android fastjson漏洞_【漏洞预警】Fastjson 远程代码执行漏洞(暂无PoC)
- python xlrd读取excel-使用Python xlrd模块读取Excel格式文件的方法
- python3中数字类型有哪些_python全栈_009_Python3基本数据类型--列表(示例代码)
- azm335x 串口配置
- Diagrams for Mac(原生流程图制作工具)
- webpack@3.6.0(4) -- 配置模块化开发
- 【动态规划】数位DP入门题:不要62
- 【图像去噪】基于matlab改进非局部均值红外图像混合噪声【含Matlab源码 1640期】
- 嵌入式工程师需不需要学java_嵌入式开发工程师需要具备哪些素质和技能基础?...
- 钉钉安装需要管理员权限报错解决办法
- 五种网站Web服务器技术和网页设计技术
- 科研第二步:远程在服务器上跑程序jupyter使用
- VirtualProtect 3方法 -seh ret-ASLR-dep-Adrenalin Player 2.2.5.3
- C++11之decltype
- author-头文字注释
- 新兴技术abcdefg_智能技术如何掩盖新兴的公司控制时代
- vue项目接入监控视频(360浏览器)