您的位置:首頁>正文

程式設計語言與併發性之間到底有沒有關係?

為什麼今天會想到聊程式設計語言和併發性之間的關係呢?前不久, 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都做了什麼?》)

所以, 廣大程式師是否同意上述觀點呢?是否認同程式設計語言與併發性之間的關係呢?

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示