官网材料下载
你可能需要两种材料,课程视频和课件作业。前者在B站可以找到,后者的大部分在课程网站。然而,斯坦福把这个课从Cousera
和自家的MOOC上撤掉了,我花了些时间才找到编程作业,在edx.org,不知道将来会不会把这个也撤了。
如果edx
上面的资料也撤了,可以从我的GitHub仓库的skeleton
分支下载,原封不动放着从edx
上下载解压的内容。这个仓库的master
分支下放的是我的实现代码,你可以去这个仓库找我的实现代码,我的每篇文章也都会完整贴上对应的实现代码。
如果你真的找不到一些素材,可以在评论区提醒我。
你可以在以上的链接里面到处看看。
Table of Content
我的博客记录我实现各个Programming Assignment
的历程,当然要引用编译原理的知识,但是不会系统讲解,也不会看Written Assignment
。如果你还没有系统学习过编译原理,可以参考课程视频进行学习,或配合着一些教科书。
每个Assignment
有对应的说明handout
和一些已经写好了的代码skeleton
,这些都可以在以上两个链接中找到。
在edx.org中,提供了两种搭建环境的方法,分别是使用虚拟机,和直接在Linux下配置。
如果你目前正在使用Windows作为主要开发环境,可以在VirtualBox
中导入提供的虚拟机。这是个古老的发行版,我没有深入研究过,应该近似Ubuntu 10.04
或11.10
。运行这个虚拟机,就可以直接获得配置好的环境。你可以通过VSCode
远程开发插件在虚拟机上写代码。
如果你目前正在使用Linux作为主要开发环境,可以不使用这个虚拟机。我的VirtualBox
貌似不能兼容最新版本的Linux内核,而我又不小心更新了。再加上VSCode
不支持32位架构远程编辑,我也就没有使用虚拟机。以下是Linux下的环境搭建。
在edx.org中,提供了一个压缩包下载链接,wget
这个链接,解压到目录/usr/class
下。这是官方配置方式。
从我目前为止的使用来看,我们可以把其它文件留在我们想要的地方,而将bin
子目录下的内容加入环境变量,就可以正常使用课程需要的一些可执行文件,没必要维持那个目录结构。
【更新 2020.9.18】
之后的PA
需要使用两个工具flex, bison
,你可能已经注意到了,它们需要我们额外安装。当然,如果你使用了官方虚拟机,就不用自己安装,也不用担心以下要说的问题。
课程使用的flex
版本较老,没有考虑到C++
和C
轻微不兼容问题。或者说,新版本flex
默认你的代码是与时俱进的。不论如何,为了使用课程提供的代码,我们不得不使用更老的flex
版本。写在这里提醒你,是因为你的Linux
包管理工具默认安装最新版本2.6+
,而你可能对一些错误迷惑不已。
官方虚拟机使用的是2.5.35
,所以我们最好也这么做。我从这里下载到的压缩包,解压之后./configure && make && sudo make install
一套连就可以了。
还不清楚bison
是否有版本要求,之后发现这方面问题再写上来。
【更新结束】
设置好环境变量后,在命令行输入coolc
,应该可以看到cool
编译器的输出,提示Main
入口类不存在。
Class Main is not defined.
Compilation halted due to static semantic errors.
我用VSCode
,所有Assignment
都在目录assignment
下,现在就可以开始了。
VSCode
你可以自己写一个Cool
程序,然后用coolc
编译,用spim
执行得到的汇编代码。如果要认真操作,你还需研究coolc
和spim
的使用。可以暂时不那么复杂,咱就想试一下配置是否正确而已。
进入assignments/PA1
目录,在这个目录下运行make test
,可以看到一行输出Nothing implemented
。这是在文件stack.cl
下写的,你可以看看Makefile
。
// stack.cl
class Main inherits IO {
main() : Object {
out_string("Nothing implemented\n")
};
};
// Makefile
test: compile
@echo stack.test
${CLASSDIR}/bin/spim -file stack.s < stack.test
能够正确输出,就是配置基本完成了。
之后可能有所调整,不过大概就是这样。
我们想要的是Programming Assignment
有关的文件,对应代码框架在assignment
目录下,assignment
目录下以J
结尾的子目录是Java版本的实现,我的文章都将使用C/C++
实现。
每次PA
的PDF说明在handouts
目录下,要完整完成各个PA
,还必须看看课程网站上的Resources
标题下的链接。具体在之后的文章中提及。
你可能发现了,课程官网上的PA1
和我们下载的assignments PA1
不相符,课程官网上的PA1
已经开始写编译器了。这是MOOC版本和正式课程的区别。正式课程如课程官网所示,有4个主要编程作业,最后一个是加分项Extra Credit
,第一个作业就开始写编译器。MOOC版本的第一个编程作业是熟悉Cool语言,之后的4个编程作业和正式课程相同。我们在这里下载到的是MOOC版本的材料,也就接着使用这个版本的,反正和正式课程没有特别大的区别。