Форт и Флаги процессора
Почему Forth не использует флаги процессора для условного выполнения?
Вместо этого результат сравнения помещается в стек параметров. Это потому, что внутренний цикл интерпретатора может изменять флаги при переходе к следующей инструкции? Или это просто абстракция условной логики?
Например, в x86 регистр флагов содержит результаты сравнения, поскольку большинство процессоров, если не все, будут иметь регистр флагов.
2 ответа
Это зависит от Форта и уровня оптимизации.
: 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
Поскольку Forth - это основанный на стеке язык, чтобы определить операции внутри языка, вы должны определить результат, чтобы изменить что-то внутри языка. Регистр флагов не на языке. Очевидно, что в случае оптимизирующего компилятора любой подход, который дает тот же конечный результат, одинаково приемлем.