论文部分内容阅读
[摘要]编译原理是目前高等院校计算机各相关专业的一门必修课,作为计算机专业的学生,学习和掌握编译程序的基本构造原理和实现技术,对今后进一步的学习、研究和工作奠定坚实的专业理论基础是十分必要的。文章基于对编译原理教学现状的分析,结合作者的教学实践,指出了目前编译原理教学中存在的问题,给出了编译原理教学改革的基本思路。
[关键词]编译原理编译器教学改革
[作者简介]龚宇辉(1975- ),女,四川攀枝花人,长春工程学院电气与信息学院,讲师,硕士,研究方向为算法分析与设计。(吉林长春130012)
[中图分类号]G642[文献标识码]A[文章编号]1004-3985(2009)30-0084-02
一、引言
编译原理主要介绍编译程序构造的一般原理、基本设计方法和主要实现技术,它是高等学校计算机科学与技术及相关专业的一门重要专业基础课,国内、外高校都将其列为计算机专业人员必修的一门主干课程。编译程序构造的基本原理和技术广泛应用于一般软件的设计和实现,它在提高学生的软件设计能力、认识计算机信息处理过程等方面都起着很大作用。
二、编译原理教学中存在的问题
编译原理是计算机专业课中较难的一门,在教学过程中,学生理解和掌握这门课有一定难度,造成这种情况的原因有:
(一)理论知识抽象难懂,且与实际应用脱节
编译原理这门课包含许多理论知识和算法,这些理论的学习和理解都存在着一定的难度。由于理论学习采用自然语言进行讲授和理解,而实验则采用计算机编程语言实现,对于学生而言,从理解理论并且可以套用公式解题到能够编程实现存在一条巨大的鸿沟——理论实现算法设计,中间缺乏对实际编译器的分析。这往往造成学生面对综合实验无从下手,从而产生“教材中理论知识抽象、复杂、不实用”的想法。
(二)理论教学授课方式陈旧
同其他理工科理论课程一样,编译原理课程具有很多概念和定理,再加上大量复杂的算法,抽象程度很高,课程内容显得比较枯燥。教学中又以传统理论教学为主,主要课时花在形式语言理论与各种语法分析算法、语义分析技术的讲授上。在讲解的时候一般没有辅之以其他形象生动的教学手段,因此,学生觉得授课内容枯燥乏味。学生的兴趣一旦受挫,就很难形成学习的主动性,同时也很难形成教师与学生的教学互动,教学效果差。
(三)学生对课程的理解不正确
不少学生认为学习编译原理就是为了设计开发编译器,而编译系统是一个庞大而复杂的系统软件,一般学生今后从事编译器设计工作的可能性不大,因此学生在学习时感觉既难又不实用。另外,目前面向对象的程序设计语言已经成为了主流,学生认为课程主要讲授面向过程的程序设计语言的处理已经落伍,因而失去了学习兴趣。
(四)实践环节设计脱离实际
目前大多数高校在编译原理课程的实践环节都是不分授课对象,要求能上机实现一个小型模型语言的完整编译程序。要完整地构造一个编译系统并不是一件容易的事情,它不仅需要具有较完备的软件知识,并需要掌握现有的软件工具的使用,而且更重要的是要有丰富的实践经验,了解硬件系统结构和操作系统的功能。在只是空洞地学习了一些编译理论与算法并且没有很好掌握的情况下,这对于大部分学生来说都是不可能完成的任务。造成很大部分学生在动手之前就早早放弃了努力,也就不可能达到预期的实验效果。
三、教学方法探讨
针对编译原理课程的特点,提出相应的教学改革的对策,改变学生应试的观念,激发他们的自主意识,由被动变主动,在学习中克服心理障碍,主动地吸取知识,并培养不断更新知识的意识。下面就这门课程在教学上存在的问题进行讨论。
(一)适当增加程序范例,加强理论学习与实验的联系
为了加深学生对编译理论与主要算法的理解,在教学中适当增加一些编译器范例并加以详细剖析。学生在教师的指导下对实际编译器代码进行阅读,以对抽象的编译理论与算法有更深刻的认识,达到良好的教学效果。
如在对有限自动机理论进行讲授的过程中,根据状态转换图用C语言开发一个能够识别标识符、保留字和整数的有限自动机程序,在课堂上通过程序的运行来展示标识符、保留字和整数的特点以及识别过程。
而对于其他单词如算符、分界符等的识别程序,则要求学生课下根据相应的状态转换图自己编写完成,再将所有识别程序合并,形成一个完整的小型词法分析程序。如此将课上的理论知识与课下的实验紧密结合,使学生既加深了对理论和算法的认识,也为以后的实践环节做好了足够的准备工作。
(二)灵活采用多种教学方法
编译原理中的一些概念、算法和问题非常抽象,学生无法理解,也更产生不了兴趣。因此,在讲解过程中,应针对不同概念、算法和问题的特点,适当选取不同的教学方法进行讲授,提高学生的学习兴趣,进而加深对理论知识的理解。
1.采用启发式教学,加深理论知识理解。课堂上避免对知识点的平铺直叙,多提出问题要求学生思考,然后师生、同学之间进行讨论,让学生讲出自己对问题的理解、分析和答案,老师加以补充和总结,帮助学生当堂消化疑点、难点。这样既能激发学生的学习兴趣,又能吸引学生听课时的注意力,充分发挥学生的学习主动性,培养学生的创新能力。
例如在学习LL(1)文法时,非终结符A的后继符号集合FOLLOW(A)是所有在句型中可以直接出现在A后面的终结符的集合,也就是
FOLLOW(A)={a|S ?圯*…Aa…,a∈VT }
如果A是某个句型的最右符号,那么属于FOLLOW(A)。如果有产生式A→?琢B或A→?琢B?茁且?茁?圯*?着,那么FOLLOW(A)的一切元素都要加入FOLLOW(B)中。怎样能够快速准确地找出某个非终结符的后继符号集合呢?根据定义,求FOLLOW集合要从文法的开始符号出发进行推导。可以在讨论中引导学生观察所有产生式的右部,找到要求FOLLOW集合的非终结符(设为A),然后从开始符号出发推导得到包含A的句型。接下来对A后面的文法符号进行处理:如果A后面是一终结符,则该终结符属于FOLLOW(A);如果A后面为一非终结符,则该非终结符的开始符号集合中除?着外的其他终结符均属于FOLLOW(A);如果该非终结符的开始符号集合中包含?着,则对该符号后面的文法符号作上面类似处理;如果A出现在句型的最右或者A后面的符号都推导为?着,那么 属于FOLLOW(A);特别注意如果在推导的过程中开始符号又出现在了句型中,那么就需要对这个出现在句型中的开始符号继续向下推导。由此基本可以概括出求非终结符的FOLLOW集合的有效方法。
2.采用案例教学法,使抽象内容形象化。编译系统中的一些概念很抽象,学生无法理解,就只会死记硬背,当然更无兴趣可言。在讲解的过程中,可以精心选择一些学生熟悉并且实用的实例,利用案例的方式呈现给学生,通过类比使抽象的概念更容易被理解。
例如在局部存储分配策略中讲解数据对象存储安排的对齐问题时,可以用下面的示例来加以说明:
在SPARC/Solaris工作站上下面两个结构体变量a和b的size分别是24和16,两个结构体类型的域都一样,仅次序不同,为什么给它们分配的存储空间不一样?
通过简单的分析不难看出,字符型数据可以分配到任何地址,即对齐到1;整型数据对齐到4(即从能被4整除的地址开始分配);双精度型数据对齐到8。因此,对于类型a的结构体,其4个域的相对地址依次是0、4、8、16,总共需24个字节;对于类型b的结构体,其4个域的相对地址依次是0、1、4、8,总共需16个字节。
而不同的机器的对齐要求可能是不一样的,如同样的定义在X86/Linux机器的结果和SPARC/Solaris工作站不一样,是20和16,这又是为什么?
通过分析可以判断,X86/Linux机器和上面的区别是双精度型数据也对齐到4。通过这样的分析和对比过程,既加深了学生的印象,又使学生对程序设计与编译系统的关系有了更深的体会。
3.采用多媒体教学,使抽象内容直观化。编译原理课程的内容抽象,知识点多,信息量大。文中有大量概念、分析动作和分析表构造算法的文字叙述,理解起来有一定的难度。如果采用课堂板书的形式,必将耗费大量的时间在图表的绘制和文字的书写上,从而影响到教学的效率和效果。
因此,构建多媒体环境下的教学环境,利用现代的教学手段、多媒体设施、电子教案等多种途径,实现课堂时间的有效化。概念、图表和相关的解释性文字以表格、图形和逐条出现的形式呈现给学生,把知识讲解化静为动。典型的编译程序中的分析表和流程图的具体构造过程则通过动态演示的形式表示出来,以便于学生的理解与记忆。教师重点放在讲解算法的原理,理顺原理之间的逻辑关系,学生则侧重于理解。这样,既减轻讲课教师的劳动强度,又提高课堂教学的效果和质量,使学生容易突破课程中的难点和重点。
采用多媒体教学也不能完全抛弃板书,因为板书灵活,可以随机应变,能够使教师紧密跟踪学生的理解进程。所以,在教学中应做到多媒体教学与传统教学的结合。
4.建立网络教学系统,促进学生自主学习。教学网站中提供丰富的教学资源,包括课程相关的教材、教学大纲、课程建设规划、理论讲稿、电子课件、算法的演示、习题、模拟考试卷、答案、实践指导书、经典算法程序、各种编译技术介绍、编译技术的动态以及多个与编译原理相关的网站链接等。学生可以通过这些资源掌握学习进度、重点及难点;根据编译的主要内容及基本框架,自由选择学习资源与学习路径。从而使学习者能够用最短的时间掌握到尽可能多的知识,根据掌握的理论知识引导学生自行设计一个个算法的程序。
编译原理在学习过程中,学生遇到问题难点不能一一与老师进行面对面交流,那么通过网络,可以把问题公开,老师建立相应的主题,学生可以在自己学习的特定区域发言,学生之间可以进行交流,所有的问题都公开化。通过这种方式,不仅解决了教师与学生见面时间少的难题,也为某些不敢当面向老师请教的学生提供了方便。
(三)扩展学生视野,激发学生兴趣
教学队伍应坚持教学和科研相结合、理论和实践相结合、课内和课外相结合,融知识传授、能力培养、素质教育于一体,将最新教改和科研成果引入教学。如果条件允许的话,可以适当配备一些编译器。通过这些实践的操作,将经典编译理论与现代编译技术有机地结合起来,激发学生对编译技术的学习兴趣。
推进编译原理课程教学模型从过程式向对象式的转变。在讲授传统理论时,用面向对象语言来描述编译算法。同时鼓励能力较强的学生从面向对象编译程序设计开始实践,从中积累经验教训,然后逐步推广,使编译原理教学适应技术的发展。
(四)合理设计实验与课程设计,与实际应用相结合
课程实验应以编译理论中的一些经典算法的实现为主,一方面可以培养学生的实践能力和动手能力,另一方面可以通过对算法的实现,达到更准确、更牢固地理解和掌握这些算法,从而提高学生的实际应用能力。如要求学生实现一个模型语言的词法分析程序和语法分析程序。语法分析必须采用递归下降分析算法、非递归的预测分析算法、算符优先分析算法、LR分析算法中的一种来实现。需提交源程序和实验报告。
课程设计应充分考虑编译理论与实际应用相结合,突出开创性和实用性。教师提供给学生一个经简化的完整的编译程序,要求学生在理解该编译程序及其源语言语法成分的基础上,扩充其语言成分,如扩充语句、数据类型或增加函数的说明和引用等,具体扩充的内容可根据可用机时和学生程度确定。这样就使所涉及问题的实现难度有一定程度的降低,进而激发学生的兴趣,更好地完成课程设计的任务。
四、结论
编译原理是计算机专业的必备基础知识,对培养计算机专业的人才有着重要的作用。上好这门课对于提升学生计算机理论素养和计算机综合应用能力具有重要意义。通过对编译原理课程进行建设,分析教学中存在的问题,制定与实施相应的对策,采用有效的教学方法和手段,使学生不再是被动的学习者,而是教学活动的参与者和实践者,以增强学生的学习积极性,使学生具备扎实的理论功底和较强的实践能力,真正地提高课程教学质量。
[参考文献]
[1]陈意云,张昱.编译原理[M].北京:高等教育出版社,2003.
[2]胡元义,邓亚玲,谈姝辰.《编译原理教程(第二版)》习题解析与上机指导[M].西安:西安电子科技大学出版社,2006.
[3]岳小婷.贯彻以人为本,推进《编译原理》教学改革[J].福建电脑,2008(1).
[4]庄燕滨,何中胜.“编译原理”课程教学中的问题分析及对策研究[J].常州工学院学报,2007(12).
[关键词]编译原理编译器教学改革
[作者简介]龚宇辉(1975- ),女,四川攀枝花人,长春工程学院电气与信息学院,讲师,硕士,研究方向为算法分析与设计。(吉林长春130012)
[中图分类号]G642[文献标识码]A[文章编号]1004-3985(2009)30-0084-02
一、引言
编译原理主要介绍编译程序构造的一般原理、基本设计方法和主要实现技术,它是高等学校计算机科学与技术及相关专业的一门重要专业基础课,国内、外高校都将其列为计算机专业人员必修的一门主干课程。编译程序构造的基本原理和技术广泛应用于一般软件的设计和实现,它在提高学生的软件设计能力、认识计算机信息处理过程等方面都起着很大作用。
二、编译原理教学中存在的问题
编译原理是计算机专业课中较难的一门,在教学过程中,学生理解和掌握这门课有一定难度,造成这种情况的原因有:
(一)理论知识抽象难懂,且与实际应用脱节
编译原理这门课包含许多理论知识和算法,这些理论的学习和理解都存在着一定的难度。由于理论学习采用自然语言进行讲授和理解,而实验则采用计算机编程语言实现,对于学生而言,从理解理论并且可以套用公式解题到能够编程实现存在一条巨大的鸿沟——理论实现算法设计,中间缺乏对实际编译器的分析。这往往造成学生面对综合实验无从下手,从而产生“教材中理论知识抽象、复杂、不实用”的想法。
(二)理论教学授课方式陈旧
同其他理工科理论课程一样,编译原理课程具有很多概念和定理,再加上大量复杂的算法,抽象程度很高,课程内容显得比较枯燥。教学中又以传统理论教学为主,主要课时花在形式语言理论与各种语法分析算法、语义分析技术的讲授上。在讲解的时候一般没有辅之以其他形象生动的教学手段,因此,学生觉得授课内容枯燥乏味。学生的兴趣一旦受挫,就很难形成学习的主动性,同时也很难形成教师与学生的教学互动,教学效果差。
(三)学生对课程的理解不正确
不少学生认为学习编译原理就是为了设计开发编译器,而编译系统是一个庞大而复杂的系统软件,一般学生今后从事编译器设计工作的可能性不大,因此学生在学习时感觉既难又不实用。另外,目前面向对象的程序设计语言已经成为了主流,学生认为课程主要讲授面向过程的程序设计语言的处理已经落伍,因而失去了学习兴趣。
(四)实践环节设计脱离实际
目前大多数高校在编译原理课程的实践环节都是不分授课对象,要求能上机实现一个小型模型语言的完整编译程序。要完整地构造一个编译系统并不是一件容易的事情,它不仅需要具有较完备的软件知识,并需要掌握现有的软件工具的使用,而且更重要的是要有丰富的实践经验,了解硬件系统结构和操作系统的功能。在只是空洞地学习了一些编译理论与算法并且没有很好掌握的情况下,这对于大部分学生来说都是不可能完成的任务。造成很大部分学生在动手之前就早早放弃了努力,也就不可能达到预期的实验效果。
三、教学方法探讨
针对编译原理课程的特点,提出相应的教学改革的对策,改变学生应试的观念,激发他们的自主意识,由被动变主动,在学习中克服心理障碍,主动地吸取知识,并培养不断更新知识的意识。下面就这门课程在教学上存在的问题进行讨论。
(一)适当增加程序范例,加强理论学习与实验的联系
为了加深学生对编译理论与主要算法的理解,在教学中适当增加一些编译器范例并加以详细剖析。学生在教师的指导下对实际编译器代码进行阅读,以对抽象的编译理论与算法有更深刻的认识,达到良好的教学效果。
如在对有限自动机理论进行讲授的过程中,根据状态转换图用C语言开发一个能够识别标识符、保留字和整数的有限自动机程序,在课堂上通过程序的运行来展示标识符、保留字和整数的特点以及识别过程。
而对于其他单词如算符、分界符等的识别程序,则要求学生课下根据相应的状态转换图自己编写完成,再将所有识别程序合并,形成一个完整的小型词法分析程序。如此将课上的理论知识与课下的实验紧密结合,使学生既加深了对理论和算法的认识,也为以后的实践环节做好了足够的准备工作。
(二)灵活采用多种教学方法
编译原理中的一些概念、算法和问题非常抽象,学生无法理解,也更产生不了兴趣。因此,在讲解过程中,应针对不同概念、算法和问题的特点,适当选取不同的教学方法进行讲授,提高学生的学习兴趣,进而加深对理论知识的理解。
1.采用启发式教学,加深理论知识理解。课堂上避免对知识点的平铺直叙,多提出问题要求学生思考,然后师生、同学之间进行讨论,让学生讲出自己对问题的理解、分析和答案,老师加以补充和总结,帮助学生当堂消化疑点、难点。这样既能激发学生的学习兴趣,又能吸引学生听课时的注意力,充分发挥学生的学习主动性,培养学生的创新能力。
例如在学习LL(1)文法时,非终结符A的后继符号集合FOLLOW(A)是所有在句型中可以直接出现在A后面的终结符的集合,也就是
FOLLOW(A)={a|S ?圯*…Aa…,a∈VT }
如果A是某个句型的最右符号,那么属于FOLLOW(A)。如果有产生式A→?琢B或A→?琢B?茁且?茁?圯*?着,那么FOLLOW(A)的一切元素都要加入FOLLOW(B)中。怎样能够快速准确地找出某个非终结符的后继符号集合呢?根据定义,求FOLLOW集合要从文法的开始符号出发进行推导。可以在讨论中引导学生观察所有产生式的右部,找到要求FOLLOW集合的非终结符(设为A),然后从开始符号出发推导得到包含A的句型。接下来对A后面的文法符号进行处理:如果A后面是一终结符,则该终结符属于FOLLOW(A);如果A后面为一非终结符,则该非终结符的开始符号集合中除?着外的其他终结符均属于FOLLOW(A);如果该非终结符的开始符号集合中包含?着,则对该符号后面的文法符号作上面类似处理;如果A出现在句型的最右或者A后面的符号都推导为?着,那么 属于FOLLOW(A);特别注意如果在推导的过程中开始符号又出现在了句型中,那么就需要对这个出现在句型中的开始符号继续向下推导。由此基本可以概括出求非终结符的FOLLOW集合的有效方法。
2.采用案例教学法,使抽象内容形象化。编译系统中的一些概念很抽象,学生无法理解,就只会死记硬背,当然更无兴趣可言。在讲解的过程中,可以精心选择一些学生熟悉并且实用的实例,利用案例的方式呈现给学生,通过类比使抽象的概念更容易被理解。
例如在局部存储分配策略中讲解数据对象存储安排的对齐问题时,可以用下面的示例来加以说明:
在SPARC/Solaris工作站上下面两个结构体变量a和b的size分别是24和16,两个结构体类型的域都一样,仅次序不同,为什么给它们分配的存储空间不一样?
通过简单的分析不难看出,字符型数据可以分配到任何地址,即对齐到1;整型数据对齐到4(即从能被4整除的地址开始分配);双精度型数据对齐到8。因此,对于类型a的结构体,其4个域的相对地址依次是0、4、8、16,总共需24个字节;对于类型b的结构体,其4个域的相对地址依次是0、1、4、8,总共需16个字节。
而不同的机器的对齐要求可能是不一样的,如同样的定义在X86/Linux机器的结果和SPARC/Solaris工作站不一样,是20和16,这又是为什么?
通过分析可以判断,X86/Linux机器和上面的区别是双精度型数据也对齐到4。通过这样的分析和对比过程,既加深了学生的印象,又使学生对程序设计与编译系统的关系有了更深的体会。
3.采用多媒体教学,使抽象内容直观化。编译原理课程的内容抽象,知识点多,信息量大。文中有大量概念、分析动作和分析表构造算法的文字叙述,理解起来有一定的难度。如果采用课堂板书的形式,必将耗费大量的时间在图表的绘制和文字的书写上,从而影响到教学的效率和效果。
因此,构建多媒体环境下的教学环境,利用现代的教学手段、多媒体设施、电子教案等多种途径,实现课堂时间的有效化。概念、图表和相关的解释性文字以表格、图形和逐条出现的形式呈现给学生,把知识讲解化静为动。典型的编译程序中的分析表和流程图的具体构造过程则通过动态演示的形式表示出来,以便于学生的理解与记忆。教师重点放在讲解算法的原理,理顺原理之间的逻辑关系,学生则侧重于理解。这样,既减轻讲课教师的劳动强度,又提高课堂教学的效果和质量,使学生容易突破课程中的难点和重点。
采用多媒体教学也不能完全抛弃板书,因为板书灵活,可以随机应变,能够使教师紧密跟踪学生的理解进程。所以,在教学中应做到多媒体教学与传统教学的结合。
4.建立网络教学系统,促进学生自主学习。教学网站中提供丰富的教学资源,包括课程相关的教材、教学大纲、课程建设规划、理论讲稿、电子课件、算法的演示、习题、模拟考试卷、答案、实践指导书、经典算法程序、各种编译技术介绍、编译技术的动态以及多个与编译原理相关的网站链接等。学生可以通过这些资源掌握学习进度、重点及难点;根据编译的主要内容及基本框架,自由选择学习资源与学习路径。从而使学习者能够用最短的时间掌握到尽可能多的知识,根据掌握的理论知识引导学生自行设计一个个算法的程序。
编译原理在学习过程中,学生遇到问题难点不能一一与老师进行面对面交流,那么通过网络,可以把问题公开,老师建立相应的主题,学生可以在自己学习的特定区域发言,学生之间可以进行交流,所有的问题都公开化。通过这种方式,不仅解决了教师与学生见面时间少的难题,也为某些不敢当面向老师请教的学生提供了方便。
(三)扩展学生视野,激发学生兴趣
教学队伍应坚持教学和科研相结合、理论和实践相结合、课内和课外相结合,融知识传授、能力培养、素质教育于一体,将最新教改和科研成果引入教学。如果条件允许的话,可以适当配备一些编译器。通过这些实践的操作,将经典编译理论与现代编译技术有机地结合起来,激发学生对编译技术的学习兴趣。
推进编译原理课程教学模型从过程式向对象式的转变。在讲授传统理论时,用面向对象语言来描述编译算法。同时鼓励能力较强的学生从面向对象编译程序设计开始实践,从中积累经验教训,然后逐步推广,使编译原理教学适应技术的发展。
(四)合理设计实验与课程设计,与实际应用相结合
课程实验应以编译理论中的一些经典算法的实现为主,一方面可以培养学生的实践能力和动手能力,另一方面可以通过对算法的实现,达到更准确、更牢固地理解和掌握这些算法,从而提高学生的实际应用能力。如要求学生实现一个模型语言的词法分析程序和语法分析程序。语法分析必须采用递归下降分析算法、非递归的预测分析算法、算符优先分析算法、LR分析算法中的一种来实现。需提交源程序和实验报告。
课程设计应充分考虑编译理论与实际应用相结合,突出开创性和实用性。教师提供给学生一个经简化的完整的编译程序,要求学生在理解该编译程序及其源语言语法成分的基础上,扩充其语言成分,如扩充语句、数据类型或增加函数的说明和引用等,具体扩充的内容可根据可用机时和学生程度确定。这样就使所涉及问题的实现难度有一定程度的降低,进而激发学生的兴趣,更好地完成课程设计的任务。
四、结论
编译原理是计算机专业的必备基础知识,对培养计算机专业的人才有着重要的作用。上好这门课对于提升学生计算机理论素养和计算机综合应用能力具有重要意义。通过对编译原理课程进行建设,分析教学中存在的问题,制定与实施相应的对策,采用有效的教学方法和手段,使学生不再是被动的学习者,而是教学活动的参与者和实践者,以增强学生的学习积极性,使学生具备扎实的理论功底和较强的实践能力,真正地提高课程教学质量。
[参考文献]
[1]陈意云,张昱.编译原理[M].北京:高等教育出版社,2003.
[2]胡元义,邓亚玲,谈姝辰.《编译原理教程(第二版)》习题解析与上机指导[M].西安:西安电子科技大学出版社,2006.
[3]岳小婷.贯彻以人为本,推进《编译原理》教学改革[J].福建电脑,2008(1).
[4]庄燕滨,何中胜.“编译原理”课程教学中的问题分析及对策研究[J].常州工学院学报,2007(12).