微信号:infoqchina

介绍:有内容的技术社区媒体

听《七周七并发模型》作者Paul 讲:编程语言演变对开发者的意义

2016-04-22 08:01 Paul Butcher

昨天是QCon2016北京站的第一天,众多国际国内一线讲师登台演讲。主会场的第一场演讲来自《七周七并发模型》的作者:Paul Butcher。

今天,世界上最为流行的编程语言都非常相似,像 Java、JavaScript、C++、C#、Ruby、Python 和 PHP 等,用一种语言写的和用另外一种语言写的看起来很像。但情况并非总是如此:在上个世纪90年代,曾发生过一场编程语言的革命,Java、JavaScript、Ruby、PHP 和 Python 都是在那十年诞生的。而现在,我们正在经历另一场语言革命。未来的十年,我们使用的语言不再是今天的这些。

Paul在演讲中探讨了这场革命背后的驱动力量,以及革命会给开发者带来什么样的影响。InfoQ第一时间根据会场实录整理了这篇文章,分享于你。

福利:关注InfoQ公众号,回复「七周七并发」,下载Paul Butcher的演讲PPT。


作为程序员,编程确实是我的热情所在,我非常热爱这个职业。事实上,我这辈子有两个热情:第一个,计算机编程;另外一个就是赛车。赛车是我的一个玩具,我挣的钱都花在这些赛车上了。(笑)


其实赛车和计算机编程有很多相似之处。作为程序员,我们非常关心我们的成绩,希望我们的程序跑得更快;同样,作为赛车手,我也非常在意我的速度,我希望我的赛车能够跑得更快:它们是一种并行关系。

有的时候我们的计算编程出现崩溃的现象,有些时候我的赛车也会翻车。


这是五年前的一个情形了,我非常喜欢这张照片。(笑)

今天我给大家介绍的是:编程语言随着时代的变迁发展的过程。要注意的是,这种演变是以跳跃式的形式出现,并不是一个延续性的旅程。


我记得出现上一次跳跃式的发展是在上世纪90年代中期,已经很久之前的事了。虽然今天我们正在使用的这些语言很久没有发生巨大变化了,但是我今天想强调的是:另一起巨大的变革正在来临,我们现在正处在变革之中。

所以我希望给大家解释一下,为什么这样?请先看一下历史的演变。


大家可能从我胡子的颜色能够看出来,我已经编程编了好多年了。


1979年、我10岁的时候,我开始了我的编程生涯。那个时候,我们还没有互联网,如果我们希望能够学习新的技术,新的语言编程,必须通过看杂志、读报纸、看论文等。当时,最知名的杂志叫做《BYTE》。

我当时看了很多《BYTE》杂志,我还研究了这本杂志的所有封面,我发现这些封面都和编程语言有关。1979年,这本杂志是关于这个编码「LISP」。


1980年,《BYTE》封面变成了另外一个:


这两种语言是我们今天都不怎么使用了。

1981年,封面又变成了另外一个编程语言:「SMALLTALK」。

也是我们现在不怎么使用的语言了。

这是在《BYTE》杂志上出现的第一个、今天仍在广为使用的编程语言:C语言。出现于1983年的封面上。


后来又出现了「MODULA-2」编程语言,同样已经不怎么使用了。


1987年,《BYTE》封面出现了Prolog编程语言。


为什么这本杂志要展示编程语言呢?

因为在八十年代的时候,我们还在猜测哪种编程语言会在未来能够广为使用,我们猜的是这几种,但是猜错了,这些语言在今天并不怎么使用了。

1988年的时候,《BYTE》出现了这种编程语言:


这是微软发布的一系列编程语言:BASIC 6.0、CS1、FORTRAN 4.1等。对于我们今天所使用的Java、PHP,80年代的我们并不知道它们今天会流行开来。


上面的图是根据TIOBE(一个流行指数)排出的、不同编程语言在网络上的流行度。(我还用了必应和Google来进一步了解哪种语言更加受欢迎。)今年2月份的时候,最受欢迎的语言是Java,之后是C、C++、C#、Python、PHP等其他语言。大家对这个结果应该并不意外,这些语言的流行度应该就是这样排的,这也符合我的预期。

有趣的是,如果我们看一下整个编程语言的发展史,找出2016年、2011年、2008年最受欢迎的编程语言。那么会发现,我们今天所使用的大多数的语言、其实都没有包含在1966年前50广泛使用的语言当中,有些语言甚至都还没有存在。


如果我们看一下在1966年、1991年的这两列序列,大家会疑惑:当时排位第一的语言现在在哪儿呢?第四、第五到第十位广为使用的编程语言,1991年又到哪儿去了?都没有出现!所以当时,编程语言的世界已经发生了翻天覆地的变化。


我再来给大家展示另外一些排名。

上图是Redmonk的排名,它和TIOBE比较类似,专注于哪种语言最受欢迎。它也会关注各种源代码,看一下哪种语言在这两边能够广泛得使用。

大家可以看一下,并不是特别不一样,第一个还是JavaScript、PHP、Python,都在TIOBE的指数上。再来看一下这些语言是什么时候发明出来的?大家可能会觉得比较惊讶,一些非常重要的事件发生在1994年、1995年、1996年的时候。我们当今所使用的很多语言,都是在90年代中期的时候所发明出来。所以在90年代中期的时候发生了什么大事件呢?它是如何进一步改变了整个编程界,答案就是网络。

1995年,网络开始成为普及,这进一步改变了我们编程的方法。时至今日,我们几乎每个人所处的世界也都受到了互联网的影响。

如果我们看2015年从11到第20位最受欢迎的编程语言,如Swift、Groovy,在今天得到了广泛的普及。所以又一个大的趋势出现了,我们又经历了一个巨大的变革和转折。问题是:这到底是什么样的变革,又是什么驱动了整个变革?

我跟大家分享一个观点。看下面这个图表,同样来自于Rodmonk的排名。


这是五年前、2010年编程语言世界的样子。数据来自于StackOverflow,横轴越向右越流行,向左就是不那么流行。

再看一下2015年的情况,有些非常有意思的情况发生了。


有些语言在2015年有很大的变化:它们在2010年并不怎么流行,但到了2015年已经往前进了,变得更加流行,向上又走了很长的距离,仅仅用了5年的时间。


还有一些事情也在发生,有些语言在2010年根本就不存在,但在过去五年被开发出来、并迅速发展,尤其是一些非常年轻的语言已经获得了很高的流行度。这是另外一个标志,让我们知道现在在进行一个很大的转变。

我还想指出一些问题:首先,支持功能性编程的语言流行度也越来越高。

其次,这些主题都是JavaScript的替代语言,它们可以说是JavaScript的增强版。


事实上还有其他的一些语言,可以根据JavaScript来编写,它们也是逐渐的在向右上角、更流行的角度在迈进。


最后我想说的是,有些语言是很流行的,它们可以去支持并行和并发,比如CUDA等。


总之,语言的流行度和三点有关:第一个是客户端网页编程,第二个是功能性编程,第三个是并发和并行的编程。


我不想谈客户端这一块,因为它流行的原因是很明显的。我想重点谈谈第二的功能性编程和第三并行并发的流程,它们为什么会流行呢?这两点究竟有什么特别之处,能带来更多的编程语言的革新呢?

为了回答这个问题,我们来看一小段Java的代码。


是数字的求和、不断在数列求和,这是一个很简单的代码。

下面这个是在Clojure写的一个功能。它是一个功能性的编程,它的代码更加简单了,更加简洁了。

如果大家不是很了解Clojure,简单解释一下,Sum和Reduce的是一个函数,比前面的Java不仅更加的简洁,而且还有其他的一些很好的属性。Java有Accumulator,使得做并行计算是很困难的。但在Clojure中可以轻松实现并行计算。同样的一个功能,但是仅仅把Reduce就成了fold,一个很小的改变就可以使得代码可以更好的以并行的方式去运行,速度可以加快四倍。

这是一个很有意思的例子,很简单。如果说稍微复杂一点的话,比如下面是Java代码并行计算的去统计字数。


这是在我的《七周七并发模型》这本书中摘录的。代码不需要大家去一一读,太多了,但是大家可以大致看一看,这些代码是不是看起来很复杂。但这个还不是全部的代码,你还需要下一页:


下一页:


下一页:


我们为了去统计字数,需要写四页的代码,就为了在Java里面并行的统计字数。

我们再看一看在同样的一个统计功能,在Clojure里面一共是七行。


它相当于刚才四页的代码,这就解释了为什么功能性的代码是非常重要的。因为它可以做更多的命令式的编程,它没有太多可变的变量,代表了它更可靠,不会有太多的Bug。因为我们看到前面是用了很多的,也许写的时候就写错了,人总免不了犯错误。这就是为什么功能性编程更加的流行,为什么并发和并行是很重要的。


我们刚才看到这么多的编程语言,究竟哪个编程语言会成为下一个Java?

下一个语言是我们在未来五年会使用的,目前没有任何答案。

但我可以看到的是,有一些潜在的语言,它们都是有可能去获胜的。回想大家看到杂志《BYTE》的封面,上世纪80年代也是在做和现在一样的事情,也许现在最佳的编程语言还没有被发明出来。

那么,这对我们有什么影响呢?

我认为首先,最好的应对方式就是去学习新的编程语言!

不管你学习哪一个新的语言,就去学吧!学习一项新的编程语言,就会使得你的眼光更加的放宽,它会教给你更多的东西,使得你更好的为未来准备,你也可以自己去预测未来会使哪个语言获胜。

第二个建议是再去学习另外一个新的编程语言。

因为我们知道,在短期内我们看到很多编程语言的交错。如果你学了更多的语言,你就能更好地去开阔你的视野,加深你对编程语言的理解,更好地了解自己或未来发展的方向。

第三,我们要学习功能性编程。

虽然现在很多语言在竞争,它们都想成为下一个王者。但是这些语言都是有不同程度的功能性的。但是我想鼓励大家,不管大家学习什么样的语言,你要知道它可以功能性的编程。

最后,去学习并发并行的编程。

以前我们用单核CPU,这样的时代已经过去了,我们现在需要更多的利用多CPU或者CPU多核,以实现更好的性能。

再次感谢主办方InfoQ中国,谢谢大家的聆听。

QCon北京2016正在火热进行中,

4.21~4.23,关注InfoQ公众号,

回复「QCon2016」,

获得在线直播地址,第一时间看QCon!

延展阅读(点击标题):


本文系InfoQ原创首发,未经授权谢绝转载。

 
InfoQ 更多文章 年前挖的坑都填了吗?技术债务偿还计划 程序员VS武林高手:技术为外功,思维乃内力 腾讯游戏大数据服务场景与应用(附PPT) 偷师饿了么:怎样用HTTP/2优化iOS APP网络层次架构? 作为高颜值的女程序员是一种怎样的体验?
猜您喜欢 从四分钟到两秒——谈谈客户端性能优化的一些最佳实践 深入研究Block捕获外部变量和__block实现原理 C++11从入门到放弃之condition_variable 大数据时代装13指南 惠普地球洞察|用大数据保护热带雨林