snap10
1、C/C++ 2、Pascal/Delphi
 
2、Pascal/Delphi

2、编译教材和教学改革研究

以提高学生研发能力为目标的编译教材和教学改革研究
斯传根/文(原载清华大学主办的《计算机教育》2、3期)

        摘要:编译是计算机专业学生一门重要的基础课程。但目前一些教材和教学方法使学生在学了编译以后仍不知道怎样具体设计和开发语言的编译程序。本文作者以提高学生研究开发能力为目标,运用多年研究发展的SI-NS图技术,对编译教材内容和教学方法进行了改革,取得了满意的效果。

  1. 编译的重要性及其教材和教学现状
  编译内容所以重要有多方面原因:
  (1)懂得编译有助于深刻理解和正确使用程序设计语言。
  (2)编译内容涉及计算机组织结构、指令系统以及操作系统等,它有助于加深对整个计算机系统的理解。
  (3)设计开发编译程序的软件技术同样可以用于其它软件的设计开发。
  (4)要想熟练地为一些计算机CPU开发建立起各种系统,如过程控制、数据处理、通信以及操作系统等,掌握编译是必要的前提。特别是,“随着微处理器技术的飞速发展,处理器性能在很大程度上取决于编译器的质量,编译技术成为计算机的核心技术,地位变得越来越重要。”因此,它历来是计算机专业学生一门重要的基础课程。
  然而现在一些高等学校《编译原理》教材,存在着以下一些问题:
  (1)正如陈火旺院士所说,大多是“原理性教科书”,只“着重介绍编译的基本理论和方法,对于实现的具体细节未予详述。”
  (2)在词法分析一章,只讲述正规式和有穷自动机理论,其目的只是为了介绍词法分析程序自动构造工具Lex的原理。词法分析程序不是通过编程,而是执行Lex产生。但实际上采用“Loop-and-switch”,即“循环和分支”方法,无需任何工具,且不难实现,学生也能得到编程训练,已被美国斯坦福大学的编译教材列为首选方法。事实上,它也是目前世界上流行的GNU/Linux系统所有编译程序(gcc)普遍采用的方法。
  (3)一些教材虽然都引用世界著名计算机科学家N.Wirth教授的PL/0语言作为教学示例。但教材内容与示例程序没有有机的结合,在语法分析一章过多介绍与PL/0编译程序无关的自底向上分析方法,徒增教材深度和难度,而真正结合PL/0编译程序讲述实际设计方法和步骤太少。
  由此造成学生在辛苦地学完了70甚至更多学时深奥的课程内容后,对编译仍缺乏系统的认识,仍不知道怎样具体去设计一个语言和语言的编译程序。“学生难学、教师难教,师生皆视此为畏途”,这是编译教学中长期存在的问题。

  2. 新编教材《编译设计与开发技术》
  新教材以著名教授N.Wirth的德文版《编译设计入门》为蓝本,总结了作者多年“编译技术”课程教学实践,还参考了美国斯坦福大学“Compilers”课程有关资料,运用了作者多年研究发展的SI-NS图技术,在原有书稿《编译设计及开发技术》基础上重新编写而成。
  教材前5章以授课形式为主,学习与编译相关的形式语言和语法分析理论。6至11章以语言PL/0为例,系统介绍了一个编译程序从语法定义开始的词法分析、语法分析、出错处理、代码生成以及解释程序的设计开发全过程。在讲授中强调了学生的参与性,例如,语法分析一章,教师仅提出设计任务和方法,并示范一个语法分析子程序的编写过程,其余子程序全由学生自己完成。新教材和教学方法注重学生实际软件开发能力的培养,它调动了学生学习编译的积极性,学生不仅掌握了与编译有关的形式语言和语法分析理论,懂得了什么是编译,更重要的是在学完了不到60学时的课程内容后,完全有能力自己去设计和开发一个语言的编译程序。学生们自行完成的第13章一个有一定规模和复杂度的编译课程设计是最好的说明。

  3. 基于SI-NS图的教学和程序设计开发方法
  “程序图型化表达”是国际上都在研究,旨在提高程序可读和可维护的一项技术,尤其用来表达像编译这样算法复杂的程序,十分必要。教材采用了作者研究开发的从程序到SI-NS图自动转换技术,全部实例程序都转换成了二维、结构清晰的SI-NS程序框图。学生不仅容易读懂、理解编译程序的算法和设计思想,还可以在SI-NS程序框图上直接执行和验证程序逻辑,这在一维的、整体结构差的文本程序里是很难办到的。
  作者在讲授第7章PL/0词法分析程序中,用SI-NS图给出了词法分析程序getsym的程序框图,如图1所示。

getsym程序框图

  程序框图自上而下由二个结构组成:一个是循环结构;另一个是嵌套的分支结构。它清晰表达了设计构造词法分析程序采用的“循环和分支方法(Loop-and-switch)”。即,每调用执行一次词法分析程序getsym,首先用循环结构在源程序上扫描,向前读入一个非空格字符;然后用嵌套的分支结构对非空格字符进行分析,依据分析的结果转入到相应的程序部分进行处理。
  在第8章PL/0语法分析程序构造中,作者研究出从语法图到语法分析SI-NS图的翻译规则B1~B6,以及系统的基于SI-NS图的语法分析程序设计方法。学生用此方法可以自行为每一个非终结符编写出相应的语法分析子程序。这里仅以非终结符statement为例:
  (1)画出非终结符statement的语法图,如图2所示。

statement的语法图

  (2)依据翻译规则画出statement语法分析子程序的总体SI-NS图,如图3所示。

statement语法分析子程序的总体SI-NS图

  (3)逐步求精,对statement的P(S1)至P(S5) 进行细化。
  例如P(S1),是处理以标识符“ident”为头符号的串行结构,依据翻译规则,相应的SI-NS图,如图4所示。

P(S1)SI-NS图

  又如P(S4), 是处理以保留字“begin”为头符号的串行结构,依据翻译规则,相应的SI-NS图,如图5所示。

P(S4)SI-NS图

  (4)将细化后的P(S1)至P(S5)汇总到语法分析子程序statement的SI-NS图,并进行优化得到如图6所示结果。

statement的SI-NS图

  (5)从SI-NS图翻译写出相应的语法分析子程序:

语法分析子程序

  从SI-NS图翻译写出相应的语法分析子程序并不难,但即使程序写错也不怕,因为可以用自动转换工具,立即从程序转换得到新的SI-NS图,再与原来的SI-NS图一对比,就可以看出程序错误所在了。
  语法分析程序的SI-NS图构成了编译程序的核心,语法出错处理、代码生成以及解释程序等编译程序的其它部分都是在此基础上逐步扩充而成。

  4. 一张演示光盘
  为了配合教学,专门为学生提供了三个演示程序,分别对应编译程序在开发过程中经历的三个阶段的程序状态。它们既可以由教师在多媒体教室演示也可以由学生自己上机实验,从而加深了学生对编译开发过程的感性认识。

  5. 一个精心编写的课程设计

  为了巩固所学知识,考核学生是否真正具有独立设计和完整地开发一个编译程序的能力,为学生提供了一个精心编写的课程设计。它要求学生先对语法定义作规则性检查,然后逐步完成词法分析、语法分析、出错处理,代码生成和解释程序的设计。分两个阶段实施检查,最终要求学生用该语法定义的语言编写一个程序(如:输出1到100间所有素数),用自己开发的编译程序对它编译,能连续指出语法错误不中断,能生成代码程序,能解释执行代码程序最后输出正确结果。以下是课程设计的具体内容:
  (1)语言plx的EBNF语法定义

语言plx的EBNF语法定义

  (2)课程设计要求(略)
  (3)某学生编译程序检查实例,如图7所示。

某学生编译程序检查实例

  6. 结束语

  新编教材《编译设计与开发技术》充分调动了学生学习编译的积极性。学生不再视编译为“畏途”,他们能听懂、掌握编译有关的理论,也能独立完成一个编译程序的全部设计开发。学生在参与设计和开发编译程序的过程中,又学到了软件工程提倡的自顶向下、逐步扩充、逐步求精的结构化程序设计方法和SI-NS图软件开发技术,这为他们今后走上社会去承担更大更复杂的实际软件项目具备了一定的能力。
  目前,新编教材《编译设计与开发技术》已经被清华大学出版社和相应的编审委员会批准,作为《本科计算机专业特色教材》已于近期面向全国高校正式出版。由于作者水平有限,书中难免存在缺点错误,敬请读者批评指正。