有內味兒了,東北話做編程語言,好使、招人稀罕
- 2020 年 2 月 24 日
- 筆記
機器之心報道
參與:思源、Jamin
如果東北話是編程語言中使用的主要語言,編程是否更招人稀罕?學習編程是否會更歡樂?
前段時間,機器之心剛介紹過以文言文為編程語言的 CMU 本科生項目。近日,圈內又驚現以東北方言詞彙為基本關鍵字的編程語言(dongbei),此項目一出便有天雷勾地火,寶塔鎮河妖之勢。作者是一位 Google 的高級軟件工程師/技術主管,同時也是 Google C++測試框架 googletest 以及 googlemock 的原作者。
項目地址:https://github.com/zhanyong-wan/dongbei
dongbei 是個啥項目?
簡而言之,它是一門東北方言詞彙為基本關鍵字的編程語言。作者在項目開篇便強調了此編程需要「以人為本」:
這玩意兒可是填補了世界方言編程地圖上的一大片兒空地啊!這麼說吧,誰要是看了 dongbei 程序能忍住了不笑,我敬他是純爺們兒! 那它有啥特點咧?多了去了:
- 簡單啊!小學文化程度就行。您能看懂春晚不?能?那就沒問題。
- 好讀啊!看着看着包您不由自主地念出聲兒來。
- 開心啊!呃,做人嘛,最重要的是要開心。
- 開源啊!不但不要錢,而且不要臉 — 隨時隨地歡迎東北話高手打臉指正。
dongbei 編程語言的開發採用了業界領先的 TDD(TreeNewBee-Driven Development)方式。具體地說,就是每個功能都是先把文案寫好,八字沒一撇牛皮就吹起來了,然後根據牛皮寫測試案例,最後再實現功能讓牛皮不被吹破。這樣做有兩大好處:第一每個功能都是有的放矢,不值得 tree new bee 的功能一概沒有。第二確保了每個功能都有文案負責吹噓,開發者的辛勞絕對不會被埋沒。 不扯犢子了。翠花,上酸菜~~~
沒事兒,跑兩圈
項目是用來跑的,是騾子是馬需要拉出來溜溜。用東北話寫代碼,看起來就比較有意思,因此我們也把這個項目拉到電腦上溜一溜。首先,只要你的系統有 Python 3,那就甭麻煩了,直接下載 GitHub 項目,跑 src/dongbei.py 就成。
如下短視頻展示了下載及測試東北方言編程的簡單過程,項目實測很好用:
我們用着非常順滑,只需要保證開發環境有 Python 3 就行了。在上面的短視頻中,我們測試了東北方言中的「Hello World」,即輸出「唉呀,這嘎噠真他媽那啥!」。這裡唯一需要注意的是東北方言代碼文件需要確保字符編碼方式為 UTF-8,即在代碼文件最上一行加上「# -*- coding: utf-8 -*-」。
如果你覺得編譯成功,完美地問候了世界,那我們寫一小段循環語句:
# -*- coding: utf-8 -*- 老王裝仨。 老王從1到10磨嘰: 老王走兩步。 嘮嘮:老王。 磨嘰完了!
直觀理解起來就是:我們先給老王賦值為 3,然後循環十次,每次老王會加二。確實在運行中,我們也能得到期望的結果。不過值得注意的是,每次執行東北方言,它都會給出對應的 Python 代碼,如下所示,「從 1 到 10 磨嘰」展示的卻是 range(1, 11),這也許是使 Python 更貼近方言語法。

東北方言編程還有很多待我們挖掘的地方,也有很多更有意思的擴展。項目作者在項目中詳細介紹了各種詞法與語法,其它開發者同樣還提了很多有意思的建議,例如:
創建個新對象 – > 娶個新媳婦? break – > 完犢子了 exit() – > 整沒了 Exception – > 整岔劈了 type() – > 你瞅啥
也許等項目完善後,導入第三方庫,用東北話寫個神經網絡也是闊以滴。
東北話「規則」大全
dongbei 固然好玩,但避免有些對我大東北方言整的不太明白的同學,作者也提供了一些詞法,語法,語義的解釋。
東北話詞法
字符串常量:字符串常量的用法變化不大,比如依舊是需配對對應的雙引號,這裡理所應當配對的是中文全角雙引號:
...「我是一個字符串」...
注釋:注釋依舊使用 #,在字符串常量外,從 # 號開始後的都會成為注釋而被忽略掉:
嘮嘮: # 我是一個注釋。 「嘎哈#?」。 # 我還是一個注釋。
嘮嘮:「嘎哈#?」。
兩者是一樣一樣滴。
分詞:而分詞方面,為了適應廣大中文語言使用者,作者將其設定為加不加空格或換行都一樣。要知道在西方各語言中,空格對分詞的意義非常大,往往會導致整個詞組或語句所表達的核心意思完全不同。下面我們來看看示例:
嘮 嘮 : 「嘎哈?」 。
嘮嘮:「嘎哈?」。
兩者也是一樣一樣滴,沒有任何區別。
名字:在 dongbei 的設定里,除了關鍵詞、標點符號和常數,其餘都是名字。「張三乘李四」會自動判定「乘」是關鍵詞,「張三」「李四」是名字。如要避免這種情況,可以直接添加【】把一串字符標註為名字。
如【張三乘李四】則會完全被判定一個名字,而不是再將「乘」當作關鍵詞。這一點在之前的文言編程中是做不到的,我們在寫文言語句時經常要避開採用關鍵詞做變量名。
常數:除了日常所用的阿拉伯數字所表示的十進制整數外,dongbei 同樣可支持使用中文表達 0 – 10 的常數:
零一二三四五六七八九十
二也可以寫成兩或者倆。三也可以寫成仨。「+」也可用中文「加」表示。
東北話語法
東北話詞法承接厚重的中國文化,我們怎麼用着舒服就怎麼定義。而到了語法,一方面需要有對應的 Python 語句,另一方面也要保留原汁原味的東北話語法。dongbei 程序是通過多個語句組成,每一個語句通過句號「。」分隔。項目作者表示,為了表達開發者熾熱的情感,結尾的句號也可以等價替代為感嘆號「!」。
項目作者在 README 文件中描述的語法非常詳細,但是我們感覺直接看示例更加便捷。要是在寫東北話代碼時遇到了問題,那時再具體看看 README 中的語法也是不錯的選擇。
具體而言,我們可以從如下 8 個方面了解整體語法情況,這也是項目作者準備的「dongbei 語言考試小抄」。
1. 變量
老張是活雷鋒。 # 定義變量。初始值:啥也不是。 老張裝二。 # 老張 = 2 削老張。 # 老張 = 啥也不是 老王是活雷鋒。 老王裝仨。 # 老王 = 3 老張裝老王。 # 引用變量。老張 = 3
2. 運算
老張走走。 # 老張 += 1 老張走兩步。 # 老張 += 2 老張退退。 # 老張 -= 1 老張推三步。 # 老張 -= 3 老張裝老王加二。 # 老張 = 老王 + 2 老張裝(老張減三)除以五乘老王。 # 老張 = (老張 - 3)/5*老王
3. 比較
老王比5大 7加二比老劉小 老張跟老王一樣一樣的 老李跟250不是一樣一樣的 老劉啥也不是
4. 打印
嘮嘮:「唉呀媽呀」。 # 打印字符串常量。 嘮嘮:老王。 # 打印變量的值。 嘮嘮:老王比老張大。 # 打印表達式的值。 嘮嘮:「老王是」、老王。 # 打印兩個表達式的並置。
5. 條件
尋思:老王比老張大? 要行咧就嘮嘮:「老王!」。 要不行咧就嘮嘮:「老張!」。
6. 循環
老王從1到10磨嘰: 嘮嘮:老王。 磨嘰完了!
7. 組合
尋思:老王比老張大? 要行咧就開整: 嘮嘮:「老王!」。 嘮嘮:「你好美!」。 整完了。
8. 套路
【階乘】(那啥)咋整: # 定義套路 階乘,有一個參數 那啥。 尋思:那啥比一小? # 需要自推嗎? 要行咧就 滾犢子吧 一。 # 返回值1。 要不行咧就 滾犢子吧 那啥乘整【階乘】(那啥減一)。 # 需要。返回自推結果。 整完了。 # 定義結束。 嘮嘮:整【階乘】(五)! # 使用套路
出不了門,不如在家讀論文。機器之心新一期AAAI 2020線上分享邀請到了南京大學人工智能學院研究助理卞超,為我們介紹他們在論文《An Efficient Evolutionary Algorithm for Subset Selection with General Cost Constraints》中提出的演化算法。