go語言 - 設計哲學

go語言是互聯網時代的語言,融合了衆多互聯網時代程序設計的特徵。

並行與分佈式支持。多核化和集羣化是互聯網時代的典型特徵。

併發執行的“執行體”

執行體是個抽象的概念,在操作系統層面有多個概念與之對應,如操作系統自己掌管的進程(process)、進程內的線程(thread)以及進程內的協程 (coroutine,也叫輕量級線程)。多數語言在語法層面並不直接支持協程,而通過庫的方式支持的協程的功能也並不完整,比如僅僅提供協程的創建、銷燬與切換等能力。如果在這樣的協程中調用一個同步IO操作,比如網絡通信、本地文件讀寫,都會阻塞其他的併發執行協程,從而無法真正達到協程本身期望達到的目標。 Go語言在語言級別支持協程,叫goroutine。Go語言標準庫提供的所有系統調用(syscall)操作,當然也包括所有同步IO操作,都會出讓CPU給其他goroutine,這讓事情變得非常簡單。

go語言異步程序示例:

func run(arg string) { 
    // ...
}
func main() {
    go run("test")
    ... 
}

關於進程、線程、協程的區別可以參考如下幾篇文章:

談談併發編程中的協程
一個“蠅量級” C 語言協程庫
編程中的進程、線程、協程、同步、異步、回調

執行體間的通信

執行體間通信的方式:

  • 執行體之間的互斥與同步
  • 執行體之間的消息傳遞

執行體之間的互斥與同步

當執行體之間存在共享資源(一般是共享內存)時,爲保證內存訪問邏輯的確定性,需要對訪問該共享資源的相關執行體進行互斥。當多個執行體之間 的邏輯存在時序上的依賴時,也往往需要在執行體之間進行同步。

多數語言在庫層面提供了線程間的互斥與同步支持,但卻找不到協程的影子。

執行體之間的消息傳遞

兩種併發編程模型:

  • 共享內存模型
  • 消息傳遞模型

go語言整合了兩種併發編程模型,但其推薦“消息傳遞模型”。其建議適度使用“共享內存模型”。在Go語言中,內置了消息隊列的支持,其叫通道(channel)。兩個goroutine之間可以通過通道來進行交互。

軟件工程支持。工程規模不斷擴大是產業發展的必然趨勢。

隨着工程規模的變大,多數軟件需要多人協作完成。所以編程規範化,對於多人協作編程是非常必要的。

go語言是非常規範化的語言,其規範化主要體現在一下幾個方面:

  • 代碼風格規範
  • 錯誤處理規範
  • 包管理
  • 契約規範(接口)
  • 單元測試規範
  • 功能開發的流程規範

【示例】go語言的錯誤處理規範:

f, err := os.Open(filename) if err != nil {
    log.Println("Open file failed:", err)
    return 
}
defer f.Close()
... // 操作已經打開的f文件

編程哲學的重塑

當今主要的編程範式:

  • 面向過程編程(C)
  • 面向對象編程(C++,Java)
  • 函數式編程(Python)
  • 面向消息編程(Erlang)

如果需要對“函數式編程”有所瞭解,閱讀這篇文章:

函數式編程

go語言對所有這些編程思想做了一次梳理,融合衆家之長,但時刻警惕特性複雜化,極力維持語言特性的簡潔,力求小而精。
例如,Go語言接受了“函數式編程”的一些想法,支持匿名函數與閉包。再如,Go語言接受了以Erlang語言爲代表的“面向消息編程”思想,支持goroutine和通道。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章