您的位置:首页 > 编程语言

重读《编程语言的发展趋势及未来方向》

2011-12-03 22:39 656 查看
这是一篇《程序员》杂志去年发表过的文章,由赵劼根据Anders Hejlsberg在比利时的演讲翻译而来。杂志上发表的内容过于简单,漏掉Anders一些精辟见解了,我有幸找到完整的译稿,重读一遍越发觉得Anders眼光像贼一样亮。

感谢老赵同志提供全篇翻译,让我们免去听录音之苦,还附上PPT讲稿。译文参见:http://blog.zhaojie.me/2010/06/trends-and-future-directions-in-programming-languages-by-anders-7-conclusion.html

Anders Hejlsberg是谁不需要解释吧?Turbo Pascal作者、Delphi首席架构师、C#首席架构师,这几样谁若做成一项就够我辈好好景仰了。本文不想否定或者探讨什么,只是在Anders见解基础上,补充若干个人浅见。下文中Anders言论我用斜体并加引号表示,我就几个观点作补充,每个观点用一句话概括,用作段落标题,用粗体字标示。

编程语言只是人性化表达的一种工具

“首先,编程语言的发展非常缓慢。期间当然出现了一些东西,例如面向对象等等,但是远没有好上1000倍。另一方面,你可能会想,那么这些努力都到哪里去了呢?事实上这些努力没有体现在编程语言上,而是出现在框架及工具等方面了。如果你关注如今我们使用的框架,它们的体积的确有1000倍的增长。例如当年Turbo Pascal所带的框架大约有,比如说100个功能,而现在的.NET Framework里则有一万个类,十万个方法,的确有1000倍的增长。与此类似,如果你观察现在的IDE,我们现在已经有了无数强大的功能,例如语法提示,重构,调试器,探测器等等,这方面的新东西有很多。与此相比,编程语言的改进的确很不明显。”

几十年来,硬件性能按成千上万倍的规模增长,软件工具与框架也有数倍乃至十数的增长,Anders举例的功能数或类数只是一个侧面,但编程语言改进不很明显。究其实质,编程语言只是表达人性化思想的一种介质,二千年前庄子讲“望洋兴叹”,今天我们还这么讲,大凡与人性相关的东西,总是比较持久的,在发明C语言的七十年代,我们用if/else处理分支,while处理循环,现在还这么去用,估计再过一百年也还这么表达。

强调这一点,我们不难识别网上的编程语言之争,有些确属“愚忠”之举,如果我们把编程语言自身与它所依赖(或由它拓展的)运行环境区分开来,什么都是浮云,剩下的其实主要是平台路线之争,都与具体应用相关,大家不甚着调的闹个热火朝天。当然,语言之间区别还是存在的,象C语言面向过程,C++面向对象,面向对象自然比面向过程更加人性,但这是显而易见的,无关语言优劣。

多范式语言是发展趋势

我深刻认同Anders这一论点,网上有不少文章讲到函数式编程,就鼓吹它的好处,像无副作用、反射、并发,等等,好象这就是我们的未来。其实不然,写文章的人往往忽略了函数式语言的劣势。且不说性能问题,纯函数式表达方式普遍不大好用,我说的“好用”指易理解,符合人类思维习惯,Common List够函数式吧,当你无论写什么代码,都用括号起头、括号结尾,并没有那么好读、好维护,大家对比一下面代码:

( if (> 3 2)
(+ 4 5)
(- 11 3)
)

if (3 > 2)
return 4 + 5;
else return 11 - 3;


前一段是CL,后一段是C/C++,对比一下就知道了。

“有一点值得一提,那便是随着语言的发展,原本的编程语言分类方式也要有所改变了。以前我们经常说面向对象语言,动态语言或是函数式语言。但是我们现在发现,这些边界变得越来越模糊,经常会互相学习各自的范式。静态语言中出现了动态类型,动态语言里也出现了静态能力,而如今所有主要的编程语言都受到函数式语言的影响。因此,一个越来越明显的趋势是多范式程序设计语言。”

C#、java、Go等语言的发展轨迹,我们明显看到这种趋势。CSE也是这种趋势的典型代表,它分明是一种解释性动态语言,但模拟C/C++命令式风格,把动态与静态的特质融为一体。

如果我们深刻理解“语言只是人性化表达的一种工具”,就不难把握上述多范式趋势。元编程为什么逐渐流行?最根本原因,我的理解是:它大力推动编码过程走向人性!Anders演讲中提到命令式语言特征在于它表现“How”甚于“What”,无疑前者更多体现了机器行为,后者“What”更为人性。

“目前我们在编写软件时大量使用的是命令式(Imperative)编程语言,例如C#,Java或是C++等等。这些语言的特征在于,写出的代码除了表现出“什么(What)”是你想做的事情之外,更多的代码则表现出实现的细节,也就是“如何(How)”完成工作。这部分代码有时候多到掩盖了我们原来问题的解决方案。比如,你会在代码里写for循环,if语句,a等于b,i加一等等,这体现出机器是如何处理数据。首先,这种做法让代码变得冗余,而且它也很难让执行代码的基础设施更聪明地判断该如何去执行代码。当你写出这样的命令是代码,然后把编译后的中间语言交给虚拟机去执行,此时虚拟机并没有多少空间可以影响代码的执行方式,它只能根据指令一条一条老老实实地去执行。例如,我们现在想要并行地执行程序就很困难了,因为更高层次的一些信息已经丢失了。这样,我们只能在代码里给出“How”,而不能体现出“What”的信息。

有多种方式可以将“What”转化为更为“声明式”的编程风格,我们只要能够在代码中体现出更多“What”,而不是“How”的信息,这样执行环境便可以更加聪明地去适应当前的执行要求。例如,它可以决定投入多少CPU进行计算,你的当前硬件是什么样的,等等。”

元编程的作用是多方面的,支持DSL,让基于What描述的指令能更聪明的实现自解释与自动组装是很重要的一面,有了元编程能力,执行中的代码可反射更多信息给开发者,无论拿它构造测试工具或调试工具,或更进一步辅助于编码过程,都是十分有益的。反射信息辅助调测不多讲了,C#、java都有这个能力,进一步辅助编码是更高要求,其前提是脚本化在线编码、在线调测,像CSE的选中执行(SelectAnd Run,SAR),运行中的代码不仅可在线更新处理逻辑,从代码反射的数据类型、函数原型等信息,还直接用于编码时提示输入。我们透过现象看本质,这些何尝不是“人性化”的趋势要求呢?

编程语言对并发能做的事情有限,请勿过高期望

声明一下,这是我的观点,不是Anders说的。

我的意思是,语言对并发支持没大家想象得重要,并发编程更多是编程方式、思维模式变化,你要关注任务隔离性,更加精心的构造(或分离出)可并行的任务,提供普适的“纯洁”函数(无副作用函数)。并发对编程语言的要求是:能标识这种纯洁函数,提供foreach多核分发机制,相比较而言,并行编程的思维方式变化才是根本性的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: