乔·达菲(Joe Duffy)关于并发和并行化的未来

Joe Duffy是Microsoft操作系统孵化项目的首席架构师,并且是.NET并行扩展的架构师。 他还是Windows并行编程的作者。

我们想要与您交谈的原因是,对并发性和并行性的研究似乎已经转向。 在过去的大约十年的大部分时间里,人们对函数式编程产生了浓厚的兴趣,无论是单独使用还是与软件事务存储结合使用。 重点似乎在于试图通过消除或至少包含副作用来实现可证明的线程安全性。

但是最近有很多关于语言和库的讨论,这些语言和库试图以其他方式解决问题,或多或少地忽略了副作用问题。 我想到的包括:

  • D 2.0:该语言默认情况下将对象包含在单个线程中,甚至可以将全局变量存储在线程本地存储中。 如果您希望某些东西从一个线程传递到另一个线程,则必须使其不可变或以其他方式表明它实际上是线程安全的。
  • .NET 5:VB和C#都在改变语言以支持异步编程,几乎可以替代多线程。
  • Grand Central Dispatch,TPL Dataflow和其他几个库在消息传递方面投入大量资金,作为跨线程通信的一种手段。

InfoQ: 我们真的看到了多线程应用程序将如何编写的重大转变,或者这些仅仅是我们一直以来所做的改进?

乔·达菲:我实际上有两个答案。

我的第一个答案是,根据过去几十年的研究,不,这并不是并行程序设计的主要转变。

大约40年前引入的Actor模型确实具有革命性,并且使一等舱这一概念成为了代理人可以通过消息传递同时组织一些更大的有趣任务的想法。 这些年来,这种总体思想一次又一次浮出水面,随着时间的推移积累了有用的扩展和变体。 Hoare CSP,Liskov的Argus,occam,Ada,MPI,Erlang,以及最近使用的诸如Scala,Clojure和Go之类的语言。 甚至已经建立了专门的体系结构,例如The Connection Machine,该体系结构使用消息传递来实现高度可扩展的细粒度并行性。

例如,在我的书中,我建议每个人都将其并发程序设计为异步的,由大部分孤立的代码孤岛组成的孤岛,这些孤岛通过消息传递进行通信,并在内部通过任务和数据并行性利用共享状态。

我的第二个答案是不同的。 我要说的是,对大多数开发社区来说,这是一个重大转变,因为主流编程环境现在正在采用多年来在研究和实验语言中看到的思想。

我完全期望C#,C ++和Java在未来5年内将提供基于Actor的产品。 同时,此类平台上的开发人员将尝试新的语言,并继续以这种风格构建体系结构,而在其主要环境中没有一流的支持。 多年来,开发人员已经通过结合线程(现在是任务)以及使用COM,EJB和Web服务来完成此任务。

实际上,在这个星球上,非常专业的一类程序员-HPC,科学和华尔街的技术计算开发人员-已经习惯于使用MPI之类的专用工具箱来完成此任务。

我们面临的主要变化是主流语言将开始合并更多的并发安全性(不变性和隔离性),并且平台库和体系结构将更好地支持这种软件分解样式。 OOP开发人员习惯于将其程序划分为类和对象。 现在,他们将需要习惯于将程序划分为可以同时运行的异步Actor。 在这种异步的海洋中,将放置普通的命令性代码,通常会添加细粒度的任务和数据并行性。

InfoQ: 您认为这些是正确的步骤,还是我们应该在其他地方寻找?

乔·达菲:是的,绝对如此,我认为这是正确的前进道路。

但是,重要的是不要落入相信一颗银弹的陷阱。 消息传递不是万能的。 通常,实现可伸缩性的最佳途径是数据并行性。 函数式编程和不变性不是万能的。 如果要替换C算法并且需要在性能方面进行竞争,那么您很可能需要使用您最喜欢的算法书中那些熟悉且有效的可变数据结构之一。 尽管我们将需要以正确的方式发展程序的正确部分,但我们不会花费数十年的时间进行研究。

要实现的另一重要事项是消息传递模型中存在共享状态。 这是一个肮脏的小秘密。 它的出现是通过一群有状态的Actor的交流而产生的。 正如细粒度的不变量可以被并发的交错破坏和见证一样,这些更紧急的粗粒度的不变量也可以被破坏和见证。 并发意味着不确定性,无论您如何分割它。 去年,在ICFP上有一篇有趣的论文,关于用纯语言传递消息的编程语言Erlang寻找“大种族”。 共享内存程序中使用的许多相同的同步问题和技术都出现在消息传递程序的更高抽象层上。 这往往使他们更容易理解和推理,但是实际上,这只是一系列权衡。

InfoQ:您认为诸如C#,C ++和Java之类的语言可以随库一起提供基于Actor的模型吗? 还是做对了,我们需要对语言进行某种形式的语法更改吗?

乔·达菲(Joe Duffy):这些平台很可能可以通过首先尝试仅使用库的方法将自己的脚趾浸入湖中。 这是实验的好方法。

但是,要使Actors成为开发人员的一流人才,语言设计师可能最终会探索语言支持。 我相信有两个主要挑战将推动他们朝这个方向发展:

  1. 语法 正如我们在使用TPL和C#的新await关键字所看到的那样,没有什么能比语言构造的表现力更好。 过去,所有出色的Actor语言都使它们成为一流的。
  2. 安全 。 要拥有真正世界一流的Actor模型,您需要安全。 这意味着隔离和不变性。 显然,今天上述语言都没有这些概念。 可以提供似乎不安全的Actor,但这并不理想。

从某种意义上说,我们已经看到了仅使用库的方法的试验。 例如,Microsoft的CCR和TPL Dataflow技术最终在库路由上传递消息,既没有语法支持也没有安全性。 但是结果是比高级编程模型更需要命令的机制。 很好,对他们来说效果很好,但是他们一定会从最基础的语言支持中受益。 毫无疑问,如果这种架构和编程风格无处不在,那么该平台的未来必将成为现实。

InfoQ:去年七月,您写了一篇文章,标题为“隔离第一;不可变第二;同步最后”。 您是否认为需要对将要执行隔离或不变性的语言结构进行更多研究?

乔·达菲:绝对! 我们需要使并发性成为真正的人可以高度自信地引入其程序的东西; 消除种族,线程和锁,并在游戏中获得编译时安全性是前进的唯一途径。

有一些类安全的类比。 我们编写C#和Java代码,而不必担心类型系统漏洞。 通过构造消除了整个程序错误类别; 它很美。 并发安全性同样需要发生。 但是,将这些概念改造成现有的语言(例如C#,C ++和Java)肯定不容易。

已经有大量研究表明在此领域中可能发生的事情,在Java社区中比在C#或C ++中更多。 但是这些思想很容易传递,当然命令式语言也将继续从功能性语言中学到重要的课程。

InfoQ:在Java产生的东西中,您认为哪些值得特别关注?

Joe Duffy:总的来说,在过去十年中,Java在并发方面比C#和C ++领先一两步。 这包括并发的“旧时代”,其中包括Doug Lea在Java 1.4中的工作,以及整个Java内存模型JSR133的成果。 最近,在不变性和控制副作用方面进行了大量的出色工作。 我最兴奋的工作是来自伊利诺伊大学的确定性并行Java(DPJ)。 如果您查看过去的十几个主要语言会议,例如PLDI和POPL,以及相关的研讨会,您会发现许多其他很酷的和创新的想法相互依存。 目前尚不清楚有多少研究可以使它适合Java,但是作为一个伟大思想的孵化器,它一直很棒。

令人高兴的是,多年来,.NET在CLR中得到了认可,JVM现在是真正的多语言平台。 Clojure和Scala都以JVM为目标,然后Swift添加了对也在CLR上运行的支持。 随着运行时变得越来越并行,位于它们上方的语言正在寻找更多动机来以安全方式公开这些功能。 哎呀,甚至JavaScript也被赋予了await关键字Google对JavaScript的新Traceur扩展。 现在,我们所需要的只是具有一流内部并发性的浏览器,并且我们将拥有另一个多语言并行运行时。

InfoQ:如果我暂时从语言和库转向工具,那么您对CHESS和Cuzz等货币错误检测工具有何看法?

乔·达菲:一方面,我爱他们。 任何有助于发现晦涩且代价高昂的并发错误的实用工具都是一件很了不起的事情。 这些是要测试的最痛苦的错误:在这些工具广泛可用之前,Microsoft的团队经常花几个月的时间对异国情调的硬件进行长期的压力,甚至直到那时都没有发现它们。 而且,它们肯定也是在野外发现的最痛苦且代价最高的错误:有一些非常著名的示例,它们表明在测试过程中错过了代价高昂的并发错误,例如导致2003年东北大停电的种族条件。

另一方面,必须存在这些工具是更大问题的征兆:我们的语言不安全,无济于事,无法帮助我们编写正确的并发程序。 对于像这样的工具发现的每个错误,程序员还必须花费数小时才能正确完成其他五十种非常微妙的多线程交互。 (考虑到置换交错所需的爆炸性搜索空间,该工具可能错过了一些工具。)请考虑片刻,这会浪费生产力!

关于图书作者

Joe Duffy是Microsoft操作系统孵化项目的首席架构师,负责该项目的开发人员平台,编程语言和并发编程模型。 在担任此职位之前,他创建了.NET的Parallel Extensions,并担任其架构师。 Joe是作家和经常演讲的人,最近写过Windows上的并发编程(Addison-Wesley),目前正在从事“符号和思想”的研究,这是一次遍历编程语言世界的有趣历史之旅。 在不工作或写作时,可以发现他与妻子金(Kim)一起旅行,写音乐,大口喝葡萄酒或阅读数学史。 您可以在他的博客上阅读他的更多想法

翻译自: https://www.infoq.com/articles/Interview-Joe-Duffy/?topicPageSponsorship=c1246725-b0a7-43a6-9ef9-68102c8d48e1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值