在非Stanford专用版的Eclipse中运行Karel程序

Stanford的CS106A真的是很经典的一门课,Mehran的幽默教学风格,比我学Java的时候要有趣得多。
如果新手学习这门课,可能会遇到Eclipse的运行问题,所以写一篇文章科普一下。

问题可以这样描述:“怎样在非Stanford专用版的通常Eclipse中运行Karel程序?”

CS106A是从Karel开始的,但是Karel程序全部是继承自Karel类或SuperKarel类,并没有main(),只有run()。
如果你在一般版的Eclipse里,这是运行不起来的——点开一片白、或者点都没法点。
很自然的,有些“聪明人”就开始考察为什么Stanford版的Eclipse可以运行,而通常版的不可以。
很快,这些“聪明人”就找到了区别,Stanford版的Eclipse多了一个专用插件:edu.stanford.cs106_1.0.0.jar

的确是这个插件,有了这个插件,你就可以找回Stanford版Eclipse里的那些个按钮,
用那些个专用按钮把程序运行起来——

但是——随着工程逐渐地增多,类逐渐地增多,你不觉得每次全工作空间查找运行类非常慢么?
为什么我每次都要找一遍我正在编辑的类文件呢?
然后,又有了“考察者”开始自己研究类的运行方式,给出了一个自定义运行配置的解决方案:

假设一个Karel类的子类,叫CheckerboardKarel好了,工程是cs106a-Assignment1。
那么只要建一个”run configuration”,即“运行配置”
依次填上这三项:

#Project:
cs106a-Assignment1
#Main Class:
CheckerboardKarel
#Program arguments:
code=CheckerboardKarel.class

然后只要用这个“运行配置”运行就可以了,一切正常。
然而,这个方法的缺点在于,每个类我都得重写一个“运行配置”,有没有更好的方法呢?
答案是肯定的。

回到最最基本的问题,为什么Eclipse不认识这个运行类?为什么?
因为它没有public static void main(String[] args)!
但它可以run(),它实现了runable()接口。这就意味着我可以创建一个线程来start它。
给你的所有在cs106a中遇到的运行类,比如CheckerboardKarel,添加一个main方法

/* main method */
public static void main(String[] args) {
    new CheckerboardKarel().start(args);
}

实际上,在Karel的父类的main()中,也是这样调用的。
这个问题将在Lecture 26里讲到,只不过一开始会让新手困惑罢了。

添加Main方法后的运行类,就可以直接点击run或者debug运行了,
而且不限Eclipse版本,我在Mac OS与Windows上都试过了,没有问题。


再来是CS106B,Julie的语速太快了,听得人吐血。但这不妨碍CS106B成为一门非常好的c++课。
可以说CS106B对环境的要求比CS106A还要苛刻,而且苛刻得多。
我已经不用Visual Studio很多年,可还是不得不重新装了一遍VS2008.
是的,VS2008,不是VS2010,因为CS106B用的运行库在VS2010下无法运行。

啊,那真是灾难的一天,折腾VS系列折腾得我要死要活,还是直接说结论了。
结论就是视频版看看就看看,作业一律使用最新的框架文件,一律按照2012版的课件要求来……
否则会被C++的兼容性问题活活害死的,我可不想装XP的SDK,更不想装VS2005……