2011年1月2日星期日

为什么C语言并不适合语言入门教学

    国内学校基本都用C语言作为入门语言教学,某本C语言教材大卖,这TMD是我看到的最蛋疼外加胡扯的事情了。你们打算把全校学生包括传媒系都培养成职业程序员么?感谢上帝,中国已经有部分学校用了java乃至python,让我不至于太绝望。
    C语言作为语言之王,有着与生俱来的优势和原罪。你可以不用,但你不能无视。python的os模块基本都是底层封装,封装的是什么呢?linux下是libstdc或者是linux c api,windows下是SDK API,都是C接口而不是C++接口。因为C是一层对底层数据结构的高层抽象,主要解决兼容性问题。例如ARM/x86平台不兼容之类的问题。用C写代码的时候,就是在直观的操作底层的数据,包括内存结构,指针。正是因为这个特点,因此几乎所有平台都用C作为底层语言,并且提供C的API接口。然而也是因为同一个理由,C中缺乏高级对象支持,写一个稍稍复杂点的结构就必须动用数据结构的知识。例如你需要模拟一个园区的物流运作,因此需要写个程序。很明显,运作是以时间为顺序触发的,因此需要一个时间队列。熟悉数据结构的同学应该想到,最适合的结构应当是堆排序中的堆结构。如果没有,那么链表结构也能凑合。但是在C语言里面呢?抱歉,你需要自己实现一个链表。
    纳尼?我它喵的为了做一个园区运作的模拟,它喵的先要啃数据结构书,然后写链表代码。你当我是计算机系的学生阿,老子是管院的。
    C++比C更适合这个问题,C++中可以使用STL,而STL中的list算是凑合的解决了这个问题。哪怕用vector,也算一种可以接受的方案了。C下面为了绕过这个问题,我用了65536长度的数组,于是程序一开就是10+M的内存。这还是我能找到的最优雅的解决方案——总比自己去写一个或者用第三方链表好。java就很明显更加适合解决这个问题,它内置了list数据结构。python虽然没有list结构,但是可以用array模拟,也可以用堆结构。
    无论如何,总好过去找第三方库吧,真当老子是IT民工啦。
    C++比C好点,但是使用C++的原罪是C++复杂的语法结构。光是类的问题上,就有静态,成员,虚三种。每种配合上public protected private,再继承一下public protected private。大约有27种情况需要记忆,它喵的这是写程序还是玩大家来找碴阿。而且还有重载,算符重载,隐性类别转换,强制类别识别这些绕死程序员的问题,我怎么看都不觉得适合给啥都不懂的非计算机系学生解决问题用。
    非计算机系的学生,需要的是这样一门语言。好用,强大,建模和解决数学问题的能力要强,速度和安全性可以无视。很明显,C根本不合格,连边都够不上。因此在国内高校中,实际是matlab和java承担起了这个任务——然而这两门都是非必修选修课,或者压根没地方教。
    有用的知识不算分,甚至没地方学,没用的垃圾要考试——这个,我真——无语了。。。

没有评论: