当前位置: 代码迷 >> 其他开发语言 >> ·由一段聊天记录引出的·解决方法
  详细解决方案

·由一段聊天记录引出的·解决方法

热度:3291   发布时间:2013-02-26 00:00:00.0
·由一段聊天记录引出的·
这几天和一个同学聊了点东西,关于一些function在BF语言下的实现

/*教学部分,熟悉BF语言的可以掠过

BF语言我个人感觉真的是世界上最好学的语言之一,因为你只要三分钟就能学会这个语言的全部,至于如何用BF语言编程,那就看你的脑袋了。

BF语言的全称叫BrainF**k,是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。Müller的目标是建立一种简单的、可以用最小的编译器来实现的、符合图灵完全思想的编程语言。这种语言由八种状态构成,为Amiga机器编写的编译器(第二版)只有240个字节大小。
就象它的名字所暗示的,BF程序很难读懂。尽管如此,BF图灵机一样可以完成任何计算任务。虽然BF的计算方式如此与众不同,但它确实能够正确运行。
这种语言基于一个简单的机器模型,除了指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。*

*来自WikiPedia中文版

好了,介绍完毕,下面是基本语法:
'>' 符号表示指针自增一,'<' 符号反之
'+' 符号表示指针所指内容自增一,'-' 符号反之
'.' 表示输出当前指针所指内容,',' 表示输入内容到指针所指处
'[' 表示如果当前指针所指内容为零,跳转至下一个']'后面
']' 表示如果当前指针所指内容非零,跳转至下一个'['后面

如果你看到了这里,那么恭喜你,BF语言你已经学会了*/

好了,下面是聊天内容(经过优化,略去不必要的部分),">>" 表示我说的话, "<<" 表示同学说的话

Conversation.Start:
>> 我觉得比汇编容易

<< 没什么要记的..

<< 但这种代码..

<< 没办法做开发啊

>> 无法维护

Conversation.Pause:
- 这里我要说一下,其实维护问题并不难,BF语言中虽然没有注释,但是事实上多数编译器都直接无视非关键字,也就是说你可以到处写注释,甚至把注释当成代码来写 。

Conversation.Continue:
>> 我发现用这个写程序有个很蛋疼的问题

>> 你必须记得当前在那个地址,以及每个地址当前的值
里面所有的指针都是用相对地址

<< 那指针内容什么的怎么搞

<< 比如你要输出ASCII字符
你怎么去找到这个字符?

>> 用>和<

<< 比如,输出字符“A”的程序是什么

>> 输出字符A,如下
code:
+++ +++ +++ +
[
>+++ +++ +
<-
]
>-----.

end of code

>> 第一行,[0]自增10,作为计数器,然后开始循环,循环中*[1]每次自增7,然后*[0]-1
当*[0] == 0时跳出循环,这个时候*[1] == 70,然后*[1] - 5,输出
所以说,你必须记住当前指针指向哪里,以及所有内存区域中的值

<< code:
+++ +++ +++ + [ > +++ +++ < - ] >+++++ .
end of code

这两种写法一样吗?

>> 一样,非关键字全部忽略

Conversation.Pause:
- 看,学习BF语言就是这么容易~!

Conversation.Continue:
<< 没办法直接提取指针,只能依次访问是吧..

>> BrainFk只有一个指针,你必须随时知道他在哪
所以养成每句话后面做清理是个好习惯

<< 这样没办法递归吧..

<< 你一次只能指向一个地址

Conversation.Pause:
- 问题就是从这里开始的。

Conversation.Continue:
>> 用循环代替递归

>> 一切递归都能用循环代替

<< 谁说的

>> 递归事实上就是给循环体起了个名字 - -

Conversation.Pause:
- 关于是否所有的递归都可以通过循环来完成,还有待商讨
- 就我个人而言,我认为一切循环都能够打包成递归,一切递归也都能展开成循环
- 或者说,我认为递归和循环是相互可逆的,理由如下:
- 假设说存在一个递归函数
- function(var1,var2,static var3,&var4) {...} // 使用C/C++表示
- 我们可以按照下述规则将其展开成循环
- 我们写一个过程体proc
- var1,var2在proc中使用赋值语句同步变量,在proc结束时清零
- var3在proc中使用赋值语句同步变量,在过程体结束时保留
- var4直接使用或者引用所需变量
- 为proc写循环语句,递归时函数用于判定的参数写入循环语句的判定部分
- 这样我们就将递归展开成了循环,而同样,将上述方法倒序,我们将从循环得到递归

Conversation.Continue:
<< 我觉得brainfk不可能在一个程序中用循环代替所有递归

<< 我组织一下思路

>> 事实上递归就是在函数执行完毕之后将指针指向函数的入口啊

<< 是啊

>> 所以说说到底还是循环~

<< 你怎么在递归中找到当前指针的位置

>> 使用一个容器

<< 你只有一个指针
和递归开始的位置
你的容器也要用这个指针去找

>> 比如说,我现在在[7]
要在[9]开始循环
我先把[7]归零,[8]增9
然后每一次循环之后[7]增一
通过[8]访问函数
[7]找起来很容易,因为可以先找[0]

<< 找0?

<< 好吧

Conversation.Pause:
- 事后证明,这个方法是错的
- 聊天至此,遇到了两个问题:一个是循环和递归是否互相可逆,另一个问题是只有一个指针的情况下究竟能不能对指针进行定位。如果这两个问题的答案都是肯定的,那么BF语言就可以实现递归。
- 这两个问题中的后一个争论许久,具体的冗长的聊天记录我先不贴出来了,觉得意义不大,争论出结果之前,我遇到点急事下了线,办完事吃了个饭回来,之后有了下面的记录
  相关解决方案