有內味兒了,東北話做程式語言,好使、招人稀罕

  • 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》中提出的演化演算法。