Whitespace

维基百科,自由的百科全书
跳转至: 导航搜索
Whitespace with syntax-heighlighting

Whitespace是種深奥的编程语言。它由Edwin Brady和Chris Morris開發,2003年4月1日發佈。大部分的現代程式設計語言都不將空白字元視為語法的一部分。但Whitespace卻只視空格(space)、制表符(tabs)和換行(new lines)為語法的一部分,它的直譯器忽略所有非空白字元。

它本身是個指令式、基於堆疊的語言。其程式運行在上的虛擬機器均有一個堆疊(Stack)和(Heap)。程式員可自由將整數推進堆疊中(只可以是整數,因為暫時並無浮點數或實數工具)。使用者亦可通過堆作為變數和資料結構的暫存區。

这种语言有和Brainfuck一样的优点,能方便地写程序注释,写的注释根本不需要标识,编译器直接跳过你写的文字信息。还有,借助这种语言,可以在满篇空白的代码中插入一篇文章,从而在看起来完全无关的文章中隐藏一段代码。对于一些需要保证安全性的工作来说,这种语言帮助很大,因为它可以防止别人把代码打印出来拿走。

語法[编辑]

IMP[编辑]

IMP ( Instruction Modification Parameter)是whitespace語法中的一種特色,在每個指令前要指名要使用哪種形式的IMP,之後在進行屬於每個IMP裡的不同操作。

IMP 意義
[Space] 堆疊操作
[Tab][Space] 數學運算
[Tab][Tab] 堆積存取
[LineFeed] 流程控制
[Tab][LineFeed] I/O

虛擬機(程式所運行的地點)中有一個堆疊與堆積. 程式設計者可以任意的將整數放入堆疊( 只有整數 ,目前沒有浮點數與實數的實作). 堆積也可以任意且永久的儲存變數或資料結構. 許多命令需要數字或是標籤(label)作為參數. 整數可以為任意長度的位元(bits), 以一系列的空白(Space)與製表符(Tab)表現, 以換行(LF)作為結束. 空白代表數位上的"0",製表符則代表"1".給定的第一個字元代表整數的正負號, 空白為正號而製表符為負號. 要注意兩號並非互補, 只是單純代表正負號. 標籤也是由一系列空白與製表符組成而以[LF]作為結尾. 所有標籤必須是獨一無二而不能重複的.


堆疊操作 (IMP: [Space])[编辑]

堆疊操作為一常用運算, 所以使用IMP裡面最簡短的[Space]. 這裡有四種操作方式.

指令 參數 意義
[Space] 數字 將某個數字放入堆疊
[Tab][Space] 數字 將堆疊裡的第n個元素複製到堆疊頂
[Tab][LF] 數字 將堆疊裡的第n個元素從堆疊裡移除
[LF][Space] - 複製堆疊最上方的元素
[LF][Tab] - 交換兩個堆疊最上層的元素
[LF][LF] - 屏棄堆疊最上層的元素

算術 (IMP: [Tab][Space])[编辑]

算術運算會取堆疊最上方的兩個元素做運算, 並以運算結果取代原本的元素. 先進入堆疊的元素將被視為運算子左方的運算元.

指令 參數 意義
[Space][Space] -
[Space][Tab] -
[Space][LF] -
[Tab][Space] - 整數除法
[Tab][Tab] - 模運算(取餘數)

堆積操作 (IMP: [Tab][Tab])[编辑]

堆積操作會由堆疊中尋找將被儲存或被取回的物件位址. 要儲存一個物件至堆積裡, 先將位址放入堆疊, 而後放入物件的值再執行儲存指令. 要取出堆積裡的一個物件, 將位址放入堆疊而後執行取回指令, 取回的值會被存放在堆疊的最上方.

指令 參數
[Space] 儲存
[Tab] 取回

控制敘述 (IMP: [LF])[编辑]

控制敘述也是常見指令. 子程序會藉由標籤(label)作標記(用於進行有條件或無條件跳轉), 此為迴圈(loop)實作的原理. 程式必須藉由[LF][LF][LF]這行命令才能才能讓直譯器乾淨(clearly)的結束程式.

指令 參數 意義
[Space][Space] 標籤 標記程式中某一個流程
[Space][Tab] 標籤 標籤呼叫子程序
[Space][LF] 標籤 從某標籤無條件跳躍至另一標籤
[Tab][Space] 標籤 如果堆疊頂為0則跳躍至某標籤
[Tab][Tab] 標籤 如果堆疊頂為負數則跳躍至某標籤
[Tab][LF] 結束目前子程序並跳躍回呼叫者
[LF][LF] - 結束程式

輸入輸出 (IMP: [Tab][LF])[编辑]

最後, 我們必須與使用者互動. 這裡的輸入輸出操作有讀入或寫出數字或單獨的字元. 有了這些指令, 我們就可以進行資料流的輸入輸出. 讀入指令會取用堆積地址以將結果寫入堆疊最上方.


指令 參數
[Space][Space] 輸出堆疊最上方的字元
[Space][Tab] 輸出堆疊最上方的數字
[Tab][Space] 讀入一字元並寫入堆疊頂的位址裡
[Tab][Tab] 讀入一數字並寫入堆疊頂的位址裡


範例[编辑]

這是一個簡單的輸出"Hello ,world!"的程式, 每個 空白, 製表符, 或是換行字元被分別以 "S", "T", 和"L", 代表:

S S S T	S S T	S S S L
T	L
S S S S S T	T	S S T	S T	L
T	L
S S S S S T	T	S T	T	S S L
T	L
S S S S S T	T	S T	T	S S L
T	L
S S S S S T	T	S T	T	T	T	L
T	L
S S S S S T	S T	T	S S L
T	L
S S S S S T	S S S S S L
T	L
S S S S S T	T	T	S T	T	T	L
T	L
S S S S S T	T	S T	T	T	T	L
T	L
S S S S S T	T	T	S S T	S L
T	L
S S S S S T	T	S T	T	S S L
T	L
S S S S S T	T	S S T	S S L
T	L
S S S S S T	S S S S T	L
T	L
S S L
L
L


外部鏈結[编辑]