如果中文是程式語言中使用的主要語言,我們中國人學習程式設計是否會更簡單?
這是知乎上討論非常火熱的話題。很多接觸過程式設計的人都知道「易語言」,這是一種使用中文代替程式語言中的英文的程式語言,同樣可以實現程式功能。近日,一位卡內基梅隆大學(CMU)的大四學生開發了基於文言文的程式語言,高中語文三大怕的文言文終於找上程式設計師了。
專案地址:https://github.com/LingDong-/wenyan-lang
這一專案並不是簡單的將程式中的英文字元換成了中文,而是利用 NLP 的一些技術,將文言文程式語法轉換到 JavaScript 或 Python 執行,有一定的技術難度。專案問世幾日即獲贊 2.2K,還得到了很多人的微博轉發。
作為橫跨媒體和 AI 的機器之心也測試了這一專案,專案作者的腦洞、文采和創意著實令人驚訝。
如果讀者想快速試一試,你也可以玩一玩線上 IDE,上面有很多預定義的函式。即使在手機上,我們也能編輯並執行「文言文程式碼」。
線上地址:http://wenyan-lang.lingdong.works/ide.html
序言
作者在專案開篇使用了一段文言文,介紹了建立這個專案的初衷。
翻譯如下:
在堯舜時代,人們使用結繩和數手指來計算。當時怎麼能夠預料到,幾百代人之後計算機的巧妙呢!計算機比魯班(公輸盤)的木鳶更加精巧,比諸葛亮(武侯)的木牛流馬更好。此外,程式語言數量眾多,如同《天官書》記錄的星宿一般多,又比《山海經》中記錄的飛禽走獸還要奇特。Go(鼠)、Rust(蟹)、Ruby(鑽)、Fishshell(魚)因速度而出名。Python(蛇)、Php(象)、Perl(駱)和 JavaScript(犀)則各有獨特之處。我這才理解到,為什麼鬼會夜哭,天上會下粟雨。
(注:傳倉頡造字後,鬼神啼哭,天降粟雨)
但以往從未有人使用過文言文進行程式設計。這並不是傳承文脈、保護文心的好方法,所以我才產生了用文言文程式設計的想法。我目前還太年輕,讀過的書也沒有破萬卷。如今身處遙遠的國家(美國),也很久沒有接觸中文了。但是我一直對文學很有興趣,編寫的程式有時候也得到人們的一些肯定。正如王希孟和莊子一般,並不因為年輕或者知識的浩瀚無涯而退縮,於是寫下了這些話。
(注:王希孟,北宋畫家,18歲畫成傳世名作《千里江山圖》)
我既沒有像李賀那樣嘔心瀝血,也沒有像李商隱那樣口角流沫(形容讀書勤奮)。專案完成後,我將繼續以干將鑄劍的精神勉勵自己,帶著越王臥薪嚐膽的精神繼續向前。我自己雖想效仿《算經十書》的筆法,只是遺憾沒有唐宋八大家那樣淋漓的文筆。正如庾信在《哀江南賦》所寫:「陸機聽了心甘情願地拍掌;張衡見了將輕視它也是理所當然」(意指如果被人嘲笑,也是理所當然,我不會太過介意)。
儘管這專案只有覆甕的價值(一點微小的工作),但是還有完善的空間。雖然沒有像呂不韋那樣有一字千金的本錢,但是我對交流的渴望是一樣的。
這也正是開源的精神核心,我們以此互相勉勵吧。
作者是誰?
Lingdong Huang 目前是 CMU 計算機專業大四學生,明年就本科畢業了。我們可以看到他曾在迪士尼研究實驗室、紐約時報等大廠實習過。而且從個人網站中,很明顯可以發現他高中就開始做各種小專案,包括視覺和自然語言的都有。
寫得了程式碼、讀得了文言文,文化底蘊還這麼強,現在的本科生已經這麼厲害了。
個人網站:https://lingdong.works
文言文程式設計是什麼情況
用文言文程式設計是什麼樣一種體驗?是不是既能學習文言文,又能搞定程式設計邏輯?介紹不如演示,我們先看看程式設計世界裡的第一段程式碼,廣大程式設計師學習的第一句「HelloWord」是什麼樣的。如果讀者們文言文比較溜,或者瞭解一點程式思維,那麼可以瞭解,下面一段文言文程式碼就是輸出三遍「問天地好在」,也就是「HelloWord」的文言文版。
吾有一數。曰三。名之曰「甲」。
為是「甲」遍。
吾有一言。曰「「問天地好在。」」。書之。
云云。
具體而言,先定義一個數「3」,並命名為「甲」,現在迴圈「甲」次,每次在螢幕上列印出「問天地好在。」。作者會將其翻譯成對應的 Javascript 程式碼,從而幫助我們理解。
var n = 3;
for (var i = 0; i < n; i++) {
console.log("問天地好在");
}
當然,按照我們的習慣,改寫成 Python 程式碼也是沒問題的:
a = 3
for i in range(a):
print("問天地好在")
為了更貼近文言文的表達習慣,Lingdong Huang 在專案表示各種標點和換行都是可以去掉的,上面的文言文程式碼可以等價寫為:
吾有一數曰三名之曰「甲」為是「甲」遍吾有一言曰「「問天地好在」」書之云云
突然感覺,好像沒了符號的文言文程式碼更容易懂了?
這樣看起來似乎很簡單?那你就小瞧了文言文程式設計的魅力。比如說程式設計師入門必修課「斐波那契數列」,每一項都是前兩項的和,第一項是 0、第二項是 0+1、第三項是 1+1 等等。
如果用文言文來寫斐波那契數列,我們需要建立一個函式,函式的輸入是斐波那契項數,輸出是該項具體的值。如果用文言文來寫,畫風是這樣的:
最後一句「施「斐氏列」於七。書之。」是呼叫函式,並輸出第 7 個結果。雖然看上去比較麻煩,但我們還是可以細細閱讀,例如「吾有一術。名之曰「斐氏列」。」很明顯定義了一個函式,函式名是「斐氏列」;「若「因」等於零者。昔之「果」者。今「因」是矣云云。」表示如果「因」這個變數等於 0,那麼就將「因」這個變數的值賦值到「果」變數。
如果閱讀上還有困難,那麼也可以看看專案作者提供的對應 Javascript 程式碼。不過我們可以嘗試把它翻譯成 Python 語言,翻譯結果如下所示:
def fei_seq(yin):
tou = 0
wei = 1
ji = 1
guo = 0
if yin == 0:
guo = yin
if yin == 1:
guo = yin
while True:
if ji >= yin:
break
ans_ = tou +wei
guo = ans_
tou = wei
wei = guo
ans_ = ji + 1
ji = ans_
return guo
print(fei_seq(7))
當然,Python 作為一種極其精簡的語言,真正用它來寫斐波那契數列肯定程式碼量要少很多。不過,藉助這段翻譯,理解文言文程式設計還是要簡單很多的。如果讀者想要試一試,可以複製這個 GitHub 專案,並在本地編譯,也可以直接使用線上 IDE 編譯你的程式碼。
下面,作為一種「新語言」,我們當然要了解它的神奇語法,不論是定義變數、函式,還是生成數列,文言文都有對應的語法。
語法規則
考慮到文言文和其他程式語言的轉換有一定的理解難度,作者提供了一些語法轉換規則表,供參考。
變數命名
條件/迴圈
數學計算
陣列(列表)
這裡從「1」開始計數。
函式
讓你的程式碼更有逼格
看厭了黑底的程式碼?專案還提供了一個炫酷的「古文程式碼生成器」,我們可以把自己的文言文程式碼轉換成古書中從右到左,從上到下,沒有標點的古文。是不是更有 B 格了?這個生成器還有 SVG 檔案,可以將程式碼再提取出來,重新執行。
以下為專案作者嘗試的「圖靈機」程式碼: