为什么Forth不使用处理器标志进行条件执行?
而是将比较结果放在参数堆栈上。是因为内部解释器循环在转到下一条指令时可能会改变标志吗?或者仅仅是抽象条件逻辑?
E.g。在x86上,flags寄存器保存了一个比较结果,因为大多数处理器(如果不是全部的话)都有一个标志寄存器。
答案 0 :(得分:2)
这取决于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
在Gforth:
see tt
: tt
0
IF .\" true"
ELSE .\" false"
THEN ; ok
答案 1 :(得分:2)
由于Forth是基于堆栈的语言,为了定义语言内的操作,您必须定义结果以更改语言内的内容。标志寄存器不在语言中。显然,在优化编译器的情况下,任何给出相同最终结果的方法都是可以接受的。