草泥馬語是馬勒戈壁第一款擁有自主知識產權的,以馬勒戈壁上頑強生存的草泥馬們爲主體的編程語言。草泥馬語語法生動豐富,內容健康活潑,是一門老小皆宜,人人適用的編程語言。它的出現彌補了我戈壁在國際編程語言界中的一項空白。編程
草泥馬語是用了先進的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 |
[指令頭:泥馬]
指令 | 操做數 | 說明 | 鳥語說明 |
---|---|---|---|
[草][草] |
- | 彈出棧頂數字做爲字符輸出到標準輸出 | 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 草泥馬語