我心中编程语言的评价标准

最近微博上各路大牛又开始争论语言问题,引发了我写水文的冲动,遂写篇文章谈谈我的看法。

首先我的观点是,对编程语言客观合理的评价不该是个A比B好还是A比B差的问题,我认为编程语言应该从以下几个特性去评价:

紧凑性

所谓紧凑,就是有限的语法和运行时机制所容纳的特性,紧凑性是一种优点。在这一点上做得最NB的是Lisp,它的语法定义极度简单,以下几行就是Lisp的全部语法了:

s_expression = atomic_symbol \
              / "(" s_expression "."s_expression ")" \
              / list 
list = "(" s_expression < s_expression > ")"
atomic_symbol = letter atom_part
atom_part = empty / letter atom_part / number atom_part
letter = "a" / "b" / " ..." / "z"
number = "1" / "2" / " ..." / "9"
empty = " "

这种程度堪称语法紧凑性的极致了。

又比如说JavaScript,很多不明真相的群众认为它的语言特性飘忽不定,非常难以把握,但是实际上,JavaScript的运行时在紧凑性方面做得非常到位,比如实际上,函数参数、变量、函数声明、with这些特性,其实在运行时都是通过scope chain这一底层机制实现的。

反过来说,紧凑性比较糟糕的要数C++了,C++的海量语法,以及那些基本没人用的nb关键字对于每一个C++学习者都是很大的负担。

一些语言虽然大量的提供了特性,但是在没有保证语言的紧凑性的前提下添加功能完全是灾难性的,没错我就是在吐槽Ruby——这一句是个纯粹的个人观点。

抽象能力

抽象能力应该是现阶段语言进化的第一优先级,抽象手段无非函数式、过程式和面向对象三种,看计算机语言的流行历史,不难看出 函数式=>过程式=>面向对象=>函数式回归 这样的规律。Lisp一直在学术界评价颇高,但是其商业应用一直低迷,其抽象能力比较弱一直是个重要的原因。

C++之所以能够从C语言手里啃下半壁江山兴起,就是因为C++盯准了抽象能力这一项。而Java则是提供了跟C++差不多级别的抽象能力之后,又砍掉不少功能,以提高紧凑性。

近年来随着JavaScript的函数式编程被提起,F#的出现和C#的语言进化,函数式回归成了新主题。于是有了C#这样的全能选手,然而实际上抽象能力与紧凑型是互相矛盾的,C#再怎么努力,多种不同的抽象范式之间的灵活组合还是会给学习者带来很大麻烦。

动态性

所谓动态性就是运行时能力的大小,对于编程语言来说,这个特性并非一个纯粹的褒义词。

动态性意味着更加灵活,意味着开发者有更多的"魔术"可以玩。而开发者会天生对动态语言有亲昵地感觉,这是人的本性。

但是凡动态语言,JavaScript、Python、Ruby这些,实际上已经意味着与地层开发无缘了。

同时灵活意味着少约束,少约束意味着大规模程序很难被编写出来。到目前为止,很少听到过超过10万行级别的JS语言项目,这样的现象多少与JS的动态性有关。

反过来看,动态性较低的C语言现在成了驱动和OS内核开发的不二之选,因为好像驱动里面根本用不着那些看上去NB的抽象——即使你用了C++,也是像C一样用而已。

语法噪音

语言除了功能和设计,“长相”也是很重要的。这里要提到一个语法噪音的概念,比如JS里面的function,相比lambda表达式,这个噪音就多了

arr.some(function(x){ return x<2});

而C#里面可以这么写:

arr.some(x=>x<2);

这里面,function关键字,return关键字,各种符号,其实实际意义都不大,因为JS语法设计,而必须要加上,这就是一种噪音。

有趣的是,向python这样的语言对于“去噪”的追求达到了极致,甚至不惜用空白做标志干掉花括号,这个做法导致了其毁誉参半,喜欢的人特别喜欢,不喜欢的人特别讨厌。

结语

编程语言是程序员每天都在用的工具,讨论语言是很自然的事情,但是,讨论谁更优雅,那个语言最好是毫无意义的,理解各种语言设计时的考量,充分理解他们的优缺点才对我们有帮助,才能让我们更好地选择语言。最后用我在知乎某问题的答案来结束这篇文章:你在家用脸盆喝水么?

posted @ 2012-08-05 15:08 winter-cn 阅读(...) 评论(...) 编辑 收藏