技术开发 频道

编程语言与并发性之间到底有没有关系?

  【IT168 评论】为什么今天会想到聊编程语言和并发性之间的关系呢?前不久,Python核心开发团队发布了基于Python路线图的四大修复点,IT168企业级也对此进行了具体报道(详情可了解:《全面的4大修复,过早的暴露了Python干掉Java的野心?》),编程语言的更新迭代本是家常便饭,各家粉丝的口水战也是见怪不怪,但有一位网友的评论却激起了千层浪:

编程语言与并发性之间到底有没有关系?

  除了部分嘲讽之外,跟帖的网友中也出现了一些观点分类:

  一部分认为编程语言与并发性之间本质上没有任何关系;

  网友|蘑菇骑士|:并发量跟语言关系不大。

  网友修影无痕:并发多少和语言没有太大的关系吧。cpp支持10亿并发需要1000台服务器,java也许就2000吧。

  网友EmacserVimer:你还需要回炉重造啊!至于为什么我就不解释了!

  一部分认为Java的这种并发性与其虚拟机有关,而虚拟机就是用C和C++编写的!

  网友子子叔:java跑来跑去需要虚拟机,java虚拟机是用什么语言写的你不知道吗?

  网友尼古拉斯晓哲:java底层是用什么实现的?还不是C和C++吗?你用Java做成本要高不知道多少倍好不啦!

  那么,问题来了:编程语言和并发性之间到底有没有关系?可以说一门编程语言在语言层面支持并发性吗?这里的并发性又指什么呢?

  在计算机科学中,并发性(Concurrence)是指在一个系统中,拥有多个计算,这些计算有同时执行的特性,而且他们之间有着潜在的交互。程序员日常讨论的并发性更多的是在操作系统层面而非编程语言层面。

  笔者就此特意询问了阿里内部的资深JVM架构师,他认为,可以说一门编程语言在语言层面支持并发,这种说法是可以的。但并发是一个很广的概念,比如java有并发library:java.util.concurrent,而线程是一个动态的概念,如果说这种并发性是指多线程的话,线程来实现并发也是这样说。上述网友评论中的并发表达的意思更侧重于在同一时间内处理多请求数目的能力,与编程语言本身也就是Java有关,但编程语言之间的并发性似乎不好对比,因为并发性与架构和设计都有很大关系。Java具备并发性,但并不是说其他编程语言做不了,比如Facebook的高并发就不是Java支撑的。

  除了Java之外,还有哪些编程语言支持并发性呢?在某知识问答社区,笔者发现了对Go语言并发性的讨论,同时很多人认为Go语言对并发性的支持是非常不错的,比如:

编程语言与并发性之间到底有没有关系?

  对于语言层面支持并发,这位介绍为“爱写程序的研究员”的网友给出了一个十分有条理的回答:

编程语言与并发性之间到底有没有关系?

  针对上图中提到的Erlang,如果程序员想认真了解,倒不妨看一下《Erlang程序设计2th》一书,这本书以Erlang为例,讲解了编程语言的并发性,或许可以对上述一系列问题进行解答。这本书中有这样一段话:编程语言有两种:顺序和并发。顺序语言被设计用于编写顺序程序,没有描述并发计算的语言结构。并发编程语言被设计用于编写并发程序,语言本身带有表达并发性的特殊结构。这位作者很明显也认同编程语言层面具备并发性的说法,甚至据此将编程语言分为了两类。

  综述

  从上述的多方观点中不难看出,编程语言确实与并发性有一定关系,编程语言层面的并发性这一说法也是合理的。而这种并发性可能是通过库、关键字、特定语法或函数等来实现,但并发性的定义非常广泛,不等同于在同一时间内处理多请求数目的能力。在实际企业应用中,很少直接对比编程语言之间的并发性,并发性可以通过架构设计等来综合体现,企业对一门编程语言的选取往往是结合多方面因素的。(如果想了解阿里对java的运用,推荐阅读:《支撑双11每秒17.5万单事务 阿里巴巴对JVM都做了什么?》)

  所以,广大程序员是否同意上述观点呢?是否认同编程语言与并发性之间的关系呢?

0
相关文章