gpt4 book ai didi

Golang 与 Hoare 的 CSP-Language 的主要区别

转载 作者:IT老高 更新时间:2023-10-28 13:04:38 26 4
gpt4 key购买 nike

看看这句话取自The examples from Tony Hoare's seminal 1978 paper :

Go's design was strongly influenced by Hoare's paper. Although Go differs significantly from the example language used in the paper, the examples still translate rather easily. The biggest difference apart from syntax is that Go models the conduits of concurrent communication explicitly as channels, while the processes of Hoare's language send messages directly to each other, similar to Erlang. Hoare hints at this possibility in section 7.3, but with the limitation that "each port is connected to exactly one other port in another process", in which case it would be a mostly syntactic difference.

我很困惑。

Hoare 语言中的进程直接相互通信。 Go 例程也可以直接相互通信,但使用 channel 。

那么 golang 的限制有什么影响。真正的区别是什么?

最佳答案

答案需要更全面地了解 Hoare 在 CSP 方面的工作。他的工作进展可以概括为三个阶段:

  • 基于 Dijkstra 的信号量,Hoare 开发了监视器。这些在 Java 中使用,除了 Java 的实现包含错误(参见 Welch 的文章 Wot No Chickens)。不幸的是,Java 忽略了 Hoare 的后期工作。

  • CSP 就是从这里发展而来的。最初,CSP 需要从进程 A 直接交换到进程 B。Ada 和 Erlang 使用这种集合方式。

  • CSP 于 1985 年完成,当时 his Book首次出版。这个 CSP 的最终版本包括 Go 中使用的 channel 。与 Hoare 在牛津的团队一起,David May 同时开发了 Occam,这是一种有意将 CSP 融入实用编程语言的语言。 CSP 和 Occam 相互影响(例如在 The Laws of Occam Programming 中)。多年来,Occam 仅在 Transputer 处理器上可用,其架构针对 CSP 量身定制。最近,Occam has developed以其他处理器为目标,并且还吸收了 Pi 演算以及其他通用同步原语。

因此,为了回答最初的问题,将 Go 与 CSP 和 Occam 进行比较可能会有所帮助。

  1. Channels:CSP、Go 和 Occam 都具有相同的 channel 语义。此外,Go 可以轻松地将缓冲添加到 channel 中(Occam 没有)。

  2. 选择:CSP 定义了 internalexternal 选择。但是,Go 和 Occam 都只有一种选择:Go 中的 select 和 Occam 中的 ALT。事实证明,有两种 CSP 选择在实际语言中不太重要。

  3. Occam 的 ALT 允许条件保护,但 Go 的 select 不允许(有一个解决方法: channel 别名可以设置为 nil 模仿相同的行为)。

  4. 移动性:Go 允许通过 channel 发送 channel 端(连同其他数据)。这创建了一个动态变化的拓扑结构,超出了 CSP 中可能的范围,但是开发了 Milner 的 Pi 演算(从他的 CCS 中)来描述这种网络。

  5. 进程:goroutine 是一个 fork 的进程;它在它想要的时候终止并且它没有 parent 。这不像 CSP/Occam,其中过程是组合的。

一个例子在这里会有所帮助:首先是 Occam(n.b. 缩进很重要)

SEQ
PAR
processA()
processB()
processC()

其次是去

go processA()
go processB()
processC()

在 Occam 情况下,直到 processA 和 processB 都终止后 processC 才会启动。在 Go 中,processA 和 processB 非常快速地 fork ,然后 processC 直接运行。

  1. 共享数据:CSP 并不真正直接关注数据。但有趣的是,Go 和 Occam 在共享数据方面存在重要区别。当多个 goroutine 共享一组公共(public)数据变量时,可能会出现竞争条件; Go 出色的比赛检测器有助于消除问题。但 Occam 采取了不同的立场:在编译时阻止共享可变数据。

  2. 别名:与上述相关,Go 允许许多指针来引用每个数据项。 Occam 中不允许使用此类别名,因此减少了检测竞争条件所需的工作量。

后两点不是关于 Hoare 的 CSP,而是更多关于 May 的 Occam。但它们是相关的,因为它们直接关系到安全的并发编码。

关于Golang 与 Hoare 的 CSP-Language 的主要区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32651557/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com