- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
看看这句话取自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 进行比较可能会有所帮助。
Channels:CSP、Go 和 Occam 都具有相同的 channel 语义。此外,Go 可以轻松地将缓冲添加到 channel 中(Occam 没有)。
选择:CSP 定义了 internal 和 external 选择。但是,Go 和 Occam 都只有一种选择:Go 中的 select 和 Occam 中的 ALT。事实证明,有两种 CSP 选择在实际语言中不太重要。
Occam 的 ALT 允许条件保护,但 Go 的 select 不允许(有一个解决方法: channel 别名可以设置为 nil 模仿相同的行为)。
移动性:Go 允许通过 channel 发送 channel 端(连同其他数据)。这创建了一个动态变化的拓扑结构,超出了 CSP 中可能的范围,但是开发了 Milner 的 Pi 演算(从他的 CCS 中)来描述这种网络。
进程: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 直接运行。
共享数据:CSP 并不真正直接关注数据。但有趣的是,Go 和 Occam 在共享数据方面存在重要区别。当多个 goroutine 共享一组公共(public)数据变量时,可能会出现竞争条件; Go 出色的比赛检测器有助于消除问题。但 Occam 采取了不同的立场:在编译时阻止共享可变数据。
别名:与上述相关,Go 允许许多指针来引用每个数据项。 Occam 中不允许使用此类别名,因此减少了检测竞争条件所需的工作量。
后两点不是关于 Hoare 的 CSP,而是更多关于 May 的 Occam。但它们是相关的,因为它们直接关系到安全的并发编码。
关于Golang 与 Hoare 的 CSP-Language 的主要区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32651557/
当我读这本书 -- 人工智能(一种现代方法)时,我遇到了以下描述将 n 元约束搜索问题转换为二进制问题的方法的句子: Another way to convert an n-ary CSP to a
我的Web应用程序(JS部分)需要在加载之前由服务器配置。现在它是通过以下方式完成的: var configObj = { setting1: "blah", setting2: {val1: 1,
作为开发人员,我应该为windows提供什么智能卡登录功能?只有微型驱动程序 + 现有的基础智能卡 csp 工作吗或者,如果我开发了一个完整的 CSP,我可以让智能卡登录正常工作吗? 最佳答案 你应该
在一些 css 文件中嵌入一些 base64 字体,但 CSP 阻止了这些:类似于 url("data:font/woff;base64,d09GRk9UVE...); 当前 CSP =“base-u
CSP的理念:以通信的方式来共享内存 不要通过共享内存来通信,而要通过通信来实现内存共享。这就是 Go 的并发哲学,它依赖 CSP 模型,基于 channel 实现。Go 一开始就把 CSP 的思想融
前情提要:CSP-J/S 2023 写这篇文章的时候,心情比较复杂。 哎,结局还算圆满。 初赛 之前那个写的不好再写一遍() 两个都在 WFLS,也就是本校考 qaq。 J 在大礼堂
比赛链接 A.玩水 (water) 签到。发现如果要找两条路径的话,能找到的充要条件是存在一个点的上方和左方的字母相同。(即使两条走过的点截然不同的路径也符合,这时终点会成为这个点)。 即存在一
在上一篇博客我们主要总结了XSS攻击,本篇博客主要总结内容安全策略CSP的相关内容。 一、定义 内容安全策略(CSP),是一种安全策略,其原理是当浏览器请求某一个网站时,告诉该浏览器申明文件可以执行,
我正在开发一个 Flask 应用程序,它使用 Flask-Talisman 来合并一个 CSP。我想在我的模板之一中创建一个内联脚本,而不是将“unsafe-inline”添加到 CSP 的“scri
我注意到 GitHub 和 Facebook 现在都在实现这项政策,这限制了第三方脚本在他们的体验/站点中运行。 有没有办法使用 检测文档是否针对 CSP 运行? JavaScript ? 我正在编写
我一直在努力寻找最好的管理访问权限的方法,并允许我们的技术人员访问我们的客户订阅和 Azure 资源,而不给予他们作为每个订阅的贡献者或类似权利的明确权利。 现在我遇到了权限身份管理功能( https
我正在学习内容安全策略。 假设我的网站 abc.com 有以下 csp: default-src 'self' 'unsafe-inline' 'unsafe-eval' xyz.com 这是否意味着
我一直在努力寻找最好的管理访问权限的方法,并允许我们的技术人员访问我们的客户订阅和 Azure 资源,而不给予他们作为每个订阅的贡献者或类似权利的明确权利。 现在我遇到了权限身份管理功能( https
我了解使用 CSP 的好处,但是发送这些 header 用于 HTML 文件以外的任何内容是否浪费?例如,我是否需要在图像上发送 CSP header ?对于 .js 文件? 最佳答案 Content
Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题
有许多用于 JavaScript 的图表绘制库,例如 Chart.js 或 Chartist.js。但是,我们无法找到任何适用于严格 CSP-Mode 的库。 .我们测试的所有库都使用 eval 或默
如何获取已连接智能卡的 CSP 提供商名称? 我无法访问注册表窗口,因此我找到了通过 win API 获取该信息的方法。 我已经看过有关 SCardGetCardTypeProviderName 的内
我正在编写一个使用智能卡进行 xml 签名的简单程序。 示例代码: var cspParams = new CspParameters(1, "Microsoft Base Smart Card Cr
我正在尝试编写自己的 CSP。我正在尝试通过实现一个 dll 文件来做到这一点,但我不确定我的方法是否正确。 我发现了这样的东西:加密服务提供商开发人员工具包 (CSPDK) 有 CSP API 的示
下册开学期末+CSP-J游记 Day -14 期末 Day -7 今天家长会,老师公布成绩 /fn/fn/fn。政治和历史考废了,然后其他都挺好。 语文 \(101\
我是一名优秀的程序员,十分优秀!