编译原理是一门好课程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理是一门好课程
2004年12月
从20世纪50年代早期第一个编译器出现到现在,半个世纪过去了。在这50来年里,计算机科学家们用自己的聪明才智不断地丰富编译的原理、技术、方法,不仅为编译本身的发展做出了贡献,而且还通过为计算机科学与技术学科提供良好的工具和思想方法而对计算机科学与技术学科的发展做出了巨大贡献。正是由于这一原因,相关内容一直是计算学科各个分支专业,尤其是计算机科学与技术专业的重要教学内容。从较早的ACM68教程到ACM/IEEE-CS近期推出的CC2001、CC2005对相应的内容都有明确的要求。在我国,从87教程到《中国计算机科学与技术学科教程2002》也都对该课程给予了高度的重视(注:2006年发布的“计算机科学与技术学科规范”也在普适性较强的计算机科学专业方向中对此提出明确要求)。在实际教学中,各校都将其作为本科生的主要课程,有条件的单位还在大专教育中开设了相应的课程。特别值得注意的是,十余年前,他一直是该专业的主干专业课,近些年来,随着学科的发展,应用不断扩大,这门课程在某种意义上已经变成了专业基础课。甚至一些学校还在研究生教育阶段对相关的内容进行补充和深化。
考虑到本学科“理工兼有”和“理论与实践紧密结合”的特征,各个学校对“编译”的教学要求不尽相同,根据这些不同的要求,“编译”课程有很多不同的版本,也有很多不同的叫法。最典型的有:编译原理、编译技术、编译方法。按照作者的理解,编译原理比较强调从原理上对“编译”中用到的技术和方法进行论述,探究这些技术和方法的来源及依据,分析和阐述“基本原理”。编译技术大体上在于讲述编译器实现中的一些关键技术,重点强调如何实现。编译方法则应该以完成“编译”所用到的方法的叙述为主线,通过对编译系统的设计与实现的讲述,介绍其中用到的一些基本方法,这些方法将在学科的研究与工程实现中常常用到。一般用“编译”来指称这些课程,需要的时候再明确地进行区分。
无论如何要求、如何定位,按照现代大学教育通过知识培养能力提高素质的基本要求,我们都是以知识为载体,通过“编译”中知识的传授,将其中的“思想”、“方法”传授给学生,甚至让学生和教师一起去体验和感受大师们在产生这些思想、发明这些方法时的“历程”,获得“顶峰体验”,以激发创新之激情,建立创新之意识,培养创新之能力。
但是,曾经有一段时间,人们对“编译”课程产生了一定的怀疑。理由和原因是多方面的,其中最为重要的理由之一是“我们的学生毕业以后几乎没有人会进行编译器的设计与实现”;另一个原因是“编译”比较难,又“没有用”,所以学生也不太愿意学习。实际上,这些都是“浮躁”情绪的表现。反映出我们的视线被眼前的计算机系统的“友好界面”挡住了,被当前处于起步阶段的应用要求限制住了,甚至是忘了“我们是搞计算机的”。
前面提到,“编译”在十余年前,一般都是被当作专业课开设的。就国内计算机教
育而言,特别是在20世纪70年代和80年代初,开办计算机专业的学校很少,大约有五、六十所。那个时候,计算机系统的总体性能还比较低,基本的软件系统的基本性能还比较低,特别是界面的“友好性”还很差,应用面也很窄。在那个时期,计算机专业的人主要从事系统软件的研究开发,因此,大家都将“编译”作为专业课来开设。而且那个时候,也确实有一定比例的人在从事编译系统的研究开发。后来,随着计算机软硬件系统性能的提高,尤其是系统软件丰富,使得大量的计算机专业人才有了更多的精力去关心计算机技术的更广泛更深入的应用,更多地关心新的应用技术的开发。虽然在20世纪80年代后期开办计算机专业的学校有了较大幅度的增长,但由于惯性等因素,这些学校仍然将“编译”当成专业课程开设。
随着国内的计算机专业的进一步飞速发展,尤其是近十余年来,开办计算机专业的学校已经达到505所(注:2005年已经达到771所)学校之多,使得大多学生的未来工作变成了对具体应用系统的开发,在这种情况下,编译、操作系统不再是他们的研究内容,但这两门传统的专业课程中含有的原理、技术、方法和思想则是在今后将进行的应用系统的开发中常用的。特别是其中含有的问题求解基本思想,已经成为一些最经典、最有用的思想,在这种情况下,如同程序设计、数据结构与算法、计算机组成原理那样,“编译”、操作系统就成了计算学科各个分支专业的专业技术基础课程。
“编译”是将高级语言描述的程序变换成与之等价的另一种语言表达的程序,前者被称为源语言,后者被称为目标语言。通常我们都要求目标语言为汇编语言或者机器语言。在这个系统的设计与实现中,用到计算学科很多基本的原理、技术和方法。所以,从原理、技术、方法传授的角度讲,开设此课程的目的之一是将这些基本的原理、技术和方法传授给学生。所以,《编译原理》是一门非常好的课程,Alfred V.Aho曾经在其编著的、并且被公认为经典教材《编译原理》第一章的第一句话就写道,“编写编译器的原理和技术具有十分普遍的意义,以至于在每个计算机科学家的研究生涯中,本书中的原理和技术都会反复用到。”所以,传授这些基本的原理、技术和方法是非常重要的。
其次,是培养学生的能力。计算思维、程序设计与实现、算法设计与分析、计算机系统的认知、开发和利用等4大学科基本能力的培养是我们教育的另一个目标。当学生在程序设计、数据结构与算法等课程中受到一定的锻炼后,还要从系统的级别上来对程序、算法的认识进行再提高,以培养他们的系统能力。编译作为一个经典的、很成熟的系统,无论从其复杂度还是技术含量来说,都是很适合教学的系统。通过对编译系统和操作系统的认识和理解,能够很好地提高学生的系统能力。加上“编译器的编写涉及到程序设计语言、计算机体系结构、语言理论、算法和软件工程学科”,既有分析,又有综合,所以是非常好的实现能力培养的知识载体。
实际上,编译原理涉及的是一个比较适当的抽象层面上的数据变换(即抽象,又实际),而计算机学科是对信息描述和变换算法的系统研究,主要包括它们的理论、分析、效率、实现和应用。编译原理除了给出一些具体的表示和变换算法外,还给出了计算机学科两种重要的系统设计方法——“自顶向下的方法”和“自底向上的方法”(思想、方法、实现全方位讨论),同时还清晰地给出了一个相当规模的系统的设计(含总体结构),这些对培养计算机专业学生的基本学科能力非常重要。按照作者的想法,这是计算机专业进行基础教育最为恰当、有效的知识载体之一,而且它们也很有利于我们开展研究型教