自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為什么我放棄了運維必學必會的Python,而選擇了更加高大上的Go?

開發(fā) 后端
在這篇文章中,我將闡述軟硬件發(fā)展的現(xiàn)狀以及為什么我們要學習像 Go 這樣的新語言? 因為如果沒有任何問題,我們就不需要解決方案,不是么?

  “    “Go will be the server language of the future.[1]” — Tobias Lütke, Shopify 

在過去幾年,有一門崛起的新語言:Go 或者 GoLang[2]。沒有什么比一門新的編程語言更令開發(fā)者興奮了,不是么? 因此,我在 4、5 個月之前開始學習 Go。在這里我將告訴你,你為什么也要學習這門新語言。

在這篇文章中,我不打算教你怎樣寫 “Hello World!!”。網(wǎng)上有許多其他的文章會教你。我將闡述軟硬件發(fā)展的現(xiàn)狀以及為什么我們要學習像 Go 這樣的新語言? 因為如果沒有任何問題,我們就不需要解決方案,不是么?

硬件的局限性

摩爾定律[3]正在失效。

英特爾公司在 2004 年推出[4]了第一款具有 3.0 GHz時鐘速度的奔騰 4 處理器。如今,我的 2016款 MacBook Pro[5] 的時鐘速度為 2.9 GHz。因此,差不多十年,原始處理能力都沒有太多的增加。你可以在下圖中看到處理能力的增長與時間的關(guān)系。

從上面的圖表可以看出,單線程的性能和處理器的頻率在近十年幾乎保持穩(wěn)定。如果你認為添加更多的晶體管是一種解決問題的方法,那你就錯了。這是因為在微觀尺度上,量子特性開始顯現(xiàn)(例如:量子隧道穿越),放更多的晶體管代價也會越多(為什么?[6]),而且,每美元可以添加晶體管的數(shù)量也開始下降。

所以,針對上述問題的解決方案如下:

  •  廠商開始向處理器添加越來越多的內(nèi)核。如今,我們已經(jīng)有四核和八核的 CPU 可用。
  •  我們還引入了超線程技術(shù)。
  •  為處理器添加更多的緩存以提升性能。

但是,以上方案也有它們自身的限制。我們無法向處理器添加更多的緩存以提升性能,因為緩存具有物理限制:緩存越大,速度越慢。添加更多的內(nèi)核到處理器也有它的成本。而且,這也無法無限擴展。這些多核處理器能同時運行多個線程,同時也能帶來并發(fā)能力。我們稍后會討論它。

因此,如果我們不能依賴于硬件的改進,唯一的出路就是找到一個高效的軟件來提升性能,但遺憾的是,現(xiàn)代編程語言都不是那么高效。

  “    “現(xiàn)代處理器就像一輛有氮氧加速系統(tǒng)的直線競速賽車,它們在直線競速賽中表現(xiàn)優(yōu)異。不幸的是,現(xiàn)代編程語言卻像蒙特卡羅賽道,它們有大量的彎道。” - David Ungar[7]

Go 有 goroutine?。?/strong>

如上所述,硬件提供商正在向處理器添加更多的內(nèi)核以提升性能。所有的數(shù)據(jù)中心都在這些處理器上運行,我們應(yīng)該期待在未來幾年內(nèi)核數(shù)量的增長。更重要的是,如今的應(yīng)用程序都是使用多個微服務(wù)來維持數(shù)據(jù)庫的連接、消息隊列和緩存的維護。因此,我們開發(fā)的軟件和編程語言可以更容易的支持并發(fā),并且它們應(yīng)該隨著內(nèi)核數(shù)量的增長而可擴展。

但是大多數(shù)現(xiàn)代編程語言(如 Java、Python 等)都來自于 90 年代的單線程環(huán)境。這些語言大多數(shù)都支持多線程。但真正的問題是并發(fā)執(zhí)行,線程鎖、競爭條件和死鎖。這些問題都使得很難在這些語言上創(chuàng)建一個多線程的應(yīng)用程序。

例如,在 Java 中創(chuàng)建新的線程會消耗大量內(nèi)存。因為每一個線程都會消耗大約 1 MB 大小的堆內(nèi)存,如果你運行上千個線程,他們會對堆造成巨大的壓力,最終會由于內(nèi)存不足而宕機。此外,你想要在兩個或者多個線程之間通信也是非常困難的。

另一方面,Go 于 2009 年發(fā)布,那時多核處理器已經(jīng)上市了。這也是為什么 Go 是在考慮并發(fā)的基礎(chǔ)上構(gòu)建的。Go 用 goroutine 來替代線程,它們從堆中消耗了大約 2 KB 的內(nèi)存。因此你可以隨時啟動上百萬個 goroutine。

Goroutine 是怎樣工作的呢?參考:http://golangtutorials.blogspot.in/2011/06/goroutines.html

其他的好處:

  •  Goroutine 具有可增長的分段堆棧,這意味著它只會在需要的時候才會使用更多的內(nèi)存。
  •  Goroutine 比線程啟動的更快。
  •  Goroutine 帶有內(nèi)置原語,可以在它們(通道)之間安全的進行通信。
  •  Goroutine 允許你在共享數(shù)據(jù)結(jié)構(gòu)時避免使用互斥鎖。
  •  此外,goroutine 和系統(tǒng)線程沒有 1:1 的映射。單個 goroutine 能在多個線程上運行。Goroutine 也能被復(fù)用到少量的系統(tǒng)線程上。

   “    你能在 Rob Pike 的優(yōu)秀演講并發(fā)不是并行[8]中獲取更深刻理解。

以上這些點,能使 Go 能像 Java、C 或者 C++ 一樣擁有強大的并發(fā)處理能力,同時在保證并發(fā)執(zhí)行代碼嚴謹性的基礎(chǔ)上,像 Erlang 一樣優(yōu)美。

Go takes good of both the worlds. Easy to write concurrent and efficient to manage concurrency

Go 直接在底層硬件上運行

與其他現(xiàn)代高級語言(如 Java/Python)相比,使用 C、C++ 的最大好處就是它的性能,因為 C/C++ 是編譯型語言而不是解釋型語言。

處理器能理解二進制文件。通常來說,當你編譯一個用 Java 或者其他基于 JVM 的語言構(gòu)建的應(yīng)用程序,它將人類可讀的代碼編譯為字節(jié)代碼,這可以被 JVM 或者在底層操作系統(tǒng)之上運行的其他虛擬機所理解。當執(zhí)行的時候,虛擬機解釋這些字節(jié)碼并且將他們轉(zhuǎn)化為處理器能理解的二進制文件。

基于虛擬機語言的執(zhí)行步驟

而另一個方面,C/C++ 不會在 VM 上執(zhí)行,并且從執(zhí)行周期中刪除(編譯為字節(jié)代碼)這一步提高性能。它直接將人類可讀的代碼編譯為二進制文件。

但是,在這些語言中釋放和分配變量是一件極其痛苦的事情。雖然大部分編程語言都使用垃圾回收器或者引用計數(shù)的算法來處理對象的分配和移除。

Go 做到了兩全其美,Go 像一些低級別的語言(如:C/C++ )一樣是一門編譯型語言,這意味著它的性能幾乎接近于低級別語言,它還用垃圾回收來分配和刪除對象。因此,不再需要 malloc() 和 free() 聲明了!?。∵@太酷了?。?!

用 Go 編寫的代碼易于維護

我告訴你一件事,Go 沒有像其他語言一樣瘋狂于編程語法,它的語法非常整潔。

Go 的的設(shè)計者在谷歌創(chuàng)建這門語言的時候就考慮到了這一點,由于谷歌擁有非常強大的代碼庫,成千上萬的開發(fā)者都工作在相同的代碼庫上,代碼應(yīng)該易于其他開發(fā)者理解,一段代碼應(yīng)該對另一段代碼有最小的影響。這些都會使得代碼易于維護,易于修改。

Go 有意的忽視了許多現(xiàn)代面向?qū)ο笳Z言的一些特性。

  •  沒有類。 所有代碼都僅用 package 分開,Go 只有結(jié)構(gòu)體而不是類。
  •  不支持繼承。 這將使得代碼易于修改。在其他語言中,如:Java/Python,如果類 ABC 繼承類 XYZ 并且你在類 XYZ 中做了一些改動,那么這可能會在繼承類 XYZ 的其他類中產(chǎn)生一些副作用。通過移除繼承,Go 也使得理解代碼變得很容易 (因為當你在看一段代碼時不需要同時查看父類)。
  •  沒有構(gòu)造方法。
  •  沒有注解。
  •  沒有泛型。
  •  沒有異常。

以上這些改變使得 Go 與其他語言截然不同,這使得用 Go 編程與其他語言很不一樣。你可能不喜歡以上的一些觀點。但是,并不是說沒有上述這些特性,你就無法對你的應(yīng)用程序編碼。你要做的就是多寫幾行代碼,但從積極的一面,它將使你的代碼更加清晰,為代碼添加更多的清晰度。

代碼的可讀性和效率的對比

如上圖所示,Go 幾乎與 C/C++ 一樣高效,同時像 Ruby、Python 以及其他一些語言一樣保持代碼語法的簡潔,對于人類和處理器來說,這是一個雙贏的局面?。?!

與 Swift 等這些新的語言不一樣[9],Go 的語法非常穩(wěn)定。自從 2012 年首次公開發(fā)布 1.0 版本以來,它保持不變并且向后兼容。

Go 由谷歌背書

  •  我知道這不是一個直接的技術(shù)優(yōu)勢,但 Go 是由谷歌設(shè)計并支持的,谷歌擁有世界上最大的云基礎(chǔ)設(shè)施之一,并且規(guī)模龐大。谷歌設(shè)計 Go 以解決可擴展性和有效性問題。這些是創(chuàng)建我們自己的服務(wù)器時都會遇到的問題。

結(jié)論

  •  盡管 Go 與其他面向?qū)ο蟮恼Z言非常不同,但他同樣產(chǎn)生了巨大的影響。Go 提供了像 C/C++ 一樣的高性能,像 Java 一樣高效的并發(fā)處理以及像 Python/Perl 一樣的編碼樂趣。
  •  如果你沒有任何學習 Go 的計劃,我將仍然會說硬件的限制會給我們帶來壓力,軟件開發(fā)者應(yīng)該寫超高效的代碼。開發(fā)者應(yīng)該理解硬件并相應(yīng)的優(yōu)化他們的程序。優(yōu)化的軟件能運行在更廉價或者更慢的機器上(例如物聯(lián)網(wǎng)[12]設(shè)備),并且整體上對最終用戶體驗有更好的影響。 

 

責任編輯:龐桂玉 來源: 奇妙的Linux世界
相關(guān)推薦

2018-12-21 11:26:49

MySQLMongoDB數(shù)據(jù)庫

2023-07-23 17:19:34

人工智能系統(tǒng)

2016-09-27 21:25:08

Go語言Ken Thompso

2022-06-14 11:01:48

SpringBootTomcatUndertow

2020-02-13 17:49:55

SpringBoot放棄選擇

2024-06-24 07:58:00

2021-02-01 07:20:51

KafkaPulsar搜索

2020-02-24 09:38:05

PythonGo語言Linux

2018-09-21 13:48:14

IT運維

2021-05-12 10:19:21

CPU程序運維

2019-04-19 11:56:48

框架AI開發(fā)

2020-08-14 10:40:35

RestTemplatRetrofitJava

2020-06-10 09:06:48

MongoDB架構(gòu)高可用

2017-02-27 15:19:04

2012-12-17 15:02:34

Linux操作系統(tǒng)

2023-11-23 15:28:38

2023-09-22 10:48:42

MySQLPostgreSQL

2023-09-14 23:08:54

PostgreSQLMySQL

2019-08-26 09:15:09

設(shè)計技術(shù)人生第一份工作

2017-07-31 19:13:58

白熊視頻技術(shù)創(chuàng)業(yè)在路上程序員
點贊
收藏

51CTO技術(shù)棧公眾號