最‘乾淨’的程式語言——空白程式語言

fango發表於2012-07-14

最‘乾淨’的程式語言——空白程式設計

prog = `          





 `

您沒看明白。上面的prog,是一個程式的原始碼,執行的結果,是顯示hi

空白不代表不存在,更不能因為它們不突出,就可以自然地被忽略。我們在Sublime裡選擇高亮,就可以看到裡面的空格、製表符tab和換行符。

並且,我也給您看了它對應的腦操語言程式碼和用\t\n轉義後的空白語言程式碼。

WAT?!

事實上,低頭看看你的鍵盤,哪個按鍵最大並唯一需要兩個大拇指的專門關照?你的右手小拇指,最多尋找的是不是回車?為什麼每個按鍵都會在shift的壓迫下交錢(Capitalize),而只有空格 製表 回車三白,可以特立獨行?

好了。肺發太多。直接上Go寫的虛擬機器(直譯器)程式吧:

/* Markspace is an esoteric programming language 
inspired by Brainfuck [1] and Whitespace [2].
It uses Harvard Architecture with 7 instructions below, 
where \s as Space (ASCII 32), \t as Tab (ASCII 9) and \n as Line Feed(ASCII 10).

    \s    Increment current data
    \t\s    Decrement current data
    \t\t    Increment current data pointer
    \t\n    Decrement current data pointer
    \n\s    Output current data as ASCII charactor
    \n\t    Mark loop start. If current data is zero, jump after loop end
    \n\n    Mark loop end. If current data is nonzero, jump after loop start

[1] http://en.wikipedia.org/wiki/Brainfuck
[2] http://compsoc.dur.ac.uk/whitespace/

Copyright (c) 2012 fango
*/
package main

import "fmt"

var (
    a [2]byte
    //prog  = "++++++++++[>++++++++++<-]>++++.+."
    //prog = "          \n\t\t\t          \t\n\t \n\n\t\t    \n  \n "
    prog = `          





 `
    p  = 0
    pc = 0
    ls = -1
    le = -1
)

func main() {
    for {
        switch prog[pc] {
        case ' ': // '+':
            a[p]++
        case '\t':
            pc++
            switch prog[pc] {
            case ' ': // '-'
                a[p]--
            case '\t': // '>'
                p++
            case '\n': // '<':
                p--
            }
        case '\n':
            pc++
            switch prog[pc] {
            case ' ': // '.'
                fmt.Print(string(a[p]))
            case '\t': // '['
                if a[p] == 0 {
                    pc = le
                } else {
                    ls = pc
                }
            case '\n': // ']':
                if a[p] != 0 {
                    pc = ls
                } else {
                    le = pc + 1
                }
            }
        }
        pc++
        if pc == len(prog) {
            return
        }
    }
    //Output:
    //hi
}

相關文章