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
下一篇 2015-04-03

相關推薦

  • LVS DR模式

    一、測試環境說明 操作系統:CentOS6.7-X64 IP_VS版本:1.2.26 DR:10.10.10.130 VIP:10.10.10.140 RS1:10.10.10.131 RS2:10.10.10.132 二、LVS-DR模式原理 a)客戶端發送一個請求(源地址為CIP,目標地址為VIP,我們簡稱為CIP:VIP)到LVS的DR b)通過在調度…

    Linux干貨 2016-09-19
  • LVM work!?。?

    1、創建一個至少有兩個PV組成的大小為20G的名為testvg的VG;要求PE大小為16MB, 而后在卷組中創建大小為5G的邏輯卷testlv;掛載至/users目錄.     (1)查看分區大小 [root@localhost ~]# lsblk NAME   MAJ…

    Linux干貨 2016-09-01
  • Bash的&&,||邏輯運算

    Bash的&&,||邏輯運算 bash里的true和false并不是我們通常所認為的0和1。 true和false是shell的內置命令,返回邏輯值。 $?是一個特殊的變量,存放有上一個程序的結束狀態。 在shell里面,把0作為程序是否成功結束的標志。 例如: $ true$ echo$?0$ false$ echo$?1 有時候,下一條命…

    Linux干貨 2016-04-11
  • Linux 第五天: (08月01日) Linux用戶組管理

    Linux 第五天: (08月01日) Linux用戶組管理         管理員 root,0普通用戶 1-65535系統用戶 1-499(centos6), 1-999(centos7)登錄用戶 500(centos6)+, 1000(centos7)+   /etc/passwd 用戶及屬性/etc/…

    Linux干貨 2016-08-08
  • Linux DNS服務系列之主從復制、子域授權和轉發、view配置詳解

    前言 上文我們講解了DNS服務的原理及正反向解析配置,相信大家對DNS服務已經有了初步了解。接下來,讓我們進一步了解DNS服務的其它功能,本文將詳解主從復制、子域授權和轉發以及view的相關配置。 主從服務器配置 主從服務器關系 如果公司內DNS服務器負載過重或者為了實現冗余這一類功能就需要用到一個備份DNS服務器,備份服務器和主DNS服務器就形成了主從關系…

    Linux干貨 2015-04-13
  • 第三周課堂練習

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 [root@myserver ~]# whoami  root  [root@myserver ~]# who | cut -d' ' -…

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