多范式编程的思考

如之前所言,不同的语言往往注重不同的范式,并在语言层面上加以实现/强化。

在当前使用的语言中一定程度上借鉴其它语言所推崇的范式常常是可行且有益的。
例如在 C++ 中,简单的把函数本身和其入参设为 const 一般就可以保证其没有副作用。这并不能使 C++ 得以应用函数式语言中强大的高阶函数编程(个人始终认为用范型做 lambda 表达式实在无益),也不见得能使整个系统的运行并行化,但足以提高系统的可理解性和可维护性,因为程序员往往更难理解程序在运行时的状态和行为(这在并行编程的情况下表现的尤为明显,以致我们需要用临界区段之类的概念来辅助理解)。试想,如果能把有副作用的模块局限在系统的 10%,那剩余 90% 的模块的运行时的表现就是完全确定的了,其测试和维护将会变得非常简单,而一旦系统发生问题,也可以把调试的重点集中到那控制系统状态的 10% 的代码中。
John Carmack 的 Functional Programming in C++ 中有更详尽的说明和更具体的方法,当然也有性能方面的折中。

当然,也有一些范式的使用会更加困难(如果不是不可能的话)。最近发现 Erlang 语言 相当有趣,函数式编程加上基于 Actor 模型的 Erlang 进程的并行支持。Erlang 进程并不是系统进程或是系统线程,而是由 Erlang 虚拟机管理的位于用户空间的轻量级进程,因此其开销非常低。同时,Actor 之间只通过消息传递来相互交互,不共享任何状态,这使其非常适合服务器端的并行,且拥有良好的可扩展性。不过要在 C++ 中实现 Actor 模型看来会相当困难。轻量级进程也许可以通过 lthread 之类的模仿(但是由于没有虚拟机这一层的抽象隔离,进程切换很难做到,同步IO 也会影响性能),而比如 “let it crash” 的编程方式则更加困难了(不过现在正在用来写 blog 的 Firefox 某种程度上应用了这个想法,把 Flash 放到了另一个 plugin-container 进程,然后,嗯,let it crash,然后重启 plugin-container 就能恢复)。
不过在今天看来,参考了 Erlang 不少功能的 Scala 似乎更热门些吧。

Advertisements
This entry was posted in Computer and Internet, Programming and Algorithm and tagged , . 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