Форт и Флаги процессора

Почему 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 - это основанный на стеке язык, чтобы определить операции внутри языка, вы должны определить результат, чтобы изменить что-то внутри языка. Регистр флагов не на языке. Очевидно, что в случае оптимизирующего компилятора любой подход, который дает тот же конечный результат, одинаково приемлем.

Другие вопросы по тегам