首页 > 代码库 > 6个变态的C语言Hello World程序 之 雷人的程序语言

6个变态的C语言Hello World程序 之 雷人的程序语言

以下的六个程序片段主要完毕这些事情:

  1. 输出Hello, World
  2. 混乱C语言的源码

以下的全部程序都能够在GCC下编译通过,仅仅有最后一个须要动用C++的编译器g++才干编程通过。

hello1.c

1
2
3
4
5
6
7
8
9
10
11
    #define _________ }
    #define ________putchar
    #define _______ main
    #define _(a) ________(a);
    #define ______ _______(){
    #define __ ______ _(0x48)_(0x65)_(0x6C)_(0x6C)
    #define ___ _(0x6F)_(0x2C)_(0x20)_(0x77)_(0x6F)
    #define ____ _(0x72)_(0x6C)_(0x64)_(0x21)
    #define _____ __ ___ ____ _________
    #include<stdio.h>
    _____

hello2.c 

1
2
3
4
5
6
7
8
9
    #include<stdio.h>
    main(){
      intx=0,y[14],*z=&y;*(z++)=0x48;*(z++)=y[x++]+0x1D;
      *(z++)=y[x++]+0x07;*(z++)=y[x++]+0x00;*(z++)=y[x++]+0x03;
      *(z++)=y[x++]-0x43;*(z++)=y[x++]-0x0C;*(z++)=y[x++]+0x57;
      *(z++)=y[x++]-0x08;*(z++)=y[x++]+0x03;*(z++)=y[x++]-0x06;
      *(z++)=y[x++]-0x08;*(z++)=y[x++]-0x43;*(z++)=y[x]-0x21;
      x=*(--z);while(y[x]!=NULL)putchar(y[x++]);
    }

hello3.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    #include<stdio.h>
    #define __(a)goto a;
    #define ___(a)putchar(a);
    #define _(a,b) ___(a) __(b);
    main()
    { _:__(t)a:_(‘r‘,g)b:_(‘$‘,p)
      c:_(‘l‘,f)d:_(‘ ‘,s)e:_(‘a‘,s)
      f:_(‘o‘,q)g:_(‘l‘,h)h:_(‘d‘,n)
      i:_(‘e‘,w)j:_(‘e‘,x)k:_(‘\n‘,z)
      l:_(‘H‘,l)m:_(‘X‘,i)n:_(‘!‘,k)
      o:_(‘z‘,q)p:_(‘q‘,b)q:_(‘,‘,d)
      r:_(‘i‘,l)s:_(‘w‘,v)t:_(‘H‘,j)
      u:_(‘a‘,a)v:_(‘o‘,a)w:_(‘)‘,k)
      x:_(‘l‘,c)y:_(‘\t‘,g)z:___(0x0)}

hello4.c

1
2
3
4
5
6
7
8
9
    intn[]={0x48,
    0x65,0x6C,0x6C,
    0x6F,0x2C,0x20,
    0x77,0x6F,0x72,
    0x6C,0x64,0x21,
    0x0A,0x00},*m=n;
    main(n){putchar
    (*m)!=‘\0‘?main
    (m++):exit(n++);}

hello5.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    main(){inti,n[]={(((1<<1)<<(1<<1)<<(1<<
    1)<<(1<<(1>>1)))+((1<<1)<<(1<<1))), (((1
    <<1)<<(1<<1)<<(1<<1)<<(1<<1))-((1<<1)<<(
    1<<1)<<(1<<1))+((1<<1)<<(1<<(1>>1)))+ (1
    <<(1>>1))),(((1<<1)<<(1<<1)<<(1<<1)<< (1
    <<1))-((1<<1)<<(1<<1)<<(1<<(1>>1)))- ((1
    <<1)<<(1<<(1>>1)))),(((1<<1)<<(1<<1)<<(1
    <<1)<<(1<<1))-((1<<1)<<(1<<1)<<(1<<(1>>1
    )))-((1<<1)<<(1<<(1>>1)))),(((1<<1)<< (1
    <<1)<<(1<<1)<<(1<<1))-((1<<1)<<(1<<1)<<(
    1<<(1>>1)))-(1<<(1>>1))),(((1<<1)<<(1<<1
    )<<(1<<1))+((1<<1)<<(1<<1)<<(1<<(1>>1)))
    -((1<<1)<<(1<<(1>>1)))),((1<<1)<< (1<<1)
    <<(1<<1)),(((1<<1)<<(1<<1)<<(1<<1)<<(1<<
    1))-((1<<1)<<(1<<1))-(1<<(1>>1))),(((1<<
    1)<<(1<<1)<<(1<<1)<<(1<<1))-((1<<1)<< (1
    <<1)<<(1<<(1>>1)))-(1<<(1>>1))), (((1<<1
    )<<(1<<1)<<(1<<1)<<(1<<1))- ((1<<1)<< (1
    <<1)<<(1<<(1>>1)))+(1<<1)), (((1<<1)<< (
    1<<1)<<(1<<1)<< (1<<1))-((1<<1)<< (1<<1)
    <<(1<<(1>>1)))-((1<<1) <<(1<< (1>>1)))),
    (((1<<1)<< (1<<1)<<(1<<1)<< (1<<1))- ((1
    <<1)<<(1<<1)<<(1<<1))+((1<<1)<< (1<<(1>>
    1)))), (((1<<1)<<(1<<1) <<(1<<1))+(1<<(1
    >>1))),(((1<<1)<<(1<<1))+((1<<1)<< (1<<(
    1>>1))) + (1<< (1>>1)))};for(i=(1>>1);i
    <(((1<<1) <<(1<<1))+((1 <<1)<< (1<<(1>>1
    ))) + (1<<1)); i++)printf("%c",n[i]); }

hello6.cpp

以下的程序仅仅能由C++的编译器编译(比方:g++)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    #include <stdio.h>
    #define _(_)putchar(_);
    intmain(void){inti = 0;_(
    ++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++
    ++++i)_(++++++++++++++++++++
    ++++++++++++++++++++++++++++
    ++++++++++i)_(++++++++++++++
    i)_(--++i)_(++++++i)_(------
    ----------------------------
    ----------------------------
    ----------------------------
    ----------------------------
    ----------------i)_(--------
    ----------------i)_(++++++++
    ++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++i)
    _(----------------i)_(++++++
    i)_(------------i)_(--------
    --------i)_(----------------
    ----------------------------
    ----------------------------
    ----------------------------
    ----------------------------
    ------i)_(------------------
    ----------------------------
    i)returni;}


这个世界从来都不会缺少另类的东西,人类自然世界如此,计算机世界也一样。编程语言方面,看过本站《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 仅仅有八种指令,而且没有keyword,也不同意自己定义标识符,因此它的编译器实现起来很easy,初学 C 语言不久的人都能够自己编出来,虽然在座的各位每人都能够自己编一个,只是为了引起大家的兴趣,我这里还是给出大家一个官方公布的版本号。这个程序仅仅有短短 50 多行,而且全然由 ANSI C 写成,因此你随便找个 C 语言编译器,把它编译一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#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写成的一个编译器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

翻译成中文就是:

嗨
我能够用 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/

几乎相同了,该结束了,再次说明。这是一篇非常严肃的文章。

(全文完)


6个变态的C语言Hello World程序 之 雷人的程序语言