编程语言杂谈

最近看了几个非C的语言,随便写点感想。嗯,标题是不是改成乱弹要好点呢。

编程语言,和自然语言类似,如果一直只用一种,就很容易把思考方式也固化在语言的框架里了。于是,有时不妨换换口味。

比如,用过 C++ 的都听过它是面向对象(OOP)的。但是,有没有人想到,在 OOP 的老前辈 Smalltalk 里,条件表达式能够这么实现呢?(抄自wiki)

expr ifTrue: [statements to evaluate if expr] ifFalse: [statements to evaluate if not expr]

True methods for evaluation
ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock
^trueAlternativeBlock value

False methods for evaluation
ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock
^falseAlternativeBlock value

上面用了 code block 和 多态。code block(这个是对象)推迟了计算,使两个表达式不会在调用条件表达式的时候就被求值。而多态则直接重载了 true 和 false(这两个也是对象)的对应成员函数(Smalltalk 的话应该叫 消息),分别对不同的 code block 求值(true 对第一个求值,false 对第二个),实现计算的分支。

另外,有人想到在 Smalltalk 里,连类本身都是对象呢?对,类(class)是元类(metaclass)的实例(类比 language 与 metalanguage。嗯,还有 meta-bug(笑))。于是,反射 就由此极其自然的实现了。

总结下,在 Smalltalk 中,最重要的范式是,1. everything is an object;2. messaging is the big idea。

其实我还没用过 Smalltalk,只是在看 Object-C 的时候,发现它偏重运行时处理的消息方式比较有趣,才去看了看作为它的参考的 Smalltalk。

光是对照 Object-C 和 C++ 就已经相当有趣了。两者都是 C 的扩展,都保留了 C 的部分(C++ 有小部分不兼容 C)。但 Object-C 偏向运行时,而 C++ 则偏向编译时。于是 C++ 可以很容易在编译时把大多数的错误给你找出来,而 Object-C 即使对于没实现的成员函数的调用也就给一个 warning(当然,不报错的原因是它的运行时特性了,你可以在运行时把一个消息传给一组对象,但也许只有部分对象实现了这个消息)。相对的 Object-C 可以很自然的实现 反射,而 C++ 就算用一堆 template 也很难搞定了。

同属于 OOP 的编程语言,已经有如此差异了。要说更根本性的差异的话,不妨再看下 LISP(这个我只是很早以前看过部分)。我们的计算机是基于 von Neumann 架构的(所谓中级语言的 C,很大程度上也是如此),这在根本上更接近 图灵机 的计算模型。与之等价的是 Church 的 lambda演算(Church-Turing thesis)。LISP 则深受 lambda演算 的影响,它最重要的范式还是函数式语言。你可以在 LISP 的程序中看到大量的递归,函数嵌套,但很少看到赋值语句(赋值引入了状态,同时也在函数内引发了副作用,从而打破了函数式语言的范式,另一方面导入了时序关系,使得并行计算更为困难)。
LISP 的基本是表达式(expression),由链表实现,并可以对表达式求值(于是 LISP 大概是最容易写自打印程序的语言了,只要打个 1 进去就行,输出的就是它的求值的结果,1)。函数(表达式)就是一阶对象,可以在程序中直接操作,这使得高层次的抽象(比如以函数作为参数并返回函数的函数)变得极为自然。

最后一个例子,LISP 中,算术运算写成
(+ 1 2)
作为表达式,第一个元素 + 是一个运算符,后面的是参数,求值之后得到 3。同时,在 LISP 下,这也可以看作是3个元素的表(元素是 + 1 2)。这里可以看到数据和代码的二义性,这赋予了 LISP 这一语言极大的自由度。

作为对比,同样的运算,在 OOP 的 Smalltalk 写成
1 + 2
其意义是,把 + 这个消息发给 1 这个对象,参数是 2 这个对象。返回的结果是对象 3。

Advertisements
This entry was posted in Computer and Internet, Programming and Algorithm. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s