他們發明了一門程式語言,名字叫:搖滾明星 Rockstar

他們發明了一門程式語言,名字叫:搖滾明星 Rockstar

譯者 | 薛命燈

Rockstar 是一門圖靈完備的動態程式語言。設計這門語言的目的是能夠像寫歌詞一樣開發計算機程式。它的歌詞風格主要受 20 世紀 80 年代重搖滾和電力民謠的影響。

為什麼會有 Rockstar?

如果我們讓 Rockstar 成為一門真正的(雖然毫無意義)程式語言,招聘人員就不會在招聘時對“搖滾開發者”頗有微詞。

另外,它很有趣,一門基於歌詞編譯的程式語言很值得我們一試。

我們還可以用它做貼紙,誰不想在自己的膝上型電腦上貼上“認證 Rockstar 開發者”這樣的貼紙呢?

Rockstar 語言規範

註釋

我們不建議在 Rockstar 程式中使用註釋。這可是 Rockstar,所以要讓閱讀程式碼的人自己從中尋找意義。但如果你堅持要使用註釋,那麼請把註釋放在括號裡。是的,這意味著你不能在算術表示式中使用括號,如果有複雜的表示式,要將它們分解為多個子句。

Tommy was a lean mean wrecking machine。 (initialises Tommy with the value 14487)

變數

在 Rockstar 中,有兩種宣告和使用變數的方式。

公共變數由一個關鍵字(a、an、the、my 或 your)和關鍵字後面的變數名組成,變數名只能包含小寫 ASCII 字母 a-z。

特定變數由專有名片語成,專有名詞是指任何不是保留關鍵字並以大寫字母開頭的單詞。特定變數名稱可以包含空格,只要每個空格後跟一個大寫字母。可能有一些開發人員會建立類似 Customer ID、Tax Rate 或 Distance In KM 這樣的變數名稱,不過我們建議你使用慣用的變數名稱,如 Tommy、Gina、Doctor Feelgood、Mister Crowley、Kayleigh、Tom Sawyer、Billie Jean 和 Janie。

Eleanor Rigby、Peggy Sue、Black Betty、Layla 和 Johnny B Goode 在 Rockstar 中也都是有效的變數名,儘管嚴格來說它們算不上是慣用的。

與 Ruby、Python 和 VBScript 一樣,Rockstar 的變數是動態型別的,所以不需要在使用前進行宣告。

代詞

關鍵詞 it、he、she、him、her、them、they 總是指向最近命名的變數。

型別

Rockstar 使用了與 ECMAScript 非常相似的型別系統,不過 undefined 聽起來不是非常搖滾,所以我們使用 mysterious 替代它。

Mysterious——任何未賦值的變數,使用關鍵字 mysterious 表示。

——空值型別,在計算時等於 0 或 false。關鍵字 nothing、nowhere 和 nobody 是 的別名。

Boolean——具有 true 和 false 值的邏輯實體。(關鍵字 maybe 和 definitely maybe 被保留下來,可能在未來會用到)。

right、yes 和 ok 是 true 的有效別名。

wrong、no 和 lies 是 false 的有效別名。

Number——Rockstar 中的數字使用 DEC64 數字型別進行儲存。

String——Rockstar 中的字串是 16 位無符號整數值的序列。

Object——資料屬性的集合,與 ECMAScript 一樣。

字面量和賦值

Rockstar 中的字串字面量使用雙引號括起來。

“Hello World”

Rockstar 中的單引號被視為普通的字母。這似乎有點不尋常,直到你想起來 ain‘t talkin’ ’bout love 在搖滾中其實是一句完美有效的歌詞。

Rockstar 中的數字字面量是十進位制數字。

123

3。141592654

賦值使用 put/into 關鍵字組合:

Put 123 into X 表示將 123 賦值給變數 X。

Put “Hello World” into the message 表示將“Hello World”賦值給 the message 變數。

遞增和遞減

我們分別使用 Build {variable} up 和 Knock {variable} down 關鍵字進行遞增和遞減。

Build my world up 將會讓 my world 的值增加 1。

Knock the walls down 將會讓 the walls 的值減 1

算術

基本的算術運算使用 plus、minus、times、over 和 by 關鍵字。

算術表示式:

plus {b}——加法,別名為 with。

minus {b}——減法,別名為 without。

times {b}——乘法,別名為 of。

over {b}——除法,別名為 by。

例子:

Put the whole of your heart into my hands——把 your heart 和 the whole 相乘,並把結果賦值給 my hands。

My world is nothing without your love——將零減去 your love,並將結果賦值給 my world。

If the tears of a child is nothing——檢查 the tears 乘以 a child 是否等於零。

My love by your eyes——返回 my love 除以 your eyes 的值。

詩意字面量

Rockstar 還支援一種獨特的語言特性,稱為詩意字面量(poetic literal)。受 here-document 語法的啟發,詩意字面量允許程式設計師在初始化變數的同時表達他們內心深處的焦灼。

詩意型別字面量

在使用關鍵字 true、false、nothing、nobody 和 nothing 進行賦值時,使用單行程式碼,包括變數名、is 關鍵字和字面量。

My heart is true——使用布林值 true 來初始化 my heart。

Tommy is nobody——使用 nobody 別名將 Tommy 的值初始化為 。

詩意字串字面量

在進行詩意字串字面量賦值時,以變數名作為開頭,後面跟一個關鍵字(如 says),然後再跟上一個空格。剩餘部分(直到碰到\n 終止符)被視為不帶引號的字串字面量。

Billy says hello world!\n 表示使用字串字面量 hello world! 來初始化 Billy。

The world says hello back\n 表示使用字串字面量 hello back 來初始化 the world。

詩意數字字面量

在進行詩意數字字面量賦值時,以變數名作為開頭,後面跟上關鍵字 is,或者別名 was 或 were。只要下一個符號不是保留關鍵字,這一行的其餘部分將被視為一個十進位制數,這個數由連續出現的字串長度對應的數字組成。為了表示數字零,也為了彌補搖滾中缺少單字母單詞和雙字母單詞,單詞長度需要對 10 取模。句點(。)表示小數位。除第一個句點外,任何非字母字元都將被忽略。

Tommy was a lovestruck ladykiller 表示使用 100 來初始化 Tommy。

Sweet Lucy was a dancer 表示使用 16 初始化 Sweet Lucy。

A killer is on the loose 表示使用 235 初始化 a killer。

My dreams were ice。 A life unfulfilled; wakin‘ everybody up, taking booze and pills 表示使用 3。1415926535 初始化 my dreams。

請注意,詩意字面量可以包含保留關鍵字,比如這個例子中的 taking。

比較操作

與 Visual Basic 和一些指令碼語言中的單個等號運算子類似,Rockstar 中的 is 關鍵字出現在語句中還是出現在表示式中所表示的意思也不一樣。

Rockstar 中的比較操作只能在表示式中完成。

Tommy is nobody 使用 nobody 來初始化 Tommy。

If Tommy is nobody 表示在 Tommy 等於 nobody 時執行後面的程式碼塊。

修飾符 not 會反轉比較操作的結果,類似於 SQL 中的 IS / IS NOT 。關鍵字 ain’t 是 is not 的別名。這種用法與慣用英語相反,其中“Tommy isn’t anybody”、“Tommy ain’t nobody”和“Tommy ain’t not nobody”表示相同的意思。

Rockstar 還支援以下的比較語法:

is higher/greater/bigger/stronger than 表示“大於”。

is lower/less/smaller/weaker than 表示“小於”。

is as high/great/big/strong as 表示“大於等於”。

is as low/little/small/weak as 表示”小於等於“。

輸入輸出

在 Rockstar 中,我們使用 Listen 關鍵字從 STDIN 讀取一行輸入,並使用 Listen to 將輸入賦值給變數。

Listen to your heart——從 STDIN 讀取一行,並將它賦值給 your heart。

使用 Say 關鍵字將變數的值寫到 SDTOUT。

Say Tommy——將 Tommy 的值輸出到 STDOUT。

Rockstar 將 Shout、Whisper 和 Scream 作為 Say 的別名。

流程控制和塊語法

條件語句

條件表示式以 If 關鍵字作為開頭,後面跟上表達式。如果表示式的計算結果為 true,則執行後續的程式碼塊。在 If 程式碼塊之後可以有可選的 Else 程式碼塊。如果 If 表示式計算結果為 false,則執行 Else 關鍵字後面的程式碼塊。

迴圈

與 If 語句類似,迴圈使用 While 或 Until 關鍵字表示,只要表示式得到滿足,後面的程式碼塊會被重複執行:

Tommy was a dancer While Tommy ain’t nothing, Knock Tommy down

使用 16 初始化 Tommy,然後迴圈,每次將 Tommy 減 1,直到 Tommy 等於零。

break 和 continue 語句的用法與其他大多數基於程式碼塊的語言一樣。Rockstar 將 Break it down 定義為 break 的別名,並將 Take it to the top 定義為 continue 的別名。

程式碼塊

Rockstar 中的程式碼塊以 If、Else、While 或 Until 作為開頭,並以空行或 EOF 作為結尾。

Tommy was a dancer While Tommy ain‘t nothing Shout it Knock it down

函式

函式使用變數名和後面的 take 關鍵字以及由 and 關鍵字分隔的引數列表進行宣告。

Multiply takes X and Y

Search takes Needle and Haystack

函式體是一個沒有空行的語句列表。空行表示函式體的結束。Rockstar 中的函式總是有返回值,使用 Give back 關鍵字表示。

使用 taking 關鍵字呼叫函式:

Multiply taking 3, 5 相當於 returning (presumably) 15

Search taking “hands”, “lay your hands on me”

示 例

使用極簡的 Rockstar 表達 FizzBuzz,為了清晰起見,使用了縮排:

他們發明了一門程式語言,名字叫:搖滾明星 Rockstar

慣用的 Rockstar,使用詩意字面量,沒有縮排:

他們發明了一門程式語言,名字叫:搖滾明星 Rockstar

一些想法

如果有可能,嘗試改進這門語言。我並不熱衷於連續塊語法——對於初學者來說,還無法實現巢狀塊。

想辦法實現圖靈完備的搖滾民謠編譯器。或許是基於 BF 的東西,我們使用單詞長度或首字母或其他東西將歌詞編譯成 BF,或者其他一些極簡但圖靈完整的語言。

製作”認證 Rockstar 開發者“貼紙,並將它們發給任何可以寫 Rockstar 程式碼的人。

使用 composer 為程式碼生成樂譜。

相關實現

rockstar-js——Rockstar-to-JavaScript 編譯器

https://github。com/wolfgang42/rockstar-js

rockstar-lexer——使用 Haskell 編寫的 Rockstar 詞法分析器

https://github。com/aitorres/rockstar-lexer

rockstar-java——Rockstar 的 Java 直譯器

https://github。com/nbrevu/rockstar-java

rockstar-py——Rockstar-to-Python 編譯器

https://github。com/yanorestes/rockstar-py

英文原文

https://github。com/dylanbeattie/rockstar

今日薦文

點選下方圖片即可閱讀

他們發明了一門程式語言,名字叫:搖滾明星 Rockstar

獨家丨對話亞麻徐 CTO Werner Vogels

技術是沒有邊界的,保持技術敏感性和快速學習能力程式設計師進階的重要因素,《程式設計師進階攻略》相信會給予正在成長階段的你很多啟發與指引。識別下圖二維碼,即刻訂閱!