Categories
程式開發

老鐵,東北話編程了解一下不?谷歌工程師新作!


如果說用文言文編程還是有些困難,那麼,東北話呢?

項目介紹

文言文編程火了,但使用它需要有一定的古文功底,因此它對大部分開發者來說並不夠友好。近日,一位谷歌的工程師琢磨出來一個更加接地氣的編程語言項目:dongbei。

項目地址:https://github.com/zhanyong-wan/dongbei

dongbei,它的創造者這樣介紹它:

一門以東北方言詞彙為基本關鍵字的以人為本的編程語言。

簡單來說就是:用東北話編程。項目的開發者又做了進一步的介紹:

dongbei 語言是基於 Python 3 二次開發的,適用於 Mac OS、Windows、Linux等系統,安裝也極其簡單,通過指令:src/dongbei.py 安裝即可。如果還沒有安裝Python 3,可以通過以下鏈接安裝:https://docs.python-guide.org/starting/install3/osx/

按照慣例,安裝完成後要先進行測試,輸入:test/dongbei_test.py 即可。

上述流程都驗證完了,就可以正式開始編程了,老規矩,先上一句“hello world”。不過,這東北話的“hello world”可是與眾不同。

首先創建一個名字叫 hello-world.dongbei 的文本文件,內容如下(已做和諧處理):

唠唠:“唉呀,这嘎哒真那啥!”。

用 utf-8 編碼保存。要是編輯器顯示編碼錯誤,那就把文件內容改成:

# -*- coding: utf-8 -*-
唠唠:“唉呀,这嘎哒真那啥!”。

然後在命令行窗口運行:

src/dongbei.py hello-world.dongbei

執行結果如下:

唉呀,这嘎哒真那啥!

當然,如果是非東北程序員,那麼理解東北話還是有點兒困難的,因此你需要對東北話進行一番“補習”,地址在此:

https://github.com/zhanyong-wan/dongbei/blob/master/doc/cheatsheet.md

語法規則

學習一門語言,要掌握“三要素”—詞法、語法、語義,帶有濃厚東北語言風格的 dongbei 編程語言的語法規則又有什麼不一樣呢?

先來看看 dongbei 語言詞彙的構成。

詞法:

字符串變量:

一行代碼當中,要是出現配對的中文全角雙引號,比如

...“我是一个字符串”...

那麼引號當中的內容(我是一個字符串)會被當成一個字符串常量。

註釋:

一行代碼當中,如果在字符串常量外面出現 # 字符,所有從 # 開始的字符都會被當成註釋被忽略掉。比如

唠唠:  # 我是一个注释。
    “嘎哈#?”。  # 我还是一个注释。
  

跟:

唠唠:“嘎哈#?”。

是一樣的:

分詞:為了避免歧義,很多西方語言在書寫時要用空白字符或標點把單詞隔開,但同時這也比較麻煩,dongbei 語言適應華人的書寫習慣,*加不加空格換行無所謂。 *所以,下面兩種表達方式的效果是一樣的。

唠
  唠
    :
      “嘎哈?”
        。
唠唠:“嘎哈?”。

名字:在 dongbei 語言裡面,除了關鍵詞、標點符號和常數,剩下的都是名字。比如,在“張三乘李四”這個dongbei 語言表達式裡,“乘”是一個關鍵詞,“張三”和“李四”是兩個不同的名字,dongbei 語言允許用中文全角方括號【 】把一串字符標註為名字。

常數:除了用阿拉伯數字表示的十進制整數(比如 2、42、250,等等),0 到 10 的常數也可以用中文表達,二也可以寫成兩或者倆。 三也可以寫成仨;

零一二三四五六七八九十

例如五加二的意思是5+2

五加二

語句:一個 dongbei 程序是由一串語句組成的。每個語句以句號(。)結束。為了表達程序員熾熱的感情,也可以用感嘆號(!)結束,意思和句號是一樣一樣的。

變量:ongbei 語言允許使用任何字符串做變量名。只要記住兩點:變量名里所有的空白字符都會被忽略;有歧義的時候要把變量名用【】括起來。

定義變量:dongbei 是一門以人為本的語言。我們知道東北人都是活雷鋒。所以,要定義一個叫 XX 的變量,寫成 :”XX是活雷鋒“, ”老王是活雷鋒“ ,”老王是活雷鋒!“ 都是可以的。

XX是活雷锋。
老王是活雷锋。
老王是活雷锋!

給變量賦值:dongbei 語言不整“賦值”這種文縐縐的詞兒。咱們叫“裝”。比如:

老王装二。

可以理解為 C 語言的

lao_wang = 2;

要把一個活雷鋒的值清空回到原始狀態,可以用”削“:

削老王。

增減變量:活雷鋒除了會裝,加加減減也是常見的操作。按沒病走兩步的規矩,這些操作的名字叫做:走走、稍稍、走X步、稍X步。比如:

老张装二。  # 现在老张等于2
老张走走。  # 现在老张等于3
老张走两步。  # 现在老张等于5
老张稍稍。  # 现在老张等于4
老张稍五步。  # 现在老张等于-1

引用變量:變量,活雷鋒定義以後就可以引用了。引用的方法很簡單:把活雷鋒的名字寫出來就成。比如:

老张是活雷锋。
老王是活雷锋。
老张装250。
老王装老张加13。

定義了兩個活雷鋒:老張和老王。老張值250。老王值263。

輸出:輸出信息用“嘮嘮”來表示,假定輸出信息是 YY,可以寫:

唠唠:YY。

字符串運算頓號(、) 操作符可以把兩個值當成字符串拼接起來。假定活雷鋒老王的當前值是字符串“NB”,那麼表達式

老王、“A”

上述代碼的值就是字符串 NBA。
算術運算基本的四則運算還是支持的,不過把符號換成了文字,+號用“加”來表示,-號用“減”來表示,*號用“乘”來表示,/號用“除以”來表示。作者特別強調,除法運算叫“除以”,不叫“除”。

乘除的優先級比加減高,相同優先級下,運算從左到右。比如:

3加2乘5

最終結果是13,不是25

循環:我們一般編程使用的循環是for、while等,在dongbei項目中,循環語言非常方便、易懂:

变量名 从 X 到 Y 磨叽:
  ...  # 需要重复做的事
磨叽完了。

判斷(講條件):當做某件事情,必須在某個條件成立下才可做時,在該項目中的表述為:

寻思: CCC ?
要行咧就 XXX

如果該條件不成立時需要執行其他操作,可以寫:

寻思: CCC ?
要行咧就 XXX
要不行咧就 YYY

簡單演示

在熟悉了一些基本的語法規則後,作者也給出了一些簡單的演示,比如,當我們需要定義一個方法(作者在項目中用“套路”來表達),可以這樣表述(以“寫九九表”為例):

写九九表咋整:  # 定义套路 写九九表。
  老王从1到9磨叽:
    老张从老王到9磨叽:
      唠唠:老王、“*”、老张、“=”、老王乘老张。  # 打印 X*Y=Z
    磨叽完了。
    唠唠:“”。  # 空一行。
  磨叽完了。
整完了。  # 结束套路定义。

如果需要運行該方法,可以使用整+套路名的方式,比如:

整写九九表

這樣就可以打印出結果了:

1*1=1
1*2=2
1*3=3
...
8*8=64
8*9=72
9*9=81

這樣的簡單示例還有很多,此處僅列舉這一個作為參考,對於復雜的遞歸題目,作者表示該編程語言同樣有效,例如這道程序員都很熟悉的題目:

求 n 的阶乘 f(n) : 如果n是0,结果为1。如果n比0大,结果就是n * f(n-1)。递归(作者使用“自推”来表达)的精髓是在算 f(n) 时,先算 f(n-1),再从 f(n-1) 算出 f(n)。 

如果把上面的思路用dongbei這個語言寫出來,就是下述效果:

【阶乘】(那啥)咋整:  # 定义套路 阶乘,有一个参数 那啥。
  寻思:那啥比一小? # 需要自推吗?
  要行咧就 滚犊子吧 一。  # 不需要。
  要不行咧就 滚犊子吧 那啥乘整【阶乘】(那啥减一)。  # 需要。自推吧。
整完了。  # 定义结束。

作者簡介

Zhanyong Wan,谷歌資深軟件工程師/技術主管經理,谷歌C ++測試框架googletest和googlemock的原始作者。