Golang橫空出世的背景(為什麼選擇Go)

  • 2019 年 10 月 11 日
  • 筆記

前言

起源及演進

最近十年來,C/C++在計算領域沒有很好得到發展,並沒有新的系統程式語言出現。對開發程度和系統效率在很多情況下不能兼得。要麼執行效率高,但低效的開發和編譯,如C++;要麼執行低效,但擁有有效的編譯,如.NET、Java;所以需要一種擁有較高效的執行速度、編譯速度和開發速度的程式語言,Go就橫空出世了。

go是一個Google公司推出的一個開源項目(系統開發語言),它是基於編譯、垃圾收集和並發的程式語言。並將其開源並在BSD許可證下發行。

Go最初的設計由Robert Griesemer,Rob Pike 和Ken Thompson在2007年9月開始的,官方的發布是在2009年11月。2010年5月由Rob Pike公開的將其運用於google內部的一個後台系統。目前在google App Engine也支援go語言(目前僅支援三種:Java、Python和Go)

Go可以運行在Linux, Mac OS X, FreeBSD, OpenBSD, Plan 9 和 Microsof windows系統上,同時也支援多種處理器架構:I386, AMD64和ARM

(註:官方網站: http://golang.org

Robert Griesemer:曾協助製作Java的HotSpot編譯器和Chrome瀏覽器的JavaScript引擎V8

Rob Pike:曾是貝爾實驗室的Unix團隊和Plan9作業系統計劃成員,與Thompson工同創造了UTF-8字元編碼

Ken Thompson:是C語言和Unix的創造者。(1983年圖靈獎和1988國家技術獎)

他們對系統程式語言、作業系統和並發有很深的理解。

主要特點

  • Go被設計為21世紀的C語言,它屬於C語言家族,比如:C/C++、Java和C#,同時它吸收了很多現在程式語言的優點。
    • 對Go的並發機制是源於CSP(Communication Sequential Processes),這同樣的機制也被於Erlang。
    • 對C、C++相比,其語法得到了很大程式上的簡化,使程式碼更簡明、清楚,同時擁有動態語言的一些特點
  • 基於BSD完全開源,所以能免費的被任何人用於適合商業目的。
  • 語言層面對並發的支援(goroutine:獨立於OS的執行緒,所以多個goroutine可以運行在一個OS的執行緒里,也可以分布到多個OS執行緒里。goroutine是從OS執行緒上抽象出來的一個輕量級的基於CSP的協程)
    • 在語言層面加入對並發的支援,而不是以庫的形式提供
    • 更高層次的並發抽象,而不是直接暴露OS的並發機制.
    • 多個goroutine間是並行的。
    • 底層混合使用非阻塞IO和執行緒
  • 主要目的
    • 融合效率、速度和安全的強類型的靜態編譯語言,同時能夠容易的進行編程,讓編程變得更有樂趣。
    • 較少的關鍵字和簡潔的語法
    • 類型安全和記憶體安全:在指針類型,但不允許對指針進行操作。
    • 支援網路通訊、並發控制、並行計算和分散式計算。
    • 在語言層面實現對多處理器(或多核)進行編程
  • 內嵌運行時反射機制。
  • 可以集成C語言實現的庫
  • 它不是傳統意義上的面向對象語言(沒有類的概念),但它有介面(interface),由此實現多態特性。
  • 函數(Function)是它的基本構成單元(也可以叫著面向函數的程式設計語言)
  • 是一種靜態類型和安全的語言,將其編譯、連接成本地程式碼(擁有高效的執行效率)
  • 支援交叉編譯,並採用編譯的編碼:UTF-8

應用領域

它最初的構想是作為一個系統程式語言,但目前也被用於像Web Server,存儲架構等這類分散式、高並發系統中。當然也可以用於一般的文字處理和作為腳本程式。

Go的編譯器作為Native Client被內嵌到Chrome瀏覽器中,可以被Web應用程式用來執行本地程式碼;同時Go也可以運行在Intel和ARM的處理器上。

目前已被Google集成到Google APP Engine中,在基於Google App Engine基礎設施的Web應用中也得到了很好的應用。目前GAE中僅支援三種應用程式開發語言:Java、Python和Go。(註:GAE的鏈接)

但不適合應用到對實時性要求很高的系統中,因為Go的記憶體模型是基於垃圾回收機制和原子記憶體分配。

目前缺少的一些特性

目前Go對OO中涉及到的一些特點還沒有很好的支援,但可能會在以後進一步完善。

  • 沒有函數和操作符的重載
  • 不支援隱式類型轉換, 避免產生Bug和迷惑。
  • 不支援類和繼承。
  • 不支援動態程式碼載入
  • 不支援動態庫
  • 不支援泛型

總結

Go語言的主要特點

  • 強調簡單、易學
  • 記憶體管理和語法簡單
  • 快速編譯
  • 並發支援
  • 靜態類型
  • 部署簡單(go install)
  • 自身就是文檔(通過godoc將程式碼中的注釋資訊構造成文檔)
  • 開源免費(BSD licensed)