跳转到内容

Compiler 2014: Mail List Summary Phase 1

来自ACM Class Wiki

资料推荐

gcc输出中间结果(AST,IR等等):

http://gcc.gnu.org/onlinedocs/gccint/RTL.html

http://www.cse.iitb.ac.in/~uday/courses/cs324-05/gccProjects/node4.html

LLVM:http://llvm.org/

Lambda expressions in Java 8:http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

Books:http://gcc.gnu.org/wiki/ListOfCompilerBooks

对于flex和cup的版本有要求吗?是否需要整个compiler用make执行?

版本没要求, 是不是用make run这种我们最后商量一下,我觉得这样确实比较灵活,特别对评测非Java的同学来说对makefile不熟的同学不用急,先用Eclipse跑吧。

详情请见Code Review后通知。

makefile需要用到.jar包该怎么办?

就用appetizer里面lib文件夹里面那些jar。

比如

all: endterm

endterm: ast/*.java semantic/*.java symbol_table/*.java syn/*.java type/*.java util/*.java main/*.java

javac -cp lib/gson-2.2.2.jar:lib/java-cup-11a.jar:java-cup-11a-runtime.jar:lib/JFlex.jar ast/*.java semantic/*.java symbol_table/*.java syn/*.java type/*.java util/*.java main/*.java

分隔符是冒号。(-cp的分隔符和系统有关,linux是冒号,而windows是分号)

课程主页挂了怎么办?

可以用从浏览器里提取缓存,并用以下网址恢复

http://www.sensefulsolutions.com/2012/01/viewing-chrome-cache-easy-way.html

关于需支持的关键字

Keywords defined in ANSI C but not defined here SHOULD be ignored, e.g. static, const, bool, etc. ignore意思是直接忽略,还是当作id? 如果遇到static,virtual之类的请将他们视为普通变量(另外,测试数据不会涉及到这些)。

我们要处理的字符包括一些什么,比如'\013'这种要处理吗?

需要,比如\0、\x、0x什么的。这一般你得“面向数据”编程,我们会尽早把数据公布的(当然过些时候我们会添加一些数据)。

函数声明的时候是不是可以不指定变量名?比如int func(int*);

我们语法里没有前置申明,所有函数都是直接定义,你们不用处理有关前置函数申明的事情。会有函数先声明后定义的testcase,不过放到bonus里了,不算在基本数据里。

语法中的a->bc*之类的是否要写两个类,c和c_list?

  • 是需要两个类,只不过其中一个类只是起到了包装list的作用。那么如果你有个List类的话,那么parse的时候你会不断地加进入,所以从AST角度来说就是一个爸爸下面挂着一个list的很多儿子了(说白了就是你cup里面不是每次都new一个list出来,而是add进去。
  • 我觉得这种问题自己把虎书仔细看看就懂了,各 parser generator 的文档里的例子也说的很详细了。编译器这个东西其实是条条大路通罗马,一个模拟题而已,怎么模拟都可以,只要结果对。半年前我完成的一个项目,lexer 都没有,一个手写的 parser 照样可以正常跑,写起来还容易所以类似 how to implement XXX 这样的问题,都可以靠自己的思考和尝试来解决,不需要助教花时间在这个方面。按照自己的想法写程序是一个很有趣的过程,如果按照别人的想法重新写了一遍,乐趣就少很多了。

怎么handle sizeof('type-name')

可以认为sizeof()只允许普通变量和类型名作为参数,如sizeof(int *)、sizeof(a)、sizeof(struct B)等等,另外不会出诸如sizeof(main)之类的数据。

cup版本导致的问题

报错信息java.lang.ClassCastException: java_cup.runtime.Symbol cannot be cast to java_cup.runtime.ComplexSymbolFactory$ComplexSymbol。

是因为cup11b默认用了complexsymbol的location作为left和right的类型,而且下载的版本无法禁用,要么可以换11a,要么下源码,把mail里的locations变量默认值改成false,重新编译cup。

ast的结构问题

详细问题:

对于像

declarators: declarator (',' declarator)*

文法生成的一系列declarator的list,这些declarator在AST中应该放在同层,还是依据递归建树的过程操作,一个delcarator做儿子一个做儿子的儿子?

简单来说比如int a,b,c;语句,树的结构应该是

[type:int]

|_____[decl: a]

|_____[decl: b]

|_____[decl: c]

还是

[type:int]

|_____[decl_list]

   |_____[decl_list]

                      |_____[decl: c]

           |_____[decl: b]

|_____[decl: a]

在算法上这两种建树都能互相转化和处理,在习惯上讲究吗?输出时应该采取哪种?

A:

理论上来说,AST是没有标准的,不同的人的AST都可能不同,直接在parse tree上做也不是不可以。compiler就是一个大的模拟题,只要能写对就行。感觉你们班问了太多什么东西的标准应该是什么什么样的问题。我觉得这些方面自己思考然后写一个自己舒服的格式就可以了。关于AST的格式问题,没有太多要求,只需要把该打印出来的东西打印出来就可以了,当然最好能缩进一下不要全打到一行去,这样看起来也方便;

Code Review后通知

上周写语法辛苦了,这周在重构代码之余,我们希望windows使用者能熟悉一下linux环境,因为版本控制和大家所使用语言的不同,我们最后必须得把大家的源码clone下来使用make编译。而你在windows下写的makefile在linux下基本就不能用了,我这几天尝试用cygwin,也会出一些奇怪的问题,所以,最后还是建议windows用户设一个虚拟机来测试你的程序,以此来与测试环境一致(你写还是在win下写没问题)。

我们初定了一个测试环境的说明http://acm.sjtu.edu.cn/wiki/Compiler_2014:_Testing_environment_specification#Testing_Process

同时也对appetizer作了一些改动,使之成为一个能符合提交要求的版本,请大家

git clone https://acmcompiler@bitbucket.org/acmcompiler/compiler-appetizer.git

如果装了jdk1.7.0的话应该是直接能跑run.sh的。

如果你是对linux shell或者Makefile不太熟悉的同学,可以参照appetizer里Makefile和脚本,应该已经足够了,你们班linux使用者这么多,找人问吧。

请注意

1:因为最后我们是用标准输出的,所以你最好现在就开始给你的程序设立一些开关来管理你的debug或者log信息

2:我们只会调用make all和make clean,所以Makefile别的目标大家可以自己按喜好设立

3.上次code review下来可能一个普遍的问题就是大家写了太多类,这周重构的时候请尽量将类似的类合并,比如BinaryExpr(但注意你不用改文法),然后可以设立一些基类, 比如Expr,这会给你下个phase存储Type,左值等带来方便。

关于是否支持奇葩代码

  • 不需要支持所有GCC能编译的奇葩代码,先要符合C语言的标准,写大作业不要过分地钻牛角尖。
  • gcc也有很多地方是偷懒的,是没有处理的,从而会导致一些我自己都认为完全无法理解,匪夷所思的情况。但是毕竟是经历了时间考验的东西,该做的它都做了,所以作为参考是足够的了。虽编译器这门课是要写编译器,但是我认为与其说最重要的是要写编译器,不如说正确理解和认识计算机程序设计语言的本质以及编译器的工作模式,这不仅能够帮助大家更深刻的理解计算机这种东西,也能提高自己的代码能力,知道什么样的代码才是安全高效的。编译器这个Project,不要嫌多嫌烦,写的越多,读得越多,你收获的就越多。做事情的时候抱着学习的心态,问问题的时候抱着讨论的心态,测试的时候抱着严谨的心态。compiler这个项目,助教们不会提出无理的要求,即使是有很困难的部分,也不会在这上面卡你们,你们需要的只是放手去做,仅此而已。
  • 以后想讨论C标准只是完全作为一个兴趣,因为数据会全部公开的。就像他们所说的,你们完全可以去实现一些不太常见的东西,然后在你们的code review和报告中向助教指出你们的这部分工作,这是会作为report这个bonus的一个加分点的。

关于maillist的要求和Helper的加分通知

整理不求多,也不要光是复制粘帖,也不用只贴跟编译相关的,比如我记得之前wiki挂了一次刘爽提了个黑科技什么的,有用的就总结起来。另外,通知一下,为了鼓励大家多在群里发言,我把Helper这个bonus提到3分(注意人数不限),你们班技术力很强,我知道大家可能一些问题私下就解决了的,但还是希望能贴到群里与所有人分享,大到一个简单有效的优化算法,中到一个有用的库,小到eclipse,vim,spim等的一个插件,功能,参数,只要你觉得能帮到大家,都希望能贴到群里来分享,另外,只要你提的问题有用,也会被算在里面。