這是關於一個國產編程語言的故事,在研發 5 年、開源一年的過程中,他們有過迷茫和挑戰,更有豁然開朗的心得與體會。在本篇文章中,他們圍繞研發初衷、開源成果、最新進展、趟過的那些“坑”和學會的那些道理做一次深度的分享,也借此希望能夠給為國產基礎軟件路上的同行者帶來一些參考。這是在CSDN首發的文章,總結瞭凹語言開源一周年的進展和心得。
作者 | 柴樹杉,丁爾男,扈夢明,趙普明
責編 | 夢依丹
出品 | CSDN(ID:CSDNnews)
隨著我國基礎軟件的快速發展,以操作系統、數據庫為代表的的國產軟件正在不斷發力與追趕國際先進水平。而作為軟件開發的最底層,軟件開發的核心工具,編程語言在推動技術創新和產業發展方面起著至關重要的作用。
縱覽國內外各大編程語言榜單,我們很難看到國產編程語言的身影,但這並不意味著國內開發者就放棄這一領域的探索與研發。論及當下,已有一門旨在推動 WASM平臺發展的編程語言已經開源一年瞭,在同類型項目中是首個實現瀏覽器內編譯、鏈接、執行全鏈路能力,具備純瀏覽器環境開發雲基礎設施的潛力,它就是——凹語言。
這門語言是在2018年底由國內一群編程語言愛好者發起的開源項目,在2022年7月正式開源(http://gitcode.net/wa-lang/wa)。在開源的一年時間瞭,它已經完成大部分語言特性的開發,開發組對外發佈瞭MVP版本和配套的《凹語言參考手冊》。
1 技術目標與“躺平”夢想
作為程序員三大浪漫的核心、傳承計算機文化的編程語言,在國內依然是技術荒漠。在雲原生領域最流行的Go語言,第一個“hello,世界”中依然跑的是日文!沒想到國內在編程語言領域依然和20年前一樣。
2017年前,凹語言創始人柴樹杉在航天遠景做Emscripten相關的探索和實踐,彼時,凹語言的另一位創始成員丁爾男對WebAssembly做過一個斷言——“一切可編譯為WebAssembly的,終將被編譯為WebAssembly。”後來該斷言被逐漸驗證,在2018年8月作為Emscripten的繼承技術WebAssembly也發佈草案。
隨後,柴樹杉和丁爾男結合工作中的實戰經驗,出版瞭《WebAssembly標準入門》一書,書中最後一章是講Go語言和WASM技術的結合。
作為對編程有興趣的老碼農,他們本著為自己定制一些工具的想法,針對WASM平臺精簡定制Go語言。2018年底,他們想到瞭“凹語言”這個名字,這不僅僅代表著WASM的初始目標,也表達瞭某些“躺平”的夢想。但是啟動一個新語言的阻力是360度全方位的,他們甚至根本沒有敢對外宣傳(和很多的項目還沒開源沒發佈就對外大肆宣傳登頂各種排行榜的做法完全相反)這個事情——隻是悄悄地註冊瞭域名並在GitHub創建瞭組織,之後就是近乎3年的沉寂。
2019年,國外分別誕生瞭TinyGo、AssemblyScript和V語言等項目。這些同類或近似的潛在競品都為他們提供瞭寶貴的路線參考。此外WASI規范誕生,WASM包管理工具陸續出現,這些變化和發展幾乎完美印證瞭他們2018年對WASM技術的推演,這也無形中增加瞭他們決心基於WASM平臺研發一個好用的通用語言。
2020年,他們一起探討瞭凹語言路線,同時完善《面向WebAssembly編程》開源圖書。與此同時,這一年,LLVM社區專傢史斌加入進來。到此,凹語言三個聯合發起人組織初步成型。幾個發起人對凹語言的目標達成瞭共識——不做玩具車!可以說“不做玩具車”是凹語言後來發展方向和各種決策的基礎原則。在後半年,三個發起人還完成瞭《Go語言定制指南》一書,至此凹語言未來發展路線的關鍵技術均已完成理論準備。
時間再跨越2年到2021年底和2022年初,結合國內外、公司內外的各種環境的變化,凹語言的實現工作正式啟動,並在2022年7月完成瞭凹語言的開源工作。開源之後,社區小夥伴的加入給凹語言項目帶去瞭極大的活力。
2 真假開源惹爭議
在2022年剛開源的時候,凹語言尚未明確開源協議,采用的是保留全部權利。當時有人在網上質疑:說凹語言開始大量使用瞭Go語言的代碼是BSD,凹語言改為自有協議是否合適?
對此,凹語言發起人柴樹杉表示:“BSD協議是不阻止、甚至是鼓勵拿來商業化和私有化的,因此凹語言當時做法沒有任何問題。但用戶可能是在隱晦質疑開源道德——網上總是會有各種聲音!”
後來經過多次會議討論,團隊決定采用瞭AGPLv3協議。主要是因為創始團隊認為他們是一個草根團隊,擔心用愛發電的開源項目會被商業公司白嫖。他們還列瞭幾個前車之鑒:
為何OSI會拒絕SSPL,為何能接受GPL?這背景是因為OSI代表的是商業公司在和GPL、SSPL等代表博弈的結果。凹語言采用AGPL是因為它是OSI認證的限制最嚴格的協議,否則很多被說是偽開源。
基於此,柴樹杉還重點提到:開源真是用愛發電,但是開源者不是傻瓜,為眾人抱薪者,不可使其凍斃於風雪!MongoDB的選擇必須鼓勵,而抵制和限制GPL協議的頭部大廠才是需要指責!
3 開源後,凹語言社區如何組織運營?
為瞭項目能夠民主快速地推進,凹語言成立瞭臨時決策委員會,該機構平時簡稱臨委會。根據臨委會章程,語法或運營模式的變更需要由委員發起提案,經臨委會投票通過後才能公示生效,也就是說委員可以通過發起提案,以及對提案進行投票的方式來對項目路線施加影響。除瞭在自己負責的方向持續推進之外,臨委會委員還需要處理各種日常事務,比如開發會議組織、參加各種交流、評獎活動等等。
與此同時,為吸引更多志同道合地開發者參與進來,凹語言項目在多個平臺建立溝通渠道。為保障貢獻者們的權益,公平對待參與者、記住所有的貢獻者,凹語言項目始終把人放在第一位。而他們所成立的臨委會、貢獻點制度都是為瞭保障這一點。
貢獻點制度是凹語言社區用來量化記錄和激勵社區成員貢獻的制度。
基本設計:社區從2022年開始,每年產生10萬個貢獻點,所有參與項目並產生貢獻的人,都可以按照貢獻量獲得貢獻點。貢獻的工作可以是代碼、文檔、參與會議討論、參與宣傳等一切需要花費功夫的工作。分配周期為1年一次或半年一次,需要發起決策提案,由決策委員會負責工作量的鑒定和貢獻點的劃分。貢獻點的分配流程和結果都會記錄並在社區文檔中,並公開展示。
到現在為止,已經進行瞭3次貢獻點分配,共計15萬點。這些貢獻點分給瞭12名同學,數目從35000到2000不等。
等到社區成熟之時,社區的決策制度將轉為公開投票制度,到時候貢獻點可以用來調整投票的權重,即貢獻點多的人可以投出更多的票數。最後,如果這個項目未來能夠產生商業價值,那麼收益分配階段也可以用貢獻點作為參考。
4 開源1周年大事記
在過去開源的一年間,截止2023年8月底,凹語言團隊召開20+次社區會議,產生8次提案,代碼提交900+次,完全自研代碼超過2萬行,發佈瞭18個版本,發表30篇碎碎念文章,完成MVP版本發佈和《凹語言參考手冊》編寫,GitHub 650+ Star。
最新的MVP版本初步達到語言可以試用狀態。實現瞭大部分核心語法特性,開發者可以以此為基礎進行標準庫的開發。目前隻有少數特性MVP尚未實現,主要有三個:map、反射以及defer。另外目前的版本中,有一些運行時行為不滿足語法定義,比如切片下標沒有做邊界檢查、孤環內存會泄漏,但隨著編譯器的更新這些問題會自動解決,不影響向後兼容性。
比較大的功能有:
社區相關的有:
5 孤勇者們面臨哪些困難與挑戰
這群一群半路出傢的非計算機專業出身、非編譯器從業者,他們在追夢國產編程語言的道路上,遇到瞭哪些挑戰和困難?
柴樹杉直言,心理挑戰貫穿始終。
時間回到2010年,那會兒Go語言剛剛開源,國內有一大批Gopher瘋狂關註,柴樹杉作為其中一員,為Go貢獻瞭BMP/TIFF等圖像庫,2015年翻譯瞭《Go語言聖經》。這些經歷讓他第一次近距離圍觀瞭一個現代化語言的誕生和發展的過程。但在嘗試自己開發一門編程語言後,壓力還是油然而生。
要麼快速發展,要麼提前死掉。這是2022年緊急決定開源時,創始團隊的想法。彼時凹語言作為一個純草根項目,他們擔心一些有資本和國傢背景的競品語言出來後,凹語言將失去被關註的機會,他們自己也將失去繼續的信心。
而在語言的開發建設過程中,各個功能的設計與實現背後都有著諸多的深思熟慮。
凹語言社區成員趙普明負責中文語法的設計和實現,他最大的體會便是“眾口難調”,大傢既想要有編程語言的精煉性,又想要有自然語言的易讀性。甚至連”if“關鍵字中文用”如果“還是”若“都可以爭論半天。
經過一段時間的討論和思考,趙普明打算應用凹語言的社區決策制度來重新決定中文語法的設計:把整套語法拆分成不同的部分,分別寫出提案,征集各種方案,再經過討論和決策委員會的投票定下來。過程雖繁瑣,但他覺得,這是個不錯的社區化嘗試,過程中,他也可以不斷學習和總結各個編程語言的特色。
此外,實現可能比設計更加重要,把本子上的想法用代碼實現,調試、改錯到最終成功。他不禁感嘆到,中文語法,確實是很好的學習編譯器開發的切入點。
最後,他提到:實現中文語法後發現瞭一個新的獨特的需求,即凹標準庫是用英文寫得,那麼該如何用中文去調用英文的庫函數?如何訪問英文實現的結構體?編譯器需要在中英文代碼之間架起一道轉化翻譯的橋梁。
在開發過程中,凹語言團隊發現每個階段和成果之後都有新的廣闊空間需要去建設。比如隨著項目的發展,代碼變得開始膨脹,像早期的Arduino Nano33環境的例子已經不能執行。每個時刻,他們都會擔心突然冒出一個咋看不起眼的問題擊垮他們。剔除技術因素,人員工作變動也可能會讓項目停滯,還有項目如何推廣、對於社區成員來說,免費參與項目建設,卻被人質疑炒作、假開源等……
6 語言項目門檻高,可能是種偏見
編程語言是一個短期內毫無商業價值,但對應長期生態的基礎軟件技術。於凹語言團隊而言,開發者能夠在一個缺少商業價值的項目花費時間投入進來,必然是真正的編程語言愛好者。正如凹語言團隊所推崇的slow is fast——低成本低效率讓項目團隊具備長期運行的潛力(凹語言從立項到現在時間將近5年)。同時草根小團隊因為缺少KPI壓力,在實現過程中可以降低技術變現的風險,可以更堅持項目的初心和突出項目的個性口味。
當下的主流編程語言,C/C++,Java,Python,Ruby,Lua,Go,TypeScript、Swift,他們的創始人都是個人在驅動。當然,如果大廠的編程語言團隊能夠徹底擺脫KPI的魔咒或許會有更大的潛力。
扈夢明作為凹語言社區的首位成員,他直言:“在實現凹語言官網重構和在線Playground的開發後發現,找準自己在團隊中的角色和定位,以及心態的轉變會讓自己融入到開源團隊變得簡單。”
他表示:隻需要找到自己的專長並持續為團隊做出貢獻,從而實現賦能。當然也離不開團隊成員的鼓勵支持和幫助。這也就是凹語言團隊的魅力所在,其多樣性和包容性讓每個人都能在團隊中發揮自己的專長。而且在與團隊夥伴們交流過程中也能收獲到不同領域的知識和經驗。
創始人之一的丁爾男說:“語言項目門檻高,可能是種偏見。”
1996年進入武漢大學學習計算機的他,一直覺得搞通用編程語言是神仙做的事,和他沒啥關系,但隨著凹語言一步步走過來,他意識到,之前的看法可能是種偏見。
他舉例道:雖然編譯器通常按照解析、轉換、代碼生成的流程執行,但學習上手並不一定需要嚴格遵守這個順序,他選擇的路線是從抽象語法樹入手向前後兩端擴展,因為抽象語法樹在編譯過程中起到瞭承上啟下的作用,兩套不同的語法可能背後對應的是同一個語法樹(就好比凹語言的中文語法和英文語法看起來風格迥異,但實際上對應的是同一套AST),再加上市面上成熟的語言已經非常非常多,隻要不是特別非主流的設計,大概率能找到AST風格相似的語言,然後按照自己的審美進行改造,這樣就可以極大的降低啟動阻力。
和其他類型的項目相比,語言項目在技術上並沒有更難,而最需要克服的困難反倒是跨出第一步的猶豫不決。
7 總結
凹語言從立項到開源,從開源到MVP版本發佈,凹語言已經完成從一個編程語言愛好者的想法到真實產品的蛻變。未來還有很多有挑戰性的工作待他們去體驗和攻克。為此,也呼籲和歡迎編程語言愛好者加入共建,為國產編程語言的發展貢獻自己的力量。