小马、参与者、因果关系、类型和垃圾收集

2020-09-08 03:39:24

Sophia Drossopoulou是帝国理工学院的教授,研究方向是编程语言的设计和实现,以及程序验证。她是最初的小马团队的一员。

软件正在改变世界。QCon通过促进开发人员社区中知识和创新的传播来支持软件开发。QCon是一个实践者驱动的会议,专为影响团队创新的技术团队领导、架构师、工程总监和项目经理而设计。

Drossopoulou:八年前,Sylvan Clebsch来到帝国理工学院,他的愿景是一种新语言可以更好地处理并发和并发编程。我想,在那里没什么新鲜事可找。这一切都是虚构的。我错了。围绕这一想法创建了以下内容。塞巴斯蒂安·布莱辛建议我们应该实施这门语言。他马上就去了,并致力于该语言的分发版。我们实现了该语言。对于任何严肃的编程语言,您都有一个包含所有现有材料的页面。您有一个包含所有版本的GitHub页面。到目前为止,有一个社区,它也控制着语言的发展。您还可以找到我将在此位置使用的示例。有一个游乐场可以让你试试看。

我想要讨论的是推动语言的主要思想。该编程语言的目标是它应该是并发的,并且还支持分布式编程。它应该有一个非常有效的实现。编写正确的程序应该很容易。我们所说的并发是什么意思?应该有一个驱动范式,驱动范式就是行动者范式。效率很高。不应该有锁。你不应该用任何锁。运行库也不应该使用锁。您应该能够在不复制副本的情况下共享状态。它很容易写。它应该是无数据竞争、无数据锁的构造。与生锈相反,创建对象循环对您来说应该是安全的。当您编程时,模型中应该有一些简单性。你的头脑里有原子性和因果关系的虚构。

这门语言真的很有效率吗?在我们在那里第一次兴奋四年之后,在我们开始这个项目之后,我们试图运行基准测试,以便特别找出,在垃圾收集方面,语言是如何比较的?我们创建了几个非常基本的微观基准。在这里,我们正在报道小马的行为。上面写着奥卡。之所以说是Orca,是因为垃圾收集器相对于Erlang和Java被称为Orca。在Java中,我们使用的是C4,它是目前最好的垃圾收集器。结果是巨大的。我们非常高兴,因为我们处理这些东西的速度都更快。我们对基准一直很诚实。我们只是写了一些小的基准,然后我们进行了比较,发现了这些令人惊叹的结果。我们对此感到非常高兴。在这里,我们一直在测量4、8、16、32、64核的性能。在这里,我们一直在测量足迹。就足迹而言,有一个小马表现糟糕的例子。我们没有像我们希望的那样,花那么多的时间来进行基准测试。然后,几年后,我们重新讨论了整个问题,我们从今年10月开始在Agere上发表了一篇论文。

我们决定,我们应该考虑由其他人开发的基准测试套件,而不是我们。我们使用的基准测试套件是Savina。Savina被认为是比较基于角色的语言的一个很好的基准套件。在这些基准套件中,共有32个程序,并且已经在Akka中实现。我们已经要求我们的朋友在CAF中实施它们,并且我们进行了比较。以下是并行基准测试中的一个示例。小马是个绿色的家伙,它做得不是很好。阿卡是红色的,做得最好。卡夫是蓝色的家伙,也做得很好。然后,在埃拉托斯提尼的筛子里,小马做得要好得多。然后在我们有了16个程序后,我们不知道该怎么做,我们计算了平均值,而Pony在内核数量较少的情况下做得并不是非常好,而且正在变得更好。另一方面,对于同时发生的故事,Pony在这里做得很好。对于这个例子,它做得不是很好。总体而言,它的表现比其他任何公司都要好。陪审团已经出来了。这些都是微观基准。我们现在正在尝试开发一个基准来管理它们,您可以在其中进行调整并获得更有趣的结果。这是正在进行的工作。这就是我们对效率的了解。这是令人鼓舞的,而且还不是最终的。然而,Wallaroo实验室决定选择我们是因为效率高。他们是小马计划的主要贡献者。他们已经开发了自己的分布式版本的Pony。

与任何严肃的编程语言一样,Pony有几个有趣的特性。我想要讨论的是行为者,因果关系,类型s的某些方面

下一点是因果关系。这样做的原因是,现在我们已经看到,该计划中存在一些不确定因素。举个例子,我们这里有四个演员。我指着演员穿过这个圆形的正方形。这是演员的名字,也是演员的主线。这些时间是当它处于活动状态时执行行为的时间。当我执行自己的行为时,其他演员在做什么?他们去了,他们改变了世界,然后我就会受到影响吗?消息什么时候到达,什么时候从队列中删除?这种不确定性通过类型和因果消息传递得以缓解。类型是做什么的?他们所做的就是给你以下保证。他们说,当一条消息被从队列中删除时,世界上的任何变化对你来说都是看不见的。其他演员可能会执行和修改世界,但它不是你能看到的世界的一部分。实际上,这一保证在信息发送时有效。消息一发送,世界上从该消息可见的任何内容基本上都不会被修改,直到接收参与者可以启动并使用它。这些不确定性得到缓解的另一个原因是我们有因果消息传递。这超出了,例如,在Erlang或Akka提供的保证。对于因果关系的含义有不同的定义。

让我们假设我们有这样一个场景,有一位顾客决定去买东西。在他们买东西之前,他们需要确保他们在银行里有足够的钱。他们干些什么?有一个行为运行。他们去决定,他们想买的东西的价格是多少?他们给银行发了一条消息说,把价格记在我的账上,这样我就确定我有足够的钱了。他们给商店发了一条信息,上面写着,从我这里买一些特价的东西。商店和银行是客户中的字段。然后商店就知道了银行,那是他自己的领域。当商店收到购买消息时,它会要求银行将特定价格记入客户的借方。银行是做什么的?它有一张桌子,一张从顾客到他们余额的地图。当它被创建时,它初始化表。当它收到信用消息时,它会递增特定客户的余额。当他收到借方时,它会检查是否有足够的钱。如果没有足够的钱,那么它就会去英格兰银行抱怨。大惊小怪,否则就付钱。我们希望这种大惊小怪永远不会发生。为什么不会发生呢?从简单化的角度来看,当客户挤兑时,它希望确保信贷在借记之前到达银行。我们说过,关于排队的保证是软弱的。某人先于另一人寄出某物的事实不一定是一种保证。会不会是借方超过了贷方,然后英国央行真的要大惊小怪了?

幸运的是,问题是没有。为什么不是呢?因果交付的保证如下。首先,一条消息导致另一条消息意味着什么?或者,我先收到一条消息,然后再发送另一条消息。如果我收到消息M,然后发送M';,则M是M';的原因。如果我先发送M,然后再发送M&39;,那么M会导致M';。因果关系是传递性的。我们可以保证的是,消息按因果顺序到达同一队列,而不是跨不同的队列,因为这太分散和困难。在一个队列中,他们都是按因果顺序到达的。特别是,当我们担心这一点时,我们知道,因为客户发送信用,然后购买,然后信用导致购买。因为商店收到购买后再发送借方,所以购买会导致借方。因此,贷记导致借记。因此,信用是借记的一个原因,因此它首先到达领域,在那里没有后顾之忧。

这是一项昂贵的功能吗?如果我们在一个节点上工作,这是非常便宜的。那么分布式编程呢?我们得到的保证是,如果我们在树拓扑中组织一切,如果所有通信都通过树,那么消息传递就是因果的。无论客户、银行和商店在该树中是如何组织的,我们都知道我们有因果消息传递。

另一个主题是如何通过类型和类型系统来减轻不确定性。2015年在阿格雷有一篇论文。我将简要介绍一下打字系统提供的功能。Pony类型系统非常有趣的一点是,类型反映了执行。对于影响堆中拓扑的每个有趣操作,类型系统中都有相应的操作。我有推荐信。我已经找到了能让我访问某些对象的路径。此路径可以只是一个变量,也可以是一个变量和字段查找,也可以是一个变量和另一个字段查找。我得到了一个物体的引用。我能做什么

我们这里有一个有身份和力量的人。当它们进食时,它们的力量就会增强。我们已经看到了这个功能,从食物中提取了一些量。食物中的“咬一口”功能可以减少卡路里,并返回部分卡路里。在主演这里,我们有一个苹果变量。然后我们就有了一个梨变量。它们都是食物。劳里和简是人,他们吃苹果和梨。如果我们看一下这里的问题,我正在修改卡路里,因此函数Take_a_Bit应该有一个ref接收器。我们在这里调用Take_a_Bit,它要求食物是Ref,但在这里它是一个盒子。我们需要改变它。这是对类型检查器所做工作的简短而快速的描述。

这些功能的真正含义是什么?我们这里有两个演员,A1,A2。这是演员的时间表,与时俱进。我们就这么说吧。这是演员的激活,忘了时间吧。这是一张快照。这是演员A1,A2。以下是演员可以访问的内容。参与者A1具有指向该对象的iso类型的局部变量。所有这些圆圆的家伙都是物体10,12,13,20等等。我用黑色箭头表示通过每个字段从一个对象到另一个对象的引用。我们可以想象,这里有10个领域,我不在乎它叫什么。此字段具有引用能力,此字段指向12。12有另一个字段具有指向13.13的引用能力,一个框指向12,还有一个指向10的引用。当我使用这些功能时,这是一种可能的拓扑。

该拓扑是什么意思?ISO将可变堆的分区引入该联合区域。这些绿松石三角形表示属于同一区域的对象。我们看到有四个区域,一个从10开始,另一个在20,另一个在30,另一个在50,因为它们都有一个等值线指向它们。有一个不变的区域,这些是蓝色的物体。它是通过这些浅蓝色方块表示的。每当我拥有VAL能力时,就会引入这些功能。从12点到10点,我有VAL能力。我知道,从100开始可以达到的一切都将是不可变的。这里的所有对象都是不可变的。然后用这种方法,我可以拥有我的自行车,因为我在这里得到了它们,我在这里得到了它们,这是我在铁锈中不能拥有的。当你想要它们的时候拥有它们是很好的,而且你不需要开始担心不安全的编程。没有指向可变区域的传入指针。21不能有对12的任何可变引用。它可以有一个标记引用,但我在这里排除它是为了讲述我的故事。21不能有对12的可变引用,甚至不能有框引用,因为它会直接进入其他人的区域。13不能指向20,因为20是ISO,并且一个区域中只有一个不同的条目。

那么我们看到的是,一次最多只有一个演员可以访问。

.