并发神器CSP的前世此生

程序架构的研究在上世纪七八十年代还处于原始阶段,当时的大部分研究都在研究如何编写顺序代码,而如今所熟知的goto语句那时也正在被讨论,尚未正式引入。而面向对象的范式正在悄悄的变成编程的基石。


一切都显得风平浪静,好像一切都在随着预想的慢慢发展。这时C.A.R Hoare (简称Tony Hoare发现了一个问题,那就是并发没有获得太多的关注,因而他开始着手解决这个问题。

Tony Hoarehtml



提及Tony Hoare,初听比较陌生。可是他的另外一项研究不少程序员不会陌生,那就是排序算法中的快速排序算法(Quick Sort)。而这个闻名于世的算法是他26岁时发明的,固然除了这些,Tony Hoare在程序设计语言的定义、设计、数据结构、算法和操做系统等许多方面都有不少影响深远的成果。并由于“对程序设计语言的定义和设计方面的基础性贡献”在1980年得到图灵奖。


Hoare在发明快速排序后的第二年,接到了新的任务,为公司的新机器设计一个新的高级语言,而当时他正好搞到一份Algol 60报告的复印件,并参加了Dijkstra(学算法的时候大部分人都听过Dijkstra算法,没错,就是这我的发明的)等人举办的Algol 60培训班。

当时Hoare学着学着就想,不如直接把Algol 60在公司的新机器上进行实现。因而Hoare把这个想法提交给公司,在公司赞成后,开始设计和实现Algol 60的一个本身版本。Hoare在一开始就制定了明确的目标,即系统要安全可靠,生成的目标码要简洁,工做区数据要紧凑,过程和函数的人口和出口要清晰、严密等,还明确了整个编译过程采用一次扫描等原则。


而此次实现不只十分顺利,而且大受欢迎,在世界各国开发的Algol 60版本中效率、可靠性和方便性都很是出色。所以获得了国际学术界的重视。国际信息处理联盟因而任命霍尔为2.1工做组(Working Group 2.1)的负责人,这个工做组的任务是维护和发展Algol。霍尔果真不负众望,主持设计了Algol X以继承与发展Algol 60。正是在Algol X的设计中,霍尔发明了CASE语句


Hoare还有不少重要的研究和成果。而咱们今天要说的CSP理论就是其中很是重要的一点。


CSP程序员



Hoare在发现并发操做没有引发过多的关注后,开始着手进行解决。终于在1978年,Hoare在ACM中发表了经典的“Communicating Sequential Processes”论文。在这篇论文中,Hoare认为输入和输出是两个被忽略的编程原语,尤为在并发代码中。因而Hoare在CSP论文中展现了如何应用通讯来建模输入和输出,并提供了如何用CSP来解决一些并发问题,好比寻找10000之内的素数。经过这种方式最终达到“在进程间正确的通讯”。固然这个思想在当时是很是超前的,

事实上,1978年的论文中,CSP只是一个用来展现通讯顺序进程的能力的一个简单的编程语言。连Hoare自己都以为这个想法过于超前而有些不切实际,他直接在论文中悲观的写道:

Thus the concepts and notations introduced in this paper (although described in the next section in the form of a programming language fragment) should not be regarded as suitable for use as a programming language, either for abstract or for concrete programming. They are at best only a partial solution to the problems tackled.算法


本文介绍的概念和符号应该不被认为适合做为一种编程语言,不管是抽象的仍是具体的编程。他们最多只是一种解决问题的方式。


Hoare担忧本身所展现的技术对于将来的并发编程的研究并无任何做用,这种技术或许没有语言可以按照他的想法来实现。可是接下来的6年里,关于CSP的想法被提炼成对并发系统进行数学建模的方法--进程微积分。并提供了代数规则来对系统进行变化来分析它们的并发和效率。而这正式将CSP的想法投入到并发编程的实践中。


Go语言编程





在CSP提出后,有些语言尝试将Hoare提出的输入和输出做为原语归入到本身的语言体系中,好比OCCAM并发处理语言。和传统的加锁方式不一样,CSP理论中不容许进程对其余进程的变量赋值,进程之间只能经过通讯原语来实现数据交换和协做。可是这些语言都没能真正地为这些原语提供支持。大多数流行语言都支持共享和内存访问同步到CSP的消息传递样式。而采用CSP理论的语言也有,可是基本都没有获得普遍的采用。


直到Go语言出现,正式将CSP的原则归入到核心原则,并提供了通讯的原语支持channel。正由于如此,并发被认为是Go语言的优点之一。并让Go语言在分布式系统、云原生系统和系统中间件中迅速占领了市场。而其余语言基于共享内存的并发模型,在大型和复杂系统中变得很难正确使用。


固然Go还有其局限性,由于CSP的理解成本问题,Go同时也支持传统的加锁方式,也支持共享内存的方式。不过Go已经向其余语言证实CSP的可行性和优越处。而且提出了经典的CSP核心概念:

Do not communicate by sharing memory; instead, share memory by communicating.安全


“不要以共享内存的方式来通讯,相反,要经过通讯来共享内存。”微信


而因为Go语言的推广和效果,使得CSP的概念变得流行起来,目前不少语言在尝试将CSP归入到语言体系中并提供对Hoare提出原语的支持。


参考连接数据结构


  • 计算机科学名人堂:Charles Antony Richard Hoare:架构

    http://wap.sciencenet.cn/blog-1225851-839515.html并发

  • Go语言CSP:通讯顺序进程简述:编程语言

    https://tsov.net/uupee/17044/

  • CSP 1978论文:

    https://spinroot.com/courses/summer/Papers/hoare_1978.pdf?__cf_chl_captcha_tk__=637000f92bddaa467d97d4404b8c86d40e787bda-1590473325-0-AfwfleSjOLTLNc9NlYQOaERH30eugvvD_pZCpJQp1BuLY7h8FMzdU-1g6gibzt0oPufEBr6ny7EMfaDuavQM9RoUnT5c1kqmUsycipyMJOPCp7-be5mLk7qFSZZm0dWcHb2HuOTkKQpAdCMgqSC4mBSfZ8UvZWjJ3v6kFE6MfP3BnQBtubXk88o3Twg3k8pd8W7xECjsYgSeyLB3xxq9y4-cpagfl0piK4i9QA00A2-Vm5usNU_WVevL5u-tepVkPdZpm8WQITYmKVeU_dTsBWv7Gpal-a1qATffyGGhAweQWYoDSpoO6uj8get5D_7cGe6jkzJEXaq04kHOABe9Us9BKs6qNOV7lE-Xdk7q1EKV



本文分享自微信公众号 - 雨夜随笔(yuye_suibi)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索