Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1080856
  • 博文数量: 104
  • 博客积分: 3715
  • 博客等级: 中校
  • 技术积分: 1868
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-30 08:38
文章分类

全部博文(104)

文章存档

2013年(1)

2012年(9)

2011年(41)

2010年(3)

2009年(3)

2008年(47)

分类: Java

2011-03-12 09:41:21

Perl的发明人Larry Wall说,程序员的三大美德是:懒惰、傲慢、缺乏耐性。很早之前,我把这个当作幽默来看。现在,我发现这句话总结得太对了。
    个人认为,除了这三个特点之外,程序员还有另外一个特点:在技术方面的完美主义。
    程序员对自己使用的各种工具都有很高的要求和严格的审美观点,这点从vim和emacs的口水战历史就可以看出来了。而编程语言,作为程序员每天交流、思考、解决问题的工具,更是处在了风口浪尖。从有高级语言(Fortran和Lisp出现)的时候起,关于“哪个语言更好”的争论就没有间断过。
    曾经有人说过,如果一个程序员不在自己的业余时间写程序,那一定不是一个好程序员。我想,同样的道理,如果一个程序员从内心中对自己使用的语言没有感觉,或者觉得用什么语言无所谓,那一定不是一个好程序员。此处说明一下,喜欢一个语言并不是指“用它工作”,而是在自己做业余项目,或者写一些自己使用的小工具时,会不由自主的使用。毕竟“工作中的项目,领导让用什么语言就用什么语言;自己的项目,想用什么语言就用什么语言”。

    首先总结一下我觉得什么样的语言是一个“完美”的语言(排名不分先后):
  1. 语法简洁,类似于C、Python3;
  2. 完全的面向对象,我认为OO的支持对于软件架构设计(模块划分、接口定义、代码组织等)有很大的帮助;
  3. 函数或方法是“first class object”,这可以说是上面一条的延展,我认为,函数式编程的思想很好,在设计、开发具体的算法、函数等组件时,这种思想会有很大的帮助;
  4. 静态类型,有类型推导,类似于ML、Haskell。我一直认为动态类型并没有减轻程序员的负担,因为编码时始终要思考对象的类型,如果没有类型声明,反而增加了程序员的负担。动态类型只是把类型错误留到了运行时。另外,静态类型也倾向于有更好的编译优化支持;
  5. 自动垃圾收集:承认吧,今天的自动垃圾收集器已经可以比绝大部分程序员更有效的管理内存。人工的内存管理也是最容易出现性能问题和Bug的地方;
  6. 拥有针对C的FFI(Foreign Function Interface),也许未来不再需要这个,不过今天绝对需要;
  7. 动态特性支持(注意,不要把这个和动态类型搞混了),主要指reflection的支持;
  8. 名字空间管理机制,类似于Java的package或C++的namespace;
  9. 泛型支持,支持成Java那样我就满足了,如果能支持到C++那样就太好了(具体差异请参考“Think in Java 5th Edition”书中对泛型的讨论);
  10. 高概念一致性,在语言本身和标准库定义上有很高的概念一致性,毕竟,概念一致才会有“美”的感觉,才会有“简洁”、“优雅”的感觉。这一条可以说是一个总体的原则而不是一个“特性”。(概念一致性是所有设计师的原则之一,在编程方面,请参考“Beautiful Architechture”那本书的前言中的定义。)
(题外话,如果用“programming language object oriented functional statically typed garbage collection reflection namespace generic”作为关键字在Google搜索,第一条是“Google学术”的提示,第二条是Objective-C;同样的关键字在Bing搜索,第一条是Objective-C;在Yahoo搜索,第一条是语言的比较,第二条是一个叫Green的语言。)

    这些年,我也一直希望能找到一个在我眼里“完美”的语言。我曾经系统地学习过的语言包括:最早的Basic、C,到后来的C++、Java、Perl、Python,函数式的Scala(这个应该是混合式的)、Haskell。大体了解过的包括Fortran、Lisp、ML、Objective-C、Bash、awk。这些语言中,没有一个是我觉得“完美”的,每个语言都或多或少地让我觉得有些“不爽”的地方。其中,最接近我认为的完美的语言的应该是Python3、Java和Objective-C了。
    在我看来,Python3其实已经很好了,但其最大的问题就在于没有采用“静态类型+类型推导”,而是采用了动态类型。也许有人说,“静态类型”写起来太麻烦,但其实像Haskell一样,配合上编译器的类型推导的话,程序员基本上只要做很少的类型声明(较好的编程风格是,程序员对全局以及对外接口做类型声明,其它部分仅仅在类型推导无法完成,一般是有歧义,的时候,才进行类型声明)。所以,静态类型并不会造成麻烦,它带来的好处则是更好的(即时)编译器优化以及更早的语义检查。动态类型让人不爽的地方就是只有到运行的时候,才会发现类型错误这类应该早就被发现的错误,而且,如果我定义了一个函数,我没有办法约束别人用什么类型的参数,只有在运行时,抛出异常。更恐怖的是,如果传进来对象恰好有函数中调用的方法,代码会“成功”执行,导致逻辑上的错误。总不能针对每个函数的每个参数做isinstance()判断吧?
    至于Java,的确采用了静态类型,但很遗憾,它也没有类型推导。Java另外一个问题是:面向对象的思想贯彻得不够好。举例来讲,在Java中,一个方法并不是一个“first class”的对象,这就直接导致了所有的函数式代码都要绕个弯子(定义个只包含一个方法的接口,再去实现这个接口,传递接口的实现类)才能实现;而且,还存在int,double这类的“基础类型”。此外,Java及其标准库中,有很多”概念不一致“的地方,这也是它的问题之一(我知道这是为了兼容老版本而造成的,不过,就语言层面而言,仍然觉得不爽)。
    我还没有深入学习过Objective-C,只是大致了解过。这里就不说它了。不过它应该也有和Java类似的问题。另外,Objective-C似乎没有名字空间或者包管理机制,还是采用着C采用的前缀方式区别不同包的成员。

    好吧,我承认,上面是我个人的牢骚。每个程序员都有自己的审美标准,也都有自己的思考习惯。希望大家想想,自己喜欢的语言是什么样的,并在业余时间享受用自己喜欢的语言写代码的乐趣。也许在很多技术人员的审美观念中,Python3或是Java或是C就已经很完美了,这很正常。另外,如果有谁知道某个语言,像Python3一样语法简洁、面向对象,像Java一样静态类型(最好也能像Haskell一样有类型推导),请告诉我,不胜感激。
阅读(2176) | 评论(0) | 转发(0) |
0

上一篇:关于IDE

下一篇:计算机三大定律

给主人留下些什么吧!~~