#两种比较雷人的编程语言 先给大家看两段雷人代码 **第一段雷人代码** ```GMH 草草草泥马 马草草草泥草草草草泥泥马 草马草 泥马草泥 草草草泥草泥草马 泥马草草 草草草泥马 泥草草草 草马草 草草草泥草泥泥马 泥草草泥 马泥草草泥草草草泥草泥马 马草马草泥草草草草泥泥马 马草草草泥草草草泥草泥马 草马马 河蟹 ``` **第二段雷人代码** ```8Diagrams 离离离离离离离离离离巽乾离离离离离离离乾离离离离离离离离离离乾离离离乾离坤坤坤坤坎艮乾离离兑乾离兑离离离离离离离兑兑离离离兑乾离离兑坤坤离离离离离离离离离离离离离离离兑乾兑离离离兑坎坎坎坎坎坎兑坎坎坎坎坎坎坎坎兑乾离兑乾兑 ``` 第一段代码可能知道的人比较多,因为它来自[Google开源项目grass-mud-horse](http://code.google.com/p/grass-mud-horse/ "Google开源项目grass-mud-horse")的一个实例程序,第二段代码大家可能大家都没见过,因为那是我发明的新型编程语言……八卦语……(呵呵,本语言对所有人开放,不过请声明是本人首先提出的,至于语法,后面我会解释)。 关于第一段代码呢,你可以到这个开源项目组去寻求支持,对于第二段代码呢,是用八卦语写的Hello World!程序。我花费了一段时间写了[一个解释器](http://1157.huaying1988.com/bfi.html "自己写的八卦语言解释器"),当前已解决常用编码问题(20180130,相关方法可参照[后来关于编码的一篇博文](/blogs/unicode_to_gb2312_by_js/detail.html "unicode与GB2312的相互转换(js)"))。该解释器附带一个例子,是输出的是李煜的虞美人,可以将文本域中的文字改变成你想要运行的程序。 呵呵,明眼人其实早已经看出来了……确实,其实八卦语是一个更雷人的编程语言BrainFuck的一个衍生版本(由于这名称太雷人了,所以以后简称为BF,或者是BrainF**k)。这其实本来是我写的一个BF解释器,而仅仅改了一句,变成了一个八卦语编译器(现在已添加相关语言的切换选择)。那么至于八卦语的语法去查看BF的语法吧([维基百科的解释](http://zh.wikipedia.org/wiki/Brainfuck "维基百科对于BrainFuck的解释"))。映射关系如下: ``` 乾 > 坤 < 离 + 坎 - 巽 [ 艮 ] 兑 . 震 , ``` 这可不是随便映射上去的,是经过本人的深刻思考了很长时间的: - 乾坤化生万物,为整个程序的框架所以定义为指针操作符<和>; - 离者火也,坎者水也,水火一阴一阳,所以定义为自增和自减; - 巽者风也,取迅之音,艮者山也,止之谓也,故为循环起始; - 兑者泽也,取言语之意,震者雷也,天之意旨,故为输出输入。 而草泥马自然是另一雷人的语言WhiteSpace的衍生版本,后面简称WS([维基百科的解释](http://zh.wikipedia.org/wiki/Brainfuck "维基百科对于WhiteSpace的解释")),具体语法可以到维基下面的链接第一个WS的官方网站,不过全英文的,要看汉语的的点最后一个连接[Adreaman’s Blog对于WS更多的解释](http://adreaman.com/1212more-whitespace-program.html "Adreaman’s Blog对于WS更多的解释"),尽管WS中的字符要少5个但是普遍来说BF的语法要简单易懂的多,但是不知道为什么没有一个衍生版本去申请CHTML的支持(详细信息请查看google开源项目组:[CHTML](http://code.google.com/p/chtml/ "CHTML项目")),而草泥马语作为WS的一个衍生版本,尽管雷人而且晦涩,却已经成功的获得CHTML的支持。本人打算是在Google上开一个八卦语的项目,开发各种语言的编译器和解释器,争取获得CHTML的支持,相信会比草泥马语更受欢迎。 现在解释一下上面那个解释器,那个解释器问题是很严重的,一开始只支持IE内核,而且不支持输入字符“兑”。其实本来用js编的目的是为了让所有平台下的所有用户都能很方便的运行,但是当编到一半时发现了好多麻烦事。说实话,其实个人认为,编程跟谈恋爱是一样一样一样滴:编码难,维护更难(说实话,我有一整套的面向对象恋爱理论,来源在面向对象的编程实践,有空再聊这个话题呵)。js是不适合写这个解释器的,因为js在输入方面不太好写,更要命的是js只能处理Unicode编码,而控制台输出用的是GB编码,要想达到控制台效果必须转码,而js要转码只能用字符映射表方式,最好的办法就是借助vbs,而vbs只有IE内核支持……所以说这个解释器只能凑合一下呵(该问题后期已解决参照[之后某博文](/blogs/unicode_to_gb2312_by_js/detail.html "unicode与GB2312的相互转换(js)"))……有机会我会用各种语言都写一个的,然后放到我的八卦语项目里,请关注本人状态,到时候我会给出项目的网址(这只是一个打算,并未实施,有时间我会做的)*(9年过去了并未行动。因为不再有人关注这些事情了——20180130)*。 BF的解释器很多,随便有点编程水平的都能编一个,但是本人推荐百度贴吧8pm的一个解释器: ```C #include <stdio.h> #ifndef cellsize #define cellsize 30000 #endif const char *s_name = " bfi" #if cellsize != 30000 "%d" #endif " - brainf*ck language interpreter 1.0.1 build - "__DATE__"\n" #if cellsize != 30000 " **** Special version with %d cells in size ****\n" #endif " ----- copyright ?? 2005 by 8pm@baidu.cbar\n"; const char *s_license = " This program is free software; you can redistribute it and/or modify\n" " it under the terms of the GNU General Public License as published by\n" " the Free Software Foundation; either version 2 of the License, or\n" " (at your option) any later version.\n" "\n" " This program is distributed in the hope that it will be useful,\n" " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" " GNU General Public License for more details.\n" "\n" " You should have received a copy of the GNU General Public License\n" " along with this program; if not, write to the\n" " Free Software Foundation, Inc.,\n" " 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n" "\n" " usage: $ %s [source code]\n" "\n"; const char *s_err_open = "[] error: unable to open file %s\n"; const char *s_err_ovfl = "[] error: unable to run, program too large.\n"; const char *s_err_unmt = "[] error: unmatch [ and ] in source file.\n"; char a[cellsize], o[cellsize]; int n=0,ip=0,dp=0; int main(int argc, char **argv) { FILE *fp = NULL; if (1 == argc) { #if cellsize != 30000 fprintf(stderr, s_name, cellsize/1000, cellsize); #else fprintf(stderr, s_name); #endif fprintf(stderr, s_license, argv[0]); return 0; } if (NULL == (fp=fopen(argv[1],"r"))) { fprintf(stderr, s_err_open, argv[1]); return -1; } while(!feof(fp)) switch(n=fgetc(fp)) { case '[':ip+=2;case ']':--ip;case '>': case '<':case '+':case '-':case '.':case ',': o[dp++]=n; if (dp==cellsize) { fclose(fp); fprintf(stderr, s_err_ovfl); return -2; } } fclose(fp); if (ip) { fprintf(stderr, s_err_unmt); return -3; } n=ip=dp=0; do { n=1; switch (o[ip]) { case '>':++dp==cellsize?dp=0:0;break; case '<':--dp==-1?dp+=cellsize:0;break; case '+':a[dp]++;break; case '-':a[dp]--;break; case '.':putchar(a[dp]);fflush(stdout);break; case ',':a[dp]=getchar();break; case '[': if(!a[dp]) while(n) switch(o[++ip]){ case '[':n++;break; case ']':n--;break; } break; case ']': if(a[dp]) while(n) switch(o[--ip]){ case ']':n++;break; case '[':n--;break; } break; } } while(o[++ip]); return 0; } ``` 不光是解释器,还有编译器推荐MasterRay 的,[相关介绍在这里](http://tieba.baidu.com/f?kz=424566372 "MasterRay的编译器的相关介绍"),下载地址见下面代码,~~其实里面还包括一个TXT转BF的转换器源码,也可以在他的百度空间里看到~~(已失效),至于地址请运行下面代码,呵呵(哥也会使坏)。 ```BrainFuck +++++++++++++.---.>+++++++++[<++++++++++>-]<++++.++++++++++++..----.>+++++++[<-------->-]<++.-----------..>+++++++[<++++++++>-]<+.+.>+++++++[<-------->-]<---.>+++++++[<+++++++>-]<+++.-.++++++++.-----.>++++[<++++>-]<+.>++++++++[<--------->-]<+.>+++++++[<++++++++>-]<---.++++++++++++.--.>+++++++[<--------->-]<+.>+++++++[<+++++++++>-]<-.------------.>++++[<++++>-]<++.+.---------------.+++++++++++++..>++++[<---->-]<-.>++++[<++++++>-]<.>++++++++[<--------->-]<--.>+++++++[<+++++++>-]<++.++++++++++.+++.--------.>+++++++[<-------->-]<.>+++++++[<++++++++>-]<++.+++++++++++.---------------.++++++++.>+++++++[<--------->-]<+.>+++++++[<+++++++>-]<+.+++++.--.++.>++++++[<-------->-]<..>++++++[<+++++++>-]<++.>++++++[<------->-]<---.++++.-----.-.>++++++[<++++++++>-]<.>+++++++[<------->-]<--.>+++++++[<++++++++>-]<---.--.-.>++++++[<-------->-]<+.++++.>++++++[<+++++++>-]<+++.>+++++++[<------->-]<.>++++++[<++++++++>-]<.--..>++++++[<------->-]<---.------.>+++++++[<++++++++>-]<++.++++++++++++.-------.-.>+++++++++[<----------->-]<++++.---.>+++++++++[<++++++++++>-]<++++.++++++++++++..----.>+++++++[<-------->-]<++.-----------..>+++++++[<++++++++>-]<.+++++++++++.---.++++++.-----.+++.>++++++++[<--------->-]<+++.>+++++++[<++++++++>-]<+.++++++++..--------.+++++.-------.>+++++++[<-------->-]<+.>+++++++[<++++++++>-]<---.++++++++++++.--.>+++++++[<--------->-]<+.>+++++++[<++++++++>-]<.+++++++++++.---.++++++.-----.>++++++++[<-------->-]<-.>+++++[<++++++>-]<.>++++[<+++++>-]<.>++++[<++++>-]<++.+.---------------.+++++++++++++.>+++++[<------>-]<--.+++++++++++++++.>++++[<++++++>-]<.>++++++++++[<----------->-]<++.---. ``` 但是最雷人的是为纪念BF而用BF写的编译器,源码很猥琐,你可以在~~[这里est's blog看到介绍](http://initiative.yo2.cn/archives/629836 "est's blog关于AWIB的介绍")~~(已失效),[在这里可以看到源码](http://www.nada.kth.se/~matslina/awib/awib-1.0rc6-BETA.b "AWIB源码"),这里给个缩略图,怎么样,够猥琐吧…… ![awib源码缩略图](awib.jpg "awib源码缩略图") 说一说这个编译器的使用方法吧,它其实是把BF转化为C语言。可以先将8pm的解释器编译出来,假设命名为`bfi.exe`,把这个BF源码保存在一个文本文档中,假设命名为`bfc.txt`,放在同一个文件夹中,用命令提示符转到当前文件夹,输入“`bfi bfc.txt`”解释执行,输入要解释的BF源码(建议粘贴,如果当前命令提示不接受右键,可以在标题栏点击)按`F6`,`回车`,就可以看到程序输出了一段C语言编码,这样不太好收集,建议把要编译的源码放到文件里,假设命名为`source.txt`,编译后的编码要存储为`result.c`,则直接输入“`bfi bfc.txt<source.txt>result.c`”,试一试“`bfi bfc.txt<bfc.txt>bfc.c`”,呵呵,这个编译器变成C语言的了……编译以后到时候就可以直接“`bfc<source.txt>result.c`”了。 还有,不要以为BF只能干一些输出文本之类雕虫小技的东西,实际上它确实有能力开发一些大型的项目,只不过像我这么无聊的人比较少,而且凑不到一起罢了……但是我确实在网上下载到一个比较大型的输出manderbrot集的BF程序,尽管运行时间长一些。 ![BF程序输出的manderbrot集缩略图](mandelbrot.jpg "BF程序输出的manderbrot集缩略图") 还有如果你因为它运行效率低而鄙视它,那你就错了,它运行效率取决于它的编译器或解释器或者运行它的机器,如果有一台计算机的计算机制是按照BF运行的,那BF在那台计算机上将是运行效率最高的语言,也许那一天某个无聊的人真的造出这么一台八进制计算机来,那这门语言就就真牛X了……当然其实所谓的BF解释器也算是一个BF虚拟机程序了。 当然关于WS与BF,matrix67大牛都曾经有过解说,WS还被M67誉为无聊的语言。传说,M67看到BF的名字后一直想发明一种语言叫做“我靠真他妈的牛逼”,其实自此以后我彻夜未眠,为了实现M67的愿望,我熬夜数日终于写出了一个并不怎么好的“我靠真他妈的牛逼”语言的解释器,其实这就是这篇日志的开始。要看到这个解释器请将上面解释器的源码格式中选择其他,文本框中填入“我靠真他妈的牛逼”即可~呵呵,希望M67和广大好友们喜欢。:laughing:


花楹2019-4-21 18:32:51 说:
回复 @小狗哥 : 欢迎常来玩~
小狗哥2019-3-15 01:59:16 说:
膜拜,膜拜
发表评论

必填,公开,这样称呼起来方便~

必填,不会被公开,不必担心~

http://

非必填,公开,目的是方便增进友好访问~

必填,请输入下方图片中的字母或数字,以证明你是人类

看不清楚
必填,最好不要超过500个字符
     ↑返回顶端↑