• 2006-09-06

    程序设计语言的表达

    Tag:向上走

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/3252068.html

    我们经常会遇到连接字符串的需求,比如在服务器端记录日志的时候,描述的部分基本上一致,差别在于随运行状态,需要记录变量的内容不一致。

    在Java中,我们可能会这样做:
    StringBuffer sb = new StringBuffer("prefix:");
    sb.append(logRecord);
    sb.append(":postfix");

    String result = sb.toString();

    这里用到了StringBuffer,在Java中,这是众所周知的技巧。

    同样的功能,在Ruby中,可能会这样写:
    result = "prefix:#{logRecord}:postfix"

    看出差别来了吗?Ruby的代码更为简洁。或许这里的代码量不足以说明问题,放开你的想象力,当要连接的内容增多,差异就会非常明显,Java代码中满天遍野的sb.append肯定让人心情不是那么好。事实上,我之前做服务器端应用的时候,这种代码经常可以看到,无论是这里所说的记录日志,还是为传输协议打包。

    造成这种结果的原因是Java语言自身的机制和表达能力。在Java中,对于字符串连接而言,也有相对简单的表达方式:“+”。但字符串的不可变特性决定了与“+”同生的是大量的临时变量,尽管编译器可以在一定程度上进行优化,但治标不治本。这也是StringBuffer广为流传的原因。

    一个简洁的表达方式对于程序设计语言的用户而言,同样重要,这也是提高生产力的重要途径,因为它可以减少代码量(多半也就是工作量),更能减轻维护的负担。同汇编语言相比,高级语言引入的分支、循环等语句,让语言的表达能力大大增强,面向对象语言将数据和函数封装起来,使我们拥有更好的模块化方式,随后的namespace、package等方式在模块化的道路上越走越远。

    在主流程序设计语言中,C++的复杂是让人望而却步的。这主要是C++混杂了太多的东西,有很多复杂的语法只是为那些程序库编写者预备的。如果只是作为一个普通程序员,仅仅利用程序库提供的接口,C++还是挺不错的。遗憾的是,往往是历尽千辛万苦,学遍了各种古怪的用法之后,我们才会知道,哪些在日常开发中基本用不到。所以,Java的一个大动作就是简化过于复杂的C++,它去掉所有它认为复杂的东西,也去掉了一些可以很好提高语言表达能力的东西,比如宏,比如运算符重载。宏是一直颇受争议的东西,但如果只是使用封装好的宏,对于简化代码来说,还是颇有益处的。同样,运算符重载之所以引入,C++之父还是有所考虑的,这在《C++语言的设计与演化》中有详尽的讨论。或许是理念不同,它成为了Java语言中认为复杂的东西,于是被去掉了。除了基本类型之外,唯一的例外是字符串,它拥有一个“+”。但总体上来说,某些机制的缺乏让Java代码看起来很繁琐。

    Ruby越来越受欢迎,因为它对于提高生产力有很大的帮助。相对于Java,Ruby的表达能力让它的代码编写和维护更加容易,前面举的是一个例子。在Ruby中,还有很多简化代码编写的方式,还以字符串连接为例,一种方式是str.concat(other),更为简洁的方式是str << other。类似的例子还有许多,比如正则表达式,比如文件操作。关于使用Ruby作为DSL的讨论越来越多,Ruby的meta programming能力让它可以成为DSL的基础。Ruby On Rails已经为我们展现了Ruby在这方面的优越,DHH为我们展示如何用Ruby进行美的追求,Potian给出了一些对应的解释

    程序设计语言就是搭建在实际问题和计算机之间的桥梁,最初,受到机器性能和人们对程序设计认识的限制,程序设计语言的表达更贴近计算机,而随着软件世界的进步,表达越来越偏向问题领域,所以,程序编写起来也就越来越容易,这样,程序员们就可以把更多的精力放在解决问题上。

    分享到:

    历史上的今天:

    体验破窗户 2005-09-06
    引用地址:

    评论

  • '程序员们就可以把更多的精力放在解决问题上',这句话说得很好,程序员不应该把自己定位成coder,而应该是problem solver。只会写代码的程序员只能算是‘代码工匠’,能创造性的解决问题的程序员才是真正的程序员。
    回复Red说:
    problem solver,我喜欢这个提法,我们就是要用技术去解决问题。
    2006-09-14 08:07:22