BT雷人的程序語言

這個世界從來都不會缺少另類的東西,人類自然世界如此,計算機世界也一樣。編程語言方面,看過本站《6個變態的C語言Hello World程序》的朋友們一定對BT和另類不會陌生,但那都是些小兒科,真正的BT和另類要是從語言級上來完成。讓我們來看看其中一個比較另類的語言BrainFuck??吹竭@個程序語言的名字,請不要以為這是一個搞笑的語言,這是一個“嚴肅事情”,請大家用“最虔誠的態度”來閱讀本文。

BF語言介紹

Brainfuck,是一種極小化的計算機語言,它是由Urban Müller在1993年創建的。由于“綠王八”的原因,這種語言有時被稱為brainf**kbrainf***,甚至被簡稱為BF。這種 語言,是一種按照“Turing complete(完整圖靈機)”思想設計的語言,它的主要設計思路是:用最小的概念實現一種“簡單”的語言,BrainF**k 語言只有八種符號,所有的操作都由這八種符號的組合來完成。

BF基于一個簡單的機器模型,除了八個指令,這個機器還包括:一個以字節為單位、被初始化為零的數組、一個指向該數組的指針(初始時指向數組的第一個字節)、以及用于輸入輸出的兩個字節流。

下面是這八種指令的描述,其中每個指令由一個字符標識:

字符 含義
> 指針加一
< 指針減一
+ 指針指向的字節的值加一
- 指針指向的字節的值減一
. 輸出指針指向的單元內容(ASCII碼)
, 輸入內容到指針指向的單元(ASCII碼)
[ 如果指針指向的單元值為零,向后跳轉到對應的]指令的次一指令處
] 如果指針指向的單元值不為零,向前跳轉到對應的[指令的次一指令處

(按照更節省時間的簡單說法,]也可以說成“向后跳轉到對應的[狀態”。這兩解釋是一樣的。)

(第三種同價的說法,[意思是”向前跳轉到對應的]“,]意思是”向后跳轉到對應的[指令的次一指令處,如果指針指向的字節非零?!保?/p>

Brainfuck程序可以用下面的替換方法翻譯成C語言(假設ptrchar*類型):

Brainfuck C
> ++ptr;
< --ptr;
+ ++*ptr;
- --*ptr;
. putchar(*ptr);
, *ptr =getchar();
[ while (*ptr) {
] }

BF解釋器

因為 BrainFuck 只有八種指令,并且沒有關鍵字,也不允許自定義標識符,因此它的編譯器實現起來非常簡單,初學 C 語言不久的人都可以自己編出來,盡管在座的各位每人都可以自己編一個,不過為了引起大家的興趣,我這里還是給出大家一個官方發布的版本。這個程序只有短短 50 多行,并且完全由 ANSI C 寫成,因此你隨便找個 C 語言編譯器,把它編譯一下。

#include <stdio.h>;
int  p, r, q;
char a[5000], f[5000], b, o, *s=f;
void interpret(char *c)
{
    char *d;
    r++;
    while( *c ) {
        //if(strchr("<>;+-,.[]\n",*c))printf("%c",*c);
        switch(o=1,*c++) {
            case '<': p--;        break;
            case '>;': p++;       break;
            case '+': a[p]++;     break;
            case '-': a[p]--;     break;
            case '.': putchar(a[p]); fflush(stdout); break;
            case ',': a[p]=getchar();fflush(stdout); break;
            case '[':
                for( b=1,d=c; b && *c; c++ )
                b+=*c=='[', b-=*c==']';
                if(!b) {
                    c[-1]=0;
                    while( a[p] )
                    interpret(d);
                    c[-1]=']';
                    break;
                }
            case ']':
                puts("UNBALANCED BRACKETS"), exit(0);
            case '#':
                if(q>;2)
                printf("%2d %2d %2d %2d %2d %2d %2d %2d %2d %2d\n%*s\n",
                *a,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],3*p+2,"^");
                break;
            default: o=0;
        }
        if( p<0 || p>;100)
            puts("RANGE ERROR"), exit(0);
    }
    r--;
    //        chkabort();
}
main(int argc,char *argv[])
{
    FILE *z;
    q=argc;
    if(z=fopen(argv[1],"r")) {
        while( (b=getc(z))>;0 )
            *s++=b;
        *s=0;
        interpret(f);
    }
}

當然,如果你覺得用C語言來實現BrainFuck語言的解釋器是對BrainFuck這種語言的一種侮辱的話,我們的BrainFuck社區是絕對不能容忍你有這種想法的。因為我們有一個使用100%純brainfuck寫成的一個編譯器awibhttp://code.google.com/p/awib/

Hello World

++++++++++[>+++++++>++++++++++>+++>+<<<<-]
>++.>+.+++++++..+++.>++.<<+++++++++++++++.
>.+++.------.--------.>+.>.

怎么?看不懂嗎?下面是解釋:

+++ +++ +++ +           initialize counter (cell #0) to 10
[                       use loop to set the next four cells to 70/100/30/10
    > +++ +++ +             add  7 to cell #1
    > +++ +++ +++ +         add 10 to cell #2
    > +++                   add  3 to cell #3
    > +                     add  1 to cell #4
    <<< < -                 decrement counter (cell #0)
]
>++ .                   print 'H'
>+.                     print 'e'
+++ +++ +.              print 'l'
.                       print 'l'
+++ .                   print 'o'
>++ .                   print ' '
<<+ +++ +++ +++ +++ ++. print 'W'
>.                      print 'o'
+++ .                   print 'r'
--- --- .               print 'l'
--- --- --.             print 'd'
>+.                     print '!'
>.                      print '\n'

相關鏈接

其它另類語言

如果你要覺得BF已經很BT了,那么你就錯了,下面這些程序語言更BT。

WhiteSpace語言

這是一種只用空白字符(空格,TAB和回車)編程的語言,而其它可見字符統統為注釋。下面是它的一個示例:


什么?你什么也沒有看見,這就對了,因為這正是這門語言的獨特之處。訪問下面這個鏈接查看Hello,World示例。記得按Ctrl+A來查看程序。

官網:http://compsoc.dur.ac.uk/whitespace/index.php。

LOLCODE語言

LOLCODE是一種建立在高度縮寫的網絡英語之上的編程語言,一般來說如果一個人能理解這種網絡英語就能在未經訓練的情況下讀懂LOLCODE程序源代碼。下面是其Hello,World例程:

HAI
CAN HAS STDIO?
VISIBLE "HAI WORLD!"
KTHXBYE

翻譯成中文就是:

嗨
我可以用 STDIO 么?
顯示一下 “HAI WORLD!”
謝謝啊,再見

官網:http://lolcode.com/

中文編程語言

不要以為只有老外才那么BT,咱們中國也有自己的BT編程語言。

中文Basic

中文指令 對應于的Applesoft BASIC
10 卜=0 10 Y=0
20 入 水, 火 20 INPUT E, F
30 從 日 = 水 到 火 30 FOR A = E TO F
40 卜 = 卜+對數(日) 40 Y = Y + LOG (A)
50 下一 日 50 NEXT A
60 印 卜 60 PRINT Y

官網無法訪問了,只能看看Wikipedia了:http://en.wikipedia.org/wiki/Chinese_BASIC

中蟒語言(中文Python)

下面的程序是不是很Cool?

#!/usr/local/bin/cpython
回答 = 讀入('你認為中文程式語言有存在價值嗎 ? (有/沒有)')
如 回答 == '有':
寫 '好吧, 讓我們一起努力!'
不然 回答 == '沒有':
寫 '好吧,中文并沒有作為程式語言的價值.'
否則:
寫 '請認真考慮后再回答.'

官網:http://www.chinesepython.org/

差不多了,該結束了,再次說明,這是一篇很嚴肅的文章。

轉自:http://coolshell.cn/articles/1142.html

原創文章,作者:s19930811,如若轉載,請注明出處:http://www.www58058.com/2410

(0)
s19930811s19930811
上一篇 2015-04-03 21:53
下一篇 2015-04-03 21:59

相關推薦

  • 二叉樹迭代器算法

    二叉樹(Binary Tree)的前序、中序和后續遍歷是算法和數據結構中的基本問題,基于遞歸的二叉樹遍歷算法更是遞歸的經典應用。 假設二叉樹結點定義如下: // C++ struct Node {     int value;     No…

    Linux干貨 2016-08-15
  • Linux文件系統上的權限

    Linux文件系統上的權限 首先我們來看一下如何修改文件的屬主和屬組 修改文件的屬主:chown chown [OPTION]… [OWNER][:[GROUP]]FILE… 用法 OWNER修改屬主 OWNER:GROUP修改屬主:屬組 :GROUP修改屬組 命令中的冒號可以用.替換 -R:遞歸 chowen [OPTION]&#8…

    Linux干貨 2016-08-04
  • 8月3日作業

    1、三種權限rwx對文件和目錄的不同意義     文件:         r:可讀         w:可修改內容,不可刪除   &nbsp…

    Linux干貨 2016-08-05
  • 馬哥網絡班N22開學小計

        2010年通信系統碩士畢業就進入了數據中心從事網絡運維管理方面的工作,隨著工作展開逐漸感受到系統方面的知識可能成為自己IT職業生涯的短板,于是從2015年底開始系統的學習linux。     2016年上半年由于備考RHCE,非常幸運的在網絡上接觸馬哥的2013版linu…

    Linux干貨 2016-08-15
  • 通過虛擬機制作RAID5

    制作RAID5的過程,包括制作RAID5的制作,增加和刪除RAID

    2017-12-10
  • Linux基礎知識第一課

    一、計算機的組成:             CPU:運算器、控制器、寄存器、緩存            存儲器:內存,RAM(Random …

    Linux干貨 2016-09-12
欧美性久久久久