事件回顧
?上周,谷歌Go語(yǔ)言項(xiàng)目負(fù)責(zé)人Steve Francia宣布辭去職務(wù),而他給出理由是:Go項(xiàng)目的工作停滯不前,讓他感到難受。有意思的是,部分國(guó)內(nèi)的Gopher(Go語(yǔ)言愛(ài)好者的自稱)對(duì)Go語(yǔ)言也產(chǎn)生了新想法。比如,國(guó)內(nèi)第一批Go語(yǔ)言愛(ài)好者之一的柴樹(shù)杉、全球Go貢獻(xiàn)者榜上長(zhǎng)期排名TOP 50的史斌等Gopher,他們決定以Go語(yǔ)言為藍(lán)本,發(fā)起新的編程語(yǔ)言:凹語(yǔ)言?(凹讀音“Wa”)。
目前凹語(yǔ)言?的代碼已經(jīng)在Github開(kāi)源,并且提供了簡(jiǎn)單可執(zhí)行的示例。根據(jù)其倉(cāng)庫(kù)的介紹,凹語(yǔ)言?的設(shè)計(jì)目標(biāo)有以下幾個(gè):1、披著Go和Rust語(yǔ)法外衣的C++語(yǔ)言2、凹語(yǔ)言?源碼文件后綴為.wa3、凹語(yǔ)言?編譯器兼容WaGo語(yǔ)法,凹語(yǔ)法與WaGo語(yǔ)法在AST層面一致(二者可生成相同的AST并無(wú)損的互相轉(zhuǎn)換)4、凹語(yǔ)言?支持中文/英文雙語(yǔ)關(guān)鍵字,即任一關(guān)鍵字均有中文版和英文版,二者在語(yǔ)法層面等價(jià)
凹語(yǔ)言?示意,圖片來(lái)源@GitHub
據(jù)柴樹(shù)杉、史斌等人的說(shuō)法,Go語(yǔ)言“克制”的風(fēng)格是他們對(duì)編程語(yǔ)言審美的最大公約數(shù)。因此,凹語(yǔ)言?項(xiàng)目啟動(dòng)時(shí)大量借鑒了Go的設(shè)計(jì)思想和具體實(shí)現(xiàn)。
當(dāng)然,他們也表示,選擇Go語(yǔ)言作為初始的藍(lán)本,是在有限投入下不得不作出的折衷。他們希望隨著項(xiàng)目的發(fā)展,積累更多原創(chuàng)的設(shè)計(jì),為自主創(chuàng)新的大潮貢獻(xiàn)一點(diǎn)力量。雖說(shuō)柴樹(shù)杉、史斌等人是資深的Gopher,偏愛(ài)Go語(yǔ)言并不難理解,但我們還是忍不住好奇:究竟Go語(yǔ)言有多神奇,讓他們對(duì)Go語(yǔ)言這么著迷?
為什么選中Go語(yǔ)言
許多使用過(guò)Go語(yǔ)言的開(kāi)發(fā)者對(duì)Go的評(píng)價(jià)上看,Go語(yǔ)言在設(shè)計(jì)上有以下四個(gè)特點(diǎn)。
1、簡(jiǎn)單易用?
不同于那些通過(guò)相互借鑒而不斷增加新特性的主流編程語(yǔ)言(如C++、Java等),Go的設(shè)計(jì)者們?cè)谡Z(yǔ)言設(shè)計(jì)之初就拒絕走語(yǔ)言特性融合的道路,而選擇了“做減法”。
他們把復(fù)雜留給了語(yǔ)言自身的設(shè)計(jì)和實(shí)現(xiàn),留給了Go核心開(kāi)發(fā)組,而將簡(jiǎn)單、易用和清晰留給了廣大使用Go語(yǔ)言的開(kāi)發(fā)者。因此,Go語(yǔ)言呈現(xiàn)出:
- 簡(jiǎn)潔、常規(guī)的語(yǔ)法(不需要解析符號(hào)表),僅有25個(gè)關(guān)鍵字;
- 沒(méi)有頭文件;
- 顯式依賴(package);
- 沒(méi)有循環(huán)依賴(package);
- 常量只是數(shù)字;
- 首字母大小寫(xiě)決定可見(jiàn)性;
- 任何類型都可以擁有方法(沒(méi)有類);
- 沒(méi)有子類型繼承(沒(méi)有子類);
- 沒(méi)有算術(shù)轉(zhuǎn)換;
- 沒(méi)有構(gòu)造函數(shù)或析構(gòu)函數(shù);
- 賦值不是表達(dá)式;
- 在賦值和函數(shù)調(diào)用中定義的求值順序(無(wú)“序列點(diǎn)”概念);
- 沒(méi)有指針?biāo)阈g(shù);
- 內(nèi)存總是初始化為零值;
- 沒(méi)有類型注解語(yǔ)法(如C++中的const、static等)
- ……
2、偏好組合?
C++、Java等主流面向?qū)ο笳Z(yǔ)言,通過(guò)龐大的自上而下的類型體系、繼承、顯式接口實(shí)現(xiàn)等機(jī)制,將程序的各個(gè)部分耦合起來(lái),但在Go語(yǔ)言中我們找不到經(jīng)典面向?qū)ο蟮恼Z(yǔ)法元素、類型體系和繼承機(jī)制。
那Go語(yǔ)言是如何將程序的各個(gè)部分耦合在一起呢?是組合。
在語(yǔ)言設(shè)計(jì)層面,Go使用了正交的語(yǔ)法元素,包括Go語(yǔ)言無(wú)類型體系,類型之間是獨(dú)立的,沒(méi)有子類型的概念;每個(gè)類型都可以有自己的方法集合,類型定義與方法實(shí)現(xiàn)是正交獨(dú)立的。
各類型之間通過(guò)類型嵌入,將已經(jīng)實(shí)現(xiàn)的功能嵌入新類型中,以快速滿足新類型的功能需求。在通過(guò)新類型實(shí)例調(diào)用方法時(shí),方法的匹配取決于方法名字,而不是類型。
另外,通過(guò)在接口的定義中嵌入接口類型來(lái)實(shí)現(xiàn)接口行為的聚合,組成大接口,這種方式在標(biāo)準(zhǔn)庫(kù)中尤為常用,并且已經(jīng)成為Go語(yǔ)言的一種慣用法。
這是Go語(yǔ)言的一個(gè)創(chuàng)新設(shè)計(jì):接口只是方法集合,且與實(shí)現(xiàn)者之間的關(guān)系是隱式的,如此可讓程序各個(gè)部分之間的耦合降至最低。
3、并發(fā)和輕量?
Go語(yǔ)言的三位設(shè)計(jì)者Rob Pike、Robert Griesemer和Ken Thompson曾認(rèn)為C++標(biāo)準(zhǔn)委員會(huì)在思路上是短視的,因?yàn)橛布芸赡茉谖磥?lái)十年內(nèi)發(fā)生重大變化,將語(yǔ)言與當(dāng)時(shí)的硬件緊密耦合起來(lái)是十分不明智的,是沒(méi)法給開(kāi)發(fā)人員在編寫(xiě)大規(guī)模并發(fā)程序時(shí)帶去太多幫助的。
因而他們把將面向多核、原生內(nèi)置并發(fā)支持作為新語(yǔ)言的設(shè)計(jì)原則之一。
Go語(yǔ)言原生支持并發(fā)的設(shè)計(jì)哲學(xué)體現(xiàn)在下面兩點(diǎn)。
(1)Go語(yǔ)言采用輕量級(jí)協(xié)程并發(fā)模型,使得Go應(yīng)用在面向多核硬件時(shí)更具可擴(kuò)展性。(2)Go語(yǔ)言為開(kāi)發(fā)者提供的支持并發(fā)的語(yǔ)法元素和機(jī)制。
4、面向工程?
Go語(yǔ)言的設(shè)計(jì)者在Go語(yǔ)言最初設(shè)計(jì)階段,就將解決工程問(wèn)題作為Go的設(shè)計(jì)原則之一,進(jìn)而考慮Go語(yǔ)法、工具鏈與標(biāo)準(zhǔn)庫(kù)的設(shè)計(jì),這也是Go與那些偏學(xué)院派、偏研究性編程語(yǔ)言在設(shè)計(jì)思路上的一個(gè)重大差異。
這讓Go語(yǔ)言的規(guī)范足夠簡(jiǎn)單靈活,有其他語(yǔ)言基礎(chǔ)的程序員都能迅速上手。更重要的是Go自帶完善的工具鏈,大大提高了團(tuán)隊(duì)協(xié)作的一致性。比如Gofmt自動(dòng)排版Go代碼,很大程度上杜絕了不同人寫(xiě)的代碼排版風(fēng)格不一致的問(wèn)題。把編輯器配置成在編輯存檔的時(shí)候自動(dòng)運(yùn)行Gofmt,這樣在編寫(xiě)代碼的時(shí)候可以隨意擺放位置,存檔的時(shí)候自動(dòng)變成正確排版的代碼。此外還有Gofix,Govet等非常有用的工具。
總之,Go在語(yǔ)言層面的簡(jiǎn)單讓Go收獲了不遜于C++/Java等的表現(xiàn)力的同時(shí),還獲得了更好的可讀性、更高的開(kāi)發(fā)效率等在軟件工程領(lǐng)域更為重要的元素。
凹語(yǔ)言?的未來(lái)
雖然今天,Go憑借其優(yōu)越的性能,已經(jīng)成為主流編程語(yǔ)言之一(超過(guò)75%的CNCF項(xiàng)目,包括Kubernetes和Istio,都是用Go編寫(xiě)的,另外,Go也是主要的云應(yīng)用程序語(yǔ)言之一),Go語(yǔ)言在中國(guó)也相當(dāng)受歡迎,但我們還是不禁擔(dān)心脫胎于Go的凹語(yǔ)言?,會(huì)有美好的未來(lái)嗎?
預(yù)測(cè)未來(lái)從來(lái)都是困難的,不過(guò),好在凹語(yǔ)言?的前面有一個(gè)先行者——Go+語(yǔ)言,我們不妨基于Go+的發(fā)展,來(lái)大致推測(cè)凹語(yǔ)言?的未來(lái)。
Go+是七牛云CEO許式偉發(fā)明的編程語(yǔ)言,于2020年7月正式發(fā)布,2021年10月推出1.0版本,目前最新發(fā)布版本是今年6月13日發(fā)布的1.1版本。也就是說(shuō),從正式發(fā)布到現(xiàn)在,經(jīng)過(guò)近兩年的時(shí)間,Go+還處于初始階段,距離大規(guī)模應(yīng)用還有一定距離,那么可以預(yù)見(jiàn),凹語(yǔ)言?在未來(lái)相當(dāng)長(zhǎng)的時(shí)間里,不會(huì)進(jìn)入廣大開(kāi)發(fā)者的視野中。
另外,據(jù)ECUG Con 2022大會(huì)上許式偉發(fā)表的看法,雖然大家都比較看重編程語(yǔ)言的性能,但單從性能來(lái)看的話,許式偉認(rèn)為Python在腳本語(yǔ)言里面只能算二流,Python其實(shí)并不快。在許式偉看來(lái),對(duì)新生的語(yǔ)言來(lái)說(shuō),最重要它選擇的目標(biāo)人群。
Go+選擇的目標(biāo)人群是全民,許式偉稱其為“連兒童也能掌握的語(yǔ)言”,因而Go+從工程與STEM教育的一體化開(kāi)始奠定用戶基礎(chǔ)。
正是Go+的這幾個(gè)特性,讓一部分開(kāi)發(fā)者看好Go+的未來(lái)。而對(duì)Go+的正向預(yù)期,會(huì)成為Go+進(jìn)一步發(fā)展的助力。
對(duì)凹語(yǔ)言?來(lái)說(shuō),這個(gè)道理也是適用的:凹語(yǔ)言?的發(fā)展重點(diǎn)可能不在于性能,而在于其選擇哪些人群作為目標(biāo)受眾,以及通過(guò)何種方式獲得種子用戶。
如果日后凹語(yǔ)言?的項(xiàng)目方會(huì)公布這些消息,那么凹語(yǔ)言?的未來(lái)還是可以期待的。