扫描二维码关注官方公众号
返回列表 发布新帖

长见识了,这就是编译器最小的语言……

1176 14
发表于 2012-10-21 18:46:12 来自手机 | 查看全部 阅读模式

来吧兄弟,一起玩一起讨论!

您需要 登录 才可以下载或查看,没有账号?注册

×
hello world 源码如下……
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

评论14

元亨利贞Lv.9 发表于 2012-10-21 18:51:08 | 查看全部
本帖最后由 moluxiaogu 于 2012-10-21 19:50 编辑

什么语言,汇编有爱啊
技术贴灌水还是复制黏贴靠谱啊
Brain**
求助编辑百科名片Brain**是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由于**在英语中是脏话,这种语言有时被称为brainf*ck或brainf***,甚至被简称为BF。




目录
简介 字符标识 条件指令 加法 乘法 除法

编辑本段简介  Müller的目标是建立一种简单的、可以用最小的编译器来实现的、符合图灵完全思想的编程语言。这种语言由八种状态构成,为Amiga机器编写的编译器(第二版)只有240个字节大小!


  就象它的名字所暗示的,brain**程序很难读懂。尽管如此,brain**图灵机一样可以完成任何计算任务。虽然brain**的计算方式如此与众不同,但它确实能够正确运行。
  这种语言基于一个简单的机器模型,除了指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。
  这种 语言,是一种按照“Turing complete(完整图灵机)”思想设计的语言,它的主要设计思路是:用最小的概念实现一种“简单”的语言,BrainF**k 语言只有八种符号,所有的操作都由这八种符号的组合来完成。[1]
编辑本段字符标识  下面是这八种状态的描述,其中每个状态由一个字符标识:[1]
  
字符
含义
>
指针加一
<
指针减一
+
指针指向的字节的值加一
-
指针指向的字节的值减一
.
输出指针指向的单元内容(ASCⅡ码)
,
输入内容到指针指向的单元(ASCⅡ码)
[
如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处
如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处
 (按照更节省时间的简单说法,"]"也可以说成“向后跳转到对应的"["状态”。这两解释是一样的。)
  (第三种同价的说法,"["意思是"向前跳转到对应的"]"",]意思是"向后跳转到对应的[指令的次一指令处,如果指针指向的字节非零。")
  Brain**程序可以用下面的替换方法翻译成C语言(假设ptr是char*类型):
  
Brain**
C
>
++ptr;
<
--ptr;
+
++*ptr;
-
--*ptr;
.
putchar(*ptr);
,
*ptr =getchar();
[
while (*ptr) {
}
当前位置清零
  [-] 将当前指针的值归零
  之前位置清零
  [[-]<] 将当前指针以及之前的指针归零
  字符I/O
  ,. 从键盘读取一个字符并输出到屏幕上。
  简单的循环
  ,[.,] 这是一个连续从键盘读取字符并回显到屏幕上的循环。注意,这里假定0表示输入结束,事实上有些系统并非如此。以-1和"未改变"作为判断依据的程序代码分别是",+[-.,+]"和",[.[-],]"。
  指针维护
  >,[.>,] 通过移动指针保存所有的输入,供后面的程序使用。
  加法
  [->+<]
  把当前位置的值加到后面的单元中(破坏性的加,它导致左边的单元被归零)。
编辑本段条件指令  ,----------[----------------------.,----------]
  这个程序会把从键盘读来的小写字符转换成大写。按回车键退出程序。
  首先,我们通过,读入第一个字符并把它减10(大多数情况下,brain**使用10作为换行符的值)。如果用户按的是回车键,循环命令([)就会直接跳转到程序的结尾:因为这时第一个字节已经被减到了零。如果输入的字符不是换行符(假设它是一个小写字符),程序进入循环。在这里我们再减去剩下的22,这样总共减掉32:这是ASCⅡ码中小写字符和大写字符的差值。
  下面我们把它输出到屏幕。然后接收下一个输入字符,并减去10。如果它是换行符,退出循环;否则,再回到循环的开始,减去22并输出……当循环退出时,因为后面已经没有其他的指令,程序也随之终止。
编辑本段加法  ,>++++++[<-------->-],,[<+>-],<.>.
  这个程序对两个一位数做加法,并输出结果(如果结果也只有一位数的话):4+3
  7 (现在程序开始有点复杂了。我们要涉及到数组中单元的内容了,比如[0]、[1]、[2]之类。)
  第一个输入的数字被放在在[0]中,从中减去48来把它从ASCⅡ码值48到57转换为数值0到9:这是通过在[1]中放入6,然后按照[1]中的次数让一个循环从[0]中多次减去8来完成的(当加上或减去一个大的数值时,这是常用的办法)。下一步,加号被读入[1]中;然后,第二个数字被输入,覆盖掉加号。
  下面的循环[<+>-]执行最重要的工作:通过把第二个数字移动到第一个里面让它们相加,并把[1]清空。这里的每次循环都把[0]增一并从[1]中减一;最终,在[1]被置零的多次循环中,[1]中的值就被转移到了[0]中。现在,[1]中是我们输入的换行符(这个程序里,我们没有设置对输入错误的检查机制)。
  然后,指针被移回到指向[0],并输出它的内容([0]里面现在是 a + (b + 48) 的值,因为我们没有修改b的值,这等于 (a + b) + 48,也就是我们想要输出的ASCⅡ值)。然后,把指针指向[1],里面保存着前面输入的换行符;输出换行符,程序结束。
编辑本段乘法  ,>,,>++++++++[<------<------>>-]<<[>[>+>+<<-]>>[<<+>>-]<<<-]>>>++++++[<++++++++>-],<.>.
  和前一个程序类似,不过这次是乘法而不是加法。
  第一个输入的数字被放入[0],星号和第二个数字被放入[1],然后两个数值都被校正:减去48。
  现在,程序进入了主循环。我们的基本思想是:每次从[0]中减去一,同时把[1]的值加入到保存乘积的[2]中。在实际操作中,第一个内层循环把[1]的值同时转移到[2]和[3]中,同时[1]清零(这是我们复制数字的基该方法)。下一个内层循环把[3]中的值重新放回到[1],并清零[3]。然后从[0]中减一,结束外层循环。在退出这个循环时,[0]中为零,[1]仍然是输入的第二个数值,[2]则是这两个数值的和。(要是想保存第一个数,我们可以在外层循环中每次给[4]加一,最后把[4]移回[0]。)在结果中加48,并把换行符读入[3],输出ASCⅡ码的乘积,然后输出刚才保存的换行符。
编辑本段除法  ,>,>++++++[-<--------<-------->>]
  从简单储存2个数字符到[0]和[1],并各自减去48
  <<[ 这是一个主循环,在被除数,也就是[0]的值为0后循环跳出
  >[->+>+<<] 从单元1中复制除数的值到[2]和[3],设[1]为0
  >[-<<- 被除数[1]减去除数[2],结果将储存在[0],并且[2]将归0
  [>]>>>[<[>>>-<<<[-]]>>]<<] 如果被除数[0]为0,跳出循环
  >>>+ 加1值商到[5]
  <<[-<<+>>] 从[3]复制除数到[1]
  <<<] 移动指针到[0]
  >[-]>>>>[-<<<<<+>>>>>] 从[5]复制商到[0] (这步不是必须的,但会更清楚)
  <<<<++++++[-<++++++++>]<.

回复 点赞

使用道具 举报

兔纸楼主Lv.9 发表于 2012-10-21 18:52:03 来自手机 | 查看全部
moluxiaogu 发表于  12 秒前
什么语言,汇编有爱啊...

汇编比这个语言还复杂得多……


回复 点赞

使用道具 举报

元亨利贞Lv.9 发表于 2012-10-21 18:59:02 | 查看全部
bgli100 发表于 2012-10-21 18:52
汇编比这个语言还复杂得多……

复杂度都被编译器给掩盖了
回复 点赞

使用道具 举报

hustbeta@2 发表于 2012-10-21 19:09:38 | 查看全部
进来之前就猜是brainf....
回复 点赞

使用道具 举报

情殇的智慧Lv.5 发表于 2012-10-21 19:09:59 | 查看全部
这个是什么意思。{:7_734:}
回复 点赞

使用道具 举报

宝宝之恋Lv.3 发表于 2012-10-21 19:11:49 | 查看全部
进来围观一下
回复 点赞

使用道具 举报

兔纸楼主Lv.9 发表于 2012-10-21 19:22:56 来自手机 | 查看全部
moluxiaogu 发表于  23 分钟前
bgli100 发表于 2012-10-21 18:52      
汇编比这个语言还复杂得多……  
复杂度都被编译器给掩盖了...

编译器也比汇编的编译器小得多。


回复 点赞

使用道具 举报

兔纸楼主Lv.9 发表于 2012-10-21 19:23:09 来自手机 | 查看全部
hustbeta 发表于  12 分钟前
进来之前就猜是brainf.......

对了!


回复 点赞

使用道具 举报

wuxiangfei9Lv.8 发表于 2012-10-21 19:32:28 | 查看全部
兔子又在发技术贴了。
回复 点赞

使用道具 举报

利利乐乐Lv.5 发表于 2012-10-21 20:21:16 | 查看全部
不懂这个   崇拜~~~
回复 点赞

使用道具 举报

GaoleiLv.3 发表于 2012-10-21 21:23:58 来自手机 | 查看全部
不懂,路过
回复 点赞

使用道具 举报

vocaloidLv.9 发表于 2012-10-21 21:27:04 | 查看全部
brain**,哎听都没听说过
回复 点赞

使用道具 举报

shadowayLv.5 发表于 2012-10-21 21:41:56 | 查看全部
汇编语言太遥远 {:2_131:}
回复 点赞

使用道具 举报

兔纸楼主Lv.9 发表于 2012-10-21 21:45:11 来自手机 | 查看全部
shadoway 发表于  2 分钟前
汇编语言太遥远...

架构上比汇编简单多了


回复 点赞

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

淘宝小店

邀请码

VIP会员

微信客服

公众号

微信群

投诉/建议联系

support@gebi1.cn

未经授权禁止转载,复制和建立镜像,
如有违反,追究法律责任
  • 关注公众号
  • 添加微信客服
Copyright © 2001-2024 隔壁网 版权所有 All Rights Reserved. 粤ICP备14056481号-1
关灯 在本版发帖
扫一扫添加微信客服
返回顶部
快速回复 返回顶部 返回列表