我是天才
伟大的野心家,实践家; 程序员,技术问题解决者.

导航

 

“C++(或者其它某种语言)是最好的编程语言”,持这种观点的往往是编程新手。这里拿C++说事是因为它尤其容易误导新手。C++是一种精神上的毒药,受害者往往中毒很深。忠实的C++信徒倾向于非常偏激,对敢于泻渎了他们信仰的人他们会予以强烈的攻击。

我接触的第一门语言就是C++。半路出家的我当时只想紧紧地抓紧这根救命草。C++是如此强大以至于它能做任何事情,从C的公共语法部分学起,到类,模板。等把这些都搞透了,还有各种库STL,boost到各种实际的库。我当时对于C++的很大一个误解在于,只要学会了C++语言,就学会了编程。但后来我才发现,C++是个学不到头的语言。

C++太庞大了,它从一开始就没有一个好的定位。似乎是想把所有的东西都包括进来,使它看起来做任何事情。

可以使用它做过程式的编程,像C代码那样。也可以使用面向对象的方式,或者如模板编程那样的东西,这个语言的作者本意是用户有自已选择的权利。但事实上仅从语法和代码风格上看,那几乎就不是同一门语言,这确实够糟糕的。

可能教育方面的原因使得这门语言很被误导,很多书籍会倾向语法而不是实际应用。是的,没有比C++语法更复杂的语言了。所以新手常常被误导的去钻研语言本身。直到模板元编程,它的语法真的可以让人疯掉。

可能有人会认为,C++语言固然复杂,但可以不必掌握全部细节嘛。事实上它的复杂性本身就是毒药,好奇的人们总想饮毒止渴,尤其是像我这样的喜欢刨根究底的。

C++挖好了一个坑,很深的坑,等着一群无知的人往里跳。

这里有点偏题了,我只是想说并没有一门最好的编程语言,那是新手选择语言时喜欢争执的问题。

 

”编程语言的选择不重要,所有语言都是等价的“。持这种观点的常常是二类人,真心的和非真心的。

非真心的人,他们虽然还是觉得自己喜爱的语言拥有更好的特性,但他们已经厌倦了语言之争,不愿与某些极端信仰者发生冲突。这并不坏,至少中毒还不是太深,或者开始反省,他们有机会自拔。

真心持这种观点的人淡化了语言的作用,他们的境界开始高了一层了。我就是慢慢走过这个阶段的,一直啃C++的语法是学不会编程的。多了解些操作系统,数据结构的知识有用多了。借用linux之父说的,C++是一门糟糕的语言,被一群糟糕的程序员使用搞问题弄得更糟。

好在聪明的程序员能够看到这些,免于受到太多的伤害。至少从诡异的语法中解放出来去专注问题本身。

 

那么随便选一门使用的人多的语言就合适了么?老板们倒是这么认为的。因为相比选择小众语言,他们的项目风险会更低。程序员跳槽了,他们很容易就能从市场上找些人来顶替。这是”编程语言的选择不重要,所有语言都是等价的“思想的沿续,只是更功利一些。

但是我注意到往往精英的黑客有自己独特的喜好。Richard stallman混合使用C和lisp,Linus仅仅使用C。

国外很多的高手,他们都是掌握数门语言的。如果用来编程仅仅一门语言就够了,为什么他们还会了解那么多的语言呢?Eric Raymond曾经说无论是否使用,lisp都是值得学习的语言。

可见并不是随便的一门语言都是值得学习的。只可惜这种挑选语言的本领是那些精英黑客玩转多门语言之后获得的,我等愚民很难天生就有有这种悟性。

 

不同语言的编程效率不同。但,这并不能变能评价语言好坏的衡量标准。

使用底层的语言(如C),会强迫用户去实现自己的算法和数据结构,强迫用户了解一些底层的运作机制,让他们重复造很多轮子。这并不是一种浪费,正是因为这样,C语言更容易出高手,而C#更容易培养一些只做为微软做苦力的码农。

看来,需要一个合适的层次。太低层的语言使用起来太累,而太高层的语言又使用户变得弱智。鱼与熊掌不能得兼,C所处的算是一个比较好的层次了。

曾经做课程设计写一个嵌入式操作系统内核,开始时bootloader和进程切换时上下文相关的代码只能用汇编写,到后面可以使用C语言了,那种感觉只能用一句语形容:"极大的解放和发展了生产力!"。但写汇编也末曾不是一种好事,对于机器是如何执行的了解就更深了一层。

如果只是出于学习的目的,编程效率并不是一个首要考虑的问题.到底什么样的语言值得学习呢?

 

编程语言决定了思维模式。程序员由于使用的编程语言不同,他的思考方法和编写出来的代码都会受到编程语言的很大影响。

不能改变编程思想的语言,不值得学习。C和lisp是两个极端,一个的基础是计算机的体系结构,另一个的基础是数学。

可以说,只要憑诺依曼的体系结构没变,只要操作系统的源代码还是用C写的,这门语言就仍然会有顽强的生命力。至于数学,则是永远不会过时的东西了。

lisp的基础是lambda演算,但好象还差点什么,是的,差一个真实的机器。早期的计算机时代可以看作lisp学派与unix学派之争,应该算unix学派胜了,因为lisp总是假装自己在一个凭空设想的机器中运行。emacs是硕果仅存,它假装自己就是一个操作系统,elisp是它的编程语言,linux只是它的硬件和驱动。

“write once, run anywhere”。我曾经觉得Java的这种方便性就尤如肛交,并且极度抵制虚拟机。但看了lisp语言之后就有所改观,这就是语言对思维模式的影响。早期机器性能太低,而现今,高层语言的动态性带来的好处完全大于虚拟机造成的性能损失。

C++确实不是一门太好的语言,为了用好它,人们会被迫继续研究设计模式,这也是语言对思维模式的影响。工厂模式,观察者模式搞出这么多种...这些本身都是好东西,是前人留下的宝贵的经验财富。只是我想说,通过强迫人们学习别扭思维方式来用好一门语言,这门语言的设计肯定是有问题的。

在慢慢的读代码中会理解一些惯用法,small is better。仅仅使用好指针和结构体,C语言足够发挥无穷的威力。我相信从书本上无法真正掌握那些设计模式用到C++上面。真正的朴实无华的技巧都是在实际代码中学到的。

“程序设计语言的设计不应该是特征的堆碓,而应消除那些需要依赖于多余特征的弱点和局限”。scheme的设计理论我太喜欢了,这是对C++语言的绝好讽刺!在C++中,我受够了模板的伤害却一无所获,而从scheme的宏中我才明白了什么是真正的元编程。现在我知道,C++不过就是想把别的语言上的好的特征都弄到自己身上,导致的结果仅仅是晦涩的语法。

不得不承认我一直没理解OO(不是XXOO,是面向对象),我的意思是说某门一直强调OO的语言没有改变我的思维方式,所以它真的很烂。在这门语言中,OO的好处的封装,继承,抽象。

知道闭包这东西之后,封闭很容易用闭包实现,模块也是一种好的封装方式,也很容易用闭包实现。继承这东西,看过linux内核中的链表的实现,那算不算一种继承呢?既然指针就能做到何苦搞那么复杂的概念。至于抽象,除了教材上看得到猫啊狗啊继承动物这种例子,实际中几乎看不到。我觉得动态类型才是更实用的抽象。据我了解,在第一门面向语言Smalltalk中,OO更强调的是对象之前的交流,是一种消息传递式的编程而不是指上面的封装继承和抽象。

我最近看到一个很有趣的东西,用易语言和lua语言做的一个游戏引擎Edgame maker。我惊讶这个世界上还真的有易语言能够做的东西。用易语言实现的IDE和库,然后用lua整合和提供编程接口。使用lua的面向对象弥补易语言的不足。从这种例子中可以学习到一个粘合层的语言如何通过模块化获得更好的实用性.

各种编程语言都有自身的特点,如果学习一门新语言,更应该看到的是它背后的思想,而不是语法层面.学习语法容易,改变思维模式难.

posted on 2012-01-12 22:39  Genius0101  阅读(500)  评论(0编辑  收藏  举报