OpenI 启智社区

启智社区,确实给力

当前位置:首页 > 学习 > 实训 >

编译原理和技术实践

编译原理和技术实践

  • 来源:中国科学技术大学
  • 章节:7 单元:19

  • 张昱

  • 黄奕桐

  • 刘硕

  • 徐伟

  • 陈金宝

  • 黄庄湫

  • 吴毓辰

  • 万嘉诚

  • 王原龙

  • 吴钰同
进入实训课程

课程简介:

编译原理介绍的是编译器构造的一般原理、基本设计方法和主要实现的技术。在实际教学或学习中,大家普遍认为编译原理和技术非常抽象且难学,剖析其重要原因就是实践环节的缺乏或薄弱。
虽然只有少数人从事构造或维护程序语言的编译器的工作,但正如 Alfred V.Aho 等在其编著的“ Compilers: Principles, Techniques, and Tools”(俗称“龙书”)中指出的,“编译器相关的模型、理论和算法具有十分普遍的意义,可以被应用到软件设计和开发中出现的各种各样的问题上”。
因此,提高编译原理和技术的学习质量对提升学生的软件以至计算机系统的设计和开发能力非常重要。而要想提高学习质量,就需要重视和加强实践。
中国科学技术大学《编译原理和技术》教学团队长期以来坚持对该课程,特别是其实践内容进行持续改革,已建设出多套循序渐进、规模适度、“综观全局、实现局部”且强调工程质量规范的课程实践项目。本实践课程就荟萃了该教学团队研制的贴近工业界需求、配合编译原理线上或线下课程教学、以循序渐进开发编译器为目标的系列线上实训。

主要实践内容


* (1)围绕单词识别,开展三种词法分析器的构造,包括手工构造词法分析器以及分别利用 Flex词法分析器生成工具产生词法分析器源码;
* (2)基于 Flex为一个实验语言构造能生成抽象语法树(AST)的程序(可先构造检查输入程序合法性的分析器,再按语法制导翻译技术生成AST);
* (3)基于 ANTLR为实验语言构造词法分析器和生成分析树的语法分析器,然后引导学员学习并使用访问者模式实现由分析树生成 AST;
* (4)继续使用访问者模式从 AST 生成基于 LLVM IR的中间代码表示,而后对接 LLVM这一编译器基础设施,从而利用 LLVM优秀的编译器后端。
* (5)本教学团队提供基于LLVM的驱动器框架应用编程接口构建编译器、程序分析器或优化器。框架中定义了可扩展的Driver类,它调用Clang/LLVM API实现对输入的源程序文件的解析,产生AST、LLVM IR等中间表示,并在这些中间表示上开展程序分析和变换。
通过开展以上部分实训,可引导学员逐步完成一个将用实验语言编写的程序解析输出对应的 LLVM IR`SysYF--`的函数参数类型仅支持int/float,而`SysYF`的函数参数还可以是数组类型。

实验特色


与其它传统实验相比,本实践课程引入的实训项目融入了现代编译器的解决方案 ANTLR4 以及 [LLVM](http://llvm.org/)。其一方面引导学习者接触业界常用的工具和技术,另一方面使学习者在了解现有编译工具的同时,关注于编程语言的上层设计与实现。

课程章节:

第1章 预备实验

本实训项目包含一些利用 C 语言编译运行环境开展的练习。你将通过练习理解 C 程序的编译以及输出的各种程序表示。

第2章 词法分析

本实训项目围绕关系运算符及其他符号的单词识别,开展三种词法分析器的构造,包括手工构造的词法分析器以及分别利用 Flex、ANTLR 词法分析器生成工具产生词法分析器源码。你需要结合实训,体会并比较这些方法的异同。

第3章 高级语言特性的学习与理解

本章提供多个可选的实训,通过这些实训,你将学习和理解在后续实验中要用到的C++智能指针、运行时类型信息(RTTI)等机制。这些是C++11以来的新语言特性,在分析器的生成工具ANTLR、编译器的基础设施LLVM中被广泛使用。你也将学习和理解多线程的编程基础。

第4章 语法分析器的构建

本章提供多种实训项目,你可以选择性地使用分析器的生成工具Flex和Bison、或者ANTLR来为实验语言构造分析器。这里提供了几种实验语言,包括表达式语言、C1语言、SysYF语言、SysYF--语言等,你可以扩展增加你要实现的语言特征。 在各实训中,你将学习并逐步掌握如何为一个实验语言构建一个能生成语法树的分析器。你将通过编写描述语言文法的描述文件,使用分析器的生成工具生成相应的分析器源码,该分析器能为合法的输入程序输出对应的分析树(parse tree)或抽象语法树(abstract syntax tree, AST)。

第5章 符号表管理与语义检查

本章提供多个实训项目,为指定的实验语言以及语言特征进行语义检查。

第6章 中间代码及中间代码生成器

本章提供对LLVM IR这种中间语言的介绍,并提供多个实训项目。你将在实训项目中,通过实现抽象语法树的访问者,为实验语言构建 LLVM IR 代码生成器、或者为实验语言构建本教学团队提供的中间表示。

第7章 LLVM驱动程序及程序分析

本章介绍本教学团队设计的基于Clang/LLVM的编译器驱动程序框架,该框架定义了可扩展的Driver类,它调用Clang/LLVM API实现对输入的源程序文件的解析,可产生Clang AST、LLVM IR,打印控制流图和支配DAG;提供AST上的类myAnalysisAction进行除0检查,并支持添加新的Checker;提供LLVM IR层次的分析示例进行循环的查找,并支持添加对IR的新的分析和优化。 实验的框架代码见 https://gitee.com/s4plus/llvm-ustc-proj/blob/master/my-llvm-driver/README.md 。