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

Почему Форт не использует флаги процессора для условного выполнения?

Вместо этого результат сравнения помещается в стек параметров. Это потому, что внутренний цикл интерпретатора может изменять флаги при переходе к следующей инструкции? Или это просто абстрактная условная логика?

Например. на x86 регистр флагов содержит результаты сравнения, так как большинство процессоров, если не все, будут иметь регистр флагов.


person Daryl    schedule 26.04.2016    source источник


Ответы (2)


Поскольку Forth является языком на основе стека, для определения операций внутри языка вы должны определить результат, чтобы изменить что-то внутри языка. Регистр флагов не на языке. Очевидно, что в случае оптимизирующего компилятора любой подход, дающий один и тот же конечный результат, одинаково приемлем.

person George Kourtis    schedule 28.04.2016
comment
Отличный ответ. Это означает, что для использования регистра флагов в качестве оптимизации четвертая виртуальная машина должна быть изменена, чтобы включить регистр флагов как часть определения, нарушая устаревший код. Это может быть или не быть выгодным. Скорость может быть увеличена за счет сложности. - person Daryl; 28.04.2016
comment
@Daryl, оптимизирующий компилятор не требует никаких изменений на уровне исходного кода, т. Е. Нет необходимости включать регистры как часть определений. Компилятор Forth просто генерирует машинный код, который в определенных случаях использует регистр флагов вместо стека. - person ruvim; 28.04.2016

Это зависит от Форта и уровня оптимизации.

: 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
person Brian Tiffin    schedule 27.04.2016