系列文章目录

学习笔记

【学习笔记】编译原理——第一章 编译引论

【学习笔记】编译原理——第二章 词法分析

实验

【实验】编译原理——编译器认知实验


文章目录

  • 系列文章目录
    • 学习笔记
    • 实验
  • 一、实验目的
  • 二、实验内容
  • 三、实验步骤
  • 实验结果
    • 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

三、实验步骤

  1. 编译器安装
    在Linux系统下安装GCC、Clang、LLVM。

    sudo apt-get install Clang
    sudo apt-get install LLVM
    
  2. 编写测试程序
    需要注意的是,不但要求对单个 C 文件进行编译,还要求对多个 C 文件一起编译和链接。
  3. 运行编译器进行观测
    分别运行 GCC 和 LLVM 编译器,首先要学习编译器的基本使用方法,其次要通过编译选项查看分析编译器的中间结果,及其与输入源码之间的对应关系,最后使用-O0、-O1、-O2 和-O3 分别使用两个编译器对输入程序进行优化编译,并对比 GCC 和 LLVM 优化后程序的运行效率。
  4. 编写实验报告
    根据观测结果编写实验报告。

实验结果

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大得多,程序运行时间更短。

五、实验心得

①通过本实验,我了解了编译过程中的每个过程⽣成的⽂件,
②了解了编译器的常⽤选项,包括⼀些优化参数
③通过使用不同的编译器,调用不同的优化参数,体会到这些参数对程序运行带来的不同影响

【实验】编译原理——编译器认知实验相关推荐

  1. 编译原理实验二、 编译器认知实验报告

    目录 一.实验目的 二.实验内容 三.实验环境 四.数据准备 五.实验过程描述

  2. 编译原理:词法分析实验报告

    词法分析实验报告 文章目录 词法分析实验报告 一.实验目的 二.实验原理 三.实验要求 四.实验步骤(利用Java语言来进行词法分析) ① 待分析的语言词法 ② 单词符号对应的种别码 ③ 词法分析程序 ...

  3. 【编译原理】【实验】利用子集法构造DFA

    利用子集法构造DFA 一.实验目的 二.实验要求.内容 三.实验设备 四.实验原理(或程序框图)及步骤 五.程序源代码 六.实验数据.结果分析 七.存在的问题与体会 附录 一.实验目的 掌握将非确定有 ...

  4. 算符优先文法编写java语法分析器,编译原理课程设计实验报告——基于算符优先分析方法的表达式语法分析器...

    内容简介: 一.设计目的 了解用算符优先法对表达进行语法分析的方法,掌握自顶向下的预测语法分析程序的手工构造方法. 二.设计内容 对简单表达式文法构造算符优先分析器. 三.设计要求 1.对下列简单表达 ...

  5. 【编译原理】课程实验——基于Java的词法分析与语法分析

    ⭐⭐⭐⭐⭐⭐ Github主页

  6. 编译原理语法分析器实验报告

    编号: 实习 一 二 三 四 五 六 七 八 九 十 总评 教师签名 成绩 第一部分 语言语法规则 Mini语言包含程序设计所需要的最基本语言成分,包括 程序定义语句 :以 program 开头 en ...

  7. 编译原理 —— 编译器各阶段工作

    1. 词法分析 词法分析器根据词法规则识别出源程序中的各个记号(token),每个记号代表一类单词(lexeme).源程序中常见的记号可以归为几大类:关键字.标识符.字面量和特殊符号.词法分析器的输入 ...

  8. 编译原理SNL语言编译器实验报告

    完成实验内容 实验要求: (1)设计并实现SNL程序设计语言的编译程序 (2)四个必做: 词法分析模块 语法分析模块(递归下降方法) 语法分析模块(LL(1)方法) 语义分析模块 (3)编程语言不限 ...

  9. 编译原理实验:自上而下语法分析

    编译原理实验:自上而下语法分析 1. 实验题目:自上而下语法分析 实验目的 实验内容 实验要求 输入输出 2. 设计思想 3. 算法流程 4. 源程序 5. 调试数据 1. 实验题目:自上而下语法分析 ...

最新文章

  1. python ~ not 的区别 :前者按位取反,后者是逻辑‘与或非’的‘非’
  2. cnblogs第一篇
  3. 数据库mongodb和mysql对比
  4. android fastjson漏洞_【漏洞预警】Fastjson 远程代码执行漏洞(暂无PoC)
  5. python xlrd读取excel-使用Python xlrd模块读取Excel格式文件的方法
  6. python3中数字类型有哪些_python全栈_009_Python3基本数据类型--列表(示例代码)
  7. azm335x 串口配置
  8. Diagrams for Mac(原生流程图制作工具)
  9. webpack@3.6.0(4) -- 配置模块化开发
  10. 【动态规划】数位DP入门题:不要62
  11. 【图像去噪】基于matlab改进非局部均值红外图像混合噪声【含Matlab源码 1640期】
  12. 嵌入式工程师需不需要学java_嵌入式开发工程师需要具备哪些素质和技能基础?...
  13. 钉钉安装需要管理员权限报错解决办法
  14. 五种网站Web服务器技术和网页设计技术
  15. 科研第二步:远程在服务器上跑程序jupyter使用
  16. VirtualProtect 3方法 -seh ret-ASLR-dep-Adrenalin Player 2.2.5.3
  17. C++11之decltype
  18. author-头文字注释
  19. 新兴技术abcdefg_智能技术如何掩盖新兴的公司控制时代
  20. vue项目接入监控视频(360浏览器)

热门文章

  1. 【C语言程序设计】实验 7
  2. Mavenir融合分组核心解决方案将为德国电信在德国的5G独立组网(SA)网络提供支持
  3. 图文:微博平台首席架构师杨卫华演讲
  4. P3654 First Step (ファーストステップ)——暴力枚举
  5. rpm包管理器常见用法
  6. C语言 精典数值算法程序合集
  7. Java 这一年都经历了什么?
  8. PHP没你想的那么差
  9. java ajax教程_AJAX Java
  10. UBLOX F9P搭建NtripCaster组建RTK