谁先进行了异步/等待?


21

Python在2015年在3.5中添加了async / await构造。Javascript社区朝着它迈进了一大步,并在2017年发布的ES8草案中增加了非常相似的实现(据我了解)。Typescript在2015年的1.7版中还添加了异步方法,使未经训练的人看起来完全像js异步方法。

C#在2012年添加了异步方法,这些方法看起来与async / await的所有其他实现类似,并且基于F#的行为类似但外观不同的异步工作流,该工作流于2010年在F#2.0中引入。这是我所知道的最早关于异步编程语言的示例-具有异步/等待对的C#和具有异步流的F#。

是否有较早的示例在此上下文中将关键字用作语言构造(或库)?从我有限的信息来看,似乎每个人都模仿了C#实现的优秀部分,但是C#是否从其他人那里复制了它呢?


3
如果您只是在寻找async await编程语言中单词的用法,那是最近的事情。但是,这种类型的异步编程async await已经存在了很长时间。
罗伯特·哈维

Answers:


27

在第9频道Anders Hejlsberg采访中async/await,就C#中的异步编程进行了采访,这启发了F#中的异步工作流程。

如果您不知道,Anders Hejlsberg是C#的首席架构师,并且还使用过其他语言,包括TypeScript。

据唐赛姆,在他的博客,F#异步工作流程灵感来自Haskell的异步单子的实施。特别是Peng Li的论文Koen Claessen的“穷人并发Monad”论文

如果您不知道,Don Syme就是F#的首席架构师。

Koen Claessen的论文是较老的操作实现,其结果和延续我可以追溯到1999年。它通过定义原子操作,延续和循环调度程序来实现并发。令人讨厌的方法将是从消息传递切换到等待结果的动机。

Haskell中的并发性先前工作使用某种形式的通道或消息传递进行通信。


说到先前的工作,我不得不提到Concurrent Haskell,“可怜的并发Monad”是它的替代方案。

Mark P. Jones和Paul Hudak发表的论文“ Haskell中的隐式和显式并行编程”。本文为科恩·克拉森(Koen Claessen)的论文奠定了基础。

在论文“ Haskell中的隐式和显式并行编程”中,Mark和Paul分析了“ fork”的属性以及并发副作用的问题。他们参考了“ ML并发原语的语义”一文,该论文选择了基于并发ML的一组并发原语,并提供了它们保留顺序执行属性的证明。


这是一个很好的答案。我很高兴您提到Haskell&ML(两者都是F#的灵感来源)。我知道您会听到Haskell员工谈论“延续风格”。async / await只是在该概念之上的编译器魔术/语法糖。
RubberDuck

1

我相信Microsoft不会使用已经存在的词,因此asyncawait可以归因于您所指的时代。但是,协程协作多任务的想法很老。


2
我不认为比较协程和异步编程是正确的-它们提供了截然不同的抽象类型。
温德拉

3
“我相信微软不会采用已经存在的词语”-您是否有这种信念的依据?成功的语言设计师通常比这更务实。
塞巴斯蒂安·雷德尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.