NKUCS.ICU
NKUCS.ICU copied to clipboard
COSC0017 编译系统原理
https://nkucs.icu/#/courses/grade-3/COSC0017
NKUCS,一个充满了「神仙」和「神仙」课程的专业,本网站旨在记录 NKUCS 的信息以及历届学生的评价
个人认为是nkucs本科最难的一门课,上完代码水平会有质的提升。
· 知识点:较多且较难
· 作业:每周预习作业+7个小实验+期末大实验+6-7个书面纸质作业 期末大实验代码量:1000-2000行
· 期末考试:与往年考题模式类似,不会刻意的刁难你,好好复习即可。
· 王老师真的是一位负责的好老师!课堂讲解非常细致深入。
· 总体上,学好编译这门课程一定要做好每周的预习作业,加上课堂的再次巩固,这样期末复习起来就会很方便。
@emanual20,20Fall,21Fall-TA:
课程安排:理论课,实验课,Opentalk (2 次,可加分)
作业:每周预习作业 + 6 个小实验 + 期末大实验 + 6 个书面纸质作业,期末大实验需要构建一个 SysY 到 ARM 汇编的编译器,不算助教给出的框架代码量约 3000 行左右;
期末考试:好好复习往年题;
除物联网专业的必修课,有意思的一门课,技术除非之后去做编译优化的同学,可能一辈子都不会再用到,但,本课程锻炼的工程能力是长久的。
课程安排非常紧凑,内容十分 "充足"、需要从头开始就跟上,龙书是很不错的参考教材。
作为 21 年的助教,经过课程改革,21 年的实验必须完成中间代码优化,并在希冀平台的 OJ 上进行测试,难度提升不少,课程组给出了框架和重置的指导书,希望同学们学有所获。衷心希望同学们对本课程提出建议。
选课时间:2021Fall
- 王刚老师的课都是这样,课前预习的 PPT 非常“丰盛”(当然他开的并行程序设计也这样),如果想学好知识点需要下较大功夫预习。
- 非常赞同楼上学长“这是本科阶段最难的一门课”的观点。
- 本课程具体安排和注意事项等楼上丁神学长已经详尽列出,此处不再赘述。
- 虽然知识点难度大,但期末考试难度适中,复习完往年题感觉挺套路化的。
- 感谢王刚老师和助教团队这一学期的付出,作为蒟蒻我也感到收获颇丰 OTZ
个人评价(仅供参考):4.7/5
以下是往届选手评论(单纯是支持这个网站)
其实不用看我的资料也可,王刚老师会把资料发QQ群。非常工整,清楚,明白。 王老师讲课也非常细致,PPT内容很详尽,课堂会提问,有不懂的课上课下可以随时交流。 每周雨课堂签到,尽量别迟到。迟到老师会特别照顾你。(前排落座,虽然一般来说迟到就没座了。 实验课有一定难度,最后要做一个编译器。每个实验的分数都会标出来,基本两周一个实验,给助教讲代码,助教打分。 只要课上跟着走,最后考试就没问题。
李老师一般也会开一门,他俩一个实验室的。只不过李老师课上学生数量有点少,有大一高数那味儿。 实验课是一起的。
另
我多传了几套试题(比这个多了几个B卷)在我的G网自救资料里,有需要的可以自取(所以快来个人手把手教我一下怎么上传到magic里啊)
课程实验的难度过大,堪称本科期间最难的课,在不看 十号明 代码的情况下几乎不可能自己写出来。由于培养计划的不合理,导致大三上学期的压力过大,信安尤甚。考试请参考往年试卷。
课程实验的难度过大,堪称本科期间最难的课,在不看 十号明 代码的情况下几乎不可能自己写出来。由于培养计划的不合理,导致大三上学期的压力过大,信安尤甚。考试请参考往年试卷。
不得不承认是这样的,建议明年的教学组可能可以对指导书进行更细化的编写,至少能让同学们知道在什么地方应该写什么代码,不至于无从下手
20级TA,做一点补充。个人认为编译课程所包含的思想,会在不止狭义的编译器领域用到。
计算机的研究,个人可粗略分为偏软件侧(编程语言理论与软件工程)和偏硬件侧的研究,和对特定计算问题的算法(tsc/ai/dist)研究。编译器是尝试建立软件与硬件的连系,人在软件侧用合适的方法(准确、少错、易读)表达清楚某个“算法”,交给编译器自动生成可被机器执行的代码(高效,正确)。应用侧,算法侧,系统侧,不论从事什么科研方向,都会在某一刻回归到软件的问题,以及软件和硬件的对话问题(即编译)。搞前端,搞安全、程序分析、高性能计算,搞算法优化,搞软件工程,搞操作系统,搞MLsys,总要回归“语言”,回归“语言的翻译”,所以它还是有许多适用的。
编译实际研究的是语义对象间的变换,比如C=>asm,或者C=>C的等价变换(如优化);变换的前提是对语义对象的“分析”。在parser之后,人们会做类型检查,会对程序做静态分析、动态分析(比如找bug,分析程序性能,插桩等),会将程序变换成不同的IR表示(线性/tree/cfg/sea of nodes/...),进行目标体系结构无关的优化,向不同的目标硬件做变换、针对性优化;而语言可能包括很现代(复杂)的语义。这里每一处都有有意的设计,计算机人大概总离不开这些思维。
但同时,我们的培养计划还缺少对程序语言理论/计算理论本身的讨论。学生可能从没有想过“为什么一个语言被设计成某个样子”,“一个语言的本质特点是什么,什么是函数式编程,什么是命令式编程,rust/golang/haskell的究竟区别是什么”,现在不断涌现的DSL(domain specific language)的设计核心是什么,如何看待“为什么那些语言看起来好像啊”这种问题。早些过一遍SICP,我认为是有帮助的;这门课似乎也可以作为补充。编译原理这一门课或许本身无法承担全部的这些责任,虽然相信助教们一定会更好设定课程的梯度,但无法取消课程的难度与前期课程设置的不足让同学们感到的困难;但作为过来人,我还是期望希望在计算机行业长期从事的同学可以重视这一门课,并意识到,嗯,原来我们还有许多没学过的、而这些思维方式十分重要,自己有意识地补充它们。加油!
~~不知道为什么这两天一大堆邮件发我这里来了,那么发表一下看法吧~~
选课时间
2022FALL
授课讲师
王刚。
课程内容
理论课
主要讲解前端的部分,重点应该在于那些算法,什么状态图之类的东西。(不考试了我就不听课了,反正我最后啥也没记住)
一些吐槽吧,刚子讲课特别让人犯困,那个PPT短短几行字能讲十分钟。上课也是,对很多问题过于深入地讲解了,而且刚子的声线和那个废话文学陈清泉很像,就更犯困了。
实验课
我同意学长们关于这是贵学院最难的一门课(指实验)的说法。
主要难度来自于以下几点:
- 编译器这个领域本身就比较难
- 网络上的参考太少,基本上只有以前学长的作业,而且学长的作业也没写注释,有时候也看不懂。(19级开源的,大多数都是shm的样子,我所见到的只有斌哥那个是自己做的,采用了完全不一样的框架,太强了,膜)
- lab6和lab7对前面的实验有较高依赖,前面没写好或者偷懒了很可能导致后面的功能增加不进去。(比如一开始没想做数组,前六个lab是针对level1写的,最后再加数组功能已经加不进去了。)
- 实验指导书我个人认为可以写的更加详细,目前的指导书的指导不太丰富。比如BUAA和USTC的实验指导书就更好。当然,TA@lk认为已经足够详细了。
- 其他因素,具体如下:
- 被我常年diss的培养计划:这学期把计算机网络、操作系统、编译,还有密码学(信安)体系结构(计科),这些极度硬核的课程,和编译放在了同一学期,造成这一学期的实验和课业压力都非常大,如果再选了几门选修课,甚至没时间去思考和写这个实验。(我到现在都记得十一月底,所有课程加一起在九天里要交11个作业,当时差点疯了)
- 理论课和实验课脱节:刚子花了大量时间在讲前端,但是我们的前端直接使用了flex和bison就解决了,而真正的难点(lab6 and lab7中间代码、汇编代码那些),在理论课上没有被提及或者很晚才提及。这问题我感觉是大物和数电才会出现的问题,妹想到在大三又出现了。
- 前置课程不足导致的代码能力不行:还是那个诡异的培养计划以及大类分流搞得,我个人认为贵院的学生在大一比较闲的时候,没有在C++上得到锻炼,也和这个大类分流有关,毕竟你不能让最终去电光的学生学很多C++,没意义。大二却又有那么多不难但是很烦的课,比如软件安全那种没啥用的必修课,写(卷)报告占据了宝贵的时光。这个问题短时间内无解。
- TA:虽然我个人的能力不足以评价TA,但我在TA那里得到的帮助其实并不多。感觉上如果一个问题TA并没有遇到过(也许是很弱智的问题,TA太强了没遇到过),实际上他就解答不了,而自己调试将花费海量时间。也许TA团队需要引入一些我这样的弱者,可以解答弱智问题,对同学们来说会更好。(听说本网站建站人当年还管调试呢,给他点赞)
意见或建议?
- 我认为level1+break & continue是可以凭个人能力写出来的。不需要过多参考往届代码,而进阶(主要是array+float)则具有较大难度。我所知道的,应该是只有zxy组,mjy组和ddw组在完全不参考的情况下,最终完成了进阶要求,应该还有其他组,但我圈小,不知道。
- NKU和CS强校之间还有很长的路要走。我看USTC开的这门课,前4个lab就完成了我校7个lab的要求,后面几乎所有人都完成了一大堆优化算法,更有强者找出了llvm的bug? B站有他们的答辩可以去看。貌似是每个人都能参赛的水平,平均实力远远超过我校。
- 也许应该考虑把这门课改成Nand2Tetris,用python玩玩写个连玩具都不是的编译器没什么不好的,毕竟以后也没什么人真正从事这个领域,理解理论就行了。
- 理论课有时候扣分还不少的样子,有的同学每次作业都扣0.5到1分,那最后对总成绩会有影响。可以看我上传的往届作业和往届试卷,也许会有收获。
- 限于个人能力,无法给出可以努力的方向,只能本着开源精神提供了理论课所需的一切。并提醒实验尽早开始,想多得分把所需的功能尽早加入等建议(尤其是float+array)。希望在3-5年后(如果那时候cs没有变成土木的话)贵院可以有所改进。
选课时间:2023Fall
授课教师:王刚老师
课程体会:今年是王刚和李忠伟两位老师都带编译原理课程,实验and期末考试完全一致,只有理论部分是两位老师分别授课。理论课的内容主要是讲述了前段的部分内容,例如语法分析,词法分析等,而后端的目标代码生成和代码优化等相对较少,更多的是在从理论上讲述是如何完成编译器的各个部分,各种算法(eg.Thompson构造法,Powerset构造法etc.)等。难度极大,学长们所说这是本科阶段最难的一门课程名不虚传,无论从课程本身的抽象程度上,还是大作业的代码量上都是如此。OS的Ucore实验是一个大的框架下补充可能特别少的代码,但是编译的大作业确是完整的在造一个车,就光框架中的AST完成之后就已经1k行以上了,不可谓工程量不大,基本上这学期的时间一半是编译,35%是OS,然后才是剩下的体系结构&计网的作业。
这门课程我的评价是和数据库一样,课程设计合理,学习资源丰富,而且刚子人真的超级好!期末会发很多年的往年考题,平时预习的时候老师也会发自己录制的带音频讲解的PPT,作业的题目也都是和考试及其相关的,做会作业题起码考试的大部分题目都知道怎么算了。
期末考试相关:由于今年的题目出的很难,词法分析的题目有22个状态,相当难算了,所以普遍分数都不高,卷面上90的好像极少极少,可能不到10个,问了问大家普遍的分数都在80出头,总评85+的都少,不过仍然有大佬卷面考了98分,相当之猛。如果是分数建议,强烈建议尽可能的将平时分拿满,以及OT的加分一定要尽力做,一次OT最多能总评加两分,相当于卷面分数+4分,白送两道选择题,还是很划得来的!平时分拿到52分的情况下,卷面只需要76分总评就可以上90了,很赚很赚!
不过还是跟之前的学长分享的感受差不多,刚子真的很认真负责,但是设计到这种及其抽象的问题就真的很容易犯困,如果真的想从头到尾认真听收获一些真知识,强烈建议听一下预习的PPT音频讲解,不然很容易就跟不上了(以lz的亲身经历来看是这样的,没听预习音频听第二章的时候直接干昏迷,至此之后后排的雅座多了一位伤心人hhh)。不过就算是卷面分真的很低,例如40分左右,平时分拿的也不是很好,也不用担心,刚子会捞一捞的,人真的超级好!如果是奔着考试为目的,其实也很简单,往年的题目有很多,而且基本题型固定,考前猛刷一波往年题即可。不过复习的时候有可能有些地方存在疏漏,例如语法制导翻译,三地址码,几种重要的优化方法(消除公共子表达式等),流图等是需要仔细看看的,今年就出了一波语法制导翻译(15分应该是)&翻译三地址码并优化(5分)的题目。
编译的助教们确实是很强大很负责,不过每个人的实现方法都不同,助教们也不太可能去把每个人的代码都详细的弄清楚原理是什么,然后解答对应的问题,不过单纯从讲解对应的知识点以及解答作业方面的问题的角度来看,助教不可谓不负责和优秀!也是真的很好说话!
关于课程的知识本身在学习之前,我其实是比较忽视的,因为个人方向发展的原因,可能部分同学(eg我)以后志于搞AI,LLM这些,在我学习这门课之前我是觉得没有什么用处的,可能这些知识一辈子都用不到,但是自从这学期开始弄了LLM相关的科研topic之后,忽然就觉得语法分析这个过程简直是太有用了,包括现在的AI4Math的定理证明树的构建,也特别类似于自顶向下语法分析和自底向上语法分析的过程,给了我不小的启发和思考,这也就给我提了个醒,有的时候理论方面的课程看起来没有用,但是不知道什么时候,在哪一个时刻,这些知识会以idea的形式触类旁通到其他方向!总之这门课程学懂学会,一定会有意想不到的惊喜!无论是成绩上还是能力上都是如此!
编译简直是System的精髓,内容非常有意思,~~如果玩过Noita这个游戏,会发现里面的“链”简直就是语法制导翻译~~
学习方面,强烈建议看哈工大的网课视频预习,老师给的PPT预习太阴间了,很难独自看懂
据王老师透露,期末考试的选择题整个班估计不会有超过3个人能做全对,非常考验平时上课是否听讲,所以(以下省略