编译问题

2024-09-02

编译问题(精选9篇)

编译问题 篇1

语法分析是编译程序的核心部分,其任务是检查词法分析器输出的单词序列是否是源语言中的句子,亦即是否符合源语言的语法规则。完成句型的分析,主要有两种方式:一种是使用推导方式推导出句子,即自顶向下的语法分析方法;另一种是利用归约方式识别句子,即自底向上的语法分析方法。本文以编译程序自底向上语法分析为主线,探讨自底向上语法分析归约中的句柄求解问题,希望对编译原理的课程教学有启发作用。

1 自底向上语法分析

自底向上语法分析,也称移进-归约分析,指从给定的输入符号串w出发,试图将其归约为文法的开始符号。其实现思想是对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移入边分析,一旦栈顶符号串形成某个句型的句柄或可归约串时,就用该产生式的左部非终结符代替相应右部的文法符号串,重复这一过程直到归约到栈中只剩下文法的开始符号时为分析成功。

在自底向上的分析过程中,最关键的问题是句柄的识别问题,即每次规约时按当前句型的句柄进行规约。自底向上语法分析方法主要有优先分析法和LR分析法。下面以两种分析法为例求解句型的句柄及可归约串问题。

2 优先分析法

优先分析法可分为简单优先分析法和算符优先分析法。简单优先分析法的基本思想是对一个文法按一定原则求出该文法所有符号即包括终结符和非终结符之间的优先关系,按照这种优先关系确定归约过程的句柄,其归约过程是一种规范归约。

算符优先分析的基本思想是只规定算符之间的优先关系,不考虑非终结符之间的优先关系,在归约过程中只要找到可归约串就归约,并不考虑归约到哪个非终结符名,其归约过程不是归范归约。

2.1 简单优先分析法中的句柄

简单优先分析法的分析算法:

先根据已知优先文法构造相应优先关系矩阵,并将文法的产生式保存,设置符号栈S:

1)将输入符号串a1a2an#依次逐个存入符号栈S中,直到遇到栈顶符号ai的优先性大于下一个待输入符号aj时,停止进栈;

2)以栈顶当前符号ai为句柄尾,由此向左在栈中找句柄的头符号ak,即找到ak-1的优先性小于ak为止;

3)由句柄akai在文法的产生式中查找右部为akai的产生式,若找到则用相应左部代替句柄,若找不到则为出错,此时可断定输入串不是该文法的句子;

4)重复上述三步直到归约完输入符号串,栈中只剩文法的开始符号为止。

例:已知文法G[S]:(1)S→b Ab(2)A→(B|a(3)B→Aa)

其简单优先关系矩阵如下图所示:

对符号串#b(aa)b#的移进-归约分析过程中,根据算法及优先关系表求得归约的句柄依次分别为:aa、AAaa))、((BB、bb AAbb。

简单优先分析法中句柄的求解过程是每次察看句型中相邻的两个符号,通过两个符号的优先关系判定出前一个符号是句柄的尾。然后,再反向找出句柄的头。如下图所示:

图中U即为移进-归约分析过程中当前句型的句柄。

2.2 算符优先分析法中的句柄

自底向上的算符优先分析法,也称自左向右归约。由于算符优先分析法不考虑非终结符之间的优先关系,在归约过程中只要找到可归约串就归约,并不考虑归约到哪个非终结符名,因此算符优先分析过程中的句柄是一个最左素短语的求解过程。对一文法来说,需先求得句型的所有素短语,处于句型最左边的素短语即算符优先分析的句柄。一个算符优先文法的最左素短语形式为NiaiNi+1ai+1…ajNj+1,符号的优先关系应满足:ai-1<ai;ai=ai+1=…=aj;aj>aj+1。

使用算符优先分析法的规约过程与规范归约是不同的,以文法G[E]为例,

如果对输入串#i+i#进行规范归约分析过程需要12步,然而使用算符优先归约时只需要7步,分析过程中形成的归约串只有三个:i、i、E+E。原因是算符优先分析中去掉了单非终结符归约,其归约过程是一种快速归约过程。

3 LR分析法

LR分析法是一种能根据当前分析栈中的符号串和向右顺序查看输入串的k个(k≥0)符号就可以唯一地确定分析器的动作是移进还是归约和用哪个产生式归约,因而也就能唯一地确定句柄。LR分析法是规范推导的逆过程,是一种规范归约。

LR分析过程:将文法的终结符和非终结符都看成有穷自动机的输入符号,每次把一个符号进栈看成已识别过了该符号,同时状态进行转换,当识别到可归前缀时,相当于在栈中形成句柄,认为达到了识别句柄的终态。

LR分析器的关键部分是分析表的构造。LR分析表是LR分析器的核心部分,是总控程序的依据。一张LR分析表包括两部分:一部分是“动作”(ACTION)表,表示当前状态下所面临输入符应做的动作是移进、归约、接受或出错。另一部分是“状态转换”(GOTO)表,表示在当前状态下面临文法的输入符号时应转向的下一个状态。

对一个文法构造了它的LR分析表后就可以在LR分析器的总控程序控制下对输入串进行分析,即根据输入串的当前符号和分析栈的栈顶状态查找分析表应采取的动作,对状态栈和符号栈进行相应的操作即移进、归约、接受或报错。

LR分析法中的归约过程:

当在栈顶形成句柄为β时,则用β归约为相应的非终结符A,即当文法中有A→β的产生式,而β的长度为γ,则从状态栈和文法符号栈中自顶向下去掉γ个符号。并把A移入文法符号栈内,再把满足Sj=GOTO[Sm-γ,A]的状态移进状态栈,当归约到文法符号栈中只剩文法的开始符号S时,并且输入符号串已结束即当前输入符是‘#’,则为分析成功。

例:已知文法G[S]:(1)S→AB(2)A→a Ba(3)A→ε(4)B→b Ab(5)B→ε

求得SLR(1)分析表如下图:

对符号串#baab#分析过程中,归约过程中求得的句柄依次为:εε、εε、aa BBaa、bb AAbb、AABB。

4 结束语

在编译程序自底向上的语法分析过程中,最关键的问题是句柄的识别问题。简单优先分析法其归约过程是一种规范归约,准确、归范、但分析效率较低,实际使用价值不大。算符优先分析法其归约过程不是归范归约,但分析速度快、简单、直观,特别适于用手工方式来实现,很多编译程序都使用算符优先法分析表达式。LR分析法分析速度快,能准确、及时地指出输入串的语法错误及出错位置,比自底向上优先分析法对文法的限制要少得多,对大多数用无二义性的上下文无关文法描述的语言都可以用LR分析器予以识别。

摘要:语法分析是编译程序的核心部分,其任务是检查词法分析器输出的单词序列是否是源语言中的句子。该文以编译程序自底向上语法分析为主线,探讨自底向上语法分析归约中的句柄求解问题,希望对编译原理的课程教学有启发作用。

关键词:编译器,自底向上语法分析,句柄,栈,归约

参考文献

[1]蒋宗礼,姜守旭.编译原理[M].北京:高等教育出版社,2010.

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

[3]张昱,陈意云.编译原理与技术[M].北京:高等教育出版社,2010.

[4]陈火旺,蒋伟进.编译原理[M].长沙:中南大学出版社,2005.

[5]黄贤英,王柯柯.编译原理及实践教程[M].北京:清华大学出版社,2008.

编译问题 篇2

编译及编译理论初探

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

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

编译问题 篇3

问题场景描述: 由于Web工程项目是由多人多模块分工协同完成, 该项目是已经测试过的, 可以在服务器端正常运行, 由于服务器端安装了SVN服务器, 所以, 本地工程项目是从SVN服务器更新下载到本地, 然后导入到本地集成开发环境Myeclipse, 工程正常没有出现错误提示。由于笔者是新加入人员, 安排了一个开发任务, 于是笔者开始的新功能模块的开发工作, 开发完成后准备调试, 测试新模块功能, 这时问题出现了, 从Myeclipse开发环境下测试服务器Tomcat能正常启动, 但是新功能就是实现不了。经过调试发现, 新写的Java类没有编译过, 又尝试了写了一个新类, 还是不能自动编译, 笔者思考这个问题是Myeclipse开发环境下Web工程项目不编译问题。

问题解决 策略 : 从问题场 景里提取 出几个关 键词 (Myeclipse、SVN、不编译), 开始在各大搜索引擎搜索 , 网上有一些实践者也遇到过类似的问题, 所以可以找到该问题的解决方案, 综合网上搜索结果有如下9种解决方案:

(1) 确保project->build automatically已经被选上。

(2) 如果选上了, 还不能编译 , 从project->clean..->选第2个clean select project, 勾上start build immediatelly。

(3) 删除现在的项目, 提前设置好编译文件输出路径, 重新导入源文件, 设置Myeclipse为保存时编译, 然后在保存的时候就可以自动编译了。

(4) 如果项目里引用了某个不用的jar包, 而那个包又被删了, 就会出现不报错但怎么也编译不出来class文件的情况, 解决方案可以把所有包都删除, 然后一个一个地再引入需要的包, 不要一下子把所有包都引入, 没用的包可能会引起不良后果。

(5) 删掉某个class文件重新生成, 删除class文件后, 但classes目录下的 文件夹被 其他程序 打开 , 比如Total Commander。此时编译也不会通过 , 在problems下可能会提示“can't delete classes……”。关掉其他程序重新编译即可。

(6) 还有种情况是remove掉JRE System Library, 重新导入即可编译。

(7) 把build path中所有包都remove掉。然后又重新add jars, add libraries, 把需要的加进去, 居然又开始编译了。

( 8) project ->properties ->java build path ->source -> .../ WEB-INF/src的output folder不要默认 , 编辑让它指向../WEB- INF/classes, 然后重新点击build工程即可自动编译。

(9) 最重要的要看工程下面是否缺少了work目录 , 由于CVS控制时不把work加入版本 , 所以checkout后没有这个目录, 要手工加上有的工程就能自动编译了。

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

关键词: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.

矛盾编译观初探 篇6

第一, 要认识更新编译观念对编译主体优化和编译事业发展具有的重要而迫切的意义。

第二, 要明确认识到, 旧有的、由翻译界界定、使用的“编译观”已经不能适应编辑和翻译相互融合的发展需要, 必须促使其向更为科学化的方向转变。

第三, 转变编译观必须从仅仅转变视角 (如从翻译界的视角转变为编辑界的视角) 走向转变到新的范式。

第四, 构建科学编译观的新范式, 可以用借鉴其他学科成熟范式的办法给予解决, 特别是可以借鉴交叉科学范式以确立交叉编译观、借鉴矛盾辩证法范式以确立矛盾编译观和借鉴系统科学范式以确立系统编译观。

第五, 探索矛盾编译观相比其他范式的编译观具有更为迫切而重要的意义。本文将以“初探”的形式对之做一个粗略的阐述。

一、矛盾编译观的现实基础

构建矛盾编译观, 就其现实意义来说, 就是因为在编辑、翻译及其关系中充满着种种矛盾, 正是这些矛盾及其运动提供着推动编译事业发展的根本动力, 而唯有这些矛盾得到了正确的对待和处理, 才能真正显现其正面的动能。

编译矛盾首先源自翻译实践中的矛盾。翻译作为一项复杂的社会活动, 涉及诸多思维、语言和文化因素, 由于翻译实践必须对差异很多很大的思维、语言和文化进行连接和转换, 它必然内含着诸多复杂的矛盾与矛盾运动过程。随着现代翻译学的兴起和翻译研究的深入, 这些现实矛盾连同由于不同学派、不同标准、不同方法、不同技巧之间造成的人工矛盾, 不断被揭示出来。例如:

(1) 翻译标准中的信与雅、形似与神似的矛盾。

(2) 翻译技术性矛盾:拆卸与重组、破损与补偿、正译与回译等。

(3) 翻译方法中的直译与意译、语义翻译与交际翻译的矛盾。

(4) 翻译技巧中增译和简译、顺译与逆译、分译与合译、异化与归化、正说与反说的辩证关系。

(5) 翻译主体性相关的作者与译者、作者风格与译者风格、忠实与再创造的矛盾。

所有这些翻译中的矛盾都可能在与编辑的相互作用中延伸为编辑和翻译关系间的真正的编译矛盾。

同样, 编辑活动也是一种充满各种矛盾的社会实践活动, 诸多的编辑矛盾也会在与翻译的相互作用中延伸为编译矛盾。例如:

(1) 编者与作者的矛盾, 具体表现为:编辑策划与作者创作实践的矛盾、编者对作者支配与服务的矛盾、编者积极求新与作者相对固旧引起的矛盾, 等等。

(2) 编者与读者的矛盾, 具体表现为:编辑目标与作者需求的矛盾、编者业务的稳定性与读者需求的变动性的矛盾、编者对读者的适应与创造 (适应读者与创造读者) 的矛盾, 等等。

(3) 编辑系统业务运行与组织管理的矛盾。

(4) 编辑系统与编辑环境的矛盾, 主要表现为:编辑系统运行与社会实践的大环境之间, 存在即可利用又受制约、既要适应又要优化的矛盾关系。

(5) 编辑主体的能力要求与自身素养的矛盾, 包括跨学科编辑遇到的“专”与“杂”的矛盾, 等等。

编辑和翻译是具有本质性区别的两种社会行为, 由它们互相联系构成的编译整体, 既有编辑矛盾或翻译矛盾延伸而来的种种矛盾, 还有双方直接作用产生的多种矛盾。特别是业界公认的编译基本矛盾——编者与译者、译者与作者、编译者与读者等主体间形成的矛盾。如由译者推荐编辑选题引起的矛盾, 组稿中统一译者译法造成的矛盾, 编者审稿中准确定位严抓标准引起的矛盾, 编译加工整理中准确与流畅的矛盾, 编者浮躁引起译者的译品质量下降, 编者不信任译者, 对其译文特别挑剔要求重译等, 以及编译双方对于译稿定位的吻合度、文化了解力和翻译力如何匹配、如何共同努力让读者从编译成果的“写世界”中做到“读世界”“看世界”和了解世界等。

当然, 编译作为社会实践中的一种, 一样会遇到主观和客观、局部与整体、相同与相异、静态与动态、认识与实践等普遍性很高的矛盾, 还会遇到编译系统外部的诸如现代与传统、热点与冷点、学理与情感、后顾与前瞻、宏观与微观、正面与反面、科学性与艺术性等关系时可能产生的矛盾。

二、矛盾编译观的范式依据

矛盾编译观的确立, 既要基于编译实践中的矛盾现状, 也要借助矛盾辩证法提供的科学哲学范式。

借鉴矛盾辩证法的范式, 最直接的办法就是学习毛泽东的《矛盾论》。就笔者领悟, 《矛盾论》为我们提供了以下可以直接运用的矛盾辩证法原理、思想与范式。

(1) 矛盾是事物发展动力的原理。所谓矛盾是指事物存在、发展中相互作用的一种表现形态——既相互对立又相互统一的形态。“事物发展的根本原因, 不是在事物的外部而是在事物的内部, 在于事物内部的矛盾性。”只有主张从事物内部找发展动力的发展观, 才是辩证的、科学的发展观。

(2) 矛盾普遍性和矛盾特殊性的原理。首先是矛盾普遍性的原理:矛盾存在于一切事物的发展过程中, 而且每一事物的发展过程中存在着自始至终的矛盾运动。其次是矛盾特殊性的原理:不同事物具有不同特点的矛盾, 同一事物不同发展阶段具有不同特点的矛盾, 矛盾双方各有自己的特点。再次是矛盾普遍性与特殊性相互关系的原理:矛盾普遍性和特殊性之间是既相互区别又相互联结且相互转化的;矛盾普遍性和特殊性的关系也就是共性与个性、绝对与相对的关系, 矛盾普遍性存在于特殊性之中, 共性存在于个性之中, 绝对存在于相对之中。“这一共性个性、绝对相对的道理, 是关于事物矛盾的问题的精髓, 不懂得它, 就等于抛弃了辩证法。”

(3) 基本矛盾原理。基本 (根本) 矛盾是指贯穿矛盾运动各方面和全过程的、对其他矛盾的存在、发展起支配、规定或重大影响作用的一对或几对矛盾。基本矛盾处在矛盾普遍性和矛盾特殊性相互关系的连接点上, 它可以在相互转化中把上一层次的特殊矛盾和下一层次的普遍矛盾衔接在一起, 可以通过特殊矛盾把握普遍矛盾, 可以通过实践加思考去准确揭示事物发展的特点和走向。

(4) 主要的矛盾和主要的矛盾方面的原理。它作为矛盾特殊性的一种表现, 指的就是矛盾及其诸方面的发展具有不平衡性:矛盾有主次之分, 矛盾方面也有主次之分。当然, 主要矛盾和次要矛盾、主要矛盾方面和次要矛盾方面的划分也是相对的而非绝对割裂的, 它们之间也是相互依存、相互联系的, 在一定条件下相互转化的。

(5) 矛盾诸方面同一性和斗争性及其相互关系的原理。首先是矛盾同一性的原理, “一切矛盾着的东西互相联系着, 不但在一定条件下共处一个统一体中, 而且在一定条件下相互转化”;其次是矛盾斗争性的原理:“一切过程中矛盾着的各方面, 本来是相互排斥、互相斗争、互相对立的”。而且这种“矛盾的斗争性是无条件的、绝对的”;再次是矛盾同一性和矛盾斗争性关系的原理:“有条件的相对的同一性和无条件的绝对的斗争性相结合, 构成了一切事物的矛盾运动。”斗争性寓于同一性之中、同一性中存在着斗争性。

(6) 矛盾斗争基本形式转换原理:矛盾斗争可以采取对抗性形式, 也可采取非对抗性形式, 而且这二种矛盾斗争的基本形式会因为条件的变化而相互转化。

三、矛盾编译观的内涵和应用探索

基于上述编译矛盾状态和矛盾辩证法原理 (范式) 的分析, 我们可以对矛盾编译观的内涵和可能的应用方向, 做出简要的界定和探讨。

在笔者看来, 借鉴矛盾辩证法主要原理 (范式) 建构的“矛盾编译观”, 应该是以编译矛盾的分析和解决为出发点和落脚点, 贯彻矛盾辩证法的原理、思想和范式并使之转化为根本方法, 用以解决编译矛盾、提升编译系统运行效益的一种整体编译观念。这种编译观既反对把编译矛盾的双方绝对对立起来、片面孤立起来, 使编译实践陷入僵化、无效的形而上学编译观念;又反对把编译矛盾双方混淆起来、不辨是非、不讲转化条件、“辩证”过头的诡辩式编译观念。

说到矛盾编译观的应用, 笔者认为重点在于提高编译主体确立矛盾编译观的自觉性, 进而认真把握矛盾辩证法原理, 用好它转化而成的世界观高度的方法论, 并发挥矛盾编译观念和方法应有的指导作用。

首先, 要懂得遵循辩证处置编译矛盾的一般方法论原则——注意区别、避免混淆;强调联系、反对割裂;承认转化、不搞僵化;把握方向、防止颠倒等。

其次, 要能对应矛盾辩证法具体原理, 明确整理出可使用于解决编译矛盾的具体方法。例如:

根据矛盾是事物发展动力的原理, 我们在认识和处理编辑和翻译的关系时, 要学会在对立中把握统一, 在统一中把握对立的方法, 既看到区别, 更看到联系;遇到问题要善于从内部找原因, 真正把编译系统内部矛盾看作编译事业发展的根本动力。

根据矛盾普遍性和特殊性的原理, 我们要注意去承认、揭示和分析编译活动普遍存在的矛盾, 解决矛盾时采取两点论、防止一点论、克服片面性;要看到不同编译主体、不同编译文本……在不同时空、不同条件下产生的编译矛盾的不同特点, 解决矛盾时做到具体矛盾具体分析, 防止“一刀切”、千篇一律;尤其要善于从特殊的编译矛盾中发现编译矛盾的普遍性、共性和规律性, 再以发现的这些普遍规律去指导具体的、特殊的编译矛盾的解决。

根据基本矛盾的原理, 我们除了要重视编辑中的基本矛盾和翻译中的基本矛盾及其相互交叉与自然延伸外, 更要抓住两界公认的编者与译者、译者与作者、编译者与读者等主体间矛盾这个编译实践的基本矛盾, 力求抓准编译工作的基本点和大方向。

根据主要的矛盾和主要的矛盾方面的原理, 在处理编译矛盾时要坚持“两点论”和“重点论”相结合的方法, 既要善于抓住重点, 集中力量解决主要矛盾和主要的矛盾方面, 又要照顾全面、统筹兼顾地处理好次要矛盾和次要矛盾方面, 不犯均衡论的错误。

根据矛盾同一性和斗争性及其关系的原理, 我们在分析和处置编译矛盾时, 一定要在懂得编译矛盾双方具有相互联系、相互转化的同一性的同时, 看清编译矛盾双方的相互区别、相互排斥、相互对立的斗争性。只有这样, 才能在建立和谐的编译整体时敢于并善于用好矛盾双方的差别、对立、排斥的关系力, 而不把追求编译矛盾双方的和谐共处、努力构建和谐的编译系统整体, 跟辩证地利用矛盾双方的差别、排斥、对立关系所造成的正面推动力量之间割裂开来甚至绝对对立起来;也只有这样, 才能让编译矛盾真正成为编译事业发展的根本推动力量。

总之, 明确了解决矛盾的一般方法论原则, 在处理编译矛盾尤其是存在于编译实践中的普遍性矛盾 (主观与客观、局部与整体、知与行、静态与动态、差异与同一等) 时, 就有了规律可循;而掌握了解决矛盾的具体方法, 我们就有了解决具体编译矛盾的思想工具。

最后, 必须明确, 在运用矛盾编译观处理编译矛盾时, 抓住编译的基本矛盾还是十分必要的。

本文所说的编译的基本矛盾, 就是编译实践中相互关联的主体间的矛盾。它的具体表现内容和形式很多, 除了上文已经表述过的以外, 特别要关注由于编者与译者之间支配和服务关系处理不当引发的一些矛盾。例如:当编辑意图 (编辑策划) 与译者文稿之间不一致, 编者要求的学术思想译者不能接受, 而译者坚持的学术观点编者又觉得不满意;当编者要求出版严格大方的学术品格的作品时, 遇上的却是一味追求扩散效应而把作品加工处理得像通俗小说;当译者不顾及编者意愿, 坚持自己的出版安排和合同签订, 或者不许编者对其提供的稿件改动一字;如果译者的思维方式、语言习惯、治学特点与编者要求的不一致;如果编者只顾出版社盈利、得失, 不关注译者权益的维护甚至不按合同办事, 反之, 如果译者要求过高, 超过了出版社的条件许可, 影响到编辑方的合法权益, 甚至单方面改变合同内容;等等。

对于这类矛盾的辩证处置, 当然首先要认清其区别、差异和对立的性质。编译矛盾主要表现在精神产品的生产中, 编者和译者在精神产品生产中的角色定位是不同的。作为不同的社会分工, 著译者是精神产品的生产者主体, 读者是精神产品的消费者主体, 编者则是要解决精神产品生产、转换、消费、分配 (供需) 等关系的组织者主体。同时还要看清他们既相互区别又相互依存、相互联系的性质, 不能把他们绝对对立起来、割裂开来。要摆正编者和译者的关系, 避免纠缠于主角与配角、主产与助产、父亲与母亲等关系观念, 因为无论是编者以父亲自居, 甚至把自己看作是著译者的衣食父母, 还是译者否认编辑作用, 只把编辑看作自己出书成名的工具和阶梯, 都会使编译矛盾得不到解决, 相反还会节外生枝, 派生出许多其他矛盾来。看清和抓好编译的联系性, 还要在“统一点”上下功夫——一切为了读者。编译中主体间矛盾, 往往是编者或译者心中只想着自己, 完全忘记双方应有的共同目标和动力——为读者服务。只要双方能确立并维护全心全意为读者服务的理念, 一定能为解决矛盾、推动编译事业发展打好牢固基础。

四、结语

矛盾编译观的探索和建立是编译事业发展的自然需要, 是应对当今编译实践及其发展中充满着各种矛盾的必然选择。只要我们能够真正学习和借鉴《矛盾论》所提供的原理和范式, 把它和编译实践相结合, 就一定能够界定、建立并逐步完善矛盾编译观。当我们把矛盾原理和范式带来的世界观高度的方法论, 成功应用到分析和解决编译实践的种种矛盾时, 我们就一定能做到把编译矛盾转化为推动编译事业发展的根本动力。

参考文献

[1]许玫.略论跨文化建设中编译观的转变[J].海外英语, 2013 (3) .

[2]许玫.编译观的转变:从转视角到转范式[J].科技创新与应用, 2013 (5) .

[3]许玫.跨文化建设需要践行交叉编译观[J].编辑学刊, 2014 (4) .

[4]曹火群.翻译中的辩证关系[J].孝感学院学报, 2005 (9) .

[5]王华良.编辑过程的基本矛盾[J].编辑学刊, 2001 (2) .

[6]强志军.论编辑系统的矛盾[J].编辑学报, 2003 (2) .

[7]佚名.期刊编辑与论文作者间矛盾的特点及其产生根源和解决途径[EB/OL].[2013-04-13].http://www.518lunwen.cn/lunwen/1206.html.

[8]范晓峰.试论自然辩证法对英汉翻译学的指导作用[C].第六届中国翻译职业交流大会会讯, 2007-07-16.

[9]毛泽东.矛盾论[A]//毛泽东选集[C].人民出版社, 1991.

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

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

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

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

编译原理教学方法研究 篇8

由于编译程序的庞大和复杂性, 编译原理课程内容包含了很多特殊的算法和思想, 如自上而下语法分析的LL (1) 分析算法、自下而上的LR (1) 语法分析算法、词法分析的NFA向DFA转化的子集法, 化简DFA的分割算法、FIRST和FOLLOW集合计算法等。该课程还高度依赖于学生在低年级所学的专业基础课程, 如程序设计语言、数据结构等, 对学生而言, 在一开始进入课程学习时就必须掌握一定程度的相关专业知识, 也要求对学习的难度有一定的思想准备及具备化解困难能力。而学生看到这样的困难往往就由于基础知识薄弱而产生畏难心理, 加上对编译知识技术学习必要性缺乏认知, 也会逐步失去学习兴趣, 走上厌学的道路。

理论教学和实践脱轨, 也是编译教学的普遍现象。因为编译理论的复杂抽象, 学生在花了很大力气理解和吸收理论知识之后, 往往感觉到用于实践更为困难。编译算法的跟踪执行过程, 无法像数据结构的算法学习一样简单, 因为很多中间结果根本无法输出。而教学课时所限, 对完整编译器的设计各个环节之间接口的介绍, 一些算法的具体编程设计, 老师无法在课内一一讲述, 学生也模模糊糊。实践内容的难度, 也让学生对无法在短期课内学习中真正融会贯通掌握编译技术。

二、教学方法改革思路

1、科学引导, 明确教学目标, 提升学习兴趣

教师通过精心备课, 针对编译程序的各个功能环节, 引导学生积极发现内在的联系和规律, 帮助学生建立起对编译程序的宏观认识, 抓住知识体系的主线, 教师再逐一将个环节的重点难点问题指出。学生在已掌握知识的基础上思考如何解决问题, 教师再提示如何改进, 从而启发学生积极思维。学生有了思考的着力点, 自然就产生了学习的兴趣。对于持有学习编译技术无用观念的学生, 教师需明确学习的目标。编译原理与技术, 涉及的操作系统、计算机指令系统等内容, 对于编程技术的提高大有裨益, 它的一些算法和实现技术同时也被某些应用软件设计采用。如:应用与文本编辑器的正规式和有限自动机, 字符串查找中使用有限自动机, 网络应用中使用必经节点算法、网络协议使用文法来定义等等。

2、教学内容优化, 提升课堂教学质量

对于知识点复杂抽象, 内容繁多的编译课程, 教师在备课过程势必要熟悉吃透教材, 对教材内容进行组合优化。

(1) 选择合适的教材与教学手段

被计算机专业人士誉为“龙书”的《Compilers Principles, Techniques and Tools》 (中文译名为《编译原理》, 机械工业出版社出版) , 虽然被很多学者推崇, 但并不适合作为本科学生学习的教材, 因其学科大全式的介绍, 涵盖过多的内容且理解难度更大。国内比较好的编译原理经典教材也有很多, 可根据教师自身教学设计的精选教材。

(2) 优化教学过程

1) 由于C语言是我们学生的基础入门编程语言, 所以授课的程序设计语言均为C语言背景。一般的编译原理教材中, 很少以某类具体程序语言为例, 而以某些字符如:A、B、C代替, 形式化语言。学生在接受知识的时候就出现了偏差, 因为编程和现在所学的符号无法统一。所以选择一门学生有较好基础的语言配合讲解很必要。

而教师也可以将C编程过程中遇到的易错、难学的问题从编译的角度加以分析, 对学生分析和解决问题也会有所启发。而对编译原理的输入了解也能让学生在编程时更注意错误的避免以及优化编程, 强化了编程能力。

2) 抽象内容形象化。对那些学生难理解的抽象概念, 讲解时可举学生最熟悉的一些实例类比, 避免学生的死记硬背。例如, 编译过程包括的词法分析、语法分析、语义分析和中间代码生成、代码优化、目标代码生成五个阶段。记忆这个知识不难, 但是如何理解划分阶段的依据, 我们就可以举翻译英文句子的过程来类比。比如, 翻译“I am a student”成中文, 首先做词法分析, 按英语构词规则, 共四个英语单词, 同时检查单词拼写是否错误。然后根据英语的语法规则做语法分析, 对上一阶段形成的单词进行分析、识别, 检查语法正确性, 判断能否组成一个符合英语语法的句子。接着是语义分析, 分析句子含义, 并用汉语表示出来。最后修饰译文, 综合考虑汉语语法的相关规则和上下文的关系, 修饰初步翻译后的句子, 形成译文“我是一名学生”。

3) 融合原理与技术, 于各个章节均穿插“PL/0语言编译程序”模型的对应实现过程讲解, 学习技术之后学习实例, 学生更容易掌握知识, 也能初步建立属于自己的知识体系模型。

4) 将大问题缩小, 分解模拟编译技术的实现如词法分析、算符优先分析程序、制导翻译等过程。通过编写一些小的例程, 对程序算法进行详解和细节演示, 学生通过庖丁解牛式的吃透程序, 就能够好的掌握编译程序的设计, 从而自己写出编译程序。

5) 实施多媒体辅助教学形式, 使用课件、SNL、PCMCAI等编译实例等编译原理教学辅助软件, 将抽象问题形象化, 便于学生理解和运用知识点, 在课下也能利用这些课件自动生成各个分析程序, 加深基本原理和实现算法的理解。

建立本课程新的课程教学理念、课程价值、教学技术等尚需时日, 其过程需要不但需要教师付出大量劳动, 与时俱进的跟进新技术的发展, 不断探索和创新, 还需要好的教材、好的课程实验设计。

摘要:编译原理的理论难度和抽象性, 导致教师与学生的教学两难, 但编译原理作为计算机专业非常重要的一门专业基础课程, 掌握和学好编译程序的基本架构、设计原理和技术, 对计算机专业学生学习和掌握软件设计技术和实现技术, 又有着非常重要的意义。如何让学生产生对该门课程的学习兴趣, 消除学生的畏难情绪, 采用何种教学手段合理组织教学过程可以提高学生对知识的吸收度和应用能力, 是本文主要的探讨内容。

关键词:编译原理,教学

参考文献

[1]何炎祥、伍春香:《现代教学理论指导下的“编译原理”教学综合改革》, 《计算机教育》, 2005, (3) :10-13。

[2]陈意云、张昱、郑启龙:《“编译原理”的教学与实际相结合的探讨》, 《教育与现代化》, 2005, (12) :32-36。

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

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

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期

上一篇:农业谈判下一篇:运行质量