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