編程語言中的精品——草泥馬語

草泥馬語是馬勒戈壁第一款擁有自主知識產權的,以馬勒戈壁上頑強生存的草泥馬們爲主體的編程語言。草泥馬語語法生動豐富,內容健康活潑,是一門老小皆宜,人人適用的編程語言。它的出現彌補了我戈壁在國際編程語言界中的一項空白。編程

oreilly草泥馬書

草泥馬語是用了先進的JOT(Just Out of Time)編譯引擎,而且運行於爪哇虛擬機中,運行速度大幅度下降同時,還使用了戈壁內外各類先進技術,使的草泥馬語不十分可靠。segmentfault

《草泥馬語》是一個基於堆和棧的編程語言,該語言的最大特色在於:全部操做全由「草」「泥」「馬」「河蟹」這4個命令完成,文件內的其餘字符都做爲註釋而不參與程序執行。編程語言

另外,因爲草泥馬語言形式過於震撼,因此爲了調試,編寫了草泥馬語逆編譯器:gmhd 能夠吧草泥馬語言代碼反編譯成比較好懂的僞代碼。

ide

《草泥馬語》的語言規範

草泥馬語是一款根據國外同類型語言「Whitespace」改編(替換關鍵字)而成的全新的編程語言,執行時使用「草泥馬」的不一樣組合實現不一樣功能。函數

PS: 能夠先看Whitespace語言入門,而後吧其中的[Space]替換成草;[Tab]替換成泥;[LF]替換成馬就能夠了解草泥馬語的大體用法了。this

每一個指令都有3部分組成,包括指令頭,指令和可選的操做數google

指令頭

草泥馬語的指令頭說明了指令的類型,列表以下:spa

指令頭 說明 鳥語說明
[草] 棧操做 Stack Manipulation
[泥][草] 數學運算 Arithmetic
[泥][泥] 堆操做 Heap access
[馬] 流程控制 Flow Control
[泥][馬] 輸入輸出 I/O

棧操做指令 [指令頭:草]

棧用來存儲指令調用的參數和結果,元素僅限整數,棧高度不限。調試

指令 操做數 說明 鳥語說明
[草] Number 把某個數壓棧 Push the number onto the stack
[馬][草] - 複製棧頂元素 Duplicate the top item on the stack
[泥][草] Number 複製第n個元素到棧頂 Copy the nth item on the stack (given by the argument) onto the top of the stack
[馬][泥] - 交換棧頂兩個元素的位置 Swap the top two items on the stack
[馬][馬] - 銷燬棧頂元素 Discard the top item on the stack
[泥][馬] Number 銷燬棧頂的n個元素,但保持棧頂 Slide n items off the stack, keeping the top item

數學運算指令 [指令頭:泥草]

注意,草泥馬語沒有浮點運算,可是整數運算的精度是無限的。 操做規則:操做時先彈出一個棧元素爲運算的右值,再彈出一個爲左值,計算後將結果壓棧。code

指令 操做數 說明 鳥語說明
[草][草] - Addition
[草][泥] - Subtraction
[草][馬] - Multiplication
[泥][草] - Integer Division
[泥][泥] - 取模 Modulo

堆操做 [指令頭:泥泥]

與棧同樣,堆也只能存儲整數,草泥馬虛擬機(AlpacaVM)最多支持65536個堆元素(0-65535),可是堆元素的大小不限制。

堆操做的規則:若是要存儲,要先將要操做的堆地址壓棧,再把要存儲的數壓棧,操做時彈出棧頂兩元素,將棧頂元素存儲到次棧頂指示的堆空間中;若是要取出,要先將地址壓棧,操做時彈出棧頂元素,根據其指示的地址取出堆中元素壓棧。

指令 操做數 說明 鳥語說明
[草] - 存儲棧頂元素x到堆地址爲y的空間中,y是次棧頂元素 Store
[泥] - 先把y壓棧,而後獲取堆中地址爲y空間的元素到棧頂 Retrieve

流程控制 [指令頭:馬]

標記一個程序點能夠用來進行跳轉或者函數調用,標記是一個任意長度的無符號整數,每一個草泥馬文件中,標記應該是惟一的,而且全部調用的標記應當存在。

注意:河蟹這個指令僅僅在河蟹這兩個字連在一塊兒時有效,分開是沒有效果的。(注意更正一個歧義表達,河蟹這個指令是沒有指令頭的。)

指令 操做數 說明 鳥語說明
[草][草] Label 定義一個標記 Mark a location in the program
[草][泥] Label 調用標記指示的函數 Call a subroutine
[草][馬] Label 無條件跳轉到標記處 Jump unconditionally to a label
[泥][草] Label 若是棧頂元素等於0則跳轉到標記指示處 Jump to a label if the top of the stack is zero
[泥][泥] Label 若是棧頂元素小於0則跳轉到標記指示處 Jump to a label if the top of the stack is negative
[泥][馬] - 函數結束,返回調用處 End a subroutine and transfer control back to the caller
[馬][馬]或者[河蟹] - 無條件結束程序運行 End the program

IO 控制 [指令頭:泥馬]

指令 操做數 說明 鳥語說明
[草][草] - 彈出棧頂數字做爲字符輸出到標準輸出 Output the character at the top of the stack
[草][泥] - 彈出棧頂數字以數字形式輸出到標準輸出 Output the number at the top of the stack
[泥][草] - 從標準輸入內讀取一個字符(回車結束)而且放到棧頂(彈出)所對應的堆空間 Read a character and place it in the location given by the top of the stack
[泥][泥] - 從標準輸入內讀取一個數字而且放到棧頂(彈出)所對應的堆空間 Read a number and place it in the location given by the top of the stack

如何定義操做數

操做數的定義是二進制的整數,對於流程控制指令來講是無符號的,不然是有符號的,第一位爲符號位。 定義方法是:草爲0;泥爲1;馬錶明定義結束。對於符號位,草爲正,泥爲負。

舉個例子吧

這是個例子,輸出1到10十個數,具體解釋請看下面。

草草草泥馬 馬草草草泥草草草草泥泥馬 草馬草 泥馬草泥 草草草泥草泥草馬 泥馬草草 草草草泥馬 泥草草草 草馬草 草草草泥草泥泥馬 泥草草泥 馬泥草草泥草草草泥草泥馬 馬草馬草泥草草草草泥泥馬 馬草草草泥草草草泥草泥馬 草馬馬 馬馬馬

寫出來大概就是這個樣子,下面是一個從1到10的循環:

指令 操做數 說明
草-草 草泥馬 數字1壓棧 Put a 1 on the stack
馬-草草 草泥草草草草泥泥馬 在這裏設置一個循環開始的標識 Set a Label at this point
草-馬草 複製棧頂元素 Duplicate the top stack item
泥馬-草泥 輸出當前值 Output the current value
草草 草泥草泥草馬 換行(10)壓棧 Put 10 (newline) on the stack...
泥馬-草草 輸出 ...and output the newline
草草 草泥馬 1壓棧 Put a 1 on the stack
泥草-草草 相加棧內兩個元素 Addition. This increments our current value.
草-馬草 複製棧頂以便比較 Duplicate that value so we can test it
草-草 草泥草泥泥馬 11壓棧 Push 11 onto the stack
泥草-草泥 相減,若是咱們已經循環到11了應該會獲得一個0到棧頂 Subtraction. So if we've reached the end, we have a zero on the stack.
馬-泥草 草泥草草草泥草泥馬 若是是0,跳到最後 If we have a zero, jump to the end
馬-草馬 草泥草草草草泥泥馬 跳到開始 Jump to the start
馬-草草 草泥草草草泥草泥馬 設置一個標籤標識循環結束 Set the end label
草-馬馬 清空堆棧,打掃衛生,整理整頓 Discard our accumulator, to be tidy
河蟹 正如其言 Just as it says.



via 草泥馬語

相關文章
相關標籤/搜索