SysY 语言是本实验的源语言。是一个 C 语言的子集,SysY 语言是单文件的,去除了 C 语言中的 include/define/pointer/struct 等较复杂特性。SysY 语言本身不具有 IO 功能,通过链接运行时库的方式进行 IO。
LLVM 是一个模块化的、可重用的编译器和工具链的集合,目的是提供一个现代的、基于 SSA 的、能够支持任意静态和动态编译的编程语言的编译策略。在最近几年已经成为表现上能够和 gcc 对标的项目。
LLVM IR 是 LLVM 项目中通用的中间代码格式,用于连接其他语言和目标体系架构 是 n*1*m 中的1
,(在目前的计划中)是学生需要从源语言中编译并翻译到的目标语言。
总共分为 6-7 次实验,实验之间具有先后关系,评测方式暂定为使用上届助教的评测机,大致实验内容为
- 维护评测系统
- 实验答疑
- 编写实验指导
- 编写示例编译器(会尽快)
LLVM 工具链的熟悉与使用
ANTLR 工具链的熟悉与使用
评测机的使用
词法分析与语法分析的小实验(token 与 表达式计算)
编写 LLVM 工具链的教程,编写 ANTLR 工具链的教程
指导学生从现有 LLVM IR 中选取需要的指令
介绍 LLVM IR 中最关键的几个概念(User Value Operand 等)
设计词法与语法分析的小实验(用于代替过去实验中的词法分析以及语法分析)
- part 1 设计实现从 AST 翻译到 LLVM IR 的架构,并实现最简单的从 main 函数的返回的 codegen Middle
- part 2 注释
- part 3 实现正号,负号
- part 4 实现四则运算及模运算
- part 5 局部变量与赋值
- part 6 调用函数
- part 7 if 语句与条件表达式
- part 8 作用域与块
- part ⑨ 全局变量
- part 10 循环语句
- part 11 continue、break 与代码回填
- part 12 一维数组、二维数组
- part 13 函数
- 14 mem2reg 20%
- 15 多维数组 10%
- 16 函数内联(因为没有函数声明,所以只有调用自身的递归,还是比较简单的)10%
- 17 短路求值(需要提前放出,不然到后面代码逻辑得大改)10%
- 满分 20% 不会溢出
每完成一次实验的内容,就应该上交一份(电子的,不允许超过字数限制的)实验报告,简要地介绍自己实现的思路以及主要参考的文献和代码。