BT雷人的程序语言

简介:

原文:http://cocre.com/?p=1142  酷壳

 

这个世界从来都不会缺少另类的东西,人类自然世界如此,计算机世界也一样。编程语言方面,看过本站《6个变态的C语言Hello World程序》的朋友们一定对BT和另类不会陌生,但那都是些小儿科,真正的BT和另类要是从语言级上来完成。让我们来看看其中一个比较另类的语言BrainFuck。看到这个程序语言的名字,请不要以为这是一个搞笑的语言,这是一个“严肃事情”,请大家用“最虔诚的态度”来阅读本文。

BF语言介绍

Brainfuck,是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由于“绿王八”的原因,这种语言有时被称为brainf**kbrainf***,甚至被简称为BF。这种 语言,是一种按照“Turing complete(完整图灵机)”思想设计的语言,它的主要设计思路是:用最小的概念实现一种“简单”的语言,BrainF**k 语言只有八种符号,所有的操作都由这八种符号的组合来完成。

BF基于一个简单的机器模型,除了八个指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。

下面是这八种指令的描述,其中每个指令由一个字符标识:

 

字符 含义
> 指针加一
< 指针减一
+ 指针指向的字节的值加一
- 指针指向的字节的值减一
. 输出指针指向的单元内容(ASCII码)
, 输入内容到指针指向的单元(ASCII码)
[ 如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处
] 如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处

(按照更节省时间的简单说法,]也可以说成“向后跳转到对应的[状态”。这两解释是一样的。)

(第三种同价的说法,[意思是"向前跳转到对应的]“,]意思是”向后跳转到对应的[指令的次一指令处,如果指针指向的字节非零。")

Brainfuck程序可以用下面的替换方法翻译成C语言(假设ptrchar*类型):

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

BF解释器

因为 BrainFuck 只有八种指令,并且没有关键字,也不允许自定义标识符,因此它的编译器实现起来非常简单,初学 C 语言不久的人都可以自己编出来,尽管在座的各位每人都可以自己编一个,不过为了引起大家的兴趣,我这里还是给出大家一个官方发布的版本。这个程序只有短短 50 多行,并且完全由 ANSI C 写成,因此你随便找个 C 语言编译器,把它编译一下。

01. #include <stdio.h>;
02.   
03. int  p, r, q;
04. char a[5000], f[5000], b, o, *s=f;
05.   
06. void interpret(char *c)
07. {
08.     char *d;
09.   
10.     r++;
11.     while( *c ) {
12.         //if(strchr("<>;+-,.[]/n",*c))printf("%c",*c);
13.         switch(o=1,*c++) {
14.             case '<': p--;        break;
15.             case '>;': p++;       break;
16.             case '+': a[p]++;     break;
17.             case '-': a[p]--;     break;
18.             case '.'putchar(a[p]); fflush(stdout); break;
19.             case ',': a[p]=getchar();fflush(stdout); break;
20.             case '[':
21.                 for( b=1,d=c; b && *c; c++ )
22.                 b+=*c=='[', b-=*c==']';
23.                 if(!b) {
24.                     c[-1]=0;
25.                     while( a[p] )
26.                     interpret(d);
27.                     c[-1]=']';
28.                     break;
29.                 }
30.             case ']':
31.                 puts("UNBALANCED BRACKETS"), exit(0);
32.             case '#':
33.                 if(q>;2)
34.                 printf("%2d %2d %2d %2d %2d %2d %2d %2d %2d %2d/n%*s/n",
35.                 *a,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],3*p+2,"^");
36.                 break;
37.             default: o=0;
38.         }
39.         if( p<0 || p>;100)
40.             puts("RANGE ERROR"), exit(0);
41.     }
42.     r--;
43.     //        chkabort();
44. }
45.   
46. main(int argc,char *argv[])
47. {
48.     FILE *z;
49.   
50.     q=argc;
51.   
52.     if(z=fopen(argv[1],"r")) {
53.         while( (b=getc(z))>;0 )
54.             *s++=b;
55.         *s=0;
56.         interpret(f);
57.     }
58. }

当然,如果你觉得用C语言来实现BrainFuck语言的解释器是对BrainFuck这种语言的一种侮辱的话,我们的BrainFuck社区是绝对不能容忍你有这种想法的。因为我们有一个使用100%纯brainfuck写成的一个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

官网: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/

 

差不多了,该结束了,再次说明,这是一篇很严肃的文章。

(全文完)

相关文章
|
3月前
|
SQL Linux 数据库
嵌入式中如何用C语言操作sqlite3(07)
嵌入式中如何用C语言操作sqlite3(07)
49 1
|
6月前
|
存储 小程序 Linux
【Linux从入门到精通】C语言模拟实现进度条小程序
在Linux下,我们安装软件时会经常看到进度条,来告知我们安装的进度。我们不妨自己模拟实现一个进度条,看看其中的细节。模拟实现进度条并不困难,但其中的细节我们又不可忽视。本篇文章会对模拟实现进度条进行详解。
239 1
|
10月前
|
安全 应用服务中间件 Linux
【linux 脚本篇】流程控制语句-case
【linux 脚本篇】流程控制语句-case
|
10月前
|
Python
Python基础 is与==的区别
Python基础 is与==的区别
47 0
|
机器学习/深度学习 Shell Linux
Linux shell编程(if、for、case、while语句的解释与应用)
Linux shell编程(if、for、case、while语句的解释与应用)
129 0
|
Go
一文熟悉 Go 的分支结构(if - else-if - else、switch)
我是陈明勇,本文分享的知识是 Go 的分支结构。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!
90 1
一文熟悉 Go 的分支结构(if - else-if - else、switch)
|
机器学习/深度学习 Unix Shell
Linux Shell 基础语法 流程控制 逻辑运算 字符串操作详细解析
Linux Shell 基础语法 流程控制 逻辑运算 字符串操作详细解析详细介绍
Linux Shell 基础语法 流程控制 逻辑运算 字符串操作详细解析
|
存储 JSON Ubuntu
测试面试题集锦(四)| Linux 与 Python 编程篇(附答案)
测试面试题集锦(四)| Linux 与 Python 编程篇(附答案)
VB编程:FileLen函数获取文件的大小
VB编程:FileLen函数获取文件的大小
269 0