过去,现在与未来
2014-08-09
本书是Matz在《日经Linux》上连载的各期内容的合集,虽然内容有些部分重复,但是内容还是很丰富的,主题也比较鲜明,与国内的某些合集甩开太远。
通书下来,个人觉得最精华的还是第2章:编程语言的过去、现在和未来。Matz通过简单回顾编程语言的过去,着重分析现在和未来的发展。主要分为以下几类:DSL,meta-programming,内存管理,异常处理,闭包。
DSL,即特定领域语言,将几乎只有程序员的编程语言进化成符合具体领域业务的特定语言,而且该语言与自然语言类似,方便非编程人员也可用其进行编程,可以解决开发人员对业务透视程度不够,业务人员无能力进行编码的矛盾。回想还在前东家码程序时,由于是游戏工作室,经常出现小工具方便策划实现自己的想法,这几乎是与DSL方向不谋而合。做为攻城师,如何把自己从代码中解放出来,如何让非编程人员方便的进行编程工作也是一种能力啊。
元编程,即可以自己写程序的程序。身为苦逼码农,还记得需求一日一变的痛若吗?还记得数据库迁移时,代码大动的尴尬吗?请用元编程利器,让你一劳永逸,面对千变万化,不动任何代码就是完善支持。善哉,这才是程序员的理想生活。当然,元编程并不是所有语言都支持,当然上古语言Lisp可以说是其始祖,但是便于理解,还是举个Ruby的例子,如下:
require 'builder'
builder = Builder::XmlMarkup.new
xml = builder.person { |b|
b.name("Jay")
b.phone("123-123321")
}
#=> <person><name>Jay</name><phone>123-123321</phone></person>
代码中对person, name, phone标签是用方法调用实现的,但这些方法并不是Builder库所定义的。因为XML中的标签是任意定义的,不可能在Builder库中事先全部准备好所有方法,所以这就是元编程的力量。若要增加home标签,无须动Builder库的任何代码,只需直接调用home方法即可。完美生活啊。
内存管理。说到这个,不得不提业务说c/c++是如何难用,很大一部分是由于要开发者进行内存管理。虽然现代c++语言经过一定的封装可以做到不用自己进行内存管理,但是曾经坑害多少无知码农的阴影是不会这么轻易散去。所以,垃圾回收,将内存管理从程序员手上释放出来是巨大的福利。
异常处理。C代码中对各种异常返回值的判断,往往在程序中占有很大的比例,如下:
int main()
{
FILE* f = open("/path/to/file");
if (f == NULL) {
puts("file open failed");
} else {
puts("file open succeeded");
}
f.close();
return 0;
}
当然,这里只是举个简单的例子,现实情况比这个糟糕太多。写一个并不复杂的业务,假设只需要10行代码,但是对异常情况的判断并且处理,往往占据了大量的代码量,也许从开始的10行渐渐臃肿到了100行。这不仅对编码人员造成了大量的工作量,而且对维护人员进行代码学习也是一种负担。若采用异常机制,很容量让编码人员只关注重要的逻辑,而不用一头淹没在异常处理代码中。上文的例子,同样实现一个Ruby版本:
begin
open("path/to/file", "r") do |f|
puts"file open succeed"
end
rescue
puts"file open failed"
end
闭包,含有“包含”的意思。如其名称,闭包就是将数据包含在函数内,与面向对象正好相反,面向对象是将数据的行为包含在数据内。对于闭包,我目前还没有体会到其带来的好处,当然是巨大的好处,值得做为编程语言未来发展的方法的好处,所以就先搁着,等到感受到其巨大力量再来补上。
注:文件代码格式较撮,影响您的阅读,请见谅。