代码改变世界

程序设计语言杂谈

2011-11-29 16:24  捷飞  阅读(282)  评论(0)    收藏  举报

  我们进入大学后,接触的第一门专业课,至少也是头2门课,便是高级程序设计语言,C也好,C++也好,还有Java,或者Basic,然后第一次试着写程序,那个亲切的hello world,作为程序员的我们,我们深知,无论怎样,编程语言在我们的学习中一直是贯穿始终的,因为我们必须通过编程语言告诉计算机我们要做什么,然后你给我怎么去做。编程语言也是我们和现实世界的纽带,因为我们通过编程语言来描述如何处理我们需要解决的现实问题,或许大家还可以说出很多编程语言重要的理由,我也不啰唆了。

  但是大家有没有真正的想过,自己了解编程语言吗?有人精通C、C++、Java或者别的其中一种,但这样应该不能算了解编程语言吧,编程语言有数百种甚至更多,种类也有好多种,即使很熟悉其中的一种,但并不能算真正的了解编程语言,各种语言还工作在不同的抽象层次上,不同的程序员需要使用不同的语言来工作,大学里老师会说一句:“学好一门编程编程语言,其他的便会一通百通”,这话有道理,但也不全对,如果精通了C,那学其他的面向过程的语言应该没什么问题,如果精通了C++,那血其他的面向对象的语言应该没什么问题,如果C、C++都精通了,那学命令式的语言应该没什么问题(什么,命令式的语言没听过?去补课,wiki一下),如果你C、C++、连汇编也很精通,那恭喜你,你已经牛到符合冯诺依曼结构描述的语言对你来说应该都不在话下,但是即使这样,你能很容易的学会Lisp语言吗?或者Scheme、HasKell、ML、F#这些函数式、声明式的语言(什么,函数式语言?去补课),这些语言并不是符合冯诺依曼结构描述的语言,而是基于邱奇的lambda演算式而建立起来的语言,为什么会有这种语言?lambda表达式是什么?简单点说,计算机是抽象的计算模型的现实化,我们现在每天接触到的计算机,最基本的计算模型是图灵机,然后冯诺依曼加入存储思想,造就了我们现在的计算机世界,但是计算模型有很多种,其中一种,就是邱奇的lambda演算式,其核心思想就是任何可计算的问题,都可以通过可定义的函数来解决,在理论上图灵机和lambda演算式是等价的计算模型,也就是说,图灵机能解决大问题,lambda演算式也能解决,于是根据这样的理论,便设计出了第一个函数式的语言Lisp。随着编程语言的发展,如今命令式的语言开始更多的加入了函数式语言的特点,2种语言朝着融合的方向在发展,语言在的生产力也在不断的加强,给我们程序员更多的利器,写出高效而优美的代码。

  在这里我想提一下,有人觉得更精通底层的程序员才是最牛的,更有甚者产生膜拜之情,这完全是一种错误,不错精通C和汇编的程序员确实值得我们尊敬,但如果认为自己只会C#等高级语言,就比不过底层程序员,这就完全没必要了,现在的程序员也因各自的工作不同,各自工作在不同的抽象层次,解决的问题都是不一样的,使用汇编和C,解决的是底层的硬件驱动问题,使之更高效和稳定(操作系统也是驱动程序,驱动的是Intelx86的芯片而已),而C#之类的语言解决的是业务应用问题,要做到的是用一定的时间完成业务系统的应用需求,如果用C和汇编写,所需的劳动力付出的代价就太高了,而且没能很好的用接近底层的语言来抽象的描述如何更符合自然逻辑的去解决问题,因为这其中会夹杂太多和硬件相关过程。如果C和汇编都能解决,那为何还要发明那么多编程语言,为何编程语言还要不断去发展?所以,作为一个清楚的程序员,应该要知道,自己应该更多的专注于哪个抽象层次上。

  语言是语言,和框架不是一个东西,或许语言的很多能力是借助框架来实现的,一个最简单的例子,有了GC,我们就不用太过于关心内存的问题,更多的让程序员专注于业务逻辑上,语言可以让你更多的关注要处理的逻辑,这是语言本身的能力,而让语言有这个能力是因为框架中实现了GC。我们程序员2方面都要知道,但更重要的是知道更好地运用语言本身的能力,毕竟语言才是我们最之际打交道的,而框架只是间接而已,框架是更多地和计算机本身打交道,帮助我们程序员完成了一些以前需要我们自己去完成的内容,比如内存释放,学好语言提高的是你自己的生产力,学好框架提高的是程序的生产力,更高效更稳定,这是2个不同的层次,就好比一行代码能解决的问题,但效率可能很慢,这种情况下,程序员的本身效率是很高的,因为他在最短的时间内完成了需求,但程序却并不快,但只要速度只要满足应用需求,有必要去写那10行代码吗?当应用需求有了那样的要求,再去写那10行也不迟,程序员本身的生产力是最重要的。之所以有计算机,是我们希望借助外部的力量帮我们去更多的完成事情,写代码的道理其实一样,我们最好是花最少的力气,去处理最多的问题,这也是语言不断发展进步的动力,以人为本,这一点上,MS一直做的不错,确切来说是那些MS的Tehcnical Fellow做得不错,尤其是Anders Helsberg(看,人才是多么的重要,不是因为MS,而已因为MS有他们)。

  编程语言有很多种,面向过程、面向对象、函数式、逻辑式的是四大,大家可以从Tiobe.com上了解到这些,最为一个想不断提升自己生产力的程序员来说,了解编程语言,掌握其核心和精髓,其性价比是最高的,比学各种各样的新技术要来得有益得多,因为越抽象的东西,越不易改变,不会说今天学了,以后就用不到了,这和新技术不一样,因为编程语言本身就是一种抽象,从最初的和硬件对应的汇编抽象出各种面向问题的语言,随着发展变得更加通用,这就是一种抽象。

  编程有着很多编程范式,范式就是一种典范,也是是一种思考方式,面向过程,面向对象,事件驱动编程都是一种编程范式,这样的范式给我们搭建起了一种思考的模式,同时也是语言描述如何解决问题的模式,一种语言可以是多范式的,如C#,以上的3种范式它都是,所以C#是多范式的语言,这也是描述语言本身能力的一个方面。

  在小的方面,语言还有很多语法糖,这也是提高语言开发效率的一个因素,虽然语法糖比起抽象的东西来说并不显得那么重要,但是,对于写出优美简洁的代码却是相当重要,代码也可以很艺术,需要语言本身提供给程序员这样的方法,C#在这方面也是领先的。总之一切语言的设计必须越来越以人为本。

  还有一种语言是硬件描述语言,如VHDL和Verilog,这样的语言和C、C++等语言虽然不同,但本质上他们是一样的,设计现实可计算的机器来解决问题,只是他们的方式不同而已,普通的C、C++是存储方式去解决,而VHDL、Verilog则是设计出硬逻辑去解决,C、C++依托的是更通用的冯诺依曼结构,而VHDL、Verilog则不拘泥于冯氏结构,他们本身就在设计结构,但或许并不通用,扩展性很差,但更高效、更快速,就好比100个数的相加计算,用C,我们可以不断通过2个数的相加,以此循环来解决,而VHDL或许可以设计成有100个数的输入,然后直接出结果,其中并没有存储的概念,一个是软实现,一个是硬实现,各有个的好处,一个是通用,一个是快速。其实CPU的设计也是这样的,CPU的指令,每个指令对应着一段微程序,微程序由n多条01组合的语句组成,每个位控制着一个门,表示通与不通,也就电压高低,配合着时钟频率不断的执行开闭任务,完成一条指令的功能,所以即使是指令也是程序设计,当然这是微结构的设计,层次又更底层了,这样的设计保证了设计时能更好的满足兼容性,但指令设计并不一定说需要依靠微程序,也可以“硬”来,道理和之前所述一样。

 

  此文是我对程序设计语言的一些杂谈,有不同观点的朋友,或者有错误之处,望大家直言提出,互相讨论,才能共同进步,不断进步。

  编程语言是我focus的领域,我会经常讨论这个话题与大家共同分享与进步,希望可以发展成系统性的系列文章,望大家一起出idea。

 

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名捷飞 (包含链接)。