| 选课类别:专业任务 | 教学语言:双语 |
| 课程类别:专业选修课 | 开课单位:计算机科学与工程系 |
| 课程层次:本科 | 获得学分:3.0 |
省流:计系毋庸置疑的好课!
课程大纲一目了然逻辑清晰,上一学期下来感觉结构很通透(虽然一学期肯定是不足以学透编译原理的),完整讲述了编译器的各个部分是如何将高级语言源码编译成机器码的过程,是听着很舒服的全英文,课程节奏也不算很快,课程内容的设置感觉比计组/OS会少一些,属于是刚好可以完整消化的程度,本人认为容量、难度、节奏设置最合理的计系课之一(还是加个之一比较客观),教材是龙书,具体内容可以看文末的第一节introduction课件了解。
理论和实验课的讲授都是刘老师负责,都讲得很清楚,再吹可能有人要觉得我是水军了所以点到为止。
应该是4次,不过这学期假期有点巧所以就3次,难度适中,题量不大,不过画自动机和推parsing table之类的不可避免地会花时间,没什么问题。
一个project是SPL(SUSTech-Programming-Language) Compiler,分四个阶段分布在整个学期,从前端(指lexer, semantic analyzer, intermediate code generator, optimizer)写到后端(MIPS32 code generator),前三个phase满分100,最后一个60即满分,多出来的可以补前面的,详情请读文末的lab课件和project。
Project还包含一次占比5%的research/survey,本学期主题是调查一个开源编译器,角度很多样。
无论是SPLC还是survey,做的好就有一次pre的机会,pre之后有+1总评的bonus,还是挺好的。
期末有个35%的考试,允许携带一张A4 Cheating sheet,鼓励手写,不允许多人使用同一份打印档,难度而言感觉并不超纲,考察内容和课程内容完全一致,虽然我计系的纸质考试就没有考好过,但这一门是为数不多让我真心觉得试卷无论是内容还是难度还是题量都很正常,是我自己没考好的计系课(也没有吐槽其他课不好的意思。均分63.6,最高91,感觉这一学期确实没有考试战神出现。
总之,好课,上!
IskXCr出品的能够接上LLVM后端优雅且强大的C++ SPLC
咕桃的CS323课程资料仓库(含理论实验课件、平时作业、期末cheating sheet[实测有用])
*感觉全放这里有点占空间,直接去GitHub就能翻到很多优质作品了!
温馨提示:刘老师明确表示cheating paper不可共享,并且计系有完善的学术诚信体系,以上cheating sheet/project/作业仅供参考,创作者不对错误使用上述材料造成的后果负任何责任。
计系精品好课,CS三大浪漫之一不学CS生涯不完整.jpg
刘老师鼓励式教育给分超好,而且讲得很通透,结构完整,节奏也很舒服,足够大部分同学消化。
课本是龙书,主要包括编译器的基本理论(能跑就行),英文授课(无论有没有国际生)
编译优化的内容很少,可能是刘老师有意控制难度 但其实也挺好的可以摆一点
作业这学期是四次,只涉及lexical 和 syntax 的内容,基本上都是龙书的题,写起来可能比较麻烦但不难。
lab都是中文,教用flex写lexer,bison写parser,也会给一些starters code(类似project的demo)。practice大概有8-9次,都是用flex/bison写一个简单的练习题。
中期左右(11月)有一个pre,展示在compiler/programming language做的调研探究,全自由发挥,然后交一个小报告。
Project 当然是做一个compiler,但今年刘老师大改project
本人被队友带飞的Rust写的全程开源的魔改版SPL Compiler
可爱Ice和他的大爹们写的酷炫函数式语言(什么你不知道函数式?)
你的Project
据说24级开始这门课必修了,鄙人认为是个好事,这种课就该上。
确实是计系精品好课,感觉是进系以来唯一一门让我觉得学起来很有层次、真正做到了循序渐进的课程。
就不说了,我理论课几乎没听过(逃
一学期只有四次,都是集中在期中前,可能也是因为后面的内容基本没什么好写的实际上也确实。题量不大,基本也就两到三道大题这样,但是写起来真的很麻烦。词法分析的NFA, DFA,语法分析的Parsing Table……从逻辑上来看流程不算复杂,但是难在重复的次数特别多,甚至可以说有些枯燥了,有时候一个分心就会漏掉哪个地方。
虽说目标不变,都是实现一个类C语言的编译器(SPLC, Simple Programming Language Compiler),但本学期的工具相比先前学期使用的Bison (Lexer) + Flex (Parser) 换成了ANTLR (Lexer + Parser)。学期内共有5(+1)个Project,其实可以视为一个大Project的5(+1)个Phase,也就是这一点让我觉得很循序渐进。从学期初最基础的词法,接着构建基本的语法,然后慢慢实现各种的语法检查和类型检查,与此同时慢慢完善(重构语法、补充缺失点或者添加语义动作),最后结合LLVM IR生成中间代码(并实现CPU层面的优化<-此为Bonus,用来补之前Phase中丢的分)。
提交方式也很有意思,第一次用makefile提交作业真有新鲜感吧虽然我用了一个月的wsl和cmake for windows之后实在难绷一怒之下买了MacBook。虽说中间几个Project的工作量真的不小(也有可能是我全程单通的原因),但是慢慢自己构建起来、一步步debug到通过官方和自制样例的过程真的很爽比DSAA还爽,看到一个编译器就在自己的手中构建出来,在自己的眼前跑通了的时候,真的真的很有成就感。
至于vibe coding……我只能说ai是个很玄学的东西,在implement阶段他就是我的绊脚石,提示词写半天不如亲自上阵看文档用法手写代码;在debug阶段他就是我活爹,一千多行代码与其自己看得头晕眼花不如让ai来受这个罪,而且生成样例这块他的想象力比我丰富多了是真的
槽点也不少。虽说makefile提交很有意思,但是效率实在太低,前期需要提交之后手动传一些identification code到bb,然后等预评测才能得知初步的分数,这就带来了两个问题:第一是如果你做的慢错过了预评测那就只能祈祷自己debug全面点了,第二是预评测就意味着能够得知用作debug参考的分数的次数是极为有限的。其次,可能是换用新工具的原因,导致Project的要求文档会产生修改,一两次还好说,但是五六次的revision还是有点难顶(我到现在都记得Project4发布之前亲爱的助教还说了一句“这次不会有很多修改了,起码不会改到v5了”然而这一次真的改到v5了),当然如果离ddl比较近还是会延期的。
还挺好的,可以自选主题,我们选的是LSP(Language Server Protocol) 方面的研究。建议是使用IEEE的模板,对于还没或者很少写作的同学来说是个很好的练习机会。当然具体的体验或者建议就没法给了毕竟这部分不是我负责的。
期末考试的题型还行,单选多选简答大题。简答难度自不必说,大题也比较简单,基本上就都是前半学期的内容甚至还会有作业原题lite版,私以为只要前面的作业都是自己写的话这里基本秒杀的。然后就是把我秒杀的选择题,即使我带上了我将近7k字/面的cheating paper如果你运气好翻到我的仓库的话就送你了别说是我写的,面对涉及到没布置作业的内容的选择题还是缴械投降,尤其是不定项真就是感觉哪都对但是哪都不对完全没招,强烈建议大家后面的课认真听课件好好看qaq细节真的是太多太多了。而且改卷速度也是一等一的快,不到半天的工作时间就改完出成绩了,也挺好的毕竟早死晚死不如现在就死
虽说期末考试创飞了我并且直接导致我卡绩而且老师还很公正你知道我想说什么,但是和同学回忆这个学期课程的时候,第一个想到的还是编译原理。瑕不掩瑜,无论是学期初老师尽力让我们都加上课,还是学期中令人充实的Project,都会让我很有自豪感。真心希望大家有兴趣的都来学学,我相信你会受益匪浅。
如果你对Compilers感兴趣,龙书值得从头到尾看一看。如果未来想走Compiler方向,几个搞MLIR和LLVM的朋友都建议直接上手现有框架。
一门很不错的课程,主要内容是讲编译器整个的workload,从lexer parser到三地址码、SSA,最后到代码生成与机器无关优化。手写作业会集中在前半学期,本学期proj是分5个阶段用 java 写一个Splc的简易编译器,总体难度我认为设置的合理。课程用的龙书讲的会比较理论,如果单纯通过考试,我觉得好好听课+B站找几个课刷刷基本就记住了。其他的我觉得其他评论介绍的很完善了。
我想补充的是我们在10分的research paper上的经验教训:在定题目时一定要认真确定探索范围的大小。
我们组探索的题目是“gcc是如何实现OpenMP”。这个问题原本是我在上一段研究里的一个副产品,当时我们发现GNU对OpenMP部分语句的实现会拖慢我们的一部分程序,但是具体拖慢情况如何我们没有系统理解与测试过,于是我就跟组员提出说一起合作探索下。
我们查阅了GNU在OpenMP相关的前后端以及运行库的源代码并给出了详细介绍。同时额外拓展了多面体优化等跟OpenMP相关的优化技术。另外我们加了点私货,我们访谈了一位工业界AI Compiler方面的工程师,他们也频繁使用OpenMP,我们聊了很多内容,比如OpenMP 使用、AI编译器的进展、CPU底层加速、系统方向程序员就业与中年危机等等。我们的访谈链接:Summary-on-meeting-with-former-Intel-Shanghai-Engineer
我们学习的有点太广了,探索的范围及工程量超出预期,没有及时完成全部介绍和相关实验。主要问题我后来在bb提交时总结有三:
1)谈论OpenMP实现原理文章过少,相关技术文章零散;
2)GNU GCC源码体量和耦合度远超预期,我们大量时间花在定位和理解实现细节上;
3)OpenMP 语义覆盖面很广,不同原语(parallel for、task 等)实现路径差异很大,很难在有限时间及有限篇幅内全面覆盖;
我个人建议主题还是小而精,一方面我们没有那么多精力,另一方面遇到的文章会很多。
当然最后老师给分挺好的。目前这个工作躺在我的todo list里,等哪一天做好了再发来分享分享。
在我们实现我们的编译器中,一个好的debug经验是用LLM Fuzzing。比如其中一个proj要求我们做Semantic Analysis,给了好几个错误类型。我们的操作是让LLM生成对应的测试案例,并将指针、多维矩阵、结构体等数据类型一个个填进去,然后查看报错类型是否正确。这样的好处是:1. 测试省力,不用一个案例一个案例的测; 2. 测试量大,比如下图我们生成了500个案例,有更大可能挖出一些潜在bug;3. 不用绞尽脑汁构想自己错哪了,只需测完后查看正确数目。
这套方法基本上能覆盖90%的普通案例,边角案例可能要在LLM生成逻辑上多想想,但是能保证拿一个不错的分数。在没有OJ的情况下,也能有OJ的效果。(仔细想想,gcc,LLVM,clang也没有OJ,他们是怎么做的呢)

关于期末。我记录在博客里了 learn-compilers-in-6-hours
计算机经典课程,很有挑战也能得到很多收获。
作业包括理论作业、lab小练习和project。在project中最终可以利用 flex、yacc 等工具实现一个完整的能用的编译器(虽然最终是在 mips 模拟器上跑的)
刘老师的英语口语十分标准,听课不会有口音上的障碍。少部分复杂的概念如果我们听不懂也会用中文解释。
去年的课程材料仓库:https://github.com/sqlab-sustech/CS323-2022F
没有说的那么好吧,刘老师讲课倒是非常非常舒服。但是实验课内容真是不敢恭维,觉得实在一般,而且本学期project的问题太多了,不停的要修正实在是造成很大的困扰,不过总体上还是一门很不错的课程。
编译原理,正如前人所言,真的是一门让人收获颇多的课程,但是这学期实际体验下来,各种难绷的事还是挺多的,我也不知道我接下来的絮叨有多少是对选课有用的,反正我啥都讲一遍。(不过听说这门课之后要变必修了,那就逃不掉了,嘿嘿)
-首先是听课体验,刘烨庞老师人非常好,讲课也讲得很细,但是讲课的水平并不突出。全程跟着听的话总体有些枯燥乏味,建议是提前看看课件,然后有什么对着课件看不太懂的地方等上课听他细讲。
+然后是书面作业。我们这一学期书面作业一共有4次,全部集中在期中前,就让期中前的压力反而比期中后还大。我个人觉得这应该算是一件好事,因为期中后没有作业,说明期中后那些看起来出大题会比较变态的知识点,就不怎么会出大题。
+我们课上一共有3次quiz,从最后的总评来看,这个quiz是并没有计入总评的,应该就是起到一个签到和期末考选择题示范的作用。(但是后一条没做好,因为期末考的选择题的难度比quiz变态许多…)
-实验课部分,这可就得大书特书了嗷。实验作业有6次project(最后一次project是选做的,补分用),确切地说,是一个project被分成了6个部分,然后每隔两个星期左右就会结算一次,所以时间安排比较紧凑。听老师们说,我们本学期的实验课做出了一些改革,使用了一些新的工具来进行教学,所以可能是这个原因,导致本学期的project作业方面出现了许多不成熟的地方,比如:
自学量炸裂的环境配置:本学期的project提交方式是我见过有史以来最诡异的。助教们搭建了一个服务器,能且只能接受用make file语句产生的tar包,然后,为了运行我们提交作业的make handin指令,你首先需要有一个linux系统,实验课手把手带着做的解决方案是让你下了一个linux虚拟机。然后问题来了,虚拟机要怎么获得你的机器里的代码文件呢?实验课上教的官方方法我到现在都没搞懂(或者其实我一直用的方法就是,但我不知道),我自己是把本地代码push到了远程github仓库后,再打开虚拟机在虚拟机的命令行里面git clone把我的代码搞下来,在cd到工程文件的根目录make handin。我的方法和实验课的方法所需的环境是一样的:你需要创建一个自己的,最好是本课程项目专用的github仓库;把这个仓库跟本地的代码编辑软件连接起来(IDEA或VScode都行,但是VScode没有官方教程);在你的linux系统里面分配一个连接github的SSH key(不然你用https方法clone八成git clone不了)…反正,前两节实验课下来,我被迫学会了各种linux系统的命令行常用指令和github的基础用法,有收获是真有收获,开学那几节课也是真的头大。
没有OJ:正如上文所述,我们的project提交是用助教们搭建的一个还比较粗糙的系统来进行的,OJ直到距离我们最后一次作业的ddl还有不到10天的时间才搓出来。因为没有OJ,就导致我们提交作业的流程基本就是,肘击代码→过了老师给的极其简单的样例→过了自己出的自认为很变态的样例→提交→莫名其妙被扣了分→骂街→重新肘击。这个过程真的很折磨,没有实时的评分反馈的话,你很可能已经写了一个足够拿满分的程序但又多花了好几天的时间测试,也可能测了好几天自认为万无一失结果一下被肘飞。直到最后一次project末期,OJ已经出来,我对着OJ反复提交凹分的时候,我终于深刻地意识到了之前过的都是什么苦日子。不过以后学期选这门课的同学们应该都能享受OJ了,我这一段话大家就看个乐呵就行了(
作业题干bug频出:我们的project作业包不是祖传的,因为随着大家做作业的过程,总有各种各样的bug出现,然后助教就得去修改作业文档,你这边运气不好的话也得部分推倒重来,而ddl还是那个时间,可能会导致本就紧凑的project时间安排雪上加霜…
+不过,虽然project作业存在上述问题,但是实验课相关内容的课程体验并不会让你感到不适(对照组:大小王组合的数据库原理),因为助教们人特别好。助教回复同学们的问题都特别及时(如果你问了问题半天没回复,建议直接在群里问,回复包快的)。前面没有OJ的问题,助教们也在努力改善同学们的debug体验,他们会在作业ddl提前1~1.5周的时间,开启3轮左右预评分,以此cos OJ的效果。而且,如果作业文档修改的时间确实离ddl有点近了的话,project的ddl也会延期。助教们还为project设置了诸多条件,大幅简化了同学们的工作量。此处引用一句助教原话:“不会出很变态的样例的。放心,肯定想你们大多数人都能过的,你们不过我们更担心。”
-project作业难度不算很大,但是水很深。我们的project是逐步完成一个类C语言的编译器的编写,中间有词法分析,语法分析,语义分析等等部分。就以语法分析为例,我到现在都坚信要搓出来一个真正“完备”的语法分析器是不可能的,即使是在作业文档已经把语法分析进行了大幅简化的情况下。我们课上主要教了一种用语义动作来处理语法错误的方法,但是这玩意每多写一条都会冲击一次原本的语法结构,甚至可能会让本来的语法错误处理机制不再能够运行…可能是我能力有限,我是真没想出来该怎么完美处理所有可能的语法错误,最后我弄得心力交瘁,直接选择有几个错误就不处理了,整个人就是个半放弃的态度,然后就交了,结果第一轮预评分就得了满分。所以,不要陷得太深,能搞懂原理,能过,就可以了。实在不行还是被扣了几分,还有最后一次project可以补分呢,这一次project的ddl甚至在期末考试之后,时间很充足。
-本课程的一大特色作业就是research paper,这个东西选题是自己选的,要研究多深也没有具体要求,但反正没有花我们特别多时间。最后的几节实验课会有research paper的优秀小组的展示环节,如果自己组没有被选上这个环节的话,那么你的research paper得分大概会在85上下,估总评的时候记得多扣自己1.5分(
-最后的期末考试环节属实是给我们震撼到了。我之前从来没想到过这门课的考试,无论是难度还是分数占比,竟然都完全地倒向了选择题。期末考题型是10单选+5多选+10判断+简答题(好像是5道)+3大题。其中单选和多选一样都是一题3分(跟后面简答题一题的分值一样,卧槽),而且考得巨细无比,即使期末考有一张双面A4的cheating paper也还是把我干碎了(我记得有一题多选,他好像考你在进行自顶向下语法分析前都要干些什么,课件上有,我有点印象,但我真的记不全啊QAQ),考完出来感觉选择题有把握的只有60%左右,而且最搞的是,多选他还不告诉你漏选的话给你几分(可能是动态难度设计,如果大家考得不错就一分不给,考得差了就漏选也给点分,我不知道,阿巴阿巴阿巴)。最后的大题反而是纯粹的纸老虎,首先都只涉及了期中前的内容,大题的题型都是期中前的书面作业布置过的,大题的难度和复杂度也都跟作业中同类型的替身比起来低了一个档次。
+考试前老师会给出一个复习重点大纲,不过仅作参考。大纲上有的考试不一定考,考试把你干碎的东西大纲上也不一定有。
+最后,本课程的期末考试批改速度真是无敌神速力啊,前一天下午16:30-18:30刚刚考完,第二天直接就出成绩了。
非常认可其他几位的评论!也就不再赘述刘烨庞老师和这门课程的优点啦!
今年我们课程其实调整了不少内容,以往Project是贯穿学期的,一共四个Phase,但是今年其实是从中后期才开始的Project,Basic只有三个Phase,最后一个Phase是选作。前面的时间会要求准备一个Presentation,是要对跟编译器相关的内容做一个调研,每个组15min的样子,最后会根据Pre的表现和提交报告的内容评分。后面如果Project做得好,也会有一个Presentation让你在实验课分享你们的项目内容(大佬好多QAQ),这个Presentation说是可以添加Bonus,但是仅限Project内部,没有办法溢出到其他部分。
今年也跟刘烨庞老师聊了聊,感觉之后刘老师仍然会继续对这门课进行一个改造,所以明年课程内容和考核内容跟今年也会不一样,可能会增加实验课里面的内容,教同学们除了使用Flex/Yacc/Bison这些C之外的工具比如Antlr/Rust等等,让我们敬请期待一下。希望之后的同学也能享受这门课程,多跟刘老师和队友沟通,真的能学到很多东西 : )
学计算机不学编译原理,就像写代码只会调API,说明这个人计算机基础和技术深度不足,他理解不了程序背后的机制和计算机科学的精妙逻辑,只能看到代码的表面堆砌,参不透系统设计的核心本质。他整个人的技术层次就卡在这里了,只能度过一个相对失败的人生。
计算机系精品好课,前面的评论已经说的很多了,这边就不多说了。
计系精品课程,课程设置合理,工作量适中,期末不难,正常跟课学习都能有还不错的收获(and得分)
内容上重点讲了前端词法/语法分析的内容,后端讲得比较快,此外也包含一些入门级的程序分析的相关内容
首先是Lecture,虽然刘老师95%以上的时间都是用英文授课,但他的讲解流利清晰,抑扬顿挫,听起来让我感觉非常舒服。遇到比较难的知识点,他也会用中文再解释一遍。(计系能做到“好好讲课”的老师真的不多了......🙏点赞!)
课堂上共有三次Quiz,每一次涉及两章的内容,都是用腾讯问卷做选择题,只要交了,无论正确率高低,都有出勤分。
Lab部分可以看作是“用代码实现Lecture所讲的内容”,同时也包含对Project各种重难点的指导和提示。
出勤分(10分)包括Quiz和Lab,从第4周起的每一次Lab都要考勤,但也只是扫二维码填一个腾讯问卷的形式。问卷只有两道题:(1)学号;(2)是否出席?(是/否)😄😄😄所以说,理论上就算你一次课也不去,找个同学把二维码拍照发给你,你也能轻松得到这10分(bushi)。
Homework(20分)共有4次,只涉及前两章:词法分析、语法分析的内容。我认为整门课最最最难的部分就是Bottom-up parsing了......什么FIRST/FOLLOW集、CLOSURE集、LR(0)项集规范族、移入/归约......这如此繁琐(无贬义)的流程成为期末考试的压轴大题也是实至名归。但作业想拿高分并不困难——我的经验是:题目给出的样例字符串一般都是符合词法/语法规则的,只要你能按照你设计的DFA/Parsing table把它顺利解析出来,那基本就意味着你这题做对了☝️🤓感觉也是很有成就感的一件事()
Projects(30分)贯穿了整个学期,要求3人一组,使用ANTLR设计一个类C语言编译器。项目分为6个部分,每部分彼此衔接,独立计分:1. 词法分析;2. 语法分析;3. 类型系统&符号表;4. 类型检查;5. 中间代码生成;6. 代码优化(选做)。Project 1~5每部分满分100分,Project 6满分50分,累计得分不超过500分。个人感觉这门课很鲜明的一个特点就是理论与实践高度结合,要想顺利完成Projects,光去把项目文档喂给AI,让AI帮你干活是不够的,它还需要我们对相应的理论知识有比较深刻的了解。
每个Project都有一个项目文档,用于介绍项目内容及要求。我认为Project 3和4是最为困难的部分,可以看到在完成这两块的过程中,项目文档是更新了一版又一版,最多甚至能更新到第五版,可见项目本身的复杂以及教学团队的严谨。
需要强调的是,既然要设计的是一个“类C语言”编辑器,因此建议修读这门课前对C/C++语言的基础语法(特别是指针)有一个初步的了解,不然在做类型系统的时候就会“指针的数组”“数组的指针”傻傻分不清(别问我为什么记得这么清楚😎🕶️😭)
Additionally,这门课在第一周的时候还“布置”了一个“Project 0”,它没有DDL,也不计分,但事实上我们“都得做”,因为这个项目介绍了如何配置Linux系统(WSL、VMWare等等),以及如何在Linux系统上使用Git工具进行版本管理。上面所说的Project 1~6,都是基于Linux和Git这两大“神器”开展的。
Research Report(10分)也是需要小组合作完成的任务,要求从五个与编译理论或应用相关的课题中任选一个,围绕此撰写一篇调研报告。最后两次Lab课上,共有四组同学作为优秀代表上台展示了他们的调研内容。我的感想只有一句话:“我看不懂,但我大受震撼。😵💫”
本学期的期末考试(30分)在第17周的周一下午,果真是最难的一门最先考......最后一次Lecture快结束的时候,刘老师会给我们梳理考试重点。特别要注意的是,鉴于选择题(单选&多选)所占的卷面分值高达45分,建议复习时不要忽略那些看起来“像文科知识一样”“无关紧要”的细节。哪怕是第一次课(Introduction)里面的内容都有可能会考到;更不必说,从第三章开始就没有相应的作业题了,谁知道什么东西会考到呢。题型还包括判断题、简答题,还有最后的大题。大题共有三道,考查的知识点基本在Homework中都有涉及,包含正则表达式/NFA/DFA、CFG设计、SLR解析等。允许带一张自己手写的A4大小Cheating paper。考试平均分70,中位数71。
唯一的小吐槽点是关于Project 6这个“加分项”的。Project 1~5都是基于通过的样例个数按比例给分,这没啥可说的;但Project 6需要我们向TA预约时间到他那里展示,看起来也没啥可说的。考虑到最后这个项目的DDL是18周周五(非常宽松了),我们小组在考完所有科目后做了这个Project。Project 6有一条要求:实现代码优化后的“编译器”依然能够通过Project 5的样例(共18个)。比较遗憾的是,最终有三个样例我们未能通过。也许是TA发现了不对劲,也许是我们的实现逻辑跟TA预想中的很不一样,TA向我们问了一句:“你们有多少代码是Vibe coding的?”我们只能应付一句“大部分是”。他又问了我们几个莫名其妙的涉及专业术语(跟他“预想中的实现逻辑”相关)的问题,我们没答上来。最后,TA只给了我们一个比较低的分数。(本来能指望着靠这个冲个总评90的......😭)
我比较不理解的一点是,都2026年了,这么复杂的几千行代码的项目,难道还有人能不用AI,把它100%纯手搓出来?!就算几年前没有AI,但几年前的Project和这学期的Project可不一样!不知道他为什么会这么“抵触”Vibe coding......也许人家是刻意压分了,但我转念一想,好像又并不能把问题全盘归咎于谁。这个需要“展示”的项目,也许检验的正是我们能不能掌握代码优化的基本原理,并且把我们的实现过程讲清楚。不论如何,希望后来者在遇到Project 6这样的项目时能够注意这一点,不要被“加分”冲昏了头脑,“为了加分而加分”,把东西学明白或许比拿分更重要。
第一次课PPT上的一句话令我印象深刻:"The course is a marathon."《编译原理》这场“马拉松”终于“跑”完了,我也终于长长舒了一口气。感谢教学团队的辛勤付出,也感谢自己的坚定选择——即使刚开学时课程尚未扩容、需要我申请加课,即使这门课的任务如此庞杂,即使偶尔会有一些意想不到的小插曲。
在暑假时,我正在看选修课选什么。受到学长推荐和好哥们邀请,便尝试选了这门课。总的来说收获丰富,我对整个编译器的原理得到了较深的理解。
老师讲课非常不错,讲得十分详细。并且老师的英语很不错,不会有理解上的问题!但比较可惜的是,我因为这学期的事情实在太多,除了第一节课外,基本上没有听过课。但PPT质量也不错,在GPT老师的帮助下,我也大概搞懂了课件内容,非常适合自学。
但这门课的任务较多,平均三周就会发布一个新的proj。整个project被拆成了5个小proj(还有一个Bonus Proj用来补分),每个mini project会让你完成编译器的一小部份。本学习老师对课程进行了一定改革,目前使用相对现代的ANTLR工具来完成project。但是,这门课前期没有OJ,而是会在DDL之前进行预评测,所以你实际的Work时间大概两周多一点,然后剩下的时间你要根据预评测的结果debug。由于工具链的修改,本学期对应的项目文档基本上处于一个现写现用的状态,导致文档存在一些潜在的问题与歧义,然后还会在做proj的过程中不断更新,导致我们要时刻检查当前实现是否符合最新文档。
除了文档以外,还有一个research paper需要调研一个与编译器有关的课题,今年似乎比例上调了,占总评的10%。如果想要做好这个paper(拿到90+),也需要投入很多精力。
在前半学期,在project迭代的同时,还会发布理论作业,但理论作业最后只覆盖到LR parsing的部份,后面讲的内容就没有任何练习了,但是这部分在考试中占比还挺大的,就会有一种“我知道要考这个,但不知道要这么考”的感觉。
最后说到考试,考试主要是由选择题(含不定项)和大题组成,大题就比较简单,也没考什么比较恶心的构造正则表达式(理论作业1),都是一眼就能看出做法的题目。真正难的是选择题,我做到不定项就感觉不对劲,所有的选项都感觉看起来有点道理,但是我不敢选。并且不定项主要考的就是后面没有做过练习的地方,所以大家一定要仔细看后面,不要因为没练过就简单看看。
总体来说,是一门比较硬的好课,推荐给那些比较热爱计算机底层,或搞软工方向的同学。这门课学起来很有激情的,有一种勇攀高峰的刺激感!
一学期下来收获是真的挺多的。可能本人比较笨,上课很多时候容易听天书,但是刘老师讲课确实很细致,课件后续自学也很方便。本学期用的是antlr,也是第一年project。助教真的很用心,文档改了一版有一版,做项目过程中,终于在和AI的大战中搬回一城(AI终于需要靠我来帮他解决问题)。考试考的还是比较细,好在最后占比30%,给分最后也不错。个人觉得lab课缺少了一些practice,容易开小差,而且(本人其实是想学一点bison和flex)。总体来说,收获还是不小的。但是课业压力确实不小,assignment和project接着接着的来,根本不给人喘息。
计系为数几门让我觉得非常感兴趣的课,也有可能是因为编译原理这个题目本身很不错。刘老师讲的也很好,尽管我主要看课件自学(课件也非常非常不错)。
课程难度非常简单(不代表编译原理这个学科很简单),主要聚焦在语法分析和Parser构建上,后面的部分比较少,不够尽兴。
期末考试难度一般,占比高,本人侥幸A+。先前写了份总结PDF,已发小群。
虽然感觉刘老师讲得很好,但是感觉还是很难。尤其是project对于没学过C的真的很折磨,好在最后4个phase还是赶完了。
另外刘老师对分数挺严格的,总评差0.03上B+但是还是不允许round上去…
刘老师讲课很细致,理论作业有四次,不过只覆盖编译器前端的lexer和parser部分。
project就是搓编译器了,可以写课程提供的SPL语言的编译器,也可以自己拓展兼容SPL的语言,或者自造语言。phase1是基本的lexer和parser分析部分,只做milestone检查,不评分。phase2是semantic analysis,和phase1一起检查评分,lab课当场给测试样例跑。phase3就是生成中间代码了,这学期是指定生成TAC的中间代码,答辩的时候需要在TAC的IR模拟器上跑测试样例。phase4选做,生成最终的汇编,MIPS32或者RISC-V等。
刘老师会控制课程难度,主要难点还是编译器前端,对后端部分的要求和考察不会很难。
期末占比30%,最高分90。最后一题SLR parsing还是有点太折磨了(画LR(0)状态画了整张纸),不过好在只有10分,而且最后的parsing过程只有2分(累死累活为了2分,对),可以看出是刻意控制分值了,而且只要写的差不多应该也是酌情给分的。如果前面作业和project都做的还不错的话,期末考低点总评也影响不大(我期末85,总评94)。
24级是必修了,不知道课程结构在必修之后会不会变呢哈哈哈。