从此处起,我们将更换描述语言。 我们通常用一个字母来命名一个单元,不区分大小写。通常情况下,我们用大写。若要强调其值为0,则用小写。若要强调其值在前后发生了变化,则加上上标'。若要强调其值,则写在行末的注释里。 我们将用*表示当前单元。如果当前单元对目标单元可定位,用*~>d或~>d表示将指针从当前单元移动至目标单元d。我们用如下格式来描述一个模块,并均用[]来表示入口点和出口点。 模块名 初始情况 若干终止情况 代码 解释 譬如,上节的习题,其中乘法可写为: MUL(A,B,C) ;C=A*B [A] B t c [a] B t C [->[->+>+<<]>[-<+>]<<] A作为计数器,每次复制B到C(上节习题,转移和复制实质上是加)。
本来是想讲一下“标志”的概念,但是感觉没什么必要,就直接跳过好了。 我们知道,要想区分不同情况,就必须要用[],因为这对指令是bf中唯一具有逻辑判断功能的指令。而[]的跳出条件为指向单元的值为0,那么用值的不同来区分情况便显得有些困难了。因此,我们不妨转换一下思路,改用出口点位置的不同来区分情况。这可能和我们用常规语言编程时的思路大不一致,但确实是一种可行的解决方案。本文将相当多地采用这种设计思路,请确保你能够理解这种思路。 譬如,我们需要比较两个数的大小。很明显我们需要双重的[]。我们通过设计不同的出口点来区分A和B的大小情况。 CMP(A,B) [A] 0 B [a] 0 B' ;a <= b A'[0] b ;a > b [->>[-<]<] 这样,我们在不同的出口点跳出。现在,我们可以利用位置的不同,合适地设置一些标志来实现一些功能,最后将两种情况的指针均指向同一处来方便后续处理(称之为“同步”)。至于怎么设置标志,我们放在if-else节进行说明。