BT雷人的程序语言
原文:http://cocre.com/?p=1142 酷壳
这个世界从来都不会缺少另类的东西,人类自然世界如此,计算机世界也一样。编程语言方面,看过本站《6个变态的C语言Hello World程序》的朋友们一定对BT和另类不会陌生,但那都是些小儿科,真正的BT和另类要是从语言级上来完成。让我们来看看其中一个比较另类的语言BrainFuck。看到这个程序语言的名字,请不要以为这是一个搞笑的语言,这是一个“严肃事情”,请大家用“最虔诚的态度”来阅读本文。
BF语言介绍
Brainfuck,是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由于“绿王八”的原因,这种语言有时被称为brainf**k或brainf***,甚至被简称为BF。这种 语言,是一种按照“Turing complete(完整图灵机)”思想设计的语言,它的主要设计思路是:用最小的概念实现一种“简单”的语言,BrainF**k 语言只有八种符号,所有的操作都由这八种符号的组合来完成。
BF基于一个简单的机器模型,除了八个指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。
下面是这八种指令的描述,其中每个指令由一个字符标识:
字符 | 含义 |
---|---|
> |
指针加一 |
< |
指针减一 |
+ |
指针指向的字节的值加一 |
- |
指针指向的字节的值减一 |
. |
输出指针指向的单元内容(ASCII码) |
, |
输入内容到指针指向的单元(ASCII码) |
[ |
如果指针指向的单元值为零,向后跳转到对应的] 指令的次一指令处 |
] |
如果指针指向的单元值不为零,向前跳转到对应的[ 指令的次一指令处 |
(按照更节省时间的简单说法,]
也可以说成“向后跳转到对应的[
状态”。这两解释是一样的。)
(第三种同价的说法,[
意思是"向前跳转到对应的]
“,]
意思是”向后跳转到对应的[
指令的次一指令处,如果指针指向的字节非零。")
Brainfuck程序可以用下面的替换方法翻译成C语言(假设ptr
是char*
类型):
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编译器awib:http://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的官网:http://www.muppetlabs.com/~breadbox/bf/。
- BF的Wikipedia:http://en.wikipedia.org/wiki/Brainfuck。
其它另类语言
如果你要觉得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
中文编程语言
不要以为只有老外才那么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/
差不多了,该结束了,再次说明,这是一篇很严肃的文章。
(全文完)
BT雷人的程序语言的更多相关文章
- 6个变态的C语言Hello World程序 之 雷人的程序语言
以下的六个程序片段主要完毕这些事情: 输出Hello, World 混乱C语言的源码 以下的全部程序都能够在GCC下编译通过,仅仅有最后一个须要动用C++的编译器g++才干编程通过. hello1.c ...
- [No000023]为何没有更多人从事程序员的工作?程序员常有,优秀程序员不常有!
成为优秀的程序员是极其困难的,并且这个过程不可能一蹴而就. 我们不可能期待去种一些树,然后一夜间收获有着2000年树龄的红杉树,无论其需求有多大. 人格特点 一个人首先得是自学者来学习编程.仅仅是超过 ...
- atitit.编程语言 程序语言 的 工具性 和 材料性 双重性 and 语言无关性 本质
atitit.编程语言 程序语言 的 工具性 和 材料性 双重性 and 语言无关性 本质 #---语言的 工具和材料双重性 有的人说语言是个工具,有的人说语言是个材料..实际上语言同时属于两个属性. ...
- 数学语言和程序语言的对比:面向过程与面向集合&命题
共同之处:都使用字符串或数值来引用一个客观实体.当然数字和字符串也可以作为实体对象,这取决于人的解释. 不同之处:数学语句每一行都给出了一个结论, 程序语句的每一行都定义了一个过程.注意这里所指的程序 ...
- 为什么越来越多的人偏爱go语言
如果你是一个开发者或者程序员,你大概应该听过Go语言或者Golang语言.当然,如果没有听过也没关系,看到这篇文章的同学,就说明你对Golang是关注的,只需要这一点就够了.今天来聊聊关于Golang ...
- 简单易懂的程序语言入门小册子(1.5):基于文本替换的解释器,递归定义与lambda演算的一些额外说明
这一篇接在第一篇lambda演算的后面.讲讲一些数学知识. 经常有些看似很容易理解的东西,一旦要描述得准确无误,就会变得极为麻烦. 软件工程里也有类似情况:20%的代码实现了核心功能,剩下80%的代码 ...
- 简单易懂的程序语言入门小册子(5):基于文本替换的解释器,递归,不动点,fix表达式,letrec表达式
这个系列有个显著的特点,那就是标题越来越长.忽然发现今天是读书节,读书节多读书. ==下面是没有意义的一段话============================================== ...
- 简单易懂的程序语言入门小册子(1):基于文本替换的解释器,lambda演算
最近比较闲,打算整理一下之前学习的关于程序语言的知识.主要的内容其实就是一边设计程序语言一边写解释器实现它.这些知识基本上来自Programming Languages and Lambda Calc ...
- 《Java从入门到失业》第一章:计算机基础知识(三):程序语言简介
1.3程序语言简介 我们经常会听到一些名词:低级语言.高级语言.编译型.解释型.面向过程.面向对象等.这些到底是啥意思呢?在正式进入Java世界前,笔者也尝试简单的聊一聊这块东西. 1.3.1低级语言 ...
随机推荐
- 18 Ui美化 剪切动画clip
输入0 - 10000 让图片根据数值显示部分图片 在工程文件的res/drawable/新建clip文件 <?xml version="1.0" encoding=&quo ...
- linux C++多线程操作文件&输出加锁
下述demo将指定目录下文件存入vector,然后一分为二交给两个线程(threadTask1,threadTask2)去分别处理,对输出函数printDirent加锁防止紊乱. #include & ...
- 对 jiffies 溢出、回绕及 time_after 宏的理解
原文如下: 关于jiffies变量: 全局变量jiffies用来记录自启动以来产生的节拍的总数.系统启动时会将该变量初始化为0,此后,每当时钟中断产生时就会增加该变量的值.jiffies和另外 ...
- Struts2配置问题终极解决方案
从下午忙到现在,终于找到问题的根源了.写下此文,与君共勉. 我的目录结构是这样的. 关于配置文件加载问题 控制台下面报错,提示错误信息如下: 严重: Exception starting filter ...
- iOS下WebRTC音视频通话(二)-局域网内音视频通话
这里是iOS 下WebRTC音视频通话开发的第二篇,在这一篇会利用一个局域网内音视频通话的例子介绍WebRTC中常用的API. 如果你下载并编译完成之后,会看到一个iOS 版的WebRTC Demo. ...
- 后端分布式系列:分布式存储-HDFS 与 GFS 的设计差异
「后端分布式系列」前面关于 HDFS 的一些文章介绍了它的整体架构和一些关键部件的设计实现要点. 我们知道 HDFS 最早是根据 GFS(Google File System)的论文概念模型来设计实现 ...
- (NO.00005)iOS实现炸弹人游戏(三):从主场景类谈起
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我又粗粗看了下整个项目的代码,比较多: 不少类都与其他类有着千丝 ...
- Android进阶(十三)网络爬虫&json应用
刚开始接触网络爬虫,怎一个"菜"字了得!经过几次的折磨,对其原理以及其中用到的json技术有了大致的了解,故作一总结,供有同样迷惑的朋友参考学习. 自己爬取的网站内容为12306的 ...
- 【一天一道LeetCode】#114. Flatten Binary Tree to Linked List
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- 从JDK源码角度看java并发的原子性如何保证
JDK源码中,在研究AQS框架时,会发现很多地方都使用了CAS操作,在并发实现中CAS操作必须具备原子性,而且是硬件级别的原子性,java被隔离在硬件之上,明显力不从心,这时为了能直接操作操作系统层面 ...