Go 之父:聊聊我眼中的 Go 语言和环境
大家好,我是煎魚。
之前春節(jié)假期,在家閉關(guān)多日。看到了在 2021 年 6 月 Go 語言之父 Rob Pike 在 UNSW Computing(悉尼新南威爾士大學(xué)計(jì)算機(jī))組織的分享會(huì)議,介紹了他對(duì)現(xiàn)在 Go 編程語言和環(huán)境的一些看法。
今天煎魚結(jié)合大佬的演講《The Go Programming Language and Environment》和一點(diǎn)個(gè)人理解給大家分享一波,包含 Go 發(fā)展、生態(tài)、看法等多方面知識(shí)。
Go 怎么樣
Rob Pike 表示其實(shí) Go 目前還不能算做主流語言,但是在全世界的影響力和發(fā)展都大大的超出了預(yù)期。
像在國內(nèi)的我們,能夠很明顯感知到,Go 在近 3~5 年的用戶群體不斷增大。我早年在 Segmentfault 上發(fā)文章,過了 1~2 周,我的 Go 文章,也還在第一頁的前幾位,發(fā)文的人比較稀少,但現(xiàn)在人非常多了。
大家會(huì)發(fā)現(xiàn),Go 并不是那種非常 “有趣” 的語言,在技術(shù)上(語言理論、設(shè)計(jì))幾乎沒有什么大進(jìn)步。當(dāng)然,這也不是 Go 核心團(tuán)隊(duì)的設(shè)計(jì)目標(biāo)。
但就是這么一門語言,他主導(dǎo)了大部分 CNCF 中的項(xiàng)目,例如:K8s、Docker 等,特別牛。Go 是云基礎(chǔ)設(shè)施的語言,這是怎么發(fā)生的?
Go 為什么成功
Go 從一門無人問津的語言,到現(xiàn)在承擔(dān)了各云基礎(chǔ)設(shè)施的核心,變得很重要,也是一種成功實(shí)踐。
Rob Pike 認(rèn)為成功的因素有如下:
Rob Pike 在 Google 工作時(shí),當(dāng)時(shí)遇到了上述 PPT 截圖中的許多問題,像是:軟件規(guī)模、長期兼容性、應(yīng)用構(gòu)建緩慢等許多方面。
核心觀點(diǎn):一門編程語言的成功取決于其他很多方面,Go 語言是面向軟件開發(fā)的,而不僅僅只是編程。
為此,Go 就是為了解決軟件開發(fā)而生,而非只是編程,這是成功的關(guān)鍵因素。
Go 要解決的難題
他們遇到的一個(gè)大問題就是 Scale(規(guī)模),規(guī)模又分為了 3 大塊問題。
分別是:
并發(fā)(Concurrency)。
工程(Engineering)。
依賴(Dependencies)。
并發(fā)
在 2007 年,軟件規(guī)模的擴(kuò)大的情況下,Google 的生產(chǎn)集群出現(xiàn)了多核 CPU。
當(dāng)時(shí)沒有成熟的主流語言可以將多核全部正確使用,導(dǎo)致 Google 即使擁有這些龐大的計(jì)算集群,硬件資源的利用率也非常低。
線程模型和庫很神秘,很復(fù)雜,很困難。由于環(huán)境的要求,生產(chǎn)代碼中不被允許使用線程,而是啟動(dòng)多個(gè)二進(jìn)制文件。
工程
Google 在軟件開發(fā)上采取的是 Menorepo 的單倉庫分包的模式,因此會(huì)有成千上萬的程序員在同一個(gè)代碼庫中工作,每天都有數(shù)不清的變化。
但是當(dāng)時(shí)用的都是 C++、Java 等這類語言,太難自動(dòng)化和分析,很難帶來工具的幫助。
依賴
軟件規(guī)模下的大量依賴,給 Google 帶來了很大的麻煩。
Java 和 C++的開發(fā)速度很慢,C++ 代碼的每一個(gè)字節(jié)都變成了 2000 個(gè)字節(jié)。
沒有辦法知道依賴性是否是必要的,感覺是很糟糕的。
Go 初始特性
Go 的大部分核心特性,其實(shí)是大佬們?cè)?2007 年 9 月的一個(gè)下午,在白板上畫了草圖和討論出的。
如下:
語法、語義。
并發(fā)性。
封裝。
垃圾回收。
工具化。
自動(dòng)化,包括格式化。
接口化
在日常的 Go 程序(標(biāo)準(zhǔn)庫、第三方庫、應(yīng)用程序等)中,存在著許多微小的接口,可以讓我們做許多的事情,像是寫入圖片都可以寫入到任意地方。
這種接口化,也就是常說的鴨子類型(duck typing):像鴨子走路,像鴨子叫(長得像鴨子),那么就是鴨子。
構(gòu)成了 Go 的應(yīng)用文化。
類型支持
在類型設(shè)計(jì)上,Go 與其他編程語言有著很根本的一個(gè)差異,那就是不能不同類型混合在一起做運(yùn)算操作:
要跨類型的話,必須做顯示轉(zhuǎn)換,不存在明確的隱式轉(zhuǎn)換。
并發(fā)
Go 要用協(xié)程做并發(fā)、并行等動(dòng)作,非常方便,不需要幾行代碼。
普通的工程師都能上手:
這是一個(gè)很重要的殺手級(jí)特性和賣點(diǎn)。
安全性
在設(shè)計(jì)時(shí),Go 對(duì)安全性考慮了許多。一般來講,是沒法做一些不安全的事情,但硬要做,就必須引用 unsafe 的庫:
使用 Go 會(huì)比 C/C++ 簡單許多,既安全又省心。如果出現(xiàn)了 unsafe 的引用,就能明確知道這個(gè)程序是 “不安全” 的。
完整性
Go 基于前面所提到的接口化,面向網(wǎng)絡(luò)、密碼學(xué)、文本處理、格式化 IO 等實(shí)現(xiàn)了一系列的核心基礎(chǔ)庫:
主體指的是 Go 把常用的都覆蓋全了,非常高效全面。
一致性
跨系統(tǒng)的編譯,只需要稍微調(diào)整 2 個(gè)環(huán)境變量,就可以在 A 系統(tǒng)打出 B 系統(tǒng)能運(yùn)行的二進(jìn)制文件,并且行為一致,也不用擔(dān)心垃圾回收。
Rob Pike 還介紹了自己平時(shí)都是在 MacOS 下開發(fā),會(huì)經(jīng)常打一個(gè) Linux 的二進(jìn)制文件部署到服務(wù)器上去運(yùn)行,非常方便。
兼容性
Go 在 2012 年發(fā)布 Go1.0 起,就起草了一份 Go1 兼容性保障的文檔,以此作為對(duì)用戶的承諾。將在 Go1 內(nèi)不會(huì)出現(xiàn)破壞性修改,你 10 年前的代碼能跑,10 年后也能跑,非常舒服。
從現(xiàn)在來看,也是做到了。
開發(fā)工具
配套的 Go 開發(fā)者工具,是具有標(biāo)準(zhǔn)化的,不像某些語言左一個(gè)右一個(gè)的,非常混亂。
Go 工具鏈都是 go build、go fmt 等模式。
依賴庫
官方有大量的標(biāo)準(zhǔn)庫提供,用戶可以自定義第三方庫。依賴的管理方式是非集中式的,可以在每個(gè)人的 URL(例如:GitHub 等),不存在搶占注冊(cè)的風(fēng)險(xiǎn)。
有一點(diǎn)遺憾的是,在早期庫依賴時(shí),理論上但就應(yīng)該包含模塊的依賴管理。但當(dāng)時(shí)沒有做到,現(xiàn)在有了,也算是 OK 了。
主題
如果希望把 Go 這門語言的生態(tài)系統(tǒng)做起來,就要在社區(qū)中運(yùn)轉(zhuǎn),能夠讓其他人做出貢獻(xiàn)。
這里最常見的就是 IDE 的各種 Go 插件,以及平時(shí)我們正在使用的第三方庫,他人開發(fā)的工具等,都可以拿來就用。
文化
Go 社區(qū)文化的構(gòu)建,本質(zhì)上 Go 現(xiàn)在作為云原生應(yīng)用的基礎(chǔ),構(gòu)建了現(xiàn)代的云環(huán)境,是由社區(qū)主動(dòng)發(fā)起的。
共同維護(hù)更美好的愿景,一種安全、兼容、可移植性和可讀性的文化。
總結(jié)
在設(shè)計(jì)一門語言時(shí),不單單只是設(shè)計(jì)他,必須要培養(yǎng)他,把其身邊的生態(tài)系統(tǒng)都做起來,讓他變得繁榮。
像是 Go,快速、高效、可移植性、部署簡單、長期兼容、簡單抽象、好用工具、容易測(cè)試、容易自動(dòng)化、很好用的依賴庫等。這些東西共同構(gòu)成了他的文化,也會(huì)使他做的更好。
Rob Pike 表示:Go 是關(guān)于軟件開發(fā)的,而不僅僅是編程,這是 Go 的核心精神和理念。
一些交流
泛型:之所以一開始沒有放進(jìn)特性里,是因?yàn)椴恢涝趺磿?huì)對(duì)他感到不舒服,不確定性極高。但經(jīng)過 10+ 年的努力,現(xiàn)在已經(jīng)有了一個(gè)基本設(shè)計(jì)和模型,很有可能會(huì)打破一切,Rob Pike 也非常好奇后續(xù)的效果。
聲明變量:當(dāng)前聲明的方式比較多,甚至有想砍掉一些。
Channel:認(rèn)真的嘗試過把 channel 和 network 協(xié)作,但是一直沒有找到好的辦法。
GOPATH:Go1.14 以前,會(huì)是 GOPATH 的原因,是因?yàn)閹讉€(gè)開發(fā)者確實(shí)是在 Google 工作,Google 采取的是 Menorepo 的模式,沒有分布式模型的原生態(tài)。
參考
The Go Programming Language and Environment
關(guān)注煎魚,獲取業(yè)內(nèi)第一手消息和知識(shí) 👇
你好,我是煎魚,出版過 Go 暢銷書《Go 語言編程之旅》,再到獲得 GOP(Go 領(lǐng)域最有觀點(diǎn)專家)榮譽(yù),點(diǎn)擊藍(lán)字查看我的出書之路。
日常分享高質(zhì)量文章,輸出 Go 面試、工作經(jīng)驗(yàn)、架構(gòu)設(shè)計(jì),加微信拉讀者交流群,和大家交流!
總結(jié)
以上是生活随笔為你收集整理的Go 之父:聊聊我眼中的 Go 语言和环境的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算密集型服务 性能优化实战始末
- 下一篇: IO 密集型服务 性能优化实战记录