APP下载

研究生编译课程教学探讨

2011-12-31黄春赵克佳

计算机教育 2011年14期

  摘要:随着计算机技术的不断发展,尤其是计算机体系结构的发展,编译器面临极大的挑战。这要求我们进一步加强和发展编译教学,在研究生阶段开设编译高阶课程。本文介绍国防科学技术大学研究生高级编译技术课程,包括课程内容、安排和实践,给出了国际其他大学开设研究生阶段编译课程的情况介绍。
  关键词:高级编译技术;编译优化;并行编译
  
  为了保证国家安全,提高计算机核心竞争力,国家对CPU、基础软件研制的支持力度不断增强,863计划、“核高基”重大专项都包含编译器项目,以开发自主可控、支持国产CPU的高效编译器。
  随着计算机技术不断发展,编译器在未来50年,主要面临两个挑战:一是程序优化,尤其是多核/众核体系结构的优化,使并行程序成为主流;二是提高程序的正确性和安全性[1]。
  《编译器研究:未来50年》[1]指出:为了迎接编译器研究中的挑战,编译器领域需要一个由全球工业界、国家实验室和大学联合参加的研究计划,并给出了四项建议。其中一项就是开发与编译技术相关的课程,即除了本科编译课程外,开设高级编译技术课程作为计算机科学与技术高年级研究生选修课程,或者在一些计算机科学课程中,讨论编译算法,关注基于编译器的分析。例如在可信计算中,讨论如何通过编译技术提高程序的可信性。在体系结构中,关注体系结构如何与编译器进行交互。
  本文介绍了我校面向研究生的高级编译技术课程设置和组织,并和国际上的同类课程进行了比较。
  1课程定位
  国内外大学计算机专业在本科阶段都开设了编译课程,这些课程多数重点讲述与语言分析相关的部分(词法分析、语法分析、语义分析等),对程序分析和优化的介绍则比较简单。这样的课程可以让学生理解一般性的编译过程及其原理,但对于需要深入掌握计算机系统软/硬件核心技术的研究生而言则显不足。因为一个现代的优化编译器不只是将源语言编译为目标语言,重要的是将其编译为能充分发挥计算机性能的高质量目标语言。这一目标主要依靠编译优化来完成。在现代编译器中,编译优化部分占的比重往往是最大的,例如,GCC4.5中,2/3左右的代码都是优化和运行时库。此外,编译优化也是编译研究中最具挑战性的内容,计算机体系结构的每一个重大变化都需要编译优化来应对。为此,我们为研究生专门开设了高级编译技术课程。
  高级编译技术课程主要介绍优化编译器的设计与实现的基础理论与方法,重点是编译优化和代码生成技术,并使学生了解编译领域的最新研究进展。通过本课程的学习和实践,学生将掌握编译构建和编译优化技术,包括程序分析、编译优化、代码生成以及运行时系统。本课程将为学员较快进入编译相关科研课题、完成科研工作提供良好的基础。
  2课程设置和安排
  国防科大一直从事巨型机的研制,这要求必须研制针对并行体系结构的优化编译器。因此,我院从2000年开始,就设置了高级编译技术这一课程。课程设置伊始,以沈志宇等撰写的《并行编译方法》[2]作为教材,主要讲授并行编译的相关知识,重点是依赖关系分析、循环并行化和向量化、并行编译和运行时库优化。随着计算机的不断发展,针对目前编译领域的研究现状,从2007年开始,我们重新修订了高级编译技术的教学大纲,将重点从并行编译转向更通用的编译优化,把并行编译作为一个专题讲座,不仅面向未来从事编译研究的学生,也为学生从事体系结构、可信计算等方向的研究打下良好的基础。
  2.1课程内容
  高级编译技术课程讲授包括两个部分:编译优化基础和专题讲座。
  编译优化可以看作是“分析+转换”,即通过分析编译过程中的中间表示,对其进行转换,以便生成“更好”的目标代码。其中,程序分析是基础,课程涵盖了优化所需的关键分析技术:控制流/数据流分析、别名分析和依赖关系分析,如图1所示。
  编译优化可以分为与体系结构无关(或者关系较少)的优化和与体系结构密切相关的优化。前者一般在较高一层的中间表示进行,例如剖视指导的优化、循环优化等,后者在低层次的中间表示进行,例如寄存器分配、指令调度等。
  在与体系结构无关的优化方面,课程选取了:
  1) (部分)冗余删除优化,包括经典的标量优化(如常数传播、激进的死代码删除等)、部分冗余删除等;
  2) 针对占程序大部分执行时间的高级循环变换,例如,循环分布和合并、循环分块、向量化等;
  3) 面向“存储墙”的局部性优化,例如,提高指令局部性的代码重排、提高数据局部性的数据垫塞等。
  与体系结构相关的优化,课程选取了代码生成阶段的寄存器分配、指令选择与调度。寄存器分配给出了经典的基于化简-合并的图着色法外,还介绍了针对静态单一赋值(Static Single Assignm