编译预处理

2024-06-29

编译预处理(共9篇)

编译预处理 篇1

0 引言

编译程序的基本任务就是将源语言翻译成等价的目标语言程序。编译程序完成从源程序到目标程序的翻译工作,是一个复杂的整体的过程。语法和语义分析在编译程序中占有十分重要的地位,如何实现语句处理是十分关键的。对此,本文提出了一种运用反填技术的语句处理实现算法,解决了语义分析中对语句真假出口的判断问题,具有很高的使用价值。

1 编译系统的基本结构

将编译过程划分成了词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成六个阶段。

1.1 词法分析

词法分析将源程序从左到右逐个字符地读入,并对构成源程序的字符流进行扫描和分解,从而识别出一个个单词符号的过程,是语法语义分析的基础。

1.2 语法分析

语法分析的任务是在词法分析的基础上将单词序列分解成各类语法短语,如“语句”、“表达式”、“分程序”等。一般这种语法短语可以用语法树来表示。语法分析所依据的是语言的语法规则,即描述程序结构的规则。通过语法分析确定整个输入串是否构成一个语法上正确的程序。

1.3 语义分析

语义分析是审查源程序有无语义错误,为代码生成阶段收集类型信息,如果发现不符合语言规范的情况,编译程序应报告出错。有些编译程序将语法分析和语义分析不予区分,同时进行。

1.4 中间代码生成

在进行了上述的语法分析和语义分析阶段的工作之后,有的编译器将编译程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间代码。

1.5 代码优化

在此阶段的任务是对前阶段产生的中间代码进行变换或进行改进,使目标代码各位高效,从而节省时间和空间。

1.6 目标代码生成

这一阶段的任务是把中间代码变换成特定机器上的绝对指令代码或可以重定位的指令代码或汇编指令代码。

以上就是编译程序的六个阶段,其中,语法和语义分析在编译程序中占有十分重要的地位,而在此分析过程中语句处理是关键和繁琐的。本文对编译程序中语句处理部分给出了一种全新的实现算法,运用了反填技术,解决了语义分析中对语句真假出口的判断问题,具有很高的使用价值。

2 编译程序中的语句处理思想

2.1 文法

这里主要介绍C语言语句处理算法的处理思想和文法规则:

2.2 语法图

C语言语句处理部分的语法图如图一所示。

3 语句处理的实现算法

3.1 子程序调用语句处理算法

进入语句处理程序首先读入一个单词,并记录为sym;首先判断sym是否是函数名ident,如果是则转入子程序调用语句处理部分进行处理,否则向下判断;

3.2 输入输出语句处理算法

判断是否是输入输出语句的标识符scanf或printf,如果是则转入输入输出语句处理部分,否则向下判断;

3.3 条件判断语句处理算法

判断是否是表示条件判断语句的标识符ifsym,如果是则转到条件判断语句部分进行处理,否则向下判断;

3.4 循环语句while处理算法

判断是否是表示循环语句的标识符whilesym,如果是则转入循环语句while部分进行处理,否则向下判断;

3.5 循环语句do while处理算法

判断是否是表示循环语句的另一个标识符dosym,如果是则转入循环语句do while部分进行处理,否则向下判断;

3.6 选择语句switch处理算法

判断是否是表示选择语句的标识符switchsym,如果是则转入选择语句处理部分进行处理,否则向下判断;

3.7 循环语句for的处理算法

判断是否是表示循环语句的另一个标识符forsym,如果是则转入循环语句for部分进行处理,否则向下判断;

3.8 赋值语句或自加自减语句的处理算法

判断是否是表示赋值语句的标识符a d d s e l f或minusself或ident,如果是则转入赋值语句部分进行处理,否则向下判断;

4 结束语

程序是由各种功能的语句按照一定的方式叠加而成,对程序的编译更离不开对语句的处理。本文提出的语句处理算法,运用了反填地址的技术,解决了语句处理过程中判断真假入口的难题,具有很高的使用价值,为实现其它语言的编译程序奠定了基础。

参考文献

[1]张素琴,等.编译原理(第2版)[M].北京:清华大学出版社,2007.

[2]孙悦红.编译原理及实现[M].北京:清华大学出版社,2005.4.

[3]温敬和.编译原理实用教程[M].北京:清华大学出版社,2005.4.

编译预处理 篇2

编译及编译理论初探

作为翻译中一种独特的处理方式,编译可以用凝练的语言和比较小的篇幅介绍原作鸿篇巨著的`中心内容,也可以在比较短的时间内完成译介大量材料的工作,速度快、效率高、实用性强.这些特性使得编译在翻译实践中得到了越来越广泛的应用.

作 者:徐建国 XU Jian-guo 作者单位:黔西南民族师范高等专科学校,贵州,兴义,562400刊 名:遵义师范学院学报英文刊名:JOURNAL OF ZUNYI NORMAL COLLEGE年,卷(期):200810(2)分类号:H315.9关键词:编译 广义 狭义 文化 艺术

编译预处理 篇3

关键词:C语言,C编译器,——运算,编译

C语言是高校计算机课程的重要部分,同时也是全国计算机等级考试的一部分。目前C语言的学习者越来越多,对C语言的了解也越来越清楚。然而在C语言教学中发现很多学生对其中的自加自减运算符感到迷惑,特别是二者出现前置后置混合使用时。同时,C语言教学中常用的两个编译器,即Turbo C 2.0编译器和Visual C++6.0编译器,对自加自减运算的编译顺序有不同,更加重了学生对此部分内容的不解。因此,本文着重分析上述两种编译器如何对自减运算进行编译,对于自加运算读者可参考文中自减运算进行分析。

1 C语言自加和自减运算

C语言的自减运算符为--,有前置和后置两种用法。前置用法指将运算符放于变量的前面,其功能是在使用变量前,先使变量的值自减1,之后再使用变量的值。后置用法指将运算符放于变量的后面,其功能是先使用变量原来的值参加表达式运算,之后再使变量的值自减1。例如下面的C语句:

很显然,不管是前置用法还是后置用法,对变量本身的影响都是相同的即自减1,受影响的是所在表达式的值。表达式中仅包含单个自减运算时Turbo C 2.0编译器和Visual C++6.0编译器的解释相同,但当表达式中出现不止一个自减运算时,Turbo C 2.0编译器和Visual C++6.0编译器的解释就可能不同。

2 两种编译器中汇编代码的查看

计算机程序如何运行依赖于该语言的编译器,因此通过对编译器的编译结果进行分析是了解编译器如何对运算进行编译的有效方法。

Turbo C 2.0编译器提供有许多工具,其中的Tcc.exe就是一个C语言的编译器,可以将代码编译成目标文件,并能自动调用tlink链接生成可执行文件。Tcc.exe有多种命令行参数,其中使用-S可以生成汇编代码。例如Tcc.exe–S yourfilename.c将生成yourfilename.c源文件的汇编代码文件yourfilename.ASM,进而可对该文件进行汇编代码分析。

Visual C++6.0编译器有汇编窗口,可以以单步运行方式运行程序,之后选择View/Debug Window/Disassembly命令,进入汇编窗口查看对应于源程序的汇编代码。

3 自减运算的单一前置或后置

当出现多个单一前置或多个单一后置时,如何编译又分不同情况。例如下面的程序:

当以Turbo c 2.0编译器编译后运行结果为:12 9 3 6。其解释方式如下:

1)对运算1:因赋值表达式右式的均为自减后置,则先一次性取3个子表达式(a--)的值顺次进行加运算,即((4+4)+4)=12,之后再统一进行a的三次自减操作。则a最终为1,输出结果12。

2)对运算2:格式输出函数的实参为一个加运算表达式,求值时从左向右进行,因为是自减后置,每个子表达式在将a的原值作为子表达式值后直接进行自减操作,所以表达式的值为((4+3)+2)=9。则a最终仍为1,输出结果为9。

3)对运算3:因赋值表达式右式的均为自减前置,则先对a顺次进行3次自减操作变为1,之后再进行3个a的算术加。则a最终为1,输出结果为3。

4)对运算4:格式输出函数的实参为一个加运算表达式,求值时从左向右进行,因为是自减前置,每个子表达式在将a的进行自减操作后将其新值作为子表达式值,所以表达式的值为((3+2)+1)=6。则a最终仍为1,输出结果为9。

当以Visual C++6.0编译器编译后运行结果为:12 12 5 5。其解释方式如下:

1)对运算1:因赋值表达式右式的均为自减后置,则先一次性取3个子表达式(a--)的值顺次进行加运算,即((4+4)+4)=12,之后再统一进行a的三次自减操作。则a最终为1,输出结果12。

2)对运算2:格式输出函数的实参为一个加运算表达式,求值时从左向右进行,而编译器将算术加的优先级视为高于后置自减,所以仍先一次性取3个子表达式(a--)的值顺次进行加运算,即((4+4)+4)=12,之后再统一进行a的三次自减操作。则a最终仍为1,输出结果为12,运算过程与运算1类似。

3)对运算3:因赋值表达式右式的均为自减前置,而编译器将算术加的优先级视为低于前置自减,同时运算从左向右逐次进行,则先对a顺次进行2次自减操作变为2,之后求出前两个子表达式之和为4,之后再进行a的第3次自减变为1,之后再与之前的和相加得5,即((2+2)+1)=5。则a最终为1,输出结果为5。

4)对运算4:格式输出函数的实参为一个加运算表达式,求值时从左向右进行,因为是自减前置,同时运算从左向右逐次进行,则先对a顺次进行2次自减操作变为2,之后求出前两个子表达式之和为4,之后再进行a的第3次自减变为1,之后再与之前的和相加得5,即((2+2)+1)=5。则a最终为1,输出结果为5,运算过程与运算3类似。

4 自减的前置和后置混合使用

当同时出现前置和后置时,如何编译又分不同情况。例如下面的程序:

当以Turbo c 2.0编译器编译后运行结果为:6 7 4 3 3 4 10 19。其解释方式如下:

1)对运算5:对赋值表达式k=(a--)+(--a)+(--a),编译器按照自减前置优先级高于子表达式求值,子表达式求值高于自减后置的顺序进行。所以先进行两次a的自减操作使a的值变为2,之后将a的值分别作为三个子表达式的值进行求和并赋给k,则k的值为6,之后再进行一次a的后置自减使a的值变为1。则a最终为1,输出结果为6。

2)对运算6:格式输出函数的实参为一个加运算表达式,顺次将两两子表达式进行相加,即(((a--)+(--a))+(--a)),对每一个子表达式求值时其中包括的自减操作不论前置、后置均进行完才进行下一个子表达式的求值。所以先求子表达式(a--)的值为4并将a的值自减变为3,之后子表达式(--a)求值时先a自减变为2,再将新值2和上一个子表达式值4相加得6,之后进行第3个子表达式(--a)的求值,a先自减变为1,再将新值1和前两个子表达式之和6相加得7,即对应值为(((4)+(2))+(1))。则a最终为1,输出结果为7。

3)对运算7:此时格式输出函数的输出项列表有四个子表达式,Turbo c 2.0编译器按照从右至左的顺序进行求值,对每一个子表达式求值时其中包括的自减操作不论前置、后置均进行完才进行下一个子表达式的求值。所以先进行(a--)得第4个输出值为4并将a置为3,之后进行(a++)得第3个输出值为3并将a置为4,再之后进行(--a)将a置为3并求得第2个输出值为3,最后进行(++a)将a置为4并求得第1个输出值为4。则最终a为4,输出结果为4 3 3 4。

4)对运算8:此运算和运算9情况类似,两个子表达式((a--)+(--a)+(--a))求值时其中包括的自减操作不论前置、后置均进行完才进行下一个子表达式的求值,而每个子表达式求值和上述运算6一样。所以第2个输出项的对应值为((8)+(6)+(5))并将a置为5,第1个输出项的对应值为((5)+(3)+(2))并将a置为2。则最终a为2,输出结果为10 19。

当以Visual C++6.0编译器编译后运行结果为:8 8 4 3 4 4 14 20。其解释方式如下:

1)对运算5:对赋值表达式的右式,编译器首先从左到右两两子表达式进行加运算,每次运算中前置自减优先级高于子表达式求值,而后置自减则放于整体赋值之后统一进行,即k=(((a--)+(--a))+(--a))。对((a--)+(--a))先进行一次a的前置自减使a的值变为3,之后将a的新值分别作为两个子表达式的值进行加运算得和为6,此时不进行a的后置自减而是继续求下一个子表达式,第3个子表达式(--a)先进行a的前置自减使a变为2并将该值作为子表达式的值与前面两个子表达式之和6相加得8并赋给k,之后再进行a的后置自减使a的值变为1。即k对应值为(((3)+(3))+(2)),a最终为1,输出结果为8。

2)对运算6:格式输出函数的实参为一个加运算表达式,但Visual C++6.0编译器求值时和对运算5的求值相似,即总体按(((a--)+(--a))+(--a))进行。对((a--)+(--a))先进行一次a的前置自减使a的值变为3,之后将a的新值分别作为两个子表达式的值进行加运算得和为6,此时不进行a的后置自减而是继续求下一个子表达式,第3个子表达式(--a)先进行a的前置自减使a变为2并将该值作为子表达式的值与前面两个子表达式之和6相加得8并作为实参值输出,之后再进行a的后置自减使a的值变为1。即实参值为(((3)+(3))+(2)),a最终为1,输出结果为8。

3)对运算7:此时格式输出函数的输出项列表有四个子表达式,Visual C++6.0编译器按照从右至左的顺序进行求值,每次运算中前置自减优先级高于子表达式求值,而后置自减则放于各个输出项的值确定之后统一进行。所以先进行(a--)得第4个输出值为4而a不变,之后进行(a++)得第3个输出值为4而a仍保持原值,再之后进行(--a)将a置为3并求得第2个输出值为3,最后进行(++a)将a置为4并求得第1个输出值为4。则最终a为4,输出结果为4 3 4 4。

4)对运算8:此运算和运算9情况类似,两个子表达式((a--)+(--a)+(--a))求值时每次运算中前置自减优先级高于子表达式求值,而后置自减则放于各个输出项的值确定之后统一进行,而每个子表达式求值和上述运算6一样。所以第2个输出项的对应值为((7)+(7)+(6))并将a置为6,第1个输出项的对应值为((5)+(5)+(4)),之后统一进行两次(a--)置a值为2。则最终a为2,输出结果为1420。

5 结论

通过研究Turbo c 2.0编译器和Visual C++6.0编译器的汇编代码可以看到,两种编译器对自加自减运算的编译是不同的。所以对于C语言的学习者而言,在学习过程中应对所使用的编程环境加以区分,并掌握对这两种编译器的汇编代码的查看方法以帮助自己加深对编译器的理解。

参考文献

[1]刘克成.C语言程序设计[M].北京:中国铁道出版社,2007:42-50.

[2]谭浩强.C程序设计[M].北京:清华大学出版社,1998:30-35.

nginx模块编译 篇4

2.查看ngixn版本极其编译参数

/usr/local/nginx/sbin/nginx -V

3.编译,但不安装

# cd nginx-1.4.7

以下是重新编译的代码和模块

##注意,是添加编译模块,所以必须把第2步看到的编译模块加上,下面列出的是新加模块

#./configure --with-http_stub_status_module--with-http_ssl_module--with-file-aio --with-http_realip_module

最终编译模块:

#./configure --with-http_ssl_module --with-http_stub_status_module--with-http_gzip_static_module --with-file-aio --with-http_realip_module--with-pcre=/mnt/tmp/pcre-8.34 --with-zlib=/mnt/tmp/zlib-1.2.8--with-openssl=/mnt/tmp/openssl-1.0.1j

#make千万别make install,否则就覆盖安装了

make完之后在objs目录下就多了个nginx,这个就是新版本的程序了

4.备份旧程序,替换新程序

备份旧的nginx程序

#cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak

把新的nginx程序覆盖旧的

#cp objs/nginx /usr/local/nginx/sbin/nginx

如果提示“cp:cannot create regular file `/usr/local/nginx/sbin/nginx‘: Text file busy”

建议使用如下语句cp

#cp -rfp objs/nginx /usr/local/nginx/sbin/nginx

5.验证并重启新程序

测试新的nginx程序是否正确

#/usr/local/nginx/sbin/nginx -t

nginx: theconfiguration file /usr/local/nginx/conf/nginx.conf syntaxis ok

nginx:configuration file /usr/local/nginx/conf/nginx.conf testissuccessful

平滑重启nginx

#/usr/local/nginx/sbin/nginx -s reload

6.查看ngixn版本极其编译参数

编译原理课程教学探讨 篇5

编译原理是高等院校计算机专业继“数据结构”、“计算机原理”等专业基础课之后的又一门重要的专业基础课, 以形式语言与自动机理论为基础, 讨论编译程序构造的基本原理[1]、基本设计方法和主要实现技术。通过本课程的学习, 能深化学生对计算机信息处理本质与计算机工作过程的认识, 加深对程序设计语言的理解, 为后继专业课程的学习奠定坚实的理论基础, 并将编译程序构造的基本原理和技术应用于一般软件的设计。因此, 努力提高这门课的教学效果, 使学生真正掌握这门课的精髓, 并应用到实践中去, 具有非常重要的现实意义。

1 编译原理课程现状与问题

编译原理课程由于理论性强, 具有严密的逻辑性, 应用其他课程的知识较多, 学生在学习过程中感到内容抽象、算法复杂、难于理解, 学习起来有一定的难度, 因此, 编译原理被普遍看做是计算机专业本科教学中最难讲解、最难学习的课程之一, 在教学上不同程度的存在以下几个问题。

1.1 理论知识抽象难懂, 学生有畏惧心理

这门课程主要讨论编译的基本理论和编译器构造的基本方法, 涉及的理论知识抽象、难懂, 如形式语言与自动机理论、语法制导翻译以及各种算法, 又综合运用到前面所学的相关课程的知识, 确实具有相当的难度, 使得学生产生了畏惧心理。此外, 不少学生认为学习这门课将来只能用于编译器的设计上, 而大多同学将来都不太可能去从事编译器的设计工作, 因此普遍认为这门课没有用, 学习热情不高。

1.2 理论课教学方式陈旧单一

目前, 编译原理的理论课大多以老师讲解为主, 很少辅之以其他形象生动的教学手段, 教学内容又大多是抽象的概念和复杂的算法, 老师和学生之间的互动很难形成, 学生觉得枯燥乏味, 慢慢就失去了学习的兴趣, 难以达到良好的教学效果[2]。

1.3 实验内容脱离实际, 不够合理

这门课程的实践环节大多要求实现一个小型语言的编译程序, 而实现一个编译程序不仅要有相关的理论知识, 更需要丰富的实践经验, 熟悉硬件系统和操作系统的功能, 对于大多数同学来说, 编程能力都相对欠缺, 实现编译程序基本是不可能完成的任务。因此, 大多同学在实验时碰到的困难太多, 无从下手, 干脆放弃努力, 也就失去了实验的意义。

2 教学探讨

2.1 帮助学生克服畏惧心理, 培养学习兴趣

根据这门课程抽象难懂的特点, 首先要帮助学生克服畏惧心理, 才能发挥他们的学习主动性。这门课的先行课程如“数据结构”、“离散数学”、“高级程序设计语言”等都是学生已经学习过的课程, 学生实际已经具有相应的能力, 老师需要的是帮助学生分析他们已经掌握的知识, 让学生对自己有足够的了解, 明白以他们已掌握的知识为基础, 有足够的能力学习掌握编译原理这门课程, 在学习之前首先消除畏惧心理。

编译程序涉及的算法、思想和实现技术除了设计编译器以外也可广泛应用于一般软件的设计实现[3], 如文本编辑器、信息检索系统、模式识别器等, 对提高学生程序设计能力和开发大型软件的能力是十分有益的。教师可以鼓励学生尝试将编译程序中的各种算法和技术应用到各个领域, 以培养学习兴趣, 激发学生的创造性思维, 培养学生的创新能力。

2.2 采用案例式教学, 把抽象问题具体化

编译原理中涉及的大量概念和算法都过于抽象, 学生理解起来非常困难, 要想获得良好的教学效果, 必须借助实例, 使抽象问题具体化。例如, 词法分析部分主要阐述词法分析器的工作原理和构造方法, 相关概念和算法较多, 可以通过一个具体的程序范例进行教学。通过编写一个读单词过程, 从输入的源程序中, 识别出各个具有独立意义的单词, 即基本保留字、标识符、常数、运算符、分隔符五大类, 并依次输出各个单词的内部编码及单词符号自身值。在课堂上通过程序的运行来展示词法分析器的工作过程。通过实例教学, 学生既加深了对理论知识的理解, 也提高了学习的积极性。

2.3 注重启发式教学, 培养学生独立思维能力

传统的教学注重教师的讲解, 学生被动的接受知识, 不利于学生思维能力的培养[4]。我们在教学中, 特别注重启发式教学, 引导学生去思考探讨。启发式教学需要教师有目的的设计问题, 有意义的提出问题, 通过问题把知识点引导出来, 学生通过思考回答问题, 寻找解决问题的途径和方法, 加深对知识点的理解。例如, LR分析法是语法分析中较难的部分, 其中包含了四种不同的分析表构造方法, 学生不好理解。在讲解时先给出LR (0) 分析表的构造方法, 引导学生发现其中的不足并进行改进, 从而引出SLR分析法, 再进一步引导学生发现SLR方法的不足, 引出LR (1) 分析法, 同样的方法引出LALR分析法。通过这样的启发式教学, 不仅破解了教学难点, 也引发了学生探究的兴趣。

通过启发式教学, 培养了学生独立思考问题、发现问题、解决问题的习惯和自主能力。学生也在这个过程中通过自己的学习活动获取知识, 发展能力。

2.4 现代化教学手段和板书相结合, 提高学习效果

编译原理课程内容抽象, 知识点多, 要想取得良好的教学效果, 必须借助形象化的教学手段, 构建多媒体环境下的教学环境。利用多媒体设施、电子教案、教学网站等多种途径把知识化静为动, 寓教于乐。为此, 我们精心编制了多媒体课件, 用Flash技术制作了动画, 可以生动形象的演示抽象概念和复杂算法。这样不仅激发了学生的学习兴趣, 也加深了学生对理论知识的理解。但是采用多媒体教学也不能完全抛弃板书, 因为板书灵活, 可以随时补充。所以在教学中应做到多媒体教学和传统的板书教学相结合。

2.5 精心设计课程实验, 加强学生实际应用能力

编译原理是一个理论和实践并重的课程, 但是如何组织实验内容始终是教学中的一个难题[5]。目前普遍的做法是实现一个小型语言的编译程序, 而这并非一件容易的事情, 对于编程能力都还欠缺的学生来说, 实现完整的编译程序基本是不可能完成的任务。因此, 大多同学在实验时碰到的困难太多, 无从下手。对此, 我们的做法是提供给学生程序源代码但是空出关键模块, 学生只需完成关键模块的编写, 大大降低了实验的难度, 也使学生可以集中精力解决关键问题。在实践环节中, 根据学生的能力、性别, 采用互补的搭配方式把学生分为若干小组, 每组设小组长负责实验的学习讨论并对各成员进行分工。每一次实验结束后, 各个小组以小组长为代表汇报自己的作业, 由其他小组自由提问, 实现各个小组之间的交流, 分享各组的实践成果, 互相借鉴, 很好的激发了大家的学习兴趣。

3 结语

编译原理课程作为计算机专业的一门重要专业基础课, 对于提高学生的计算机专业素养具有重要的作用。本文分析了目前教学中存在的问题, 并从教学实践出发, 对如何调动学生积极性从而真正提高教学效果总结出了一些有效的教学方法, 在实际教学中也取得了良好的效果。由于课程的复杂性和抽象性, 还需要不断地探索更合理的教学方法, 提高教学质量。

参考文献

[1]朱文华, 王荣波.基于建构主义的编译原理实践教学研究[J].杭州电子科技大学学报:社科版, 2008 (4) :67—70.

[2]舒忠梅, 李文军, 周晓聪.编译原理教学改革实践初探[J].中山大学学报:自然科学版, 2007 (S2) :101-104.

[3]莫雷.教育心理学[M].广州:广东高等教育出版社, 2003.

[4]何炎祥.现代教学理论指导下的“编译原理”教学综合改革[J].计算机教育, 2005 (03) .

《编译原理》教学改革初探 篇6

《编译原理》课程是计算机专业人员必修的一门主干课程, 虽然只有少数人从事编译方面的工作,但这门课程在理论、技术、方法上都对学生提供了系统而有效的训练,通过本课程的学习可以培养并提高学生的抽象思维、逻辑思维和编程能力。

《编译原理》一直是高年级专业课程中最难学习的课程之一。原因有四,第一:在学习本课程前,学生对它知之甚少,先入为主的认为该课程就是了解编译程序的构造,没有什么实际应用价值,学习没有积极性;第二:本课程具有一定的理论深度和难度,较一般课程学习过程的难度要大;第三:《编译原理》课程各章节间内容有密切的连贯性,学生在学习过程中,需要有较强的概括能力和逻辑能力,几个知识点掌握欠缺,可能会导致整章理解模糊,产生畏难心理;第四:实验题目较难,需要足够的理论基础和较强的编程能力为前提。因此,如何提升学习积极性、如何深入浅出讲授理论内容、如何合理安排实验过程显得尤为重要。本文就《编译原理》课程的授课方法和实验过程组织等问题进行探讨,以期改观本课程的教学效果,达到提高教学质量的目的。

1、课堂教学改革

1.1 兴趣教学

兴趣是人们力求认识某种事物或爱好某种活动的心理倾向,是推动学生学习活动的内在动力。要想让学生学得好,需不断的激发他们学习的兴趣,从而变被动学习为主动学习[1]。

1.1.1 兴趣入门,引发学习动力

兴趣的激发,应从入门开始。上课伊始,首先介绍《编译原理》课程的教学目标,并由此点出,整门课程讲解的就是一个编译程序的构造,可见该程序的庞大、复杂,提出在构造编译程序过程中用到了许多经典的技术和算法,利用学生猎新喜奇的心理,诱导学生学习的好奇心。其次,简单列举并演示编译技术在文本编辑器、网络协议、搜索引擎等方面的应用,激发兴趣的同时,消除学生对本课程无实际应用价值的理解误区。最后,指出包括《编译原理》课程在内,《软件工程》、《网络》等都是计算机专业独有的课程,在许多人把计算机只当作简单的应用工具,在许多非计算机专业也学习计算机课程的今天,进一步引导学生笃定学习目标为成为计算机专业人才。

1.1.2 兴趣教学贯穿整个教学过程

《编译原理》传统教学方式是以课堂教授为主的"灌输式"教学,而长时间以一种方法单调的进行教学,难免导致学生学习疲劳,因此需要根据具体教学内容,适当使用类比式、启发式、实例式等形式多样的的教学方法,来提升学习兴趣。

例如,从实现思想上来说,编译过程类似于英译汉,因此,可用类比式教育法由英译汉过程引入编译过程。大概如下,在对句子英译汉时,首先要识别出一个个单词(类似词法分析阶段),然后分析句子的语法结构是否合理(类似语法分析阶段),之后对英语句子进行初步的翻译(类似语义分析及中间代码生成阶段),接着对翻译进行润色(类似优化阶段),最后得到译文(目标代码生成阶段)。用这样的方法概述编译各阶段任务,学生更易理解。

又如,《编译原理》中算法非常多,对于一些雷同的算法,可采用启发式教育,教师提出问题,组织学生进行讨论并回答问题,教师做适当补充。例如在讲授算法优先分析方法的优先分析表构造时,需要求出所有非终结符的FIRSTVT集和LASTVT集,FIRSTVT集和LASTVT集的定义、求法是类似的,因此,教师可首先讲解FIRSTVT集的定义、求法及用其构造优先表的方法,然后使用启发式方法,让学生通过讨论,来写出LASTVT集的定义、求法及构造优先表的方法,教师做适当的纠正和补充。这样,学生对算符优先表的构造一定理解深刻。

又例,《编译原理》中多个理论可通过实例引入,采用实例法,激发学生的好奇心和求知欲。比如,对于算法优先分析法,可先通过如下文法G[E]及句子i1+i2*i3的归约,引入该法。

对句子i+i*i使用G[E]文法进行归约有两种方法,一种是:

i1+i2*i3归约为E+i2*i3归约为E+E*i3归约为E*i3归约为E*E归约为E。

另一种是:

i1+i2*i3归约为E+i2*i3归约为E+E*i3归约为E+E*E归约为E+E归约为E。

但显然第二种方法更符合我们的数学思维,因为从小学开始,我们就认为乘的优先级是高于加的。这就给出一种思路,能否设定运算符*的优先级高于+号,让i1+i2*i3归约的过程唯一,由此引入了算法优先分析法。

1.2 加深理论内涵的讲解

《编译原理》课程中包括有许多迷人的理论、精妙的算法,只有真正深刻理解到理论和算法的精髓,在日后才能将这些理论和算法应用于实际的问题解决中。对于课程中的非确定有限自动机的确定化、最小化、预测分析法、算符优先分析法、LR分析法等多个内容,笔者奉行理论-实例应用-理论-算法的讲解思路。即先了解理论的字面意思,然后通过实例非严格的对这些理论进行"证明",了解这些理论的使用,之后回到理论,通过基础知识点的逻辑推理,加深对这些理论的理解,最后由理论编写算法,解决问题。比如,讲授预测分析法的总控程序时,可首先描述三种可能动作的字面含义。然后,举例用这三种动作识别句子,熟悉三种动作的使用,了解总控过程。之后,从LL (1) 分析法思想及预测分析表的构造过程推导并深刻理解总控程序三个动作的内在含义,进一步了解预测分析法是LL (1) 分析法的一种具体。最后,依据三个动作及举例分析句子的过程,描述总控程序算法。

1.3 反复分析并强调知识点间逻辑关系

根据作者的经验和所作的调查显示,许多学生学习完《编译原理》后,并没有从宏观上掌握了编译程序构造的原理和基本设计方法,只是记住了各种算法的步骤,学会了做题,能基本应付考试。这就要求在授课过程中,要特别注意引导学生重视对编译的原理和技术的全面把握。具体在实施的时候,建议根据授课内容,由浅入深,从整体到局部,反复强调章和章之间、节和节之间逻辑关系,让学生在学习过程中,对每个知识点的意义和构造编译程序时其所处的位置有精准的把握。

比如,在讲授词法分析这章内容初始,可先行描述本章内容的组织。章节结构用图的形式来描述更加清楚,例词法分析这章内容可如图1.1所示。即本章第一个内容是了解词法分析的二元式输出形式。要通过词法分析程序获取二元式,需提前对源程序过滤无用的符号,因此,第二个内容是如何对源程序进行预处理。第三个内容为词法分析器的设计,从源程序获取二元式。讲授到词法分析器的设计时,又可通过图1.2来描述所用知识点及他们之间的关系。即首先通过正规式或正规文法描述出单词的词法规则,然后将正规式或正规文法等价转化为有穷自动机,对有穷自动机进行确定化和最小化,最后根据最小化的确定自动机编写词法分析器。学生了解了设计的总体思路后,在讲授到具体某个知识点还需要重复它在本图中的位置,及意义,如对确定有穷自动机的最小化,其目的为使有穷自动机的状态转换图达到最简形式,以便简化词法分析器的构造。经过验证,这样的叙述方式将词法分析器的实现思路,各知识点的逻辑关系阐述的更加清楚,加强了学生的整体把握。

2、实验教学改革

要很好地理解和掌握《编译原理》这门课,除了重视课堂教学的方法之外,还应该重视课程实验。设计一组与理论内容相适宜的课程实验,是整体上提高《编译原理》课程教学质量的重要保证。在实验内容组织上,我们在教学上采取如下策略:

2.1 针对知识点,增加小实验

传统实验课要求每个学生在规定学时内编写出词法分析器、语法分析器、语义分析及中间代码生成器。由于实验时间短,加之课堂教学刚刚结束,理论知识还没有完全消化,并且该课程实验的编程思路和以往一些编程实验的设计思想有很多的不同之处,所以,对于大多数学生来说,完成本实验困难较大,导致部分学生甚至不亲自编程,而是抄袭其他同学的实验报告应付了事,影响了实验教学的效果。因此,建议在各章授课结束后,先布置一些简单实验题目,加深学生对理论内容的理解,同时为最终完成各主要实验题目做好准备。可从两方面来考虑这些题目的选取。一方面,这些题目要与编译器的构造过程相关;另一方面,它们能够体现编译技术的应用。比如,词法分析章节结束后,可布置"一个人带着狼、羊、白菜过河"的题目。又如,在算符优先分析法章节后,可布置"简单计算器的设计与实现"题目。

2.2 简化基础语言文法,以理解编译理论和算法为目标。

实验的目的是加强对编译理论的理解和算法的应用,提高编程能力。若把构造编译器的源语言文法设计的非常复杂,学生则不得不将大量时间花费在用同样方法重复处理文法上,导致学生产生厌烦和畏难情绪,且对理解编译理论和算法没有大的益处。因此,可将源语言文法进行简化,这种做法看似降低了编译器构造的复杂性,为学生编程降低了难度,实则促进了学生对整个编译理论和技术的宏观掌握。

2.3 加强实验过程的组织与管理。

《编译原理》的语法分析、语义分析等实验比较庞大,务必要做完善的准备工作。教师最好提前一周布置实验,让学生有足够的时间准备。其次,在课堂上简要概括所需的理论知识、明确实验目的、实验内容、重点和难点,提醒学生使用软件工程的思想,来完成实验。并且,为防局限学生思路及抄袭现象,可改变传统的实验报告模式,教师不再硬性规定报告的格式和内容,而是要求学生将实验报告以科研论文的形式提交,让学生可完整叙述自己独到的思路和见解[2]。

2.4 根据实验实际情况,因材施教。

针对不同层次的学生,教师可在适当时候提供部分参考程序,让学生来完善。

3、总结

根据多年的教学经验,本文提出了几种课堂教学和实验教学的改进方法,事实证明切实可行。随着面向对象语言应用的日益广泛,学生素质的逐年提高,提升教师本身素质,根据需要增删教学内容,都是我们刻不容缓必须马上面对的问题。在解决这些问题的同时,我们应在该课程现有教学方法的基础上,合理运用各种教学辅助工具,对新的更合理的教学方法进行长期的不断的探索。

摘要:《编译原理》是计算机专业的一门主要的专业课程, 在计算机科学中有着重要的地位和作用。本文针对该课程的特点, 提出了几种改进课堂和实验教学的有效建议, 事实证明切实可行。

关键词:编译原理,教学改革

参考文献

[1]刘艳.计算机兴趣教学定位.黑龙江科技信息, 2008, 10:128

《编译原理》课程教学改革探索 篇7

但是,编译程序是一个庞大和复杂的系统软件。它所包含的算法和思想理论性强且抽象度高,计算机专业学生普遍反映,编译原理课程是一门比较难于理解和掌握的课程。如何让这门课程的教学效果达到令人满意的程度,是《编译原理》教师普遍关注的问题。该文通过分析目前《编译原理》教学过程中存在的问题,对《编译原理》课程教学改革提出了一些新的方法和见解。

1“编译原理”课程教学现状

《编译原理》课程在目前教学中出现的主要问题有:

1)课程内容抽象难懂,采用传统的灌输式的授课方式,教学手段单一,无法激发学生学习兴趣。编译原理课程中的概念和算法大都以符号、自动机、上下文无关文法、属性文法等抽象程度较高的复杂形式描述,教材内容显得比较枯燥。如果教师在教学中又以传统的灌输式教学为主,那么因为理论知识较抽象,在整个的教学过程中学生被动地接受知识,教师很少考虑学生的需要和态度,就会让学生觉得授课内容枯燥乏味,学习缺乏主动性,影响教学效果,造成理解难度大和教学难度大的情况。

2)学生觉得编译技术在一般的软件开发中应用不多,学习积极性不高,难以让学生对这门课程的学习形成主动性。编译原理这门课包含许多理论知识和算法,这些理论的学习和理解都存在着一定的难度。同时,学生感觉教材中理论知识很难又不实用,所以学习积极性不高。但是和数据结构课程做比较,数据结构课程的很多内容也比较复杂和抽象,但是学生的学习积极性明显很高,看来内容的抽象并不是造成这门课程难讲、难学的唯一原因,造成这种现象的还有一个重要因素是,课程内容实用性的广度不同。数据结构课程中的很多内容如:栈、队列、图、排序和查找算法,学生在一般的软件开发中都会经常用到,即使用频率很高,学生觉得有必要学习即使课程内容难,学习积极性高,自然老师也容易教,也愿意教,学生也愿意学,教学效果就自然好。而编译原理中的很多技术,比如形式语言理论,LL和LR语法分析算法,属性文法,代码优化技术等,学生觉得这些技术只有在翻译器的开发中用到,而自己一般也不会从事这方面的软件开发,加上这些技术的理解难度和上机转换成程序的难度明显比先前学过的课程难度大,所以学习主动性不高。

3)先修课程知识掌握不牢,增加学习本课程的难度。编译原理课程一般是在大三开设,它的先修课程在大一和大二学习,如果学生在之前的课程学得知识不太好,那么对这门课程的学习过程中就会觉得难度很大,影响学习效果,比如数据结构的“栈”,如果学习不好,就直接影响学生语法分析器的理解和上机实现。

4)课程的课时有限,有的高校上机实践环节无法有效实施。由于教学改革,很多高校对包括本课程在内的许多专业课的授课课时进行了压缩,在一定程度上给教学增加了难度。有的高校对本课程没有开设实验课,仅仅学习了一些编译理论与算法,只有理论没有实践,使得学生无法将抽象的编译理论知识具体化和形象化,就难以对基本概念和方法正确地理解和运用,也无法全面系统地掌握了编译器的构造过程,缺乏上机实践,就会影响教学效果。

2“编译原理”课程教学现状

针对以上在课程教学中出现的问题,该文提出了以下一些教学改革措施:

2.1 合理选用教材和参考书,保持教学内容的时代性和先进性

从教材建设方面看,教材坚持“基本概念严谨,基本方法灵活”的论述方法,既注重科学性也注重通俗性,文笔平实、通顺,易于理解。同时教材应该符合《中国计算机科学与技术学科教程》最新版的要求,真实反映当前程序设计语言翻译领域的核心知识,摒弃了部分陈旧内容及过时技术,并在此基础上增加适应新发展方向的内容;或对现有教材进行改版以满足新的教学要求。著名计算机科学家和教育家Alfred V.Aho所著的《编译器:原理、技术与工具》英文原版教材和翻译本可以作为主要参考书。增加配套实验教材,实验题目应该难度适中。合理选用教材和参考书,保持教学内容的时代性和先进性科学授课,可以充分调动学生的积极性和创造性。

2.2 科学授课

2.2.1 类比教学

使抽象内容形象化。事物之间存在着普遍联系,知识之间也存在联系,因而在教学过程中教师应该注意到这种联系,可以行之有效地运用这种联系的方法就是类比教学法。为提高课堂教学的效果,类比教学方法和值得推广。比如在讲高级程序设计语言的语法分析器的时候,涉及一个非常重要的内容:上下文无关文法。在讲的时候,可以先以自然语言文法为话题来引入。

以一个简化的自然语言文法为例:

句子→主语谓语宾语

主语→你

主语→我

谓语→是

宾语→定语宾语

定语→可爱的

宾语→男孩

宾语→女孩

以上文法描述了一个简化的语言模型,该文法可以用来验证某个句子是否属于该语言模型。比如,验证“你是可爱的男孩”是否为合法的句子,实际上就是从“句子”出发,反复把上述规则中的“→”左边的符号替换成右边的符号的过程,如下:

句子=>主语谓语宾语

=>你谓语宾语

=>你是宾语

=>你是定语宾语

=>你是可爱的宾语

=>你是可爱的男孩

则表明这个句子符合该文法描述的语言模型,即为合法的句子,否则为不合法的句子。这个例子中,文法G(VN,VT,S,P)可很容易地被学生理解。每个规则是文法的一条产生式P,而“句子”,“谓语”,“宾语”,“定语”就是非终结符VN,其中,“句子”是文法开始符号S,该文法的所有的句子都是由它推出的,“你”,“我”,“可爱的”,“男孩”,“女孩”就是终结符VT。由此例再引出“直接推导”的定义。“直接推导”,就是将产生式左部的非终结符替换为合适的产生式右部的过程,可以用“=>”来表示“直接推导”。同时,“语言”的定义也可以很容易地理解,就是从文法开始符S出发,通过推导得到的所有句子构成的集合,就是这个文法所描述的语言L(G)。经过以上分析,授课内容过渡到高级程序设计语言的语法分析器的开发途径,就是,需要对高级程序设计语言构建一个工具来描述这种语言的语法结构,这个工具就是上下文无关文法,上面的例子清楚地说明了文法G的主要概念。通过采用类比教学法,学生也容易理解和接受抽象理论。

2.2.2 温故而知新

编译原理是许多课程的一个综合性的实践。在课程讲授中,应注意将教授的课程内容与先修课程相关联,一方面起到温故而知新的作用,提高对程序设计语言、算法、软件开发理论的理解,另一方面也促进学生考虑问题层次的迁移,可以使学生体验到这些先修课在系统软件开发中的作用。比如在讲整个编译器符号表管理时,会涉及到散列表;讲自上而下语法分析器和自下而上语法分析器时候,会涉及到语法树和栈;在讲属性文法和中间代码优化的时候,会涉及到图,这些都是数据结构知识在系统软件开发中的实际应用;还有如运行时存储空间分配,会涉及操作系统的知识;目标代码生成部分的内容会涉及汇编语言以及计算机组成原理等课程的内容,这些内容在编译原理中再次学习并应用,会起到温故知新的作用。

2.2.3 变“填鸭式”为“启发式”

“填鸭式”教学方式是教师为主体,学生被动学习的一种传统教学模式。而启发式教学是利用有限课时讲授重点内容,给出重要结论之前先提出一些问题,让学生思考。比如在讲词法分析器的设计这一节时,教师可以先提一个问题,即考虑在给定输入是高级语言源程序,输出是该程序的单词二元组(Token)形式的前提下,怎么去设计词法分析器,也就是怎么把源程序的字符流转换成单词流,可以让学生先思考,然后鼓励他们发表自己的见解,而不是由老师直接讲出该部分涉及到的知识:预处理、正则表达式、超前搜索识别、状态转换图、确定有限自动机(DFA)、非确定有限自动机(NFA)等非常抽象的理论。这种方法激发了学生的思维,由以往的老师直接讲,直接灌输的填鸭式教育,变成学生主动去思考、去实现的启发式教育,能够收到更好地教学效果。

2.2.4 多媒体与传统板书相互补充

板书和PPT各有优势,通过合理分工,可以使学生更好地理解讲授的内容。对于在授课过程中需要长时间对照参考的内容、复杂的推导步骤、难以在一张PPT中展示的内容,可以采用板书的方式讲解。而对于课本的核心内容、扩展内容、抽象内容的图形化或动画演示可以采用PPT的方式讲解。如在讲授程序句子递归下降法语法程序执行过程时,可以运用ppt的动画效果,直观地描述文法符号对应的程序递归调用的变化过程,抓住学生的注意力,增强了学生学习的兴趣,如图1所示。这和手工分析相比,即清晰又避免了长时间的手工书写过程;同时,PPT页面容量有限,有时候无法同时将某些显示给学生,影响教学,这些内容是可以板书出来,配合PPT演示,这样会取得更好地教学效果。

2.2.5 开发多媒体辅助教学软件

讲课时,采用文字、动画、图形等多种媒体,可以使内容充实,形象生动。对书本中死板的知识赋予活力,使学生在轻松的学习环境中掌握更多的要领。软件以多媒体动画的形式生动形象地描述了编译器的各个阶段的工作过程。借助现代化的教学手段和工具,将抽象的知识具体化、形象化,便于学生理解复杂的原理,极大地调动了学生的学习积极性,学习效果有了明显的提高。比如:LL(1)分析法、移进归约分析法就可以采用FLASH动画演示,模拟语法分析过程,实现分析表和分析栈的状态跟踪。

2.2.6 将学科发展新内容引入教学中

在课堂授课上,首先注意将学科发展新内容反映到教学中,以丰富同学们的知识结构和拓展同学们的思路。很多学生在学习的时候,只是就编译技术学习编译技术,只知道在开发编译程序的时候会用到哪些理论,但是并不了解这些理论在编译技术之外的广泛应用。新的教学方式不能只是枯燥地讲解编译理论,而是应该在介绍编译技术的同时,介绍一些所学内容的学术前沿,使学生有强烈的学习和研究的冲动。编译技术在当前已经广泛应用于编译器构造之外的其他领域,比如:常用的文本编辑工具的实现;浏览器对HTML、XML的解析;网络检索;网络协议解析、信息安全领域;软件测试领域;中文叙词表的有效性检验程序;虚拟机、多核编程、嵌入式程序设计领域。这些新信息、新内容的引入,将有助于让学生对所学内容产生兴趣,同时加深对所学知识的正确认识,对于今后从事系统软件和应用软件的开发以及计算机的相关工作都是非常有好处的。

2.3 注重实践环节,强调能力培养

实践性教学是课程教学体系中一个不可缺少的重要环节,对学生创新能力的培养,综合素质的提高,具有不可替代的作用。编译原理实践性教学的设计思想是使学生通过课堂学习,理解编译原理的同时,注重学生实践能力的培养,进一步巩固对知识的理解,通过实际的锻炼,掌握编译技术,进而能够独立的进行编译器的设计。

由于本课程在本科阶段的学习重点是编译的前端技术:文法、正则表达式、语法分析器以及语法制导翻译器,而后端的目标代码生成及优化技术在本科并不是教学重点,而是后继研究生的课程,再加上该课程的实验的课内学时一般都较少,时间非常有限,所以应该开展短学时编译原理实践教学设计,所以可以要求学生实现一个受限语言的词法分析、语法分析、语义分析和中间代码生成功能的基本编译器即可。实验课实施策略,采用在课程理论课的进行中,加以适当引导,同时让学生在课下前做好设计,根据课程教学内容的开展,让学生在有限的上机时间内完成了实践。编译程序实验课,前一个实验的输出结果要为下一个实验所用,所以前一个实验的完成好坏直接影响下一个实验的开展,所以教师要对学生每节实验课的完成情况进行有力监督和指导,同时进行随堂评分,以激励和督促学生完成上机作业。

2.4 建设编译原理资源网站,辅助学生自主学习

由于编译原理课程内容抽象难懂,学生难以在有限的课时里掌握讲授的全部内容。建立课程的网络教学环境,将课程的多媒体课件、课堂授课视频、编译原理实例库、习题库、编译源程序、实验所需编译工具等放在课程网站上,供学生在课后使用,极大地方便了各类学生的不同需求,使教师的课堂在课后得到了有效的延伸。同时,还可以通过网络平台提供的多媒体交互手段让师生进行有效的沟通,答疑解惑,同时也可以缓解目前学生人数增多,教学资源不足,学生质量参差不齐,教学质量和效率得不到保证的情况,为该课程的教学提供强有力的支持。

2.5 教师队伍培养

教师应该承担过实际编译程序或相关系统软件的研制,具有丰富的教学经验和科研能力。紧密跟踪与编译原理相关的学科国际学术前沿,不断更新教学内容,以保证教学内容的先进性,并将科研中遇到的问题作为教学的典型案例在课堂中进行讲解,将科学研究的最新成果不断充实到教学过程之中,并且将科研项目进行必要的分解,组织部分优秀的学生参与项目开发,使学生切实体会到理论成果在技术实践中的完美应用,深刻理解理论与实践相结合的意义和具体途径。

2.6 学校与公司合作,共建课程

学校可以和国内外和编译工具软件等相关的计算机公司签订培训协议,推荐学生到其公司进行专业实习和暑期实践,为学生提供到公司进行实践的机会,使学生能够更深刻了解课程知识的发展应用,同时培养学生的问题求解能力和软件开发水平;另一方面,聘请公司的资深开发人员、高级技术专家等人员到学校做讲座,讨论编译原理课程内容及其应用的热点问题等。学校和公司联合教学,共同提高学生的课程学习效果,多方面提升学生的能力和素质。

3 总结

编译原理是计算机专业的核心课程,它对培养高水平的计算机专业人才有重要作用,同时可以培养学生计算机思维和问题求解能力,因此是需要学生认真学习、教师认真教学的一门课程。为了使该门课程取得高效的教学成果,该文针对该课程目前的教学现状,从多方面对现有编译课程的教学提出了自己的一些改革措施。实践证明,这些措施的实施,使得学生不仅可以学习到课程的核心内容,同时还可以学习到结合现代信息发展的新的教学内容以及国外优秀教材的精华;通过在已有的教学手段的基础上,实施新的教学手段,能充分提高学生学习兴趣,有利于抽象内容的理解;通过上机实践,学生能有效提高自己的动手能力;通过构建网站,辅助学生课外学习;通过培养师资,为教育质量提供有力保障;通过校企合作,给学生提供更多实践学习的机会、并为将来的就业打下良好基础。总之,采用合适的教学措施,将使编译原理课程的教学效果提升到一个新的高度。

参考文献

[1]陈火旺,刘春林.程序设计语言编译原理[M].长沙:国防工业出版社,2004.

[2]Alfred V.Aho.编译原理技术与工具[M].北京:人民邮电出版社,2008.

[3]Alfred V.Aho.编译原理[M].北京:机械工业出版社,2009.

[4]Alfred Aho,Ravi Sethi,Jeffrey D.Ullman.译原理[M].北京:机械工业出版社,2003.

[5]Francisco Ortin,Daniel Zapico,Juan Manuel Cueva.Design patterns for teaching type checking in a compiler.construction course[J].IEEE Transactions on Education,2007,50(3):273-283.

[6]裘巍.编译器设计之路[M].北京:机械工业出版社,2011.

[7]Thomax Pittman James Peters.编译程序设计艺术[M].北京:机械工业出版社,2010.

《编译原理》课程教学改革探讨 篇8

编译原理课程主要介绍编译程序构造的一般原理、基本设计方法、主要实现技术和一些自动构造工具。虽然大多数的程序设计和开发人员不需要写自己的编译器, 也不一定非读懂任何编译器的代码, 但是编译程序构造的基本原理和技术广泛应用于一般软件的设计和实现。因此掌握好编译原理这门课程, 可以深层次地理解程序语言和内部机制, 对以后从事计算机项目开发, 很多思想可以借鉴, 受益匪浅。

2、编译原理课程的教学现状

我们是新建的本科院校, 学校坐落在民族地区, 学生在平时学习中与外界的实践接触较少。对计算机这类技术学科, 这些条件限制使得很多课程的教学偏重理论, 显得枯燥, 增加了难度。接触过编译原理课程的老师和学生大概都有相同的感受:这是一门“难教难学”的课程, 甚至认为这是计算机课程体系中难度系数最高的, 内容抽象、理论性强、对实践要求高。

2.1 学习兴趣和热情的严重缺乏

学生大多理解这门课程只是介绍编译程序的构造, 而自己以后很少会涉及从事编译器设计工作, 因而认为没有实际应用价值, 没有真正领会这门课程在整个计算机知识系统以及软件理论和开发方法上的潜在意义。实际上不管是国内还是国际知名高校, 从本科、硕士到博士都有关于编译原理课程的整体规划设置, 这足以说明该课程在计算机专业中的位置是不可忽略的。

没有清楚认识课程的学习意义, 不实用的思想导致了学习兴趣的大幅下降, 被动的学习加上课程本身的难度和深度使得学生的学习积极性降到了低点。较多的学生反映课堂上能听懂老师的例题讲解, 但是由于没有真正把知识点落实, 课后独立完成习题觉得很困难, 慢慢地产生畏难情绪, 如此的恶性循环滋生了对课程学习的强大障碍。

2.2 纯理论式的传统教学

在前些年编译原理课程的教学中, 理论教学比例过大甚至忽略了实践教学, 没有真正将实践和理论结合起来。在课堂上老师扮演着主要角色, 采用传统的教学模式, 以教师为中心、老师讲、学生听, 没有更好地调动学生的积极性, 因此教学效果也不是那么好。

2.3 课程实践的匮乏

编译原理的实践教学所占比例小, 教师和学生都忽视了实践教学在整个课程中的重要性, 脱离了实践的理论学习会显得更加枯燥和抽象。目前课程设置中增加了实践教学, 但是由于编译原理的实验题目偏难, 并且需要实践者有足够的理论基础和较强的编程能力做支撑, 所以大多数学生仍然觉得编译原理的实践是件棘手的事情。导致了学生对编译原理的理解往往停留在书本的理论概念上, 不明白怎样才能把理论应用到实际的编译程序设计中。

3、推进编译原理课程的教学改革

由于编译原理课程涉及的理论知识多, 可研究性强, 应根据学生的实际情况选择合适的教材、运用适当的教学模式来组织教学内容、理论实践相结合, 以更好地提高教学效果, 满足不同层次学生的需求。

3.1 教材的改进与选择

现在程序设计语言已经从过程式转向对象式, C++、C#、Java等就是目前在软件设计中流行的面向对象编程语言, 程序设计模型的变迁带来了算法描述工具的变化。在计算机应用领域几乎都使用面向对象语言, 各种电子产品的嵌入式软件广泛用到面向对象技术。在这样的背景下程序设计的一些后继课程诸如数据结构等也进行了同步的改进, 已出现了用Java或者C++描述的数据结构教材, 但是大多高校使用的编译原理教材还是没有大的变化, 教材中的编译算法和模型仍然用C语言甚至Pascal语言来描述。

这种主要关注面向过程的编译技术的教材, 会让学生觉得编译原理课程和当前的程序设计应用较为脱节。因此分析面向对象技术后台的编译系统非常有必要, 这样更贴近应用, 更利于培养学生的学习兴趣。可以选用对象式语言描述编译算法和教学模型的编译原理教材, 将面向对象的编译技术有机结合到教学中。例如目前国外以及国内某些高校选用Java语言描述的编译原理新教材, 其中像《现代编译程序实现———Java语言》 (影印版) 教材可视为典型。改进后的教材在词法分析和语法分析上变动较小, 主要增加了针对面向对象语言的语法结构及其语义特征, 着重从类及类的继承结构上讨论编译实现技术及构造面向对象编译器的思路;在语义分析、代码生成等内容上调整幅度较大, 面向对象的作用域特性、类的封装、继承以及多态的典型特征都将体现在教材中。

3.2 教学模式的转变

打破传统的以教师为中心、一味灌输式的教学方法, 采用更能激发学生兴趣和潜能的“以学生为主, 师生互动, 实例教学”的教学模式。在教学中, 教师扮演好传授、指导、组织和帮助的角色, 利用问题及情境充分发挥学生的主动性、积极性和创造性。

对某些章节教师首先提炼出核心问题, 让学生带着问题自主学习。之后由学生讲解, 展开课堂讨论, 最后教师再总结归纳。这样学生不再是只带耳朵来听课的机器, 更多的时候由他们来主导控制课堂, 由完全的被动转化为主动, 将会大大地提高教学效果。当然在这个过程中教师要有足够掌控课堂的能力, 给出恰当的涵盖相应知识面的问题, 能在适当的时候做引导者促进讨论的展开, 让大多数学生能在互动的氛围中积极掌握课程知识。

枯燥的理论转化为实例教学, 效果也是事半功倍。比如词法、语法分析中很多理论描述都比较抽象复杂, 此时教师先不分析理论, 而是借助实例的讲解, 案例完成后再总结归纳理论知识点。通过实例的引导, 既提高了教学效果又营造了轻松的课堂氛围, 师生互动得以良性地发展下去。下面通过一个具体的例子简单分析“实例教学———知识归纳———案例实践———总结”的教学模式。语法分析中有个重要的内容是项目集规范族C的构造, 这是自下而上语法分析中LR (0) 以及SLR (1) 分析表的关键, 但其构造算法描述很复杂, 我们从案例出发引导学生推导到算法规则。例:文法G为E→aA∣d, A→cA∣d, 要求给出该文法对应的项目集规范族C。教师通过讲解例子归纳出求解过程:首先引入新的开始符号S’拓广文法, 构成S’→S.作为唯一的接受态项目, 用closure ({S’→.S}得到初态项目集;计算go (I, x) 得到新状态J的项目集;重复前面两个步骤直到不出现新的项目集为止。在此基础上分析算法, 接着让学生自主完成练习领会算法思想, 这样比直接分析长篇幅的算法效果更加明显。

3.3 课程实验的深化

目前学校提倡“本科学历 (学位) +职业技能素养”的办学模式, 把实践教学提到了相当的高度。整个课程体系及人才培养方案都在强化实践, 同时编译原理课程属于技术学科, 必须注重理论与实践的有机结合, 强调课程实验的重要性, 强化对学生实践动手能力的培养。编译原理的实验难度大, 有的编译器实现程序代码多达十几万条指令, 因此我们一定要避免直接让学生分析和设计编译器, 要循序渐进, 按照高级程序语言的编译过程模块化地设计实验, 结合系统的编译原理实验教材逐步深入地进行课程实践, 真正把实践教学落到实处。

分层次制定课程的实践环节。最初借助面向对象编程语言的编译模型工具生成简单代码的词法分析和语法分析程序, 让学生理解代码的程序结构;在此基础上添加语义动作, 理解虚拟机生成代码;最后扩展教学模型, 分层次构造完整的编译程序。在综合实验部分, 教师可以设置好程序代码框架, 甚至提供源代码将关键模块挖空, 指导学生完成核心代码的编写与调试, 有方向性地指导学生完成课程设计, 以此让他们能投入更多的热情与精力去实际地开展有深度和广度的课程实践, 促进理论的进一步掌握。

4、结束语

编译原理在高校计算机专业课程体系中的地位是不可忽视的, 我们需要与时俱进, 适当调整课程教学的体系和内容, 以更好地顺应计算机技术的发展。怎样在有限的学时内让学生既能掌握扎实的理论, 又能切实提高实践的能力, 这是编译原理课程教学面临的难题。教师应通过优化教学改革、不断探讨, 采用多样的教学手段、灵活的教学方法, 不断地提高编译原理课程的教学质量。

摘要:以新建本科院校为背景, 从学生学习兴趣、教师教学、课程实践等几个方面分析了当前编译原理的教学现状, 提出了对教材、教学模式以及课程实验的基本改革思路, 用以提高编译原理教学效果。

关键词:编译原理,教学改革,面向对象,实例教学

参考文献

[1]何炎祥, 伍春香.计算机专业不需要开设编译原理课程吗[J].计算机教育, 2009年第4期

[2]Alfred V.Aho, Ravi Sethi.编译原理技术与工具 (英文版) [M].北京:人民邮电出版社, 2010

[3]胡学联.编译原理课程的调态与转型[J].计算机教育, 2006年11期

《编译原理》教学方法的研讨 篇9

关键词:编译原理,教学方法,教学组织

《编译原理》课程是计算机科学与技术专业中的一门重要的专业课程。传统的教学方法主要突出编译原理课程中书本知识的传授, 对于编译技术的思想介绍不是很突职课程授课模式缺乏让学生自己独立思考和解决问题的机会。实践课程也是在老师的精心安排下, 按照预定程序对所学知识进行的简单验证活动, 学生缺乏独立操作和自己摸索、体会以解决问题的机会。根据重庆市教育委员会关于印发《重庆市高等职业院校人才培养工作评估实施细则》等文件的通知, 就现阶段课程设置提出以下几点建议: (1) 以市场需求为主设置课程。首先, 做好市场需要调查, 确定课程设置方向。市场需求调查, 不仅是针对当前市场需求的调查, 更重要的是使人能够从中发现未来市场的需求, 这样才能按照职业岗位工作的需求去精选合适的专业理论知识。其次, 课程内容的设置要有很强的行业或岗位针对性, 但也要注意课程之间的衔接, 将相关知识有机地组合。最后, 与市场需求的变化相适应。由于市场是在不断变化的, 新的技术和新的经济形态的不断出现就会对职业岗位技能提出新的要求。因而, 高职课程的设置要根据客观需要和新的知识、技术成果以及职业岗位要求, 适当地引进新内容。 (2) 注重技能的培养, 加大课程中的实践内容。高职院校的课程设置应加大学生实践的机会, 让学生动起来, 提高学生的实际操作能力和主动解决问题的能力。要达到这样的效果, 不仅仅是在学校的实训基地中进行模拟操作, 更要注重在产业部门中获得经验和知识。这就需要高职院校主动与社会、企业、当地行政主管部门联系, 通过校企合作、产学结合等途径, 实现高职教育在教育观念、办学体制、培养目标、培养模式、培养方法等多方面的创新。

二、《地基与基础工程施工》课程改革实践

《地基基础工程施工》课程应用较广, 不仅涉及到建筑工程技术专业的房屋建筑基础施工、道路与桥梁工程技术专业的路基处理、桥梁基础施工, 其中基坑工程施工更为地下工程专业的重点学习内容。在课程改革之前其主要内容涉及到:土的物理力学性质及工程分类、地基土中的应力计算、土的压缩性与地基沉降计算、土的抗剪强度与地基承载力等内容, 虽说为高职高专类教材但其实质无疑为本科教育的“压缩饼干”。根据高职教育培养高端技能型人才的培养目标, 此次《地基基础工程施工》的课程设置打破了传统知识体系的完整性, 保持职业活动的完整性, 采用真实工程项目, 着力体现职业岗位需要什么就学什么, 学什么就教什么的职业教育教学思想。在统筹考虑和选取教学内容时, 以真实工作任务为依据, 按照职业岗位任职所需要的知识、能出, 从而使得学生认为本课程对其今后的发展没有什么作用, 而忽视了课程开设的目的。我们认为, 《编译原理》课程内容虽然多, 但各部分间逻辑联系很强。课程大致可分为力和素质要求整合序化教学内容, 将原来的“工程制图与识图”“工程测量”“土力学与地基基础”“建筑结构”“施工组织”“质量验评与事故处理”等学科课程按照基础工程施工时职业岗位所需要的知识和能力进行重新构建。根据职业能力形成要求, 我们把整个课程按施工过程分成六个单元, 分别是基础职业情景建立、基础施工图识读、基础施工测量、土方施工、垫层施工、基础施工。每个单元对应于基础工程施工的某个分项工程的工作过程, 每个单元又由若干个工作任务组成。《地基与基础工程施工》课程设置的具体内容包含以下几个方面: (1) 重构基于工作过程的专业课程体系, 以基础施工工序为导向编排教学内容。 (2) 课程和课程内容工序化, 以职业岗位能力培养为导向, 以个人职业成长和个人在实际工作岗位中的成长规律作为参照。 (3) 采用行动导向的课程教学设计方法, 其核心是根据工作过程确定学习单元及其对应的工作任务。从基础工程施工全过程分析出发确定典型工作任务, 通过对典型工作任务的教学改造, 理论实践一体化设计必需的知识和技能。 (4) 模拟企业的实际工作情景和组织结构 (环境和角色) , 教学过程以学生为主体, 在掌握专业技能的同时, 培养学生沟通、协作、组织和管理能力。 (5) 课程教学载体源于真实, 高于真实, 将真实的基础工程施工过程转换为教学过程, 真实的工作任务转换为教学任务。课程以框架结构房屋基础工程项目的施工过程为主、以基坑支护结构的模型制作为辅, 突出技能培训与职业岗位的“零距离”结合。 (6) 校企共建实训基地, 共同实施课程教学。

国务院副总理张德江同志在重庆市职业技术教育工作会上的指出, 职业技术教育要以掌握技能为根本, 突出技能训练和动手能力的培养, 在掌握技能上下功夫。让学生在实践中提高动手能力, 理论与实践相结合, 掌握技术技能。《地基与基础工程施工》课程的设置符合职业教育要求, 以职业岗位为核心, 以行动为导向, 在教学实践中取得了良好的效果, 希望对其他课程的设置有一定的借鉴作用。

参考文献:

[1]陈民利.高职教育“就业导向”热中的冷思考[J].辽宁高职学报, 2005, (8) .

[2]张瑜.课程领导理念下高职院校校本课程开发研究[D].陕西:陕西师范大学, 2009.

作者简介:卢敏健 (1985-) , 男, 讲师, 研究方向:岩土工程。

三个部分:第一部分是程序设计语言基本概念、形式语言与自动机理论和编译程序的构造原理, 使学生了解编译程序在程序设计语言系统中的重要地位;第二部分为形式语言与有穷自动机理论, 为编译程序提供了完善的理论基础;第三部分深入透析编译程序的构造结构, 突出编译程序各部分之间的逻辑关系, 使学生了解编译程序的总体构造过程和方法, 能够掌握基本的构造原理与技术。《编译原理》课程具有较强的理论性和实践性, 本文将从教学目标、教学组织以及典型教学方法三个方面来探讨如何有效实施课程教学。

一、教学目标

以工科为主的计算机科学与技术专业中的绝大部分毕业生都不会去设计编译器或者从事相关工作。但《编译原理》课程中蕴含的知识内涵非常丰富, 课程中体现出的形式化方法和抽象的逻辑思维能力是计算机科学与技术专业学科所要求的重要的“计算机思维能力”。能力的培养绝不是通过一两门课程的学习可以实现的, 尤其这种抽象思维能力的培养, 需要长期不断地学习和积累来完成。本门课程就是这个体系中的重要组成部分。就如何突出该课程的实践性和必要性, 让学生掌握和了解编译程序的基本理论和基本构造方法, 还要兼顾大多数学生的需求, 成为制定《编译原理》课程教学目标的主要内容。所以, 我们对学生的要求是:

1. 对课程整体应当有较为全面的了解和认识, 熟悉编译程序的构造过程和形式语言中的基本概念和基本理论。

2. 理解编译程序构造的一些基本算法和基本技术。

3. 能够使用有穷自动机的理论和算法, 解决常见离散事件问题。

二、教学组织

教师的职责就是讲授知识, 陈述的内容要便于学生理解与接受, 同时还要提高学生分析问题的能力, 当然也不能忽视学生应用相应方法的能力。在《编译原理》课程的教学组织中, 应当从以下几个方面组织和安排教学工作:

1.备课。《编译原理》课程的一个特点是逻辑性很强, 所以该课程在准备的时候, 可能比其他课程需要花费更多的时间, 需要将课程的整体逻辑理顺, 在一个完整的课程框架内合理安排各个分支逻辑的内容, 孰轻孰重, 就一目了然了。所以该课程的前期准备阶段非常重要, 需要我们对课程的内容有比较深层的理解和认识, 设计一个实验系统, 以增加实践的效果, 提高课堂中的实践性讲解, 做到开课之前就对课程有一个清晰的逻辑思路。

2.讲课内容安排。《编译原理》课程内容覆盖广泛, 涉及到很多相关学科的知识, 如高级语言、离散数学、数据结构等专业基础课程, 就目前教学的基本学时数来说, 基本无法满足教材中所有内容的讲授, 教师可以根据学生的理解情况对关的内容适当取舍。对一般性的知识可以跳过, 比如高级语言的概念;对理论性很强的概念可以不作要求;对已学过的知识可以略过, 如符号表、存储管理等。在有限的课时内充分安排教学内容, 是《编译原理》课程中组织教学的一个关键环节。对于有穷自动机的工作原理和实现以及与正则式的关系, 可以详细讨论, 并可以作一定的衍生, 特别是有穷自动机的理论和应用, 可以留给学生一些思维的空间。总之, 课堂内容的安排组织在一定程度上可以激发学生学习探索的积极性和创造性。

3.习题课讨论课。《编译原理》课程理论性很强, 有大量的基本概念和算法, 有些概念和算法在理解上有一定的难度, 为了便于学生理解相关的知识点, 在教学组织中应当安排一定数量的习题课, 帮助学生加深对基本理论和常用算法的理解, 力争达到灵活应用的目的。比如在讲解文法和语言一章中, 有许多形式化的概念:文法、推导、语言及Chomsky文法的分类等, 对第一次接触到这样的概念的学生来说, 理解这些概念的实质及它们在课程中的作用和地位是比较含糊不清的, 往往会使一些学生失去对此课程的学习积极性。

4. 实验实习安排。

《编译原理》课程是一门理论性很强的课程, 主要表现在形式化语言的理论基础概念贯穿在完整的课程知识中, 尤其是语法制导的翻译和以形式化的属性文法为基础的翻译过程, 大大地增加了课程的难度, 代码优化及优化中的数据流方程又为整个课程添加理论难度, 就是这样的一门理论型课程, 却有着同其他应用型课程一样重要的实践性, 甚至其实践的意义更为重要。课程的特点决定了课程中的实验实习的重要地位。笔者要求学生完成Tiny C语言的编译程序, 使得学生通过实践更为深入地理解课程中的理论知识与方法。

5. 典型教学方法。

《编译原理》课程的教学难度比较大, 既要让学生理解编译原理的基本理论和方法, 还要学生能够掌握一些解决问题的方法和思路。《编译原理》课程的教学方法很多, 笔者在总结自身教学活动中, 觉得有以下一些方法和思路可供探讨: (1) 图示法。运用状态转换图形象直观, 对一些抽象问题的解决有很好的帮助。这也是对问题抽象分析的重要体现。有穷状态自动机在解决一些离散状态问题中是一个十分重要的思维模型, 如果能够将问题的分析和抽象通过自动机的模型反映出来, 那么问题的解决将变得十分的简单和可靠。 (2) 枚举、归类法。列出集合中的部分元素, 寻找元素之间的内在联系, 构造相应的规则, 这是形式化方法和抽象思维能力的具体体现。从元素的构成形态出发, 归纳出其一般形式, 需要有丰富的想象力和创造能力, 再加上对形式工具的使用, 能够构造出形式多样的表示方法。

在计算机专业如何有效开展《编译原理》课程教学与学习是一项值得研究的问题, 作为教师的我们需要与时俱进, 适时考虑相应教学方法和内容的改革。这里我们提出和总结了一些教学方法和手段, 在实际教学过程中取得了良好效果。但《编译原理》课程的教学方法和内容改革仍然需要我们继续付出大量辛勤劳动, 以便取得好的教学效果。

参考文献

[1]陈火旺, 刘春林, 谭庆平, 赵克佳, 刘越.程序设计语言编译原理[M].第3版.北京:国防工业出版社, 2000.

[2]吕映芝, 张素琴, 蒋维杜.编译原理M].北京:清华大学出版社, 1998.

[3]Alfred V.Aho.Compilers:Principles, Techniques, and Tools (影印版) [M].北京:人民邮电出版社, 2002.

[4]高仲仪, 金茂忠.编译原理及编译程序构造[M].北京:北京航空航天大学出版社, 1996.

[5]陈意云.编译原理和技术[M].合肥:中国科学技术大学出版社, 1997.

[6]张幸儿.计算机编译原理[M].北京:科学出版社, 2003.

上一篇:信息化学生管理下一篇:语文教学中的分层教育