第一篇:编译原理课程和助教工作总结
编译原理课程和助教工作总结
时间如流水般,转眼,一学期将至,每个人为了能交上一份满意的答卷,无时无刻不在倾注着汗水,挥洒着热泪。掩卷长思,细细品味,这学期的点点滴滴不禁又浮上心头,现在让我们一起回顾一下,希望可以对今后的教学工作有所帮助。
编译原理是我们北京师范大学信息科学与技术学院计算机专业本科生的专业必修课,它旨在介绍编译程序构造的一般原理和基本方法,其内容主要包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成等。这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,但是编译原理课程是所有计算机专业学生应该习得的一门重要课程,因为虽然在将来并不是所有人都会从事编译方面的工作,但是通过编译原理的学习之后,可从许多不同的角度来观察编译器的结构,编译器的物理结构、操作的顺序等等,会涉及到数据结构、计算机组成原理等课程,所以同学们在理论、技术和方法上都能得到系统而有效的训练,而且有利于将来希望从事软件开发的学生的相关素质和能力的进一步提高,更能够让每个学生更清楚的了解和熟悉一段程序从源代码到可执行文件之间具体的转换过程,这样能够更好的理解代码的编译和计算机内部的工作原理,对学生以后计算机相关的学习乃至工作从业都会有非常大的帮助。
编译原理这门课程是计算机专业课程中偏难的一门课,不管是在平时的课堂教学上,还是在上机实验的过程中,学生都会产生很多困惑之处,在这些方面我们的编译原理助教就承担了相当重要的工作和任务:
每周课堂随堂听课,跟进教学进度,并且上课之前做好复习工作,对每节课同学们可能会产生的问题提前做好归纳,以便更好的在课余时间跟同学们讨论,给同学们提供答疑解惑的机会;
能动手编写代码完成变异原理实验是本课程技能培养的重要一环,在每周的上机实验时,助教帮助同学们进行分组,以小组合作的方式来完成每次的实验任务,依照课程进度循序渐进的给同学们分派布置实验任务,在实验课上跟同学们随时交流,一同调试代码,一对一的解答实验疑惑等,并且协助同学们理解实验原理和内容,辅助同学们能够顺利完成上机实验,通过上机实验的手动操作,同学们也可以更直接、更具体的理解编译程序代码过程中一些具体的原理和方法;实验课我选取的是基于C++或者是基于flex和bison的实验,助教会主动和实验课本的作者老师联系沟通,获得更多实验相关的资料,比如书上给出代码的电子版和用例测试等。
助教在课后会主动收集同学们课堂上课或者实验过程中遇到的问题向我反映,这样可以及时发现同学们在课堂中理解较为模糊甚至有偏差的地方,并在课堂或者实验课上进行一个集中的讲解,更利于同学们的学习;
每次课结束之后,我会布置课后作业来让同学们对课堂教学内容进行巩固和查漏补缺,助教认真批改同学们的课后作业、所交的实验报告和运行的代码,做好每位同学的评分与登记,对课后作业、实验报告和代码中关键性的错误做出标记,并要求学生改正。登记课后成绩时,按10分制来决定,登记实验成绩时按照20分制来决定。在每次批改作业结束后,助教会及时整理,汇总学生的成绩和作业实验中出现的问题,助教通过批改课后作业和实验来了解同学们真实的学习情况,从而能够更好的辅助教学工作的进行。
平时为了同学们能获得更好的学习体验,会进行一些与国外教授的视频课程或者相关活动等,助教会组织同学们进行视频授课前的预习工作,同大家一起讨论上课形式,提出可能遇到的问题等等,在课前会负责批教室,布置桌椅场地,设置视频授课环境,调试摄像头、话筒和音响等相关的设备,为进行正常的视频授课或其他活动做准备。
对自己的要求:
一、师德方面:加强修养,塑造“师德”,我始终认为作为一名教师应把“师德”放在一个极其重要的位置上,因为这是教师的立身之本。“学高为师,身正为范”,这个道理古今皆然。从踏上讲台的第一天,我就时刻严格要求自己,力争做一个有崇高师德的人,为每一个学生“传道授业解惑”。
二、认真备课,不但备学生而且备教材备教法,根据教材内容及学生的实际,设计课的类型,拟定采用的教学方法,并对教学过程的程序及时间安排都作了详细的安排,认真写好教案。每一课都做到“有备而来”,每堂课都在课前做好充分的准备,并制作各种有利于吸引学生注意力的有趣教具,课后及时对该课作出总结,并认真搜集每课书的知识要点,归纳总结。
三、增强上课技能,提高教学质量,使讲解清晰化,条理化,准确化,生动化,做到线索清晰,言简意赅,深入浅出。在课堂上特别注意调动学生的积极性,让学生多动手,从而加深理解掌握知识。加强师生交流,充分体现学生的主动作用,让学生学得容易,学得轻松,学得愉快;注意精讲精练,在课堂上老师讲得尽量少,学生动口动手动脑尽量多;同时在每一堂课上都充分考虑每一个层次的学生学习需求和学习能力,让各个层次的学生都得到提高。
四、认真批改作业:布置作业做到精读精练。有针对性,有层次性。同时对学生的作业批改及时、认真,分析并记录学生的作业情况,将他们在作业过程中出现的问题作出分类总结,进行透切的评讲,并针对有关情况及时改进教学方法,做到有的放矢。对学生:
“不积跬步,无以致千里;不积小流,无以成江海”,学生要从点点滴滴做起,一步一个脚印,一份耕耘,一份收获。学习要靠你们自己,踏踏实实做事,所谓“行百里路半九十”,学习要锲而不舍,奋进永远是核心,让努力充实自己,厚积而薄发,达到“书香引蝶宜养兰,胸中点墨绘新颜”的水平。
第二篇:编译原理课程-教学计划
编译原理教学大纲2001,9
周次课内学时课内安排(讲授内容)建议课外安排备注
12编译原理概述阅读PL/0程序文本
24介绍PL/0编译程序阅读PL/0程序文本
32词法分析程序自动构造阅读PL/0程序文本
(正规式,有穷自动机)
44(2)词法分析程序自动构造练习题
Lex(Flex)介绍,布置PP1实践题一PP1
52文法和语言练习题
64自顶向下语法分析练习题提交PP1LL(1)文法
72自底向上语法分析练习题
LR文法
84LR分析练习题
期中考试
92Yacc介绍,布置PP2实践题一PP2
104习题课
语法分析方法比较提交PP2 112语法制导翻译,布置PP3实践题一PP3
124语法制导翻译
运行时存储组织提交PP3 132运行时存储组织练习题144代码优化, 布置PP4实践题一PP4
152代码生成164实践题目总结答辩
习题课
附1 实践题目(从中选一)
实践题一 Deacf编译程序的设计和实现.实践题二Pl/0编译程序扩充,用Lex和 Yacc实现一个小解释器.实践题三 java实现的Mini-Triangle编译程序.(限少数同学选,在第四周作选题报告)附2 课程评分
1课堂小测验,作业抽查 10%期中考试20%
3实践题一 40% 实践题二20% 实践题三 50%
4期末考试 完成实践题一 30% 完成实践题二50% 完成实践题三 20%
第三篇:《编译原理》课程培训心得体会
《编译原理》课程培训心得体会
天津科技大学 吴江红
首先感谢全国高校教师网络培训中心为我们这些工作在教学第一线的教师提供一个提高自己教学水平、方法和能力的机会,使得我们学习到更好的方法能更好地为学生服务。经过本次培训之后,我个人觉得可以通过以下几个方面提高教学质量。
1、认清编译原理,明确学习意义,激发学生的热情 帮助学生认清编译原理的作用和地位。给学生介绍清楚可以通过编译原理的学习,有助于学生快速理解、定位和解决在程序编译、测试与运行中出现的问题。帮助学生克服畏难心理,提高学生的兴趣。编译原理中的原理除了可以用于分析编译器以外,还对诸如人工智能、并行处理技术等课程的学习具有指导作用。本门课程学习对其它课程的学习和今后很多领域的理论研究具有深远的意义,如计算机软件技术领域、计算机系统结构领域、人工智能系统的机器学习领域、并行处理技术等领域。
2、优化教学内容,搞好课堂教学
可以采用以人本主义学习理论为基础,充分发挥学生的学习主动性,注重启发式教学,注重提高学生的素质、培养学生的创新能力。使得学生对编译原理课程的兴趣提高,能主动学习,理解、体会前辈们在解决相应问题时是如何考虑的,同学们自己又是如何考虑的。
编译系统中的一些概念很抽象,学生无法理解,就只会死记硬背,当然更无兴趣可言。在讲解的过程中,可以选用学生最熟悉的一些实例,通过类比使抽象的概念更容易被理解。我本人觉着对于工学学科的同学来说,不用在数学定义上花费太多时间,因为他们对数学符号不敏感,而应该尽量多安排例子,使得同学们能把数学符号代表的含义通过例子理解清楚,以及知道如何使用。
有效地利用教学辅助手段,增强课堂教学效果。由于本课程涉及形式语言、有穷自动机等抽象内容,学生在学习过程中接受起来较困难。为了提高学生的学习兴趣、增强课堂教学效果,可以将教学过程中一些需要教师在黑板上动态演示的过程做成CAI课件,既可在课堂上演示,也可在课后由学生自己观摩,有助于加深学生对所学知识的理解。
同时可在课堂上和习题中,多准备了一些从实际程序的编译和运行时碰到的问题中抽象出来的例子,供学生用所学的知识去分析、理解、并加以解决。通过采用这种实例教学方式,既能够对前期课程起到复习巩固的作用,又能让学生切实体会到本课程的实际价值,从而有力地激发了学生学习编译原理和技术的积极性。
3、选取合适的教材
把理论知识具体化、通俗化,教材在教学过程中起关键作用。一本好的教材不仅对老师教的过程很重要,同时在学生进行预习和复习时也是相当重要的。我们可以选择蒋宗礼教授编写的编译原理教材来达到我们的目标。
4、精心设计实验教学内容
编译原理课程对实践的要求比较高,所以实验课是培养学生实践能力的重要环节,是巩固和验证所学理论知识,培养学生分析问题、解决问题能力的重要环节。因此为了能达到好的实验效果,极大地促进学生对原理的理解,可以通过认真设计合适的实验内容、采用适当的实验形式以及教师的耐心指导等途径。
第四篇:《编译原理》课程设计说明-第1次
《编译原理》课程设计
《编译原理》课程设计
1.要求
完成一个简化C语言——TINY C语言的编译程序,最终能为用TINY C语言编写的源程序(后缀为.tny,已给sample.tny,用一般的文本编辑程序即可打开)生成目标代码,并在给定的虚拟机TM上运行得到运行结果。
TINY C语言中允许出现的字词: 整数、标识符;
算术运算符/关系运算符/赋值运算符/界符:+、-、*、/、=、<、:=、;、{、}、(、) 其它保留字:IF THEN ELSE END REPEAT UNTIL READ WRITE TINY C语言中允许出现的语法单位
表达式:简单整型算术表达式、关系表达式 语句:
条件语句(IF THEN ELSE END) 循环语句(REPEAT UNTIL) 赋值语句(:=) 读写语句(READ WRITE) { }中可以有注释,但不能嵌套
2.步骤
1)、词法分析
2)、语法分析
3)、语义分析
4)、生成目标代码
3.源码构成
MAIN.C 主程序
GLOBALS.H 全局类型及变量(如Token类属及语法树结点的组成) UTIL.H、UTIL.C 各步骤的实用函数。如输出Token,生成语法树结点等 SCAN.C、SCAN.H 词法分析程序及其头文件 PARSE.C、PARSE.H 语法分析程序及其头文件 ANALYZE.C、ANALYZE.H 语义检查程序及其头文件 SYMTAB.C、SYMTAB.H 符号表生成程序及其头文件
CGEN.H、CGEN.C、CODE.C、CODE.H 目标代码生成程序及其头文件
《编译原理》课程设计
TM 编译sample.tny源程序后得到目标代码,在该虚拟机上运行得到结果
步骤1——词法分析
要求:填写getToken()函数,完成词法分析器scan.c。约定:
仅允许整数类型,不允许实数类型
标识符由大小写英文字母组成,最多52个。其识别按最长匹配原则 整数后紧跟非数字,或标识符后紧跟非字母认为是一个新Token开始 由{ }括起来符号串都认为是注释部分,该部分在词法分析时被过滤掉
识别出的Token由两个变量:currentToken,tokenString识别,其中currentToken代表Token的类属,为一个名为TokenType的枚举类型,在文件globals.h中定义;tokenString代表Token在程序中出现的形式,即其本来面目。例如整数10的currentToken值为NUM,而tokenString值为‘10’;标识符i的currentToken值为ID,而tokenString值为‘i’
typedef enum
{ ENDFILE,ERROR,IF,THEN,ELSE,END,REPEAT,UNTIL,READ,WRITE,/* 保留字 */
ID,NUM, ASSIGN,EQ,LT,PLUS,MINUS,TIMES,OVER,LPAREN,RPAREN,SEMI :=
= <
+
*
/
()
;
} TokenType;
画识别符合TINY C语言构词规则的DFA。然后用直接编码的方法构造词法分析器
/****************************************************/ /* File: scan.c
*/ /* The scanner implementation for the TINY compiler
*/ /****************************************************/ #include “globals.h”
#include “util.h”
#include “scan.h”
typedef enum
{ START, INASSIGN, INCOMMENT, INNUM, INID, DONE } StateType;
《编译原理》课程设计
char tokenString[MAXTOKENLEN+1];static int getNextChar(void)
//获得下一字符 {实现请自己看scan.c文件} static void ungetNextChar(void)
//用于回吐字符 {实现请自己看scan.c文件}
static struct
{ char* str;
TokenType tok;
} reservedWords[MAXRESERVED]
= {{“if”,IF},{“then”,THEN},{“else”,ELSE},{“end”,END},{“repeat”,REPEAT},{“until”,UNTIL},{“read”,READ},{“write”,WRITE}};
//定义保留字表
static TokenType reservedLookup(char * s)
//进行保留字的匹配 {实现请自己看scan.c文件}
/**********************************************/ /* the primary function of the scanner
*/ /* function getToken returns the next token in source file */ /**********************************************/ TokenType getToken(void){ int tokenStringIndex = 0;
TokenType currentToken;
//保存被识别Token的类属
StateType state = START;
//初始状态为START
int save;
//标识当前字符是否保存,如空格,换行符n、TAB符t及注释中的任何字符
while(state!= DONE)
//DONE状态表示已识别出一个Token
{ int c = getNextChar();
save = TRUE;
switch(state)
{ case START:
if(isdigit(c))
state = INNUM;
else if …… //此处请自己填写(字符、:、空格/tab/换行、{、算符及界符等)
break;
case INCOMMENT:
…//此处请自己填写,仅出现‘}’或EOF(注释未完结束程序)时才改变状态。
break;
case INASSIGN: …… //此处请自己填写,‘=’或其它(出现错误)
《编译原理》课程设计
break;
case INNUM:
if(!isdigit(c))
{ /* backup in the input */
ungetNextChar();
save = FALSE;
state = DONE;
currentToken = NUM;
}
break;
case INID:
…… //此处请自己填写,不是字符则回吐,并进入DONE,且识别出一个ID
break;
case DONE: //不可能到
default: /* should never happen */
fprintf(listing,“Scanner Bug: state= %dn”,state);
state = DONE;
currentToken = ERROR;
break;
}
if((save)&&(tokenStringIndex <= MAXTOKENLEN))
tokenString[tokenStringIndex++] =(char)c;
if(state == DONE)
{ tokenString[tokenStringIndex] = '';
if(currentToken == ID)
currentToken = reservedLookup(tokenString);
}
}
---------end WHILE
if(TraceScan){
fprintf(listing,“t%d: ”,lineno);
printToken(currentToken,tokenString);
}
return currentToken;} /* end getToken */
第五篇:编译原理课程学习总结体会
编译原理课程学习总结体会
编译原理是我们计算机科学与技术的一门非常重要的专业课,它主要介绍了高级程序设计语言编译程序构造的一般原理、基本设计方法、主要实现技术和一些自动构造工具。
在开始学习这门课程之前,老师就说过编译原理是一门比较难学的课程,它主要的难点在于它的概念性和理论性很强,内容丰富且抽象,具有严密的逻辑性,应用其他课程的的内容比较多。
通过这一学期的学习,我也发现了编译原理是一门理论性很强的课程,从文法和语言的概念到LL(1)文法和LR(0)文法的分析,几乎都是对具体问题的抽象。这门课还包含许多理论知识和算法,这些理论的学习和理解都存在着一定的难度。其中理论知识包括:词法分析器的构造,语法中各种分析器(LR, LL,SLR,LALR 等)实现与完成。因而,我们需要更多的时间来理解、掌握相关的知识。在学习的过程中也存在这许许多多的问题,比如说由于我之前对文法的概念不够清晰,在后面老师讲解具体文法的方式式,感觉自己很难听懂,影响的自己后期的学习效率,也使得自己对这门课程的兴趣大大降低。此外,这门课程的课时也安排得不多,每个周也就一两次课,这样也不利于我们队这门课程的理解和掌握,但好在我后面通过自己做题和询问同学之后将词法分析和语法语法分析的方法弄懂之后,自己对这门课程的兴趣又提起来。除了自己课后对知识进行了总结之外,最重要的还是老师的讲解,师在有限的课程中尽量将知识点以比较容易接受的方式给我们讲解,教我们用简单的方法理解记忆不同的知识,这样我们学习起这门课程来也没有那么难了。
在我看来编译原理这门课程不仅仅在于其本身的理论价值,更在于为我们解决问题提供的思维方式和方法。从LL(1)到LR(0),问题不断被解决的同时,又有一个个新的问题提了出来。对计算机语言世界的知识积累,像滚雪球一样越滚越大。这个逐渐递进,逐渐解决问题的过程对我来说是收获很大的。整个过程好像踏着前人研究编译理论的路线,不断感觉他们遇到的问题,更重要的是他们解决问题的思路。编译原理的课程带给我的不只是如何去编译程序这样的理论知识,相信更重要的是一种如何“自动计算”的思路。通过对相关编译问题的具体分析,让我体会最深的是一种“自动计算”的思想,同时完成编译试验后,更是感到了一种“自动计算”的快乐。”然而我明白自己虽然对编译有了一定的了解,我懂得了文法的分析,学会了构造确定和非确定有限自动机,学会了LL(1)文法和LR(0)文法等,但是并没有完全掌握,对于这些知识点的实质性和其他方面,更是认识不深。作为一名学习计算机科学与技术的学生,我明白编译原理是软件工程的基础,课程的结束并不意味着学习的结束,只有通过以后的学习,才能更深入地了解编译原理,才能将编译原理更好地应用到以后的学习和工作中去。
最后,衷心感谢老师这一学期的辛苦教学,让我学到了许多颇为重要的知识。