| 选课类别:计划内与自由选修 | 教学类型:理论实验课 |
| 课程类别:本科计划内课程 | 开课单位:计算机科学与技术系 |
| 课程层次:专业核心 | 学分:4.0 |
本课程是计算机科学与技术英才班的专业核心课,目的是让学生对程序设计语言的设计和实现技术有深刻的理解,对和程序设计语言有关的理论有所了解,并能把本课程讨论的概念和技术用到软件设计和开发中。本课程介绍编译器构造的一般原理和基本实现方法,其内容包括词法分析、语法分析、类型检查、运行时存储空间的组织和管理、中间代码生成、代码优化和目标代码生成等部分。本课程在介绍编译器各逻辑阶段实现技术的同时,还强调形式化描述技术,并以语法制导的定义作为翻译的主要描述工具。作为原理性的课程,本课程介绍基本的理论和方法,而不偏向于某种源语言或目标机器。与普通班的同类课程相比,本课程重点增强课程实验的难度和复杂度。
教学与课程内容 张昱老师的《编译原理和技术(H)》课程内容丰富且理论与实践结合紧密。课程涉及词法分析、语法分析、语义分析等高级主题,知识拓展较多,包括GLL、GLR等形式文法及LLVM工具链的实际应用。PPT内容充实,但较为冗杂,有时上课节奏偏快。教材被一些同学评价为不易理解,但课程本身提供了足够的深度和广度。
实验与作业 实验以构建一个类C语言编译器为目标,涉及词法、语法、类型检查、中间代码生成等。实验工作量大、难度递增,特别是后期的组队项目,需要独立思考与合作完成。实验帮助学生掌握C++高阶特性、Git和LLVM等工具,有助于培养项目管理和解决问题能力。然而,实验框架偶尔导致配置问题,给部分同学带来不便。作业每周发布一次,题目数量和难度相对合理。
考试 考试对学生的灵活应用能力要求高,题型多样,难度大。期中期末考试设计精妙,题目考查内容的深刻理解,开卷形式允许带电子设备,但考题涉及知识点运用,并非简单记忆与查阅。一般来说,考试中的知识点需要综合运用,常见于作业和习题中。
给分与评价 给分相对严格,但老师在期中期末考试中提供了一定的补救空间(如24分满分按20分算)。实验、作业和最终项目对总评有重大影响,尤其是大作业的表现可能影响最终成绩显著。张老师以“不调分”著称,但会基于学生整体表现出具合理成绩。
总体评价 张昱老师被评价为认真负责,教学质量高,充满热情,关注学生学习体验。课程总体收获丰富,是计算机编译原理领域的重要学习机会,对计算机科学基础和应用都有极大帮助。对于有志于计算机系统层次深入学习的同学尤其推荐,但需有充足准备来应对较高的课程强度和挑战。
想了一下感觉之前评课有点过激,存档丢这里了,下面放点对 H 班和普通班(本文指李诚老师班)的比较,可能对选课有点用(
编译原理内容很多:
这就决定了默认的实验设置难以覆盖课程的方方面面(即使这门课实验可能已经是本科所有课程中质量最高,量最大的了)。因此课程的深度和广度除了实验还在课堂。
总体来说课程相比普通班是很有特色和区分度(难度)的,欢迎来学(给分个人感觉不用太在意,2022 年虽然不算很奶但绝对不杀(从优秀率也可以看出来))。
期中考完开始摆烂,念名字发卷子的操作直接梦回初中时代。
第十四周布置个自己出题互相打分的作业,花样多多。
第十六周结课了布置带答辩的大作业,DDL空降考试周正中间,4号编译6号算法8号随机过程10号就是这个实验DDL,12号实验答辩。
老师上课很认真,作业和实验都有很认真的设计,收获很多,是在计科上的最优质量的专业必修课了。给分还不知道,不过不抱期望了。
H课不怕大家说,H课怕大家不说。
昱姐真的是好老师,5分给老师,0分给自己,加起来5分.
DDL延到考试后了。
属实是好课,上了不亏。
终于全部结束啦,完整的评一下这门课
作业:每周一次,课后习题,不超过3题,不算很难,可以说和考试不是一个难度。
实验:前3次实验用来熟悉Cpp的某些特性(虽然感觉做了之后也没对cpp熟悉多少),从实验四开始难度陡增,所以请留出充分的时间debug。后面四次实验分别是文法分析,类型检查,代码生成以及优化。助教的实验文档写得比较详细,但每次还是在阅读接口代码上花费了很多时间。虽然是在educoder上有现成的环境,但是根据助教的文档,在本地配置一个环境一点都不复杂,在本地写实验当然是效率++。最后两次实验是组队实验,第一次组队实验耦合度比较高,需要队友之间经常交流,所以和熟悉的人一起组队可以省不少事。第二次组队实验ddl本来在考试周,但老师后来调到了所有考试结束后三天。最后一次实验任务量相当大,ddl特别紧迫,绝对是我整个大学生涯目前最刺激的一次实验,体验极佳。对于实验,中间几次实验在educoder上测试,有一些很不容易想到的隐藏样例点,多和同学交流当然有好处。
考试:实在是太难了,期中考得差得要命,导致我期末直接没有去问成绩。老师水平是真的高,不知道怎么就出出来这么精妙的题目,题目主要考察的是对知识的运用情况,刷题似乎是没什么用的。
老师:上课水平应该是计科数一数二的了。老师特别温柔,第一节课就跟我们说“感谢大家知道我给分不好还选这门课”,对同学的严格要求我也不认为是什么不好的事情。平常课间也会和同学聊天,问同学一些课程外的问题,课堂气氛真好。在计科,能上到这么一位好老师的课真的是幸运的事情。
总的来说,这门课还是相当有难度的,我也经常会去问同学问题qwq不然很多课程上的问题我都无法解决,非常感谢!这是我在计科投入最多的课,虽然感觉总评可能会跌破我的史低,但还是觉得挺值得的(谁让我考试中暴露水平了呢hhhh)
编译原理H是计算机学院最好的课!
张昱是计算机学院最好的老师!
上大学以来最喜欢的一门课。
课程主页:
http://staff.ustc.edu.cn/~yuzhang/compiler/index.html
http://home.ustc.edu.cn/~yxonic/compiler2016/#
https://guoxing.gitbooks.io/compiler-f2016/content/
张昱老师的教学思想是专业课中很先进的,实验的内容每年都在变,在编译器的领域有什么新的东西,都会让学生去用。
今年的实验中,实验要求等说明放在gitbook上,代码的提交使用git。实验需要使用flex、bison写编译器前端,用llvm IR做后端,最后实现一个完整的cool语言的编译器。还有很多llvm、clang的源码阅读和修改实验。大作业自选题目,然后分组展示。
实验的难点主要在学习新工具的使用上,需要查很多资料、阅读文档,比较锻炼能力,收获很大。
期中期末考试开卷,占总分的比例比较小,主要还是实验占比大。
我希望有能力的同学们都来选H班,因为H班相比普通班能学到更多先进的、实用的东西,接触计算机领域更新的技术,而不仅仅是学习编译原理的知识。
负泽的助教+优秀的老师+众多的大腿=良好的课程体验。
本学期的课程总体感觉良好,除了最后一个开放性实验布置得太晚来不及干。但是如果一开始选择了科研探索这个实验就可以不做,所以建议各位还是去做科研探索比较好,虽然这学期大部分科研探索也比较水,真正有成果的只有两组,其中一组甚至发了paper!!!
个人觉得这门课的实验难度相当大,有几个实验完全不知道怎么下手,不过在同学和助教的帮助下,fail的点很少(谢谢zevin助教!)这门课的实验资料很少,而且实验内容每年都有变化,因此同学之间抱团取暖肥肠重要。
考试相当之难,建议多看看gcc编译生成的汇编码,老师课件中给出的问题要认真分析,考试题有很多相关强化型变种,对于代码分析能力的考查较高。
从给分看,昱姐这一次是调了分的,而且从课程管理上看昱姐在优化课程内容的同时也在优化课程的体验。
总的来说,这门课在维持一贯的高难度,高标准的同时,也在优化教学内容和教学方法,虽然仍然存在着一定的问题(如最后一个实验布置的太晚,论文阅读的guide太少),但是可以看得出老师也是希望我们能够多学一些与时代接轨的东西,而不是抱着多年来几乎不变的教材死读书。
来日可期。
最新消息,2019年3月22日,量子编程组投稿的论文中了,发表在TASE2019上。
恭喜之外附加羡慕嫉妒,以及再一次意识到了自己有多菜。
课堂:前半学期我上课比较认真,老师讲得很好,也能跟上,课后不需要花过多时间复习。后半学期因为各种实验开始上课一边听一边摸鱼( 直接导致好多东西只能自己看PPT看书,感觉有点费劲。所以在此奉劝后面的同学们编译H上课一定尽量认真听课
作业:作业是每次上完课都布置->相当于一周2次,每次题目倒是不算多,基本都是对课堂内容的考察和理解,没啥好说的,而且每年题目差别也不大
实验:一共7次 5次独立实验 前三次是一些小实验 包括智能指针,c++运行时,主要介绍和学习一些东西,第四次词法语法分析器,第五次语义检查,第六次第七次合作实验2-3人,分别是中间代码生成和代码优化,代码优化ddl在考试周之后,结束之后还有一个答辩(虽然感觉大家实现没啥大的本质的区别,毕竟不是自由选题的实验)总体而言七个实验都能学到很多东西,而且基本框架都搭好了,有了一个基本的思路,个人感觉挺好的。
考试:期中 期末卷面满分都是24分,据老师说是直接以20分为满算入总评,也就是大于等于20就能算满分了,算是给分上面给了极大的缓冲空间了,考试都是完全开卷,可以用电脑看资料(不能跑代码),不过考试体型大部分基本都不算送分题,需要灵活.运用所学。
总体:感觉是我3门H课里面学到东西最多的课,虽然考完试还要留在学校写几天代码答辩确实很累,但是相比之前安排在考试周中间验收答辩,那还是轻松了很多,还是很感谢老师助教为大家考虑,延迟到考试周结束。最后期中+期末38.5分 总评给了95 感觉还是被捞了一点,没有卡绩 感谢老师。
昱姐的编译h,当然要给十分啦!
经历:
大二上的时候脑子瓦特,所以提前选了一下h.各种酸爽,各种佩服学长们的优秀.期中8分/20分.然后开始懈怠(不如说是战略性放弃)后面实验没有做好,但还是没有中途退课.最后60分.
大三上再来.
个性化重修找昱姐签字.
昱姐:是为了提高分数才来的吗?
我:编译很重要,我没学好,想好好学一遍.(屁,这个原因只是一小部分,当然是因为要过这个"坎儿",去年真的是我的一个坎儿,不干掉编译就很不爽).
之后好好学.所以编译h在我这里就不再是"专业重课",更不是什么"这课学了干嘛"的印象,而是必须hack掉的东西.
所以就认真做了.尤其是teamwork吧,虽然我们组选的是老套的java GC,但是付出了40-50小时以上.虽然只占了5分.
然后是吹水部分:
最后92分,全班最高2333(也没说必须给4.3对吧,并且私以为这侧面反映了在编译这方面,这届没有上届强.)
实验:
实验改了很多,但万变不离其宗.
这学期的ddl是ddl当天的晚上十点,保证我们的睡眠,这一点超级棒.
收获:
收获真的大!
毕竟学过两个学期嘛233333.
昱姐:
绝对的好老师.体现在:
对学生:会记住每个人的名字,对的上脸,会有一定了解.(班主任有的都做不到吧)
对课程:每年都会改进实验,教学等.这一点我学了两学期印象深刻.会尽力让我们学到的东西有用,向工业界靠近.讲课水平较高,并且会关注同学的反馈,如果有开小差严重会点到.
对成绩:原则是"不调分",该多少就多少.对于不及格的同学例外.会在出分之前给可能不及格同学改进实验的机会.
张昱老师的编译原理课,实验作业的量很大,一定要做好心理准备。由于张昱老师积极采用新技术,能学到不少东西。比如我 2012 年学的时候就要求使用 Git,而且不能只有一个 Git commit,要有一步步做出来的过程,commit message 还要有意义,这样基本就杜绝了抄袭。我们当年是 yacc + lex,据说后来用 clang + LLVM 取代了;我们当年是要求有 Makefile,据说后来用 cmake 取代了,都是与时俱进的。
缺交作业、缺课是万万不可的。我们那一级就有好几位同学挂科了。我的一位技术很强的学弟,因为参加国际超算比赛时间与期末考试冲突,张昱老师既不同意缓考,又不安排补考,这门挂科就影响了保研,导致他毕业只能去工作。还有一位学弟因为在北京的微软实习(联合培养博士项目),因为这门课不能缺课,只好终止实习回学校上课。
本门课的实验确实是我作为一个网安学生大学生涯里第一个较为成系统的原创项目实验(虽然有待完善,甚至大学前两年感觉几乎没有课程内的代码能力,工程能力的训练) ps:有时候挺xm南大的(无论是课程的设置,还是实验的安排),总感觉在科大这种培养方案下,相似水平的人最后会被nju爷狠狠甩开,当然不排除nju出圈的课程与老师比较多。
当然缺少之前必要的训练,在完成实验的路上必定是磕磕绊绊的,但是如果自己全部完成当然也是收获巨大的,感觉难度可能比一般国外网课的课程实验难一点,当然这也是参考文档仍有待完善导致的,不过瑕不掩瑜。
学期前半部分,语法分析可能有些抽象,后半学期,较为简单,考试20/24即为满分,考的很好,实验全完成(虽然报告写的很敷衍),最后给分也属于预期,虽然我觉得还可以高一点,不过已满足,毕竟没必要那么纠结给分,差不多就ok。
最后,助教很负责,好评
可能是我目前为止最认真的课程。
刚开学的时候感觉昱姐有点高冷(刚开学俺上课没认真听课,在写代码,突然昱姐叫大家都抬起头听课,把俺吓了一跳),后来发现昱姐人超级好啊,很快就和同学们气氛很轻松了,很多事情也很为同学们着想(比如疫情返乡时期叫我们不必为编译课担心,想回家就回;还有安排习题课在开学时,为了让我们考前记忆更深刻)。讲课也不错,我已经有好多课平时摸鱼期末看字补天了,但这门编译课确实听课比我看书来得快和形象。实验和作业稍微有点多,每次一布置作业我就会叫苦连连,吐槽自己为什么选这课遭罪受。但写完了又觉得没什么痛苦的(话说框架感觉确实有点内存泄露,用 address sanitizer 一堆奇奇怪怪的报错)。
在最后有一个 team work。刚开始感觉很难受(比如有点社恐找不到第三人、感觉自己很菜任务好难放假好想摸鱼),但最后在缺人且优化摆烂的情况下早早便完成了开摸了。感谢我的队友让我体验了从小到大最开心的一次组队!后来听汇报,感觉大佬们都好厉害啊,我还以为优化只能凭自己空想然后乱写、或者复现书上课上讲过的方式呢,好多大佬真的去看了 llvm 本身是怎么做的,然后简单复现了一下先进的做法。看得我目瞪口呆。
稍微有点体验不好的可能是考试了,考得有点抽象啊,期中感觉也认真复习了,但卷子就是不会写,弄得我心态很爆炸(题量好大,而且第一题心态直接崩了)。期末感觉都是意识流在答题。最后拿了个不高不低的分,感觉也一本满足了。
总之推荐选,没这种类型的课我会怀疑自己上了大专(。
这门课确实是大三上最难的一门课,大概也是花时间最多的一门课,但是完全没有评课社区说的那么困难,实验也没有想象中那么困难,顶多是量大了一点并且由于之前没接触过这方面的东西所以上手慢一些而已。
每周基本上都有作业,每次作业也就两三道题,但是要想写全对还是需要花一些时间的,像我这种比较浪的人作业拿过一堆8分。。。
这学期实验一共有七个,前几个是熟悉编译工具和C++的高级特性,从第四个实验开始就是从头开始实现SysYF的编译器,包括词法文法构建、类型检查、IR生成、代码优化。实验刚上手可能有点困难,但是熟悉了就不难了,强烈建议先把算法的设计思路想清楚再动手编程,这样会大大降低出现奇怪的bug的概率。最后两个实验是小组合作完成,需要针对最后一个实验进行答辩,期间会有助教和同学提问。
扣的一分在于昱妈妈上课,节奏对我这样的菜鸡来说有点太快了,经常听不懂在讲什么,而且PPT里经常夹带私货。。。反正我个人觉得上课体验一般。
最后说说考试,期中期末都是24的卷面总分,达到20就算满分。貌似这学期考试比之前简单些?期中和期末好像都有6、7个20+的。考试内容就是上课讲的知识(这不废话么),平时作业都搞懂了问题不大。
这学期昱妈妈给分超好,喜提96
最后的最后,这学期实验的仓库Komorebi660/SysYF-Compiler: 2021年中国科学技术大学编译原理(H)课程实验项目 (github.com)希望对学弟学妹们有所帮助。
编译原理H正式撒花
zy老师上课很细心,也介绍了很多当下与时俱进的内容,单纯从课程内容来讲,真心觉得学到了很多有用的知识,很多地方没有跟上,也只能怪自己不够细心吧。
期中期末考试卷出的很独特,属于是那种复习了也没啥用,卷子上扣一分总评里就差不多扣一分,第一次在考完之后连书都懒得翻,因为书上不可能有。考试的时候属于是两道不会的题来回摆动的状态,最后期中期末考都考得不理想,也就是自己菜的缘故,希望张老师捞捞我~
接下来是想吐槽的两点,第一是实验的时候安排的有些许不合理,比如考试周结束还要写大实验并答辩。
第二是,作业布置在平台之后,标记了书上的题号却暗改了题目,好多时候对着书上相同题号做完被扣分了。。。
对于整门课程,个人觉得知识很有用,给人很多次恍然大悟和如梦初醒的感觉(虽然在未来生活中未必用得上),花了大量的时间和精力,最后结果可能和投入精力不太匹配,令本人有些深夜emo
张老师第一节课就感谢了大家,说知道自己给分不是很好大家却都愿意选自己的课,嗅探到一些信息(但还是只能给分出来后再评价给分吧)
老师和助教都很不错,我却只能给自己打5分
-----------------------------------------------------------------
昨天实验结束 今天就出分了 两次大考都比平均分低,后面实验样例测试结果也不是很好 最后给了85 算是满足辣!现在我给自己打6分,老师助教仍然都是满分
本科期间收货最大的一门课没有之一 具体来说: 1. 编译的基本知识 很多人觉得编译知识不重要,但实际上不懂编译的人写不出好的代码(c/cpp/java甚至py都非常显著) 引用yuzhang的话说,学好编译之后学一门编程语言就非常容易了 2. 一些git,linux,c++,llvm等知识技能 要完成这门课的实验,只会c肯定是没有可能的。我在学这课之前,c++只会一点点oop,其他除了iostream,cout之外和c没啥区别。而在这门课的实验里,c++涉及到stl,模板,type trait,rtti,继承和多态,cast,还有访问者模式等东西。开始很反感这些(心里喷能不能让人好好写代码),后来才发现这些真的有用。如果工作或者研究要和大型开源c++项目打交道,这些都是非常基本的技能。 至于git,cmake,makefile,linux等技能,几乎是linux开发基本技能,接触一点也不是坏处
最后总评只比一个重修的低
果然只有作者能讲清楚自己的书写了些什么。。。
出分了就可以来点评了。张昱老师的上课质量是有目共睹的,算是科大所有课程里顶尖的一批。整个课程的难度比较大,实验非常多,感觉有数据结构的两倍以上。但是都比较有价值所以收获很大。这个学期老师的给分似乎变好了,年前出分大家似乎都比较满意可以安心过年了。
另外这门课的除了本身的实验,下半学期是会有拓展实验的,可以自行选题也可以做老师在学期一开始就给出的课题。建议是尽早去跟老师的课题,因为这样有很多的时间调研,有更大概率做出有价值的成果,还没有实验室的同学甚至可以直接借此进老师的实验室。张昱老师绝对是模范老板,很适合当导师。如果这个拓展实验做得好甚至可以发出paper。完全靠自己选题由于要到下半学期才开始,无法有很多时间调研,而且还有各种期末考试,很难做出有价值的成果。最后的成果汇报老师是严格把关的,很难混过去。
这门课的实验中还是能学到很多东西的,包括养成看文档、源码解决问题的习惯,同时也在应对实验的同时意识到自己所能做到的比想象中要多。计院的课程实验还是挺水,有时候写完了感觉就是完成了作业这样子。。。完全没有自己收获了什么这种感觉,但这门课的实验还是不一样的。
但这种拔高带来的副作用就是很多问题就连助教可能也不能完全帮你解决。再加上助教态度不是很温和(不过设身处地的想,帮人debug还是挺头疼的)。。。而且今年的实验据说与去年不同,新花样玩起来总是有一些阻力的,各种环境啥的有点难配,而且一开头就让人直接编译llvm,而事实上,直到最后也不一定用得上这个编译的版本(除非要写checker,然而期末大家差不多都没这个心情了),有点浪费时间。再一个是C++很多人不熟,搞得这门实验像C++速成小课堂,浪费了大量时间在应付不熟悉C++特性引起的错误上。
再一个就是qq群的班级管理方式有点迷。个人觉得qq群用来锦上添花,分享额外的知识想法、抄抄答案(划掉)啥的还行,正儿八经ddl时间最好在网站和ppt上公布,并且上课强调。
此外就是teamwork比较鸡肋,分值少,所以大家都心照不宣没有搞实际项目,最后弄得像新生研讨课orz不如布置一个组队写代码的任务,就像一个额外的实验一样,毕竟团队协作调xia研bian大家其实见得太多,但合作写代码的经历还是蛮珍贵。
说了这么多然而期末征集意见的时候还是怂(눈_눈)只能寄希望于下届助教or学弟学妹能看到了。
另外,虽然一般大家会告诉你编译h实验最重要,但考试的卷面分是直接扣在总评上的啊啊啊(流下了考得烂的泪水)不过确实觉得这门课理论其实远比实验难得多,即使摸着良心瞎编出了能跑通测试的代码,但背后的实现机制,还有在使用一门语言时,以批判的眼光看待其局限、特性、创新之处,包括为什么要这样设计,那些依旧令我云里雾里的异端邪教的争论,我还是不明白啊(痛哭流涕)
但无论如何,这绝对是配得上名字后面那个H的一门课。希望它会越来越好(。・ω・。)ノ♡
没错我是来帮昱姐刷分的,课程质量有目共睹,老师的水平和志向也摆在那里,具体内容如上面两位大神所述,还没出分所以给分暂时没法评价只好给了一般,不过到了这一步也不在乎分数了。
今年给分还挺良心的,本来以为会是我最低的一门,结果是最高的(98)
期中期末考的都挺水的,比作业水很多,期末还直接出作业原题(所以记得带习题课ppt)
实验挺多,记得和队友沟通好,以免队友决定单飞了你却不知道:)
嗨嗨嗨,来了奥。
感觉这门课其实挂了一个H的牌子,但是实际情况是似乎似乎实验并没有隔壁诚哥的难。
关于期中期末的话,其实考得都很基础,但是需要极高的熟练度。(期末考了一个我出的题的改编版,有些unfair)
张老师可以帮你涨很多有关语言的视野,这个还是比较关键的。
课程有那么一点晦涩难懂,例如标号回填那里,我感觉PPT没有一些C站的博客弄得好。
课程主页:http://staff.ustc.edu.cn/~yuzhang/compiler/
// 建议留出充足的时间写实验
见识了传说中的编译原理,其实也没那么可怕。卷面考试难度颇高,建议大家学习时注重理解和运用,多从实际应用的角度出发,对编译的理解会更深刻一些。
非英才班,本着不选这门课或许会成为一个遗憾的想法选了这门课,最后总评还不错。
跟非H班的同学交流过,感觉非H班的实验并不比H班的简单多少。非H班的实验貌似是代码全都要自己写,包括词法、语法分析之类的,而H班使用ANTLR,有完整的一套实验包,语法分析部分差不多就是抄一遍语法规范而已,难度要小很多。
加上H班好像没有优秀率限制,不用担心大佬多的问题,所以非英才班的同学还是可以考虑一下选这门课的。
感觉这门课难在要读两篇关于LL*、ALL*的论文并回答几个问题以及在考试周要完成的final project。final project自由选题,发布时间比较晚,临近考试周,会比较肝。本来想抱大腿来着,结果发现好多大佬都去做科研探索项目了。科研探索项目开始得比较早,人也比较多,期末应该没有那么肝。
补充:LLVM是完全没有必要自己编译的,可以直接在官网下载已经编译好的包。