为什么 Forth 不使用处理器标志进行条件执行?
相反,比较的结果将放在参数堆栈上。是因为内部解释器循环可能会在转到下一条指令时更改标志吗?还是简单地抽象条件逻辑?
例如,在 x86 上,标志寄存器保存比较结果,因为大多数处理器(如果不是全部)都会有一个标志寄存器。
As Forth 是一种基于堆栈的语言,为了定义语言内部的操作,您必须定义结果以更改语言内部的某些内容。标志寄存器不在语言中。显然,在优化编译器的情况下,任何给出相同最终结果的方法都是同样可以接受的。
这取决于 Forth 和优化级别。
: tt 0 if ." true" else ." false" then ;
在 SwiftForth (x86_64 GNU/Linux 中):
see tt
808376F 4 # EBP SUB 83ED04
8083772 EBX 0 [EBP] MOV 895D00
8083775 0 # EBX MOV BB00000000
808377A EBX EBX OR 09DB
808377C 0 [EBP] EBX MOV 8B5D00
808377F 4 [EBP] EBP LEA 8D6D04
8083782 808379D JZ 0F8415000000
8083788 804D06F ( (S") ) CALL E8E298FCFF
808378D "true"
8083793 804C5BF ( TYPE ) CALL E8278EFCFF
8083798 80837AE JMP E911000000
808379D 804D06F ( (S") ) CALL E8CD98FCFF
80837A2 "false"
80837A9 804C5BF ( TYPE ) CALL E8118EFCFF
80837AE RET C3 ok
在格福斯:
see tt
: tt
0
IF ." true"
ELSE ." false"
THEN ; ok