免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

Go 會接替 Java,成為下一個企業級編程語言嗎?

2021-02-17    分類: 網站建設

基于現實經驗

Go 是由經驗豐富的軟件行業老手一手創建的,長期以來,他們對現有語言的各種缺點有過切身體會的痛苦經歷。幾十年前,Rob Pike 和 Ken Thompson 在 Unix、C 和 Unicode 的發明中起到了重要作用。Robert Griensemer 在為 JavaScript 和 Java 開發 V8 和 HotSpot 虛擬機之后,在編譯器和垃圾收集方面擁有數十年的經驗。有太多次,他們不得不等待 Google 規模的 C++/Java 代碼庫進行編譯。于是,他們開始著手創建新的編程語言,將他們半個世紀以來的編寫代碼所學到的一切經驗包含進去。

專注于大型工程

小型工程項目幾乎可以用任何編程語言來成功構建。當成千上萬的開發人員在數十年的持續時間壓力下,在包含數千萬行代碼的大型代碼庫上進行協作時,就會發生真正令人痛苦的問題。這樣會導致一些問題,如下:

  • 較長的編譯時間導致中斷開發。
  • 代碼庫由幾個人 / 團隊 / 部門 / 公司所擁有,混合了不同的編程風格。
  • 公司雇傭了數千名工程師、架構師、測試人員、運營專家、審計員、實習生等,他們需要了解代碼庫,但也具備廣泛的編碼經驗。
  • 依賴于許多外部庫或運行時,其中一些不再以原始形式存在。
  • 在代碼庫的生命周期中,每行代碼平均被重寫 10 次,被弄得千瘡百痍,而且還會發生技術偏差。
  • 文檔不完整。

Go 注重減輕這些大型工程的難題,有時會以使小型工程變得更麻煩為代價,例如,代碼中到處都需要幾行額外的代碼行。

注重可維護性

Go 強調盡可能多地將工作轉給自動化的代碼維護工具中。Go 工具鏈提供了最常用的功能,如格式化代碼和導入、查找符號的定義和用法、簡單的重構以及代碼異味的識別。由于標準化的代碼格式和單一的慣用方式,機器生成的代碼更改看起來非常接近 Go 中人為生成的更改并使用類似的模式,從而允許人機之間更加無縫地協作。

保持簡單明了

初級程序員為簡單的問題創建簡單的解決方案。高級程序員為復雜的問題創建復雜的解決方案。偉大的程序員找到復雜問題的簡單解決方案。——Charles Connell

讓很多人驚訝的一點是,Go 居然不包含他們喜歡的其他語言的概念。Go 確實是一種非常小巧而簡單的語言,只包含正交和經過驗證的概念的最小選擇。這鼓勵開發人員用最少的認知開銷來編寫盡可能簡單的代碼,以便許多其他人可以理解并使用它。

使事情清晰明了

良好的代碼總是顯而易見的,避免了那些小聰明、難以理解的語言特性、詭異的控制流和兜圈子。

許多語言都致力提高編寫代碼的效率。然而,在其生命周期中,人們閱讀代碼的時間卻遠遠超過最初編寫代碼所需的時間(100 倍)。例如,審查、理解、調試、更改、重構或重用代碼。在查看代碼時,往往只能看到并理解其中的一小部分,通常不會有完整的代碼庫概述。為了解釋這一點,Go 將所有內容都明確出來。

錯誤處理就是一個例子。讓異常在各個點中斷代碼并在調用鏈上冒泡會更容易。Go 需要手動處理和返回每個錯誤。這使得它可以準確地顯示代碼可以被中斷的位置以及如何處理或包裝錯誤。總的來說,這使得錯誤處理編寫起來更加繁瑣,但是也更容易理解。

簡單易學

Go 是如此的小巧而簡單,以至于人們可以在短短幾天內就能研究通整個語言及其基本概念。根據我們的經驗,培訓用不了一個星期(相比于掌握其他語言需要幾個月),初學者就能夠理解 Go 專家編寫的代碼,并為之做出貢獻。為了方便吸引更多的用戶,Go 網站提供了所有必要的教程和深入研究的文章。這些教程在瀏覽器中運行,允許人們在將 Go 安裝到本地計算機上之前就能夠學習和使用 Go。

解決之道

Go 強調的是團隊之間的合作,而不是個人的自我表達。

在 Go(和 Python)中,所有的語言特性都是相互正交和互補的,通常有一種方法可以做一些事情。如果你想讓 10 個 Python 或 Go 程序員來解決同一個問題,你將會得到 10 個相對類似的解決方案。不同的程序員在彼此的代碼庫中感覺更自在。在查看其他人的代碼時,國罵會更少,而且人們的工作可以更好地融合在一起,從而形成了一致的整體,人人都為之感到自豪,并樂于工作。這還避免了大型工程的問題,如:

  • 開發人員認為良好的工作代碼很“混亂”,并要求在開始工作之前進行重寫,因為他們的思維方式與原作者不同。
  • 不同的團隊成員使用不同的語言子集來編寫相同代碼庫的部分內容。


簡單、內置的并發性

Go 專為現代多核硬件設計。

目前使用的大多數編程語言(Java、JavaScript、Python、Ruby、C、C++)都是 20 世紀 80 年代到 21 世紀初設計的,當時大多數 CPU 只有一個計算內核。這就是為什么它們本質上是單線程的,并將并行化視為邊緣情況的馬后炮。通過現成和同步點之類的附加組件來實現,而這些附加組件既麻煩又難以正確使用。第三方庫雖然提供了更簡單的并發形式,如 Actor 模型,但是總有多個可用選項,結果導致了語言生態系統的碎片化。今天的硬件擁有越來越多的計算內核,軟件必須并行化才能高效運行。Go 是在多核處理器時代編寫的,并且在語言中內置了簡單、高級的 CSP 風格并發性。

面向計算的語言原語

就深層而言,計算機系統接收數據,對其進行處理(通常要經過幾個步驟),然后輸出結果數據。例如,Web 服務器從客戶端接收 HTTP 請求,并將其轉換為一系列數據庫或后端調用。一旦這些調用返回,它就將接收到的數據轉換成 HTML 或 JSON 并將其輸出給調用者。Go 的內置語言原語直接支持這種范例:

  • 結構表示數據
  • 讀和寫代表流式 IO
  • 函數過程數據
  • goroutines 提供(幾乎無限的)并發性
  • 在并行處理步驟之間傳輸管道數據

因為所有的計算原語都是由語言以直接形式提供的,因此 Go 源代碼更直接地表達了服務器執行的操作。

OO?—?好的部分


更改基類中的某些內容的副作用

面向對象非常有用。過去幾十年來,面向對象的使用富有成效,并讓我們了解了它的哪些部分比其他部分能夠更好地擴展。Go 在面向對象方面采用了一種全新的方法,并記住了這些知識。它保留了好的部分,如封裝、消息傳遞等。Go 還避免了繼承,因為它現在被認為是有害的,并為組合提供了的支持。

現代標準庫

目前使用的許多編程語言(Java、JavaScript、Python、Ruby)都是在互聯網成為當今無處不在的計算平臺之前設計的。因此,這些語言的標準庫只提供了相對通用的網絡支持,而這些網絡并沒有針對現代互聯網進行優化。Go 是十年前創建的,當時互聯網已全面發展。Go 的標準庫允許在沒有第三方庫的情況下創建更復雜的網絡服務。這就避免了第三方庫的常見問題:

  • 碎片化:總是有多個選項實現相同的功能。
  • 膨脹:庫常常實現的不僅僅是它們的用途。
  • 依賴地獄:庫通常依賴于特定版本的其他庫。
  • 未知質量:第三方代碼的質量和安全性可能存在問題。
  • 未知支持:第三方庫的開發可能隨時停止支持。
  • 意外更改:第三方庫通常不像標準庫那樣嚴格地進行版本控制。

關于這方面更多的信息請參考 Russ Cox 提供的資料:https://research.swtch.com/deps

標準化格式

Gofmt 的風格沒有人會去喜歡,但人人都會喜歡 gofmt。——Rob Pike

Gofmt 是一種以標準化方式來格式化 Go 代碼的程序。它不是最漂亮的格式化方式,但卻是最簡單、最不令人生厭的格式化方式。標準化的源代碼格式具有驚人的積極影響:

  1. 集中討論重要主題:?它消除了圍繞制表符和空格、縮進深度、行長、空行、花括號的位置等一系列爭論。
  2. 開發人員在彼此的代碼庫中感覺很自在,?因為其他代碼看起來很像他們編寫的代碼。每個人都喜歡自由地按照自己喜歡的方式進行格式化代碼,但如果其他人按照自己喜歡的方式格式化了代碼,這么做很招人煩。
  3. 自動代碼更改并不會打亂手寫代碼的格式,例如引入了意外的空白更改。

許多其他語言社區現在正在開發類似 gofmt 的東西。當作為第三方解決方案構建時,通常會有幾個相互競爭的格式標準。例如,JavaScript 提供了 Prettier 和 StandardJS。這兩者都可以用,也可以只使用其中的一個。但許多 JS 項目并沒有采用它們,因為這是一個額外的決策。Go 的格式化程序內置于該語言的標準工具鏈中,因此只有一個標準,每個人都在使用它。

快速編譯


對于大型代碼庫來說,它們長時間的編譯是促使 Go 誕生的原因。Google 主要使用的是 C++ 和 Java,與 Haskell、Scala 或 Rust 等更復雜的語言相比,它們的編譯速度相對較快。盡管如此,當編譯大型代碼庫時,即使是少量的緩慢也會加劇編譯的延遲,從而激怒開發人員,并干擾流程。Go 的設計初衷是為了提高編譯效率,因此它的編譯器速度非常快,幾乎沒有編譯延遲的現象。這給 Go 開發人員提供了與腳本類語言類似的即時反饋,還有靜態類型檢查的額外好處。

交叉編譯

由于語言運行時非常簡單,因此它被移植到許多平臺,如 macOS、Linux、Windows、BSD、ARM 等。Go 可以開箱即用地為所有這些平臺編譯二進制文件。這使得從一臺機器進行部署變得很容易。

快速執行

Go 的運行速度接近于 C。與 JITed 語言(Java、JavaScript、Python 等)不同,Go 二進制文件不需要啟動或預熱的時間,因為它們是作為編譯和完全優化的本地代碼的形式發布的。Go 的垃圾收集器僅引入微秒量級的可忽略的停頓。除了快速的單核性能外,Go 還可以輕松利用所有的 CPU 內核。

內存占用小

像 JVM、Python 或 Node 這樣的運行時不僅僅在運行時加載程序代碼,每次運行程序時,它們還會加載大型且高度復雜的基礎架構,以進行編譯和優化程序。如此一來,它們的啟動時間就變慢了,并且還占用了大量內存(數百兆字節)。而 Go 進程的開銷更小,因為它們已經完全編譯和優化,只需運行即可。Go 還以非常節省內存的方式來存儲數據。在內存有限且昂貴的云環境中,以及在開發過程中,這一點非常重要。我們希望在一臺機器上能夠快速啟動整個堆棧,同時將內存留給其他軟件。

部署規模小

Go 的二進制文件大小非常簡潔。Go 應用程序的 Docker 鏡像通常比用 Java 或 Node 編寫的等效鏡像要小 10 倍,這是因為它無需包含編譯器、JIT,以及更少的運行時基礎架構的原因。這些特點,在部署大型應用程序時很重要。想象一下,如果要將一個簡單的應用程序部署到 100 個生產服務器上會怎么樣?如果使用 Node/JVM 時,我們的 Docker 注冊表就必須提供 100 個 docker 鏡像,每個鏡像 200MB,那么一共就需要 20GB。要完成這些部署就需要一些時間。想象一下,如果我們想每天部署 100 次的話,如果使用 Go 服務,那么 Docker 注冊表只需提供 10 個 docker 鏡像,每個鏡像只有 20MB,共只需 2GB 即可。大型 Go 應用程序可以更快、更頻繁地部署,從而使得重要更新能夠更快地部署到生產環境中。

獨立部署

Go 應用程序部署為一個包含所有依賴項的單個可執行文件,并無需安裝特定版本的 JVM、Node 或 Python 運行時;也不必將庫下載到生產服務器上,更無須對運行 Go 二進制文件的機器進行任何更改。甚至也不需要講 Go 二進制文件包裝到 Docker 來共享他們。你需要做的是,只是將 Go 二進制文件放到服務器上,它就會在那里運行,而不用關心服務器運行的是什么。前面所提到的那些,唯一的例外是使用net和os/user包時針對對glibc的動態鏈接。

供應依賴關系

Go 有意識避免使用第三方庫的中央存儲庫。Go 應用程序直接鏈接到相應的 Git 存儲庫,并將所有相關代碼下載(供應)到自己的代碼庫中。這樣做有很多好處:

  • 在使用第三方代碼之前,我們可以對其進行審查、分析和測試。該代碼就和我們自己的代碼一樣,是我們應用程序的一部分,應該遵循相同的質量、安全性和可靠性標準。
  • 無需永久訪問存儲依賴項的各個位置。從任何地方(包括私有 Git repos)獲取第三方庫,你就能永久擁有它們。
  • 經過驗收后,編譯代碼庫無需進一步下載依賴項。
  • 若互聯網某處的代碼存儲庫突然提供不同的代碼,這也并不足為奇。
  • 即使軟件包存儲庫速度變慢,或托管包不復存在,部署也不會因此中斷。

兼容性保證

Go 團隊承諾現有的程序將會繼續適用于新一代語言。這使得將大型項目升級到最新版本的編譯器會非常容易,并且可從它們帶來的許多性能和安全性改進中獲益。同時,由于 Go 二進制文件包含了它們需要的所有依賴項,因此可以在同一服務器上并行運行使用不同版本的 Go 編譯器編譯的二進制文件,而無需進行復雜的多個版本的運行時設置或虛擬化。

文檔

在大型工程中,文檔對于使軟件可訪問性和可維護性非常重要。與其他特性類似,Go 中的文檔簡單實用:

  • 由于它是嵌入到源代碼中的,因此兩者可以同時維護。
  • 它不需要特殊的語法,文檔只是普通的源代碼注釋。
  • 可運行單元測試通常是最好的文檔形式。因此 Go 要求將它們嵌入到文檔中。
  • 所有的文檔實用程序都內置在工具鏈中,因此每個人都使用它們。
  • Go linter 需要導出元素的文檔,以防止“文檔債務”的積累。

商業支持的開源

當商業實體在開放式環境下開發時,那么一些最流行的、經過徹底設計的軟件就會出現。這種設置結合了商業軟件開發的優勢——一致性和精細化,使系統更為健壯、可靠、高效,并具有開放式開發的優勢,如來自許多行業的廣泛支持,多個大型實體和許多用戶的支持,以及即使商業支持停止的長期支持。Go 就是這樣發展起來的。

缺點

當然,Go 也并非好無缺,每種技術選擇都是有利有弊。在決定選擇 Go 之前,有幾個方面需要進行考慮考慮。

未成熟

雖然 Go 的標準庫在支持許多新概念(如 HTTP 2 Server push 等)方面處于行業地位,但與 JVM 生態系統中的第三方庫相比,用于外部 API 的第三方 Go 庫可能不那么成熟。

即將到來的改進

由于清楚幾乎不可能改變現有的語言元素,Go 團隊非常謹慎,只在新特性完全開發出來后才添加新特性。在經歷了 10 年的有意穩定階段之后,Go 團隊正在謀劃對語言進行一系列更大的改進,作為 Go 2.0 之旅的一部分。

無硬實時

雖然 Go 的垃圾收集器只引入了非常短暫的停頓,但支持硬實時需要沒有垃圾收集的技術,例如 Rust。

結語

本文詳細介紹了 Go 語言的一些優秀的設計準則,雖然有的準則的好處平常看起來沒有那么明顯。但當代碼庫和團隊規模增長幾個數量級時,這些準則可能會使大型工程項目免于許多痛苦。總的來說,正是這些設計準則讓 Go 語言成為了除 Java 之外的編程語言里,用于大型軟件開發項目的好選擇。

網站名稱:Go 會接替 Java,成為下一個企業級編程語言嗎?
文章位置:http://m.newbst.com/news39/101539.html

成都網站建設公司_創新互聯,為您提供外貿建站定制網站企業建站移動網站建設云服務器標簽優化

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

網站托管運營